Pentester への道(1) - Nmap の使い方まとめ
*初学者が公式リファレンスをもとにまとめている内容です。間違いなどあるかと思いますので、お気づきの方はご指摘いただけますと幸いです。
また、ここで説明されているツールを無許可で使用することは禁じられていることがあります。あくまで使用方法をまとめただけであり、一般に広く使用されることを奨励するものではありません。
Nmapとは
Nmap( Network Mapper ) は オープンソースのツールで、ネットワークやセキュリティ設定を確認するために用いられます。
Pentesting においては特に重要なツールで、攻撃対象のネットワークの構成を理解する手助けをしてくれます。
余談ですが、Nmapは映画でハッカーが活躍するシーンで用いられていることがあるみたいです。一度見てみたい!

基本構造
以下の公式リファレンスを参考にまとめてみます。
構造は以下の通り。
nmap [ <Scan Type> ...] [ <Options> ] { <targets> }
例
nmap -A {url/IP_address}
そこまで難しいものではなさそうですが、さまざまな options があり、奥が深そうです。もう少し細かくみていきましょう。
用途
大きく3つに分けられるかと思います。
Host Discovery: 攻撃対象のホストを見つける
Port Scan: 攻撃対象のポートを見つける
Details: 攻撃対象について、より詳しく知る
Host Discovery
最初に行いたいことは「攻撃対象のホスト」を見つけることです。CTF などではホストの IP Address が最初から指定されていることもありますが、複数の IP Address が提示されたとき、一つずつ見ていくのはとても時間がかかります。どのホストを詳しくみていくか、という優先順位付けのためにもまずはこの作業を行います。
初心者向け解釈
卑近な例で言うと、「ホスト」はそれぞれの家・商店、と言っていいかもしれません。家にいて荷物を受け取るとき、それはまた別の家・商店から送られています。
荷物=インターネット上を流れる情報
荷物を受け取る私の家や、送ってくる他の商店=ホスト
といったイメージです。
家・商店はそれぞれいろいろなサービスを提供しています。例えばある商店は本屋だったり、別の商店は八百屋だったりします。
それぞれの家がどこにいるのかを見つけるのが Host Discovery、どういったサービスを提供しているのかを知るのが Port Scan、といった具合です。
ここでよく使われる options は以下のようなものがあります。なお、 options はこの後の別の用途にも使われることがあります。
-PE: ICMP echo requests(Ping Echo で覚えた)
ICMP エコー要求を使用して Host discovery を行う
-sn: No port scan(Scan No で覚えた)
ホストを見つけた後に Port scan を行わないようにする設定
Ping scan とも言われる
Port scan を行わない分クイックに実施できる
-Pn: No ping(Ping No で覚えた)
Host discovery 自体をスキップする
後述の Scanning に移ってくれるので、その分速くなる
--disable-arp-ping
ARP Request/Reply による Host discovery を行わない
デフォルトではこれを使って Host discovery をしている
Local の ethernet network に対しては、-PE や -Pn を入れていたとしても、ARP ping を明示的に disable する必要がある
--packet-trace
どのような通信があったかを一つずつ明示してくれる
Port Scan
Port states
Port scan を行うにあたり、Port はどういった状態にあるのかを知る必要があります。
初心者向け解釈
Port は直訳すると「港」ですが、イメージは「窓口」だと思います。先ほど「ホスト」で説明したように、ホストはいろいろなサービスを提供しているわけですが、サービスごとに窓口があります。
例えば、郵便局に行って荷物を送りたいときと、書留を送りたいとき、おそらく別の窓口に並ぶと思います。同じように、ホストはサービスごとに別の窓口を用意しています。どの窓口があるのか、窓口が開いているかどうか、を見るのが Port Scan というわけです。
Nmap では6つの状態に分けています。
open
closed
filtered
unfiltered
open|filtered
closed|filtered
open や closed はその名の通り、その port が開いているか、閉まっているかを教えてくれます。Open ports に対して Pentest を行うことが一般的なので、どこが open しているかを知ることは非常に重要です。
ただ、そんなに簡単に見つけられないこともあります。他の4つの状態をみていきましょう。
filtered
Nmap がその port が開いているかどうか判断できないときに表示されます。
判断できない理由としては、多くの場合、 firewall によって Nmap が送ったパケットが drop されるか reject されるために port まで到達できず、その結果返答をもらえないためです。
--packet-trace を追加すると drop されたのか reject されたのかのヒントを得ることができます。
また、drop された場合は何もエラーが出ないこともあり、その際 Nmap はパケットを再送します。その結果、scan が終わるまでの時間がより長くなってしまいます。
unfiltered
Port にはアクセスできるが、Nmap が開いているかどうか判断できないときに表示されます。基本的にはあまりお目にかかることはなく、TCP-ACK scan を行ったときのみ表示されます。その際は SYN scan などを改めて行うことで判断ができます。
open|filtered
Nmap がその port が open なのか、filtered なのか判断できないときに表示されます。filtered との違いはなんなのか、というところですが、公式リファレンスを読む限りは UDP scan を行ったときなどに表示されるようです。
UDP scan においては、UDP port からの返答がないケースが多いからのようです(自信がないですが・・・)。
closed|filtered
IP ID idle scanのときのみに表示される、という記載がありました。まだよくわからないので、また後日勉強します。
Scanning Techniques
どのような形で scan を行うかは同じように options で決定します。
-sS: TCP SYN scan(scan SYN で覚えた)
SYN packet を送り、相手から SYN/ACK や RST という返答をもらうことで port を scan します
SYN scan は管理者権限でNmapを回した際のデフォルトとなっており、速くかつ攻撃対象のホストに悟られにくいこともあり、もっとも popular な方法のようです。
SYN scan を行うには、raw packet privileges なるものが必要だから
half-open scan とも呼ばれる
TCP connection を確立しないため
-sT: TCP connect scan(scan TCP で覚えた)
TCP の3ウェイハンドシェイクによって port scan を行う方法
SYN packet を送り、相手から SYN/ACK が帰ってきて、こちらが ACK を送るという形でコネクションを確立する方法が3ウェイハンドシェイク
コネクションを確立してしまうので、scan にかかるスピードが遅くなり、相手方にもコネクションしたというログが残ってしまうので、可能であれば SYN scan をしたい
-sA: TCP ACK scan(scan ACK で覚えた)
3ウェイハンドシェイクの最後の ACK packet を送る
他の scan とは異なり、port が開いているかどうかを確かめるものではなく、firewall のルールや機能を確かめるために使用する
firewall や IDS/IPS がフィルターするのは難しいため
Port は open もしくは closed の場合、RST packet を送り返してくる
これらの port を unfiltered として分類する
open か closed かは判断できない(前述の通り)
SYN scan などで判断する
-sU: UDP scan(scan UDP で覚えた)
UDP port に対しての scan を行う
TCP scan よりも遅く難しい
そのため見過ごされがちでもある
他にも Xmas スキャンなるものもあるそうな。公式リファレンスには
Sets the FIN, PSH, and URG flags, lighting the packet up like a Christmas tree.
などと書いてありました。クリスマスツリーのように・・・?
Port Specification and Scan Order
どの port を scan 対象にするか、という options もあります。
何も指定しない場合は、よく使われる1,000 ports のみを対象にします。
-p <ports>: 特定の port のみを scan する
-p22, -p1-100 のような書き方をする
数字との間にはスペースがあっても良い(はず)
-p- で全ての(65535) port を scanする
時間がかかる
CTF を始めてみて、まずは普通に scan して、その後 background でこれを回すのがいいと感じました
-F: Fast scan
Top 100 ports に絞る
--top-ports <n>
Top n portsに絞る
Service, Version, OS detection
どの port が開いているかわかった後に知りたいのが、その port 番号上でどのようなサービスが運用されているかだったり、それらのサービスのバージョンだったり、そもそもどの OS 上でサービスが運用されているかだったり、というものです。
サービスと port 番号は紐づいていることが多いですが、いつもそうというわけではありません。また、バージョンによっては脆弱性を抱えていたり、OS 特有の問題もあるので、その辺りも知りたいというわけです。
初心者向け解釈
先ほど port は窓口だと言いましたが、その窓口で実際にどのようなサービスが行われているか知らないと、間違った窓口に並んでしまう可能性がありますね。
例えば郵便局の窓口でお金を受け取れるとしましょう。本来であれば本人確認をしっかりと行う必要がありますが、手続き上不備があったとすれば、他の人になりすましてお金を受け取ることができてしまいます。その手続きの不備が脆弱性で、郵便局の局長さんはそれを見つけ次第直していく必要があります。
いつも通り、この部分にも options があります。
-sV: Version detection(scan Version で覚えた)
サービスの内容やそのバージョンを検出します
-O: OS detection
どの OS を使用しているかを検出します
-A: Aggressive scan
-sV や -O などを同時に scan ができます
後述する -sC や --traceroute も含めての scan となるみたいです
Scripting Scan
Nmap で最も面白く、パワフルなものがこの scripting scan だと思います。
習いたての頃はよくわからなかったのですが、今持っているイメージは、
「カスタマイズされた script を用いて、host や port やサービス内容についてより詳しく理解することができる」というものです。
さまざまなことをまるっと理解するための script もあれば、特定の用途のために開発された script もあり、用途に合わせて使い分けることで、さまざまな情報を得ることができます。
Options は以下の通り。どちらかと言えば、どういった script を使うかの方が重要なんだと思います。
-sC: Script scan(scan sCript で覚えた)
デフォルトで用意されている scripts を用いて script scan を行います
--script <file>
特定の script を回す際は、その file 名を上記のように指定します
--script <category>
Scripts はカテゴリ別にも分けられており、そのカテゴリに属す scripts を一度に回したいときは上記のように指定できます
--script auth: Authentication 関連
--script vuln: 脆弱性関連
--script-args <name>=<value>
Scripts で用いられる設定をカスタマイズしたいときに、引数を設定する方法です
--script-args 'user=foo,whois={whodb=nofollow+ripe},xmpp-info.server_name=localhost'
のように、複数ある場合はコンマで繋ぐようです
まだ使いこなせていないので、要学習だと感じています
初心者向け CTF の write-up(どのように攻撃して flag を得たかを書き記したもの)を読むと、だいたい
-sC -sV
というのを見る気がします。現場でどこまで使われているかはわかりませんが・・・。
Performance
ここまで書いてきたように、Nmap にはさまざまな機能があり、何をどの粒度で行うかによって、どの程度時間がかかるかが決まってきます。
時間があまりにもかかりすぎてしまったら、それだけで Pentest が終わってしまいますが、一方で、あまりにも雑に scan をしてしまうと、正しい情報が得られません。
私はまだそこまで performance optimization をしたことがないのですが、CTF でたまに見かける options を羅列してみました。
--max-retries <n>
前述の port scan において、drop されると返答が返ってこないため、一定時間ののちにパケットを再送します。それが時間がかかる原因になるわけですが、何回まで再挑戦するか、を決めるものがこの option です。
--max-retries 0 とすると、再送することがなくなります。
--min-rate <n>
どれだけの数のパケットを同時に送るかを決めるものです。
この数を増やすほど一度に多くのパケットを送ることができるため、スピードアップになりますが、一方で精度が低下します
--min-rate 100 などと指定します
-T <n>|<preset>
あらかじめ performance に関わるさまざまな options を組み合わせたプリセットがあり、それを指定する方法です
-T 0 もしくは -T paranoid などと指定します
数字は0-5の6段階あり、数値が大きくなるほどよりスピード重視になります
デフォルトでは-T3 のようです
数字ではなくそのプリセット名を指定してもいいようです
0: paranoid
1: sneaky
2: polite
3: normal
4: aggressive
5: insane
一番スピード重視なプリセット名が insane (正気ではない)というのは面白いですね。
Firewall & IDS/IPS Evasion
Port scan で少し出てきましたが、firewall やIDS/IPS といった「監視ツール」に見つかってしまうと、Pentester としては攻撃の糸口を見つけることができません。いかにこのような監視ツールから逃れるかが鍵となってきます。
それに応じた options も多々あるようです。
初学者なので詳しいことはまだわからず、一つだけみていきます。
--source-port <n>
こちら側の port 番号を偽装する設定です
ここでよく用いられるものは DNS 53番です
DNS reply が53番からくることから、この port を無条件に信頼しているケースがあるらしい
--source-port 53 と指定します
Output
ここまでの scan の結果は全てコマンドライン上に表示されます。ただ、それを保存して後から見たい、もしくはもう少し細かく見たい、といったニーズもあります。
-oA <output_name>: Output to all formats(output All で覚えた)
アウトプットを、Nmap がサポートしている全てのフォーマットで保存してくれるという設定です
normal(.nmap), grepable(.gnmap), XML(.xml) という3つのフォーマットがあります
-v: increase verbose level
より詳しい情報が欲しい、というときにこの option を追加します
Computer science を勉強するまで verbose という言葉はよく知らなかったのですが、「もっと詳しく!」みたいなニュアンスで使われているケースが多い印象です
終わりに
初めてにしては7,000字を超える超大作になってしまいました。その割に内容が読みやすいか、また誰を対象にしているのかと言われると答えられないですが笑、書くために公式リファレンスを読むことで理解が深まりました。
公式リファレンス、恥ずかしながらあまり読んだことないですが、ちゃんと読めばちゃんと知りたいことが(ほぼ)過不足なく書かれていますね。
初心者向け解釈も途中まで書いていましたが、もう少し上手く書けたらいいなと思います。今後個別のプロトコル・サービスについても学んだ結果をアウトプットしようと考えていますが、そこで練習していきたいです。
間違いなどあれば適宜ご指摘ください。また、それ以外でもコメントなどいただけると嬉しいです。
ここまで読んでいただき、ありがとうございました。