nmapパケットを学ぶ

# 今さらながら「nmap」を確認
nmapを使う機会は多数あったが、実際のパケットをまともに見たことがなかったので、動作とともに確認する。

## 対象
nmapにはあまりに多数のオプションがあるので、ここでは、次の３つをターゲットとした。
- -sS：TCP Synスキャン
- -sT：TCP Connectスキャン
- -sN：TCP Nullスキャン

これらの説明については、次のサイトがわかりやすいと感じる。
- [ポートスキャンツール「Nmap」を使ったセキュリティチェック](https://knowledge.sakura.ad.jp/97/2/)

上記オプションの結果とTCPフラグの受信内容をまとめると下記のとおり。
|結果|open|closed|filtered|
|---|---|---|---|
|-sS|SYN-ACK受信|RST受信|受信なし|
|-sT|SYN-ACK受信|RST受信|受信なし|
|-sN|受信なし|RST受信|受信なし|

- 「-sS」と「-sT」のnmapの結果としては同じであるが、後者ではTCPセッション確立という点で違いがある。
- 受信しなくても、「closed」の可能性は０ではない。

## テスト環境
![Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/736a7fa2-fc26-8ff3-c96e-67bfbfb2bfd1.png)
GNS3上のルーターにVMである、LubuntuとBusterdogとが存在し、Busterdog上にListenしているTCPポートがあり、Lubuntu上でnmapを実行する。また、Routerのアクセスコントールにより、特定のTCPポートをブロックすることも実施。

### Listen側（Busterdog）設定
今回は、iperfを用いて、TCP Listenの状態を設けた。
```
# iperf -s -p 1001 &
# iperf -s -p 1003 &
#
# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:1001            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:1003            0.0.0.0:*               LISTEN
```
ポート1001および1003で、Listenする。

## 検証
探索ポートを1001、1002、1003とした、nmap（Lubuntu）の実行結果を記す。
### ルーターでのアクセスコントールなし
#### -sS 
```
$ sudo nmap -sS -p 1001-1003 10.0.0.11

PORT     STATE  SERVICE
1001/tcp open   webpush
1002/tcp closed windows-icfw
1003/tcp open   unknown
```
このときのWiresharkの結果は下記となった。
![-sS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0c87a284-d287-e3e9-1050-bc6a0447925e.png)
Openしているポート1001および1003からは「Syn-Ack」が、Closeしているポート1002からは「RST」が返ってきている。nmapの結果は文字どおりのものとなっている。

#### -sT
```
$ sudo nmap -sT -p 1001-1003 10.0.0.11

PORT     STATE  SERVICE
1001/tcp open   webpush
1002/tcp closed windows-icfw
1003/tcp open   unknown
```
Wiresharkの結果は下記のとおり。
![-sT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fd61da2d-4b07-482f-51a6-69660e048bcf.png)
基本的に「-sS」のときと同じであるが、「Syn-Ack」に対して「Ack」を返し、TCPセッションを確立させている（その後「RST」送信）が異なる。

#### -sN
```
$ sudo nmap -sN -p 1001-1003 10.0.0.11

PORT     STATE         SERVICE
1001/tcp open|filtered webpush
1002/tcp closed        windows-icfw
1003/tcp open|filtered unknown
```
Wiresharkの結果は下記のとおり。
![-sN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e610d3ae-48aa-443c-2995-118a76bcc34f.png)
TCPフラグを何もセットしていないパケットを送信していることがわかる。それに対して、クローズしているポート（1002）から「RST」が返されている。ポート1001および1003に対しては応答がないので、openしているかFirewallなどでブロックされているかわからないため、nmapの結果としては「open|filtered」となる。

### ルーターでのアクセスコントールあり
ルーターに、nmapからのポート1003アクセスブロックを設定。
```
interface FastEthernet0/0
 ip address 192.168.0.1 255.255.255.0
 ip access-group 101 in

access-list 101 deny   tcp any any eq 1003
access-list 101 permit ip any any
```

#### -sS 
```
$ sudo nmap -sS -p 1001-1003 10.0.0.11

PORT     STATE    SERVICE
1001/tcp open     webpush
1002/tcp closed   windows-icfw
1003/tcp filtered unknown
```
Wiresharkの結果は下記のとおり。
![-sSwtL詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d19ddca7-1135-b1db-7529-ee51afbc2ae9.png)
ポート1003の通信がブロックされ、ICMP Destination unreachableが返ってきており、nmapの結果が「filtered」となっている。

#### -sT 
```
$ sudo nmap -sT -p 1001-1003 10.0.0.11

PORT     STATE    SERVICE
1001/tcp open     webpush
1002/tcp closed   windows-icfw
1003/tcp filtered unknown
```
「-sS」とほぼ同じのため、説明略。

#### -sN
```
undeux3@vamos:~$ sudo nmap -sN -p 1001-1003 10.0.0.11

PORT     STATE         SERVICE
1001/tcp open|filtered webpush
1002/tcp closed        windows-icfw
1003/tcp filtered      unknown
```
Wiresharkの結果は下記のとおり。
![-sNwtL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/72892f7e-1384-8c83-b156-be51b0f11af5.png)
ポート1003の結果であるが、ICMP Destination unreachableを受けて、nmapの結果としては「filtered」となっている（と考えている）。

## おわりに
OSやFirewallによる違いなどもあるだろうが、基本的なところはこんなところだろう。nmapには多数のオプションがあり、Wiresharkの結果と組み合わせて、結果を理解するのがベター。