> For the complete documentation index, see [llms.txt](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/pentest_technique/target-discovery.md).

# Nmap

* 会社のネットワーク全体の内部侵入テストを実施する必要がある場合、ネットワーク上で生きているホストを探索するために、Nmapホスト検出オプションが使える
* wifiとかネットワークに侵入できた後に、どんなマシンがあるかなって見ていく感じ
* ここでは、ポートスキャンはしないで、本当にマシンが生きているかいないかの確認だけを扱う
* 公式ドキュメント
  * <https://nmap.org/book/host-discovery-strategies.html>
* HTBのコマンドチートシート
  * <https://drive.google.com/file/d/1dwUEr\\_Opm8-BLnQWtQ1QPW6Be-on5tWV/view?usp=sharing>

## 単一IPをスキャンする

一のホストをスキャンしてオープンポートとそのサービスを調べる前に、まずそれが生きているかどうかを判断する

```shell-session
snowyowl644@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-14 23:59 CEST
Nmap scan report for 10.129.2.18
Host is up (0.087s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds
```

| **スキャンオプション** | **説明**                         |
| ------------- | ------------------------------ |
| `10.129.2.18` | ターゲットに対して定義されたスキャンを実行します。      |
| `-sn`         | ポートスキャンを無効にします。                |
| `-oA host`    | 結果を「ホスト」という名前で始まるすべての形式で保存します。 |

* `-sn`オプション（ポートスキャンの無効化）を指定すると、Nmapは自動的にICMP Echoリクエスト（`-PE`）によるpingスキャンを行う。
* ICMP Echoリクエストを送信すると、対象が稼働中の場合はICMP Echo Replyが返ってくるのが通常。
* 以前のスキャンでICMP Echoリクエストが行われなかった理由は、ICMPを送る前にARP pingを送信し、ARP応答が返っていたため。
* `--packet-trace`オプションを使うと、実際にどのパケットが送信されているかを確認できる。
* ICMP Echoリクエストを確実に送信したい場合は、`-PE`オプションを明示的に指定する。

```shell-session
snowyowl644@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:08 CEST
SENT (0.0074s) ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD (0.0309s) ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF
Nmap scan report for 10.129.2.18
Host is up (0.023s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
```

| **スキャンオプション**    | **説明**                                   |
| ---------------- | ---------------------------------------- |
| `10.129.2.18`    | ターゲットに対して定義されたスキャンを実行します。                |
| `-sn`            | ポートスキャンを無効にします。                          |
| `-oA host`       | 結果を「ホスト」という名前で始まるすべての形式で保存します。           |
| `-PE`            | ターゲットに対して「ICMPエコー要求」を使用してpingスキャンを実行します。 |
| `--packet-trace` | 送受信されたすべてのパケットを表示します                     |

## 複数のIPをスキャン

```shell-session
snowyowl644@htb[/htb]$ sudo nmap -sn -oA tnet 10.129.2.18 10.129.2.19 10.129.2.20| grep for | cut -d" " -f5

10.129.2.18
10.129.2.19
10.129.2.20
```

オクテットでの指定もできる

```shell-session
snowyowl644@htb[/htb]$ sudo nmap -sn -oA tnet 10.129.2.18-20| grep for | cut -d" " -f5

10.129.2.18
10.129.2.19
10.129.2.20
```

* `Nmap`が`ARP request`と`ARP reply`のみを通じてホストが生きているかどうかを実際に検出することがわかる
* ARPリクエストを無効にし、目的の`ICMP echo requests`でターゲットをスキャンするには、「`--disable-arp-ping`」オプションを設定して、ARP pingを無効にすることができる

```shell-session
snowyowl644@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:12 CEST
SENT (0.0107s) ICMP [10.10.14.2 > 10.129.2.18 Echo request (type=8/code=0) id=13607 seq=0] IP [ttl=255 id=23541 iplen=28 ]
RCVD (0.0152s) ICMP [10.129.2.18 > 10.10.14.2 Echo reply (type=0/code=0) id=13607 seq=0] IP [ttl=128 id=40622 iplen=28 ]
Nmap scan report for 10.129.2.18
Host is up (0.086s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds
```

* ttlから大体のOSは特定できるよーって話
  * `ttl=64` → Linux OS/Mac OS
  * `ttl=128` → Windows OS
  * `ttl=255` → UNIX OS/ネットワーク機器

## IPスキャンリスト

* 内部ペネトレーションテスト中に、テストする必要があるホストのIPリストが提供されたら、`Nmap`で、リストからホストを読み取れる
* こんな感じで.lstファイルで書けばおけ

```shell-session
snowyowl644@htb[/htb]$ cat hosts.lst

10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19
10.129.2.20
10.129.2.28
```

事前定義されたリストで同じスキャン手法を使用すると、コマンドはこんな感じ

```shell-session
snowyowl644@htb[/htb]$ sudo nmap -sn -oA tnet -iL hosts.lst | grep for | cut -d" " -f5

10.129.2.18
10.129.2.19
10.129.2.20
```

| **スキャンオプション** | **説明**                                        |
| ------------- | --------------------------------------------- |
| `-sn`         | ポートスキャンを無効にします。                               |
| `-oA tnet`    | 結果を「tnet」という名前で始まるすべての形式で保存します。               |
| `-iL`         | 提供された「hosts.lst」リストのターゲットに対して定義されたスキャンを実行します。 |

* この例では、7つのホストのうち3つだけがアクティブであることがわかる。
* でも、他のホストがファイアウォール設定のためにデフォルトの**ICMPエコー要求**を無視してる可能性もあるので注意が必要

## ネットワーク範囲のスキャン

```shell-session
snowyowl644@htb[/htb]$ sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5

10.129.2.4
10.129.2.10
...
```

| **スキャンオプション**   | **説明**                          |
| --------------- | ------------------------------- |
| `10.129.2.0/24` | ターゲットネットワーク範囲。                  |
| `-sn`           | ポートスキャンを無効にします。                 |
| `-oA tnet`      | 結果を「tnet」という名前で始まるすべての形式で保存します。 |

* ホストのファイアウォールが許可している場合にのみ機能する。
* それ以外の場合は、他のスキャンを使用して、ホストがアクティブかどうかを確認できる
