Kali Linux2022.1 でハッキングラボをつくってみる8 Wiresharkでパケットキャプチャ3 nmapのポートスキャンを解析する

# はじめに
「ハッキング・ラボのつくりかた」(IPUSIRON著)のP.440-460を参考にした記事となります。
ただし、ネットワークの構成が同書の構成とは異なります。

同書では、

- Windows10(ホストOS) : 10.0.0.1
- Kali(ゲストOS) : 10.0.0.2
- Metasploitable(ゲストOS) : 10.0.0.5
- DHCPサーバー : 10.0.0.100

となっていますが、

- Ubuntu系ディストリビューション（ホストOS) : 192.168.56.1
- Kali(ゲストOS) : 192.168.56.2
- Metasploitable(ゲストOS) : 192.168.56.5
- DHCPサーバー : 192.168.56.50

とします。

`wireshark &`コマンドを実行するか、アイコンをクリックすることで、Wiresharkを起動させます。インターフェースはホストオンリアダプターが接続されているものを指定して、キャプチャを開始します。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# nmapのポートスキャンの種類の確認
- TCPフルコネクトスキャン
- TCP SYNスキャン
- UDPスキャン
- Pingスキャン
- FINスキャン
- Xmasスキャン
- Nullスキャン
- ACKスキャン

# TCPのスキャン
## TCPフルコネクトスキャン
-sTオプション
開いているポート80に次のコマンドを実行する。
```
nmap -sT -p 80 192.168.56.1
```
コマンド実行後のWiresharkの画面
![VirtualBox_kali-linux-2022.1-wirenmap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/274e97a1-8eb1-2f2c-5431-b47ed98ae976.png)
フロー図を表示する。メニューバーの「統計」＞「フローグラフ」をクリックする。
![VirtualBox_kali-linux-2022.1-wirenmap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/4bdc48ad-b13f-d204-a467-a0cb8516c128.png)
「フロー種別」はTCP Flowsを選択する。
上の画像を見ると、
192.168.56.2 → 192.168.56.1に向けて、 SYN ACK RST,ACKの通信が
192.168.56.1 → 192.168.56.2に向けて、SYN,ACKの通信が合計４回行われていることがわかる。
KaliLinuxからターゲットにSYNパケットが送られた後、その応答としてSYN,ACKが返される。
その後、KaliLinuxからターゲットにACK RST,ACKパケットが送られて、コネクションが確立する。
このスキャンは、ターゲットのサービスにログが残る。ポートスキャンの露見につながる。

今度は閉じているポート5555に次のコマンドを実行する。（正しくは、閉じているのではなく存在しないサービスのポート番号）
```
nmap -sT -p 5555 192.168.56.1
```
![VirtualBox_kali-linux-2022.1-wirenmap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/89ce9778-da28-6968-e0d5-bbb06f980e32.png)
192.168.56.2 → 192.168.56.1 SYN 
192.168.56.1 → 192.168.56.2 RST,ACK
の２回の通信で終わってしまう。
ターゲットからRST,ACKが返されて、接続が拒否される。

最後に、ファイアフォール(ufw)でフィルタリングされているポートに対して次のコマンドを実行する。
```
nmap -sT -p 80 192.168.56.1
```
![VirtualBox_kali-linux-2022.1-wirenmap5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/7a185b3b-779f-b51c-344f-bb0959ad86a7.png)
192.168.56.2 → 192.168.56.1にSYNパケットが送信されるのみで、応答はなし。

## TCP SYNスキャン
-sSオプション 
開いているポート443に次のコマンドを実行する。
```
sudo nmap -sS -p 443 192.168.56.1
```

![VirtualBox_kali-linux-2022.1-wirenmap6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/322a8d22-e3c3-15ff-9b4b-6783b411a3ad.png)
192.168.56.2 → 192.168.56.1からSYN SYN,ACK RSTパケットが送られている。
最後にRSTパケットが送られているので、KaliLinuxからターゲットに接続を試みた後に、Kali自身から接続を遮断している流れ。
パケットのやり取りが、前述のフルコネクトスキャンと比較して少なくなるので、時間の節約になる。また、ターゲットのサービスのログに記録されない。

# UDPスキャン
-sU
開いているポート111に次のコマンドを実行する。
```
sudo nmap -sU -p 111 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/b60ba5bd-8c6f-8640-7402-153e35f43287.png)
応答があった。ポートは開いているが、最後のICMPポート到達不能エラーは、パケットの方向が逆になっている。ポート識別の判断材料にはならない。

今度は、閉じているポート2050に次のコマンドを実行する。
```
sudo nmap -sU -p 2050 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/f1353629-9abc-ed71-e0bb-bf8a9f1ebcf7.png)
"Destination unreachable"とICMPポート到達不能エラーがかえってきたら、ポートが閉じていると判断する。

最後に、ファイアウォール(ufw)にフィルタリングされたポート631につぎのコマンドを実行する。
```
sudo nmap -sU -p 631 192.168.56.1
```
![VirtualBox_kali-linux-2022.1-wirenmap9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/f337684c-a3cc-e8d3-3b4e-bc4d7fc7432b.png)
ターゲットが応答を返さない。
nmapの出力では、
>PORT    STATE         SERVICE
631/udp open|filtered ipp

となっている。

# Pingスキャン
-sP　または -sn

対象ネットワークのIPアドレスを総当りでPingすることをPingスイーツと呼ぶ。
次のコマンドを実行。
```
nmap -sn 192.168.56.5
nmap -sP 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/d2e5ec26-9d95-bd0d-6181-66a416296aaa.png)
ARPのパケットのほか、TCPのパケットも見られる。
--send-ipオプションを付けて、WANの端末を対象としてPingスキャンをする時の動きをLAN内の再現できる。
```
nmap -sn 192.168.56.5 --send-ip
nmap -sP 192.168.56.5 --send-ip
```
![VirtualBox_kali-linux-2022.1-wirenmap11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/4814c640-e090-8068-fcf3-c478034c8fe8.png)
--send-ipオプションを付けていないときとあまり変わらないような気がする・・・。
前者も後者もtcpパケットは送っていないはずなのだが、tcpパケットのやり取りが成立している点が奇妙。同書ｐ.452に記述されているような結果にはなっていない。

# 特殊なパケットによるスキャン
特殊なパケットを送り、その反応からサービスが動いているかを確認するスキャン

## FINスキャン
-sFオプション
FINパケットは、通常、通信を終了させたいときに使用されるが、このスキャンは、通信前にFINパケットを送信して、ターゲット端末の様子を観察する。

開いているポート２１に次のコマンドを実行する。
```
sudo nmap -sF -p 21 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_fin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/c0440d6e-1f19-a1fa-71f3-fc00fe1bbbb0.png)
ターゲットからの応答はない。ポートが開いている場合、通常は応答がない。ファイアウォールなどによって、フィルタリングされている場合も応答はない。WindowsもFINスキャンに対して反応しない。

次は、閉じているポート24に次のコマンドを実行する。
```
sudo nmap -sF -p 24 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_fin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/a6863538-4458-9831-577e-4193ea70d8ff.png)
表示が分かりづらいが、"RST,ACK"と応答があるので、ポートが閉じていると判断できる。

## Xmasスキャン
-sXオプション
これは、TCPパケット（FIN/URG/PUSHの３つのフラグを設定したもの）を送信するもの。
FINは通信を終了させるフラグ、URGは緊急を要するときに用いるフラグ、PUSHはアプリケーション層へ引きつぐデータを持つパケットであることを示す。
開いているポート２１に、次のコマンドを実行する。
```
sudo nmap -sX -p 21 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_Xmas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/7e0ae830-7bc9-e85c-9a0f-ec6bafc85eb9.png)

送りっぱなしで、ターゲットからの応答はない。

次は、閉じているポート２４に、次のコマンドを実行する。
```
sudo nmap -sX -p 24 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_Xmas2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/afc3edfb-49d0-35f8-4cf3-28197d0153ef.png)

応答があった。ポートが閉じていると判断できる。

## Nullスキャン
-sNオプション
このオプションは、何のフラグも設定しないでTCPパケットを送信する。
-snオプション（Pingスキャン）と見た目が似ているが、別物。

開いているポート２１に、次のコマンドを実行する。
```
sudo nmap -sN -p 21 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_null1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/98467971-d3e6-ed10-7dd9-68252d34e69e.png)
パケットをターゲットに送りっぱなしの状態。

次は、閉じているポート２４に、次のコマンドを実行する。
```
sudo nmap -sN -p 24 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_null2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/6d98b065-d53a-c092-8330-06b80ca37904.png)
応答がある。

:::note
同書p.457に、
>フロー図の画面にて、この特殊なTCPパケットだけを表示するために、「Flow Type」を「TCP Flows」にすると、Wiresharkが落ちる

とあるが、そういったことは起こらなかった。どうやら、バグが修正されたっぽい。
:::

# ACKスキャン
-sAオプション
このスキャンは、ポートが閉じているか否かを判別せずに、ファイアウォールのルールセットを明らかにするために用いられ、ファイアウォールがステートフルか否か、どのポートがフィルタされているかなどを判別する。
開いているポート２１に、次のコマンドを実行する。
```
sudo nmap -sA -p 21 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_ack1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/0b417162-c4ae-c633-ff37-b729f56a4d1d.png)
RSTフラグのパケットが返される。

次は、閉じているポート２４に、次のコマンドを実行する。
```
sudo nmap -sA -p 24 192.168.56.5
```
![VirtualBox_kali-linux-2022.1-wirenmap_ack2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/27937c84-7f15-2331-c327-b51a8b17c1c5.png)
ポートが開いているときと同じように、RSTフラグのパケットが返される。 

最後に、ファイアフォール(ufw)でフィルタリングされているポートに対して次のコマンドを実行する。
```
sudo nmap -sA -p 80 192.168.56.1
```
![VirtualBox_kali-linux-2022.1-wirenmap_ack3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/266fee15-ef24-dd41-8f3c-72675361fd2f.png)
パケットは送りっぱなしで、応答はない。

ポートが開かれているまたは閉じている場合は、nmapの出力に"STATE unfiltered"と表示され、ファイアウォール(ufw)にフィルタリングされている場合は、"STATE filtered"と表示される。

# おわりに
まとめるとこんな感じです。

**TCPフルコネクトスキャン**
TCPのポートスキャンとしてスタンダード
ポートが開いていたら４回、閉じていたら２回、双方向でパケットをやり取りする。
フィルタリングされていたら、パケットの流れは一方通行のみ。
サービスを確実に特定できるが、後述のTCP SYNスキャンと比べて時間がかかる。

**TCP SYN スキャン**
TCPのポートにSYN要求だけを行って、途中で接続を打ち切ってしまうポートスキャン。
ポートが開いていたら３回、閉じていたら２回、双方向でパケットをやり取りする。
フィルタリングされていたら、パケットの流れは一方通行のみ。
前述のTCPフルコネクトスキャンの簡略版といった感じ。たくさんのポートをスキャンする際の、時間短縮に。

**UDPスキャン**
UDPのポートにスキャンを行う。
UDPはTCPとは違い、パケットがきちんと到達したかどうかは保証しない。
それゆえ、スキャン結果も信頼性に欠ける。また、TCPをスキャンと比較して時間がかかる。

**Pingスキャン**
ネットワーク内の端末にpingを送るスキャン。
ネットワークに接続している端末のIPアドレスなどの情報を調べる。pingを行うだけなので、ポートスキャンにはならず、ターゲットのログにも残りにくい。

**FINスキャン**
FINフラグを設定したTCPパケットを送るスキャン。
開いているポート、フィルタリングされているポートに送っても、応答はない。
閉じているポートに送ると、RST,ACKを返して応答する。

**Xmasスキャン**
FIN/URG/PUSHフラグを設定したTCPを送るスキャン。
開いているポートに送っても、応答はない。
閉じているポートに送ると、RST,ACKを返して応答する。

**Nullスキャン**
何のフラグも設定しないTCPパケットを送るスキャン。
開いているポートに送っても、応答はない。
閉じているポートに送ると、RST,ACKを返して応答する。

３つの特殊なパケットによるスキャンは、基本的に同じような振る舞いをする。
この３つのスキャンは、特定のファイアウォール、フィルタリングをすり抜けやすかったり、他のスキャン方法よりも秘匿性が高い。

**Ackスキャン**
ポートが、ファイアウォールによってフィルタリングされているかどうかを調べるスキャン。
フィルタリングされていないポートに送ると、RSTを応答する。
フィルタリングされているポートに送ると、応答はない。

参考にしたもの
「ハッキング・ラボのつくりかた」(IPUSIRON著)
「情報ネットワークの基礎」(田坂修二)
「図解でわかるネットワークのすべて」(小泉修)

https://nmap.org/man/ja/man-port-scanning-techniques.html