【ハッキング・ラボ⑬】有線LANをハッキングする～ポートスキャン～

有線LANに対して、ハッキングをしていきます。
主にポートスキャンについて取り上げます。
<br>
まとめ記事（①〜⑯をまとめてます）
[【ハッキング・ラボのつくりかた】をやってみた](https://qiita.com/nakatatsu711/items/e90e6e0962bb787bf4a9)



## システム環境
`仮想化ソフト`：VirtualBox 6.1.0
`ホストOS`：Windows10
`ゲストOS1`：Kali Linux 2020.1
`ゲストOS2`：Windows7
`ゲストOS3`：Windows10
`ゲストOS4`：Metasploitable

攻撃端末はゲストOS1、ターゲット端末はホストOS、ゲストOS4です。
IPアドレスはゲストOS1が10.0.0.2、ホストOSが10.0.0.1、ゲストOS4が10.0.0.5です。



## Wiresharkについて
WiresharkはLANに流れるデータを取得するソフトウェアです。
ネットワークに関するトラブルを解析したり、未知の通信を解析したりするのに使われます。

Kali LinuxにはデフォルトでWiresharkがインストールされています。


### 起動方法
以下のコマンドで起動します。
kaliユーザーで行います。

```
$ wireshark
```

<img width="600" alt="hacking-lab-part13-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/e8553b63-e015-2fd1-01ae-982c51f46782.jpeg">

次に、「Capture」→「Options」から、eth1（ここではNAT）の「Promiscuous」にチェックが入っていることを確認、選択した後、「Start」を押します。
<img width="600" alt="hacking-lab-part13-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/c74bcce2-3333-ded7-65ad-c1e899238463.jpeg">

ここでエラーが出るので、指示の通り以下のコマンドを入力します。

```
$ sudo dpkg-reconfigure wireshark-common
$ sudo usermod -a -G wireshark kali
```

再度Wiresharkを立ち上げ、上記の操作を行います。

Firefoxを起動して、インターネットを巡回します。
すると、パケットが取得できていることがわかります。
<img width="600" alt="hacking-lab-part13-3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/417be936-8a86-fe91-be17-7bc553892950.jpeg">


### キャプチャしたデータの保存
キャプチャしたデータはpcap形式やpcapng形式で保存します。

「Stop capturing packets」ボタンを押してキャプチャを止めてから、「File」→「Save as」から保存します。

ここでは、pcap形式で保存します。



## Xplicoについて
Wiresharkは通信の流れやビット列等を分析するには向いていますが、画像やメール等を解析するにはXplicoが便利です。

Kali Linuxにインストールし、Xplicoを起動します。

```
# apt install xplico -y
# service apache2 restart
# /etc/init.d/xplico start
```

`http://localhost:9876`にアクセスします。
<img width="600" alt="hacking-lab-part13-4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/7b29f979-8a9c-7821-4e1d-d102bd783b3b.jpeg">

Usernameにxplico、Passwordにxplicoを入力してログインします。

「New Case」から「Uploading PCAP capture file/s」にチェックし、「Case name」（ここではtestcase）、「External reference」（ここでは空白）を入力し、「Create」ボタンを押します。

「Cases」から作成したCaseを選択し、「New Session」をクリックします。

「Session name」（ここではtestsession）を入力し、「Create」ボタンを押します。
<img width="600" alt="hacking-lab-part13-5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/3deea45a-3b0d-368b-aa56-42a4bd783c41.jpeg">

先程Wiresharkで保存したpcap形式のファイルを「Browse...」で選択し、「Upload」ボタンを押し、アップロードします。

アップロードすると、自動的に解析されて画面に解析結果が表示されます。
<img width="600" alt="hacking-lab-part13-6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/94827cae-e2f4-4c85-5eee-41700be35cb9.jpeg">

「Web」→「Images」を選ぶと、キャプチャファイルに含まれていた画像データを表示することもできます。



## Wiresharkでnmapのポートスキャンを解析する
ここでは、Wiresharkを使用してnmapのポートスキャンを解析してみます。

nmapには様々なスキャンが用意されていますが、今回は以下を取り上げます。

- TCPフルコネクトスキャン
- TCP SYNスキャン
- UDPスキャン
- Pingスキャン
- FINスキャン
- Xmasスキャン
- Nullスキャン

<img width="600" alt="hacking-lab-part13-7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/6d8a73fc-fcdd-ae60-f21c-e857479cb091.jpeg">

Wiresharkをバックグランドで起動します。
eth0（ホストオンリーネットワーク）を指定して、キャプチャを開始します。

```
# wireshark &
```


### TCPフルコネクトスキャン
空いているポートに対して、スキャンしてみます。

```
$ sudo nmap -sT -p 445 10.0.0.1
```

Wiresharkの「Statistics」→「Flow Graph」からフロー図を表示します。
<img width="600" alt="hacking-lab-part13-8" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/141d4bbb-867c-a50a-1ba8-4ed421ba0f06.jpeg">

まず、SYNパケットが送信されます。
「ターゲット端末が起動」かつ「ポートが開いている」ならば、許可（SYN/ACK）パケットが返ってきます。
その後はACKパケットを送信してコネクションを張ろうとします。

しかし、ターゲット端末のサービスが「つながった」、「拒否した」というログを記録するので、ポートスキャンが露見してしまいます。

また、「ターゲット端末が起動」かつ「ポートが閉じている」なら拒否（RST/ACT）パケットが返ってきます。

```
$ sudo nmap -sT -p 24 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-9" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/5535946b-fd6e-af75-feac-5d33d155ecc2.jpeg">

「ターゲット端末がダウン」または「フィルタリングされている」なら応答さえ返ってきません。

```
$ sudo nmap -sT -p 21 10.0.0.1
```

<img width="600" alt="hacking-lab-part13-10" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/fb584ea5-ef13-ba17-7897-875525ba8f34.jpeg">

このように、SYNパケットに対する応答によって、ポートが開いているか判断することができます。


### TCP SYNスキャン
空いているポートに対して、スキャンしてみます。

```
$ sudo nmap -sS -p 445 10.0.0.1
```

<img width="600" alt="hacking-lab-part13-11" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/dbcc8510-6c65-ed1e-e685-da6663ffc44a.jpeg">

2番目のやり取りまではTCPフルコネクトスキャンと同じですが、この時点でターゲット端末のポートは開いていると判断し、RSTパケットを送信します。
途中で通信を取りやめてしまうので、TCPフルコネクトスキャンと異なり、ログに記録されることもなく、ポートスキャンが露見することもありません。


### UDPスキャン
空いているポートに対して、スキャンしてみます。

```
$ sudo nmap -sU -p 111 10.0.0.5
```

Wiresharkの「Statistics」→「Flow Graph」からフロー図を表示します。
<img width="600" alt="hacking-lab-part13-12" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/2e286667-8010-d5a2-0c94-b9b433337038.jpeg">

上記のように応答があると、ポートが開いていると判断できます。

閉じているポートに対して、スキャンしてみます。
ICMP到達不能エラーが返ってきたら、ポートが閉じていると判断できます。

```
$ sudo nmap -sU -p 2050 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-13" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/e5ab1bcc-07e7-5d8c-7943-f350131e4806.jpeg">

フィルタリングされたポートに対して、スキャンしてみます。
フィルタリングされるため、ターゲット端末が応答を返すことはありません。

```
$ sudo nmap -sU -p 53 10.0.0.1
```

<img width="600" alt="hacking-lab-part13-14" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/720bb7b4-a218-db65-6203-f7dad08de605.jpeg">

UDPはTCPと違い、パケットの到達性を保証しません。
また、応答なしの場合は数回試行するため時間がかかります。


### Pingスキャン
Pingスキャンの実体はPingで疎通確認することです。nmapの仕様では、LANの端末を対象にした場合、ARP要求が用いられます。

空いているポートに対して、スキャンしてみます。
ブロードキャストにARP要求が送られ、ターゲット端末がARP応答を返しています。

```
$ sudo nmap -sn 10.0.0.1
```

<img width="600" alt="hacking-lab-part13-15" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/17118ba4-e61a-1846-1a2a-729f37aa5f41.jpeg">

一方、WANの端末を対象にした場合、nmapは上記の動きに加えて別の動きをします。
これをLANで再現するには、以下のコマンドを実行します。
ブロードキャストにARP要求を送り、ARP応答があったとします。すると、ICMPエコー要求、ICMPタイムスタンプ要求、TCPパケットを送ります。
ターゲット端末からICMPエコー応答、あるいはTCPパケットが返ってくれば稼働していると判断できます。

```
$ sudo nmap -sn 10.0.0.1 --send-ip
```

<img width="600" alt="hacking-lab-part13-16" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/391904ec-6ed1-c797-0e3e-225c17c4b3cf.jpeg">

pingコマンドはICMPエコー要求を送信します。
nmapコマンドはファイアウォールがあってICMPエコー応答を返さなくても、TCPパケットには応答を返す可能性があるので、pingコマンドより信頼性が高いといえます。


### FINスキャン
nmapには普通ではないパケットを送り、その反応からサービスが稼働しているか確認するスキャンがあります。
FINスキャン、Xmasスキャン、Nullスキャン等がそうです。
ここでは、FINスキャンについて見ていきます。

空いているポートに対して、スキャンしてみます。
FINパケットは通信終了要求に使われます。FINパケットを送信していますが、ポートが空いている場合は、応答がありません。

```
$ sudo nmap -sF -p 21 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-17" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/32e0ecab-57de-833a-8296-b72218f86d26.jpeg">

閉じているポートに対して、スキャンしてみます。
FINパケットを送信したときにTCPパケット（RST/ACK）が返ってくれば、ポートは閉じていると判断できます。

```
$ sudo nmap -sF -p 24 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-18" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/4cceaa26-8301-e8b0-1261-5c263a22f3a4.jpeg">


### Xmasスキャン
ここでは、Xmasスキャンについて見ていきます。

空いているポートに対して、スキャンしてみます。
TCPパケット（FIN/URG/PUSH）を送信しても、応答がありません。

```
$ sudo nmap -sX -p 21 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-19" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/03ec3101-42d2-9a0d-55f6-83753259d4ff.jpeg">

閉じているポートに対して、スキャンしてみます。
TCPパケット（RST/ACK）が返ってくれば、ポートは閉じていると判断できます。

```
$ sudo nmap -sX -p 24 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/8ebb5a6c-dfd5-5498-1a13-261341e7640c.jpeg">


### Nullスキャン
ここでは、Nullスキャンについて見ていきます。

空いているポートに対して、スキャンしてみます。
Nullスキャンでは何のフラグも設定しないTCPパケットを送信します。
応答がないので、ポートは空いていると判断できます。

```
$ sudo nmap -sN -p 24 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-21" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/6156247d-70c0-b27e-212d-d970dff4b938.jpeg">

閉じているポートに対して、スキャンしてみます。
TCPパケット（RST/ACK）が返ってくれば、ポートは閉じていると判断できます。

```
$ sudo nmap -sN -p 24 10.0.0.5
```

<img width="600" alt="hacking-lab-part13-22" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/9dac7c0a-5f31-79c1-579c-bd72b02a25c5.jpeg">