あなたはNmapのことを本当に理解していますか？

#初めに
皆さんこんにちは
いきなりですが、まずはnmapに関する雑学問題をどうぞ！
(答えは白文字で書かれてます)
<br><br>

Q1(Easy).nmapのオプションの数はいくつ？
A1.<font color="white">103以上</font>
([公式サイト](https://nmap.org/man/ja/man-briefoptions.html)参照)

Q2(Medium).nmapの出力をリート表記(A→4,E→3など)にする方法は？
A2.<font color="white">-oSオプションで出力する(やってみてください！)</font>
([THE DIGITALOCEAN COMMUNITY](https://www.digitalocean.com/community/tutorials/top-10-linux-easter-eggs)より)

Q3(Hard).Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。その理由は？
A3.<font color="white">特定のプリンタは TCP:9100 に対してバージョンスキャンを行うと、送信したパケットを印刷してしまう可能性があるため</font>
([@Virtual](https://at-virtual.net/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/namp%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%81%AE%E5%85%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%BB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A7%A3/)より)


<br><br>
どのくらい知ってましたか？

全部答えられた方はnmapマスターです。おめでとう！！🎉

ちなみに僕はこの記事を書くまでは一つも知りませんでした。

でも、自分が使っている「**武器**」の中身を知らないってちょっとダサいですよね。

そんな僕が勉強していく中で得た知識を備忘録がてら、共有したいなと思ってこの記事を書きました。

nmapを「**なんとなく使っている**」方は是非、一読してみてはいかがでしょうか。
#目次
・はじめに
・nmapのなりたち(歴史)
・nmapと他のポートスキャナとの違い(特徴)
・nmapのスキャン手順(メイン)
・オプションについて(おまけ)
・最後に
・参考にさせて頂いたサイト

#nmapのなりたち
nmapは1997年(23年も前！)にGordon Lyon([英wiki](https://en.wikipedia.org/wiki/Gordon_Lyon))によって作られたセキュリティスキャナです。([当時の記事](https://nmap.org/p51-11.html))
当初はLinux用のシンプルなポートスキャナでしたが、長い年月の中で、OS検出・バージョン検出・NSE・Windows/Mac対応、Zenmap(GUI)などの機能が追加されてきました。
今では、WiresharkやMetasploitなどと並ぶセキュリティツールの定番となり、映画「マトリックス」のハッキングシーンでも用いられています。
![trinity-hacking-hd-cropscale-302x250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/c04d3b65-fd2b-7dbb-d34a-16c9a63fdcd6.jpeg)![trinity-nmapscreen-hd-cropscale-418x250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/cc47bee7-306e-379f-02dd-5eb618ec161a.jpeg)
(登場した映画が[こちら](https://nmap.org/movies/)でまとめられています。結構知ってる映画が多い！)


#nmapと他のポートスキャナの違い
「ポートスキャナ」で検索するとまず出てくる名前はnmapですが、世の中には様々なポートスキャナが存在します。それらの代表として、Zmap・Masscanを主に紹介しながら、nmapの特徴を捉えていきます。

###Zmap、Masscan
[Zmap](https://zmap.io/)、[Masscan]()はどちらもインターネット上のIPv4 の全アドレス空間のスキャンを目的としたツールです。
全アドレス空間をスキャンするという目的上、もの凄い高速のスキャンが可能です。
nmapでやろうとすると2~3か月かかるところをZmapは45分、Maccanは6分で完了するそうです。([ソース1](https://srad.jp/story/13/08/21/0532257)、[ソース2](https://github.com/robertdavidgraham/masscan/blob/master/README.md))
nmapとの速度の違いを実現している秘密は、非同期型の仕組みを採用しているところです。
nmapに代表される同期型のスキャナは、一つのポートに要求を送信したのち、タイムアウトになるまで応答を待ちます。一方、非同期型のスキャナは送信スレッドと受信スレッドを別々に持つため、接続がタイムアウトする前に、次の処理に進めます。
もちろん、高速化に犠牲はつきもので、nmapに精度面で劣ります。
(参考：Capt.Meelo『[Finding the Balance Between Speed & Accuracy During an Internet-wide Port Scanning](https://captmeelo.com/pentest/2019/07/29/port-scanning.html)』) 

###Tsunami(おまけ)
本旨とは違いますが、最近話題になっていたので紹介しておきます。
[Tsunami](https://github.com/google/tsunami-security-scanner)はGoogleがつい半年前に公開したオープンソースのセキュリティスキャナです。
数百万のシステムを持つ様な大企業に向けたツールを目指しており、システムの規模に合わせて簡単にスケールすることが出来ます。
nmapなどのツールも一部ベースに使われています。
まだpre-α版ですが、興味のある方は@satto_sannさんが方法を紹介しているのでやってみてはいかがでしょうか？(記事：『[話題のGoogle製OSS - Tsunamiを試してみた](https://qiita.com/satto_sann/items/69deb12ed3f11155a284)』

###まとめ
これまでの比較を纏めると、nmapは他のスキャナに比べて
・**精度が高い**
・多くのターゲットをスキャンすると非常に**時間が掛かる**
という特徴があると言えます。
あとは、歴史が長いため**多くの機能を備えている**というところも挙げられるかもしれません。

#nmapのスキャン手順
いよいよnmapがどういう手順でスキャンを行っているのか、図表を交えて解説していきたいと思います。
nmapは、以下の段階に分けてスキャンを行っています。
(番号がないものはオプションをつけた場合のみ実行されます。)


| 番号 | 種類 |詳細| 
|:-:|:-:|:-:|
||(スクリプトの事前スキャン)|*1
|1|**ターゲットの列挙**|スキャン対象の決定
|2|**ホストの発見**|アクティブなマシンの特定|
||(ReverseDNS解決)|ホスト名の特定
|3|**ポートスキャン**|ポートの応答確認
||(バージョン検出)|*2
||(OSの検出)|*3
||(経路の追跡)|*4
||(スクリプトスキャン)|*1
|4|**出力**|収集した情報の画面出力
||(スクリプトの処理)|*1
*1：スクリプト指定時のみ
*2：``-sV``使用時のみ
*3：``-O``使用時のみ
*4：``--traceroute``使用時のみ
(参考：nmap.org『[The Phases of an Nmap Scan](https://nmap.org/book/nmap-phases.html)』)

主要なものだけ解説していきます。
###1．ターゲットの列挙
ユーザーが入力したIPアドレス・ホスト名・CIDR表記などを基にスキャン対象を決定します。
``-iL``オプションでリストを渡すことも可能です。
``-iR``オプションでターゲットをランダムに決定することもできます。(危険なので非推奨)

###2．ホストの発見
pingスキャンを行い、アクティブなマシンを特定します。
デフォルトでは``TCP ACKパケット``と``ICMPエコー要求クエリ``をターゲットマシンに送信して、その応答によって対象のマシンがアクティブかどうかを確認します。
<img width="600" alt="pingスキャン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/effadfa1-d24c-acfc-5178-ccb1ab071a58.png">
pingがターゲットのファイアーウォールによってブロックされている場合は``-P*``オプションでpingの種類を選ぶ、もしくは``-Pn``オプションでpingを送信せず、ホスト発見の段階をスキップすることが出来ます。(その場合は全てのマシンがアクティブと仮定されます。)

###3．ポートスキャン
ここが、nmapのメインオペレーションです。
ホスト発見の段階で判明したアクティブなマシンに対して、プローブパケットを送信し、その応答によってポートの状態を6種類に判別します。

|種類|詳細|
|:-:|:-:|
|open|TCPコネクション・UDPパケット受け入れ可能
|closed|パケットの応答は可能だが、listenしてるアプリケーションが無い
|filtered|プローブがポートまで到達していないので、openか判別不可
|unfiltered|アクセス可能だが、openか判別不可*1
|open&#x7C;filtered|open/filteredのどちらか*2
|closed&#x7C;filtered|closed/filteredのどちらか*3
*1：ACKスキャン時のみ
*2：応答を返さないタイプのスキャン時のみ(UDPスキャン,IPスキャンなど)
*3：IPID Idleスキャン時のみ

代表的なスキャンタイプについて[CyberSecurity.com](https://cybersecurity-jp.com/)さんが分かりやすい解説をしてくれているので引用して、紹介します。

|スキャンタイプ|解説|
|:-:|:-:|
|TCPスキャン|3ウェイハンドシェイク（SYN + SYN/ACK + ACK）が確立したときに、そのポートで通信が成立すると判断します。コネクションが確立するため、サーバーのログに記録されます。|
|SYNスキャン|コネクションを確立しないでポートの稼働状態を確認する方法です。完全な3ウェイハンドシェイクを確立しないため、ステルススキャンやハーフオープンスキャンともよばれます。<br>ポートに対してSYNパケットのみを送信して、応答を確認します。SYN/ACKを受信したときは、サービスは稼働していると判断し、RST/ACKを受信したときは、サービスが非稼働であると判断します。
|FINスキャン|FINパケットを送信し、RSTパケットを受信したら、そのポートは稼働していると判断します。もし何も帰ってこなかった場合は、そのポートは稼働していないと判断します。
|クリスマスツリースキャン|FIN、URG（緊急確認）、PUSHのフラグをセットしたパケットを送信します。ターゲットのサービスが稼働していない場合、RSTパケットが返ってきますが、サービスが稼働しているときは、何も帰ってきません。
|NULLスキャン|どのフラグも立っていないパケットを送信するポートスキャンです。<br>ターゲットのサービスが稼働していない場合、RSTパケットが返ってきますが、サービスが稼働しているときは、何も帰ってきません。
|UDPスキャン|UDPを使ったポートスキャンです。<br>ターゲットにUDPパケットを送信し、ICMP Port Unreachableメッセージが返ってこなければサービスは提供されていると判断します。UDPは通信相手への到達保障がなく、途中でICMPパケットをロスする可能性もあります。
引用：CyberSecurity.com『[ポートスキャンとは？仕組みと種類、対策方法について徹底解説](https://cybersecurity-jp.com/security-measures/29893)』

(更に詳しく知りたい方はnmap.org『[Chapter 5. Port Scanning Techniques and Algorithms](https://nmap.org/book/scan-methods.html)』参照)

###4．出力
これまでに収集した情報を、対話モードやXMLなどのいくつかの形式で出力します。
``-V``オプションでより詳細な情報を出力したり、``-d``オプションでメッセージのデバッグが可能です。

#オプションについて
最後に、nmapに無数に存在するオプションを軽く紹介しておきます。
公式サイトでは以下の11個に分類されています。

| 番号 | 種類 | |代表的なオプション | 
|:-:|:-:|:-:|:-:|
|1|TARGET SPECIFICATION|ターゲットの指定|-iL
|2|HOST DISCOVERY|ホストの発見|-Pn,-sn
|3|SCAN TECHNIQUES|スキャン方法|-sT,-sS
|4|PORT SPECIFICATION AND SCAN ORDER|対象ポートとスキャン順序|-p
|5|SERVICE/VERSION DETECTION|サービス/バージョン検出|-sV
|6|SCRIPT SCAN|使用スクリプト|-sC
|7|OS DETECTION|OS検出|-O
|8|TIMING AND PERFORMANCE|スキャンの間隔と速度|-T4
|9|FIREWALL/IDS EVASION AND SPOOFING|侵入検知の回避となりすまし|-f,-D
|10|OUTPUT|出力方法|-oN
|11|MISC|その他|-A

(参考：nmap.org『[オプション概要](https://nmap.org/man/ja/man-briefoptions.html)』)

オプションについてはnmap.org含め、多くのサイトで紹介されているので、ここでは表程度にとどめておきます。
(僕が見た中だと、IPUSIRONさんが書かれた『ハッカーの学校』([Amazon](https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%AE%E5%AD%A6%E6%A0%A1-IPUSIRON/dp/4781701973))という本が一つ一つのオプションを丁寧に解説しているのでおススメです。)

#さいごに
長い文章でしたが、読んで頂きありがとうございました。
nmapの基礎的な部分をなるべく簡単に書いたつもりですが、間違い等あれば指摘いただければ幸いです。
それでは失礼させて頂きます。

P.S．
nmap.orgは偉大

#参考にさせて頂いたサイト
公式サイト『[Nmap.org](https://nmap.org/)』
Wikipedia『[nmap](https://ja.wikipedia.org/wiki/Nmap#cite_note-8)』
@<wbr>Virtual『[Nampスキャンの全コマンド・オプションを日本語解説](https://www.atmarkit.co.jp/ait/articles/0801/08/news127.html)』
その他記事中に随時記載