Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What are the problem?

posted at

updated at

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

初めに

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


Q1(Easy).nmapのオプションの数はいくつ?
A1.103以上
(公式サイト参照)

Q2(Medium).nmapの出力をリート表記(A→4,E→3など)にする方法は?
A2.-oSオプションで出力する(やってみてください!)
(THE DIGITALOCEAN COMMUNITYより)

Q3(Hard).Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。その理由は?
A3.特定のプリンタは TCP:9100 に対してバージョンスキャンを行うと、送信したパケットを印刷してしまう可能性があるため
(@Virtualより)




どのくらい知ってましたか?

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

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

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

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

nmapを「なんとなく使っている」方は是非、一読してみてはいかがでしょうか。

目次

・はじめに
・nmapのなりたち(歴史)
・nmapと他のポートスキャナとの違い(特徴)
・nmapのスキャン手順(メイン)
・オプションについて(おまけ)
・最後に
・参考にさせて頂いたサイト

nmapのなりたち

nmapは1997年(23年も前!)にGordon Lyon(英wiki)によって作られたセキュリティスキャナです。(当時の記事)
当初はLinux用のシンプルなポートスキャナでしたが、長い年月の中で、OS検出・バージョン検出・NSE・Windows/Mac対応、Zenmap(GUI)などの機能が追加されてきました。
今では、WiresharkやMetasploitなどと並ぶセキュリティツールの定番となり、映画「マトリックス」のハッキングシーンでも用いられています。
trinity-hacking-hd-cropscale-302x250.jpgtrinity-nmapscreen-hd-cropscale-418x250.jpg
(登場した映画がこちらでまとめられています。結構知ってる映画が多い!)

nmapと他のポートスキャナの違い

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

Zmap、Masscan

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

Tsunami(おまけ)

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

まとめ

これまでの比較を纏めると、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』)

主要なものだけ解説していきます。

1.ターゲットの列挙

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

2.ホストの発見

pingスキャンを行い、アクティブなマシンを特定します。
デフォルトではTCP ACKパケットICMPエコー要求クエリをターゲットマシンに送信して、その応答によって対象のマシンがアクティブかどうかを確認します。
pingスキャン.png
pingがターゲットのファイアーウォールによってブロックされている場合は-P*オプションでpingの種類を選ぶ、もしくは-Pnオプションでpingを送信せず、ホスト発見の段階をスキップすることが出来ます。(その場合は全てのマシンがアクティブと仮定されます。)

3.ポートスキャン

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

種類 詳細
open TCPコネクション・UDPパケット受け入れ可能
closed パケットの応答は可能だが、listenしてるアプリケーションが無い
filtered プローブがポートまで到達していないので、openか判別不可
unfiltered アクセス可能だが、openか判別不可*1
open|filtered open/filteredのどちらか*2
closed|filtered closed/filteredのどちらか*3

*1:ACKスキャン時のみ
*2:応答を返さないタイプのスキャン時のみ(UDPスキャン,IPスキャンなど)
*3:IPID Idleスキャン時のみ

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

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

引用:CyberSecurity.com『ポートスキャンとは?仕組みと種類、対策方法について徹底解説

(更に詳しく知りたい方はnmap.org『Chapter 5. Port Scanning Techniques and Algorithms』参照)

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『オプション概要』)

オプションについてはnmap.org含め、多くのサイトで紹介されているので、ここでは表程度にとどめておきます。
(僕が見た中だと、IPUSIRONさんが書かれた『ハッカーの学校』(Amazon)という本が一つ一つのオプションを丁寧に解説しているのでおススメです。)

さいごに

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

P.S.
nmap.orgは偉大

参考にさせて頂いたサイト

公式サイト『Nmap.org
Wikipedia『nmap
@Virtual『Nampスキャンの全コマンド・オプションを日本語解説
その他記事中に随時記載

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
9
Help us understand the problem. What are the problem?