Nmap command and script

Nampスキャンの全コマンド・オプションを日本語解説|ネットワークのセキュリティーはNmapで抑えよう

投稿日: カテゴリー: セキュリティ
Pocket

世の中にはたくさんのペンテスト・脆弱性診断ツールがありますが、全ての現場で利用されていたツールが2つだけあります。
「Nmap」「Burp Suite」です。今回は「Nmap」の方にフォーカスを当てて解説していきたいと思います。
「Nmap」のイメージは一般のハッキングのイメージに非常にマッチしているため、マトリックスやダイ・ハード4.0などの映画のシーンにも利用されています。ただNampを利用する人でしっかり仕組みを理解している人は少数派です。なんとなくポートスキャンをするツールがこれほど世界的に利用されるツールになる訳がありません。

皆さんは「FTPバウンス攻撃を再現するオプション」「IPv6でスキャンすオプション」はご存知でしょうか。
Nmapでは実に多様な環境でネットワーク・プラットフォームの診断、ペンテストを行う機能を有しています。
また、NmapはNetwork Mapperの略で現在ではセキュリティ監査やペンテストツールのイメージが強いですが、ネットワーク・インベントリ情報の収集やサービスのバージョン管理などネットワーク上の情報資産にも利用されているツールです。

検知されたサービスについての知識も必要になるので、ポート毎のセキュリティ観点も合わせて紹介していきます。

さて、オプション紹介の前にNmapの知識試しに次の問題を解いてみましょう。

Nmap Hackテスト

①Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。その理由はなぜでしょう?
②特権でないと利用できないオプションは何でしょう?
③ポートスキャンのみの場合と-sVなどのサービス検知オプションをつけた場合で検知されたサービス名自体が異なるケースがあるのはなぜでしょう?
④ポートスキャンにおいて-sPの代わりに-snを使うべき理由は何でしょう?

①回答
特定のプリンタは TCP:9100 に対してバージョンスキャンを行うと、送信したパケットを印刷してしまう可能性があるためです。このため、Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。
②回答
–script broadcast-wpad-discover
LAN上にあるプロキシサーバの一覧を取得するオプションですがDHCPのアドレス取得時には、nmapが特権モードで実行されている必要があるため、特権でないと実行されません。
–script mysql-dump-hashes
MySQLサーバからパスワードハッシュをJohn-the-ripperなどででクラック可能な形式でダンプするオプションです。
-script rlogin-brute
rloginサービスに対し、ブルートフォースのパスワードクラックを行うオプションです。UNIX上で特権モードでの実行が必要となります。
③回答
ポートスキャンではポートに紐づくデフォルトのポート番号のリストからサービス名を出力しているのに対し、-sVではサービスの特定を行って出力しているためことなる場合があります。
④回答
-sPはICMPのみでなく80,443番ポートにもTCPパケットを送り、同セグメントではARPも送信します。純粋にPingスキャンを目的にする場合、-snを利用しないと他に飛ばしているパケットの理由の説明を求められる可能性があります。
さて知識をおさらいしたところで本題に入っていきます。

Nmapのインストール

まず、Nmapが入っていないことには始まらないので、インストールから始めます。
Nmapはここからダウンロード可能です。WindowsやLinuxだけでなくMac OS Xでも利用可能ですが、オプションにより特権が必要になります。
Ubuntu であれば$ sudo apt-get -y install nmapのコマンドでインストールできます。
「nmap -v」と打って以下のようにバージョンが表示されれば、インストールはできています。(例はKali linux)
どのNmapバージョンで実行した結果かというのも重要になるため、ペンテストや診断前には必ずnamp -vでバージョンを確認後開始しましょう。

root@kali:~# nmap -v
Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-03 06:27 JST
Read data files from: /usr/bin/../share/nmap
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.11 seconds
Raw packets sent: 0 (0B) | Rcvd: 0 (0B)

Nmapオプションの解説

Nmapのコマンド指定の基本形は以下の通りです。

nmap <スキャン方法>の指定 IPの指定 Portの指定

ターゲットの指定・除外方法

IPの指定(Target Specification)

1IPのみ
nmap 192.168.0.1
IPv6での指定方法
nmap -6 2607:f0d0:1002:51::4
複数を直書きで指定
nmap 192.168.0.1 192.168.1.1
範囲で指定
nmap 192.168.0.1-254
ドメインで指定
nmap scanme.nmap.org
プレフィックス記法(CIDR(Classless Inter-Domain routing))で指定
nmap 192.168.1.0/24
ファイルで指定
「-iL」Nessusにファイル取り込みで指定するオプションがあるので併用する場合は有用です。
nmap -iL (ファイルパス)targets.txt
ランダムに100個スキャン
※自己管理の閉じたネットワーク以外では確実に違法行為になるので知識にとどめましょう
nmap -iR 100
特定のIPを除外したい場合
範囲指定と組み合わせると便利
nmap –exclude 192.168.1.1
ファイルに記載した特定のIP除外したい場合
除外範囲が複雑、数が多い場合に便利
nmap –excludefile (ファイルパス)targets.txt

ポートの指定と順番の指定(PORT SPECIFICATION AND SCAN ORDER)

特定のプリンタは TCP:9100 に対してバージョンスキャンを行うと、送信したパケットを大量に印刷してしまいます。このため、Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。
ビットコインで有名なEthereumですが、8545/TCPはEthereumクライアントは以下の条件で悪用、最悪不正送金などの被害に合う可能性があります。
①8545/TCPがオープンポートで、、インターネット上からJSON RPCが利用可能であること
②EOA(Externally Owned Account)のUnlockが可能であること
ポート決め打ち
nmap 192.168.1.1 -p 21
ポートレンジ(範囲)で指定
nmap 192.168.1.1 -p 21-100
TCP,UDP毎の指定
nmap 192.168.1.1 -p U:53,T:21-25,80
全ポートのスキャン、全ポートと言いながらポート0,9100はスキップしています。(実行には特権が必要です)
nmap 192.168.1.1 -p-
0番ポートから本当に全スキャンかけたい場合はこの指定オプションになります。(実行には特権が必要です)
nmap 192.168.1.1 -p0- Leaving off end port in range makes the scan go through to port 65535
サービス名を指定してのスキャン
サービスのデフォルトのポートなので、変更しているとスキャンされない点に注意が必要です。
nmap 192.168.1.1 -p http,https
TOP〇〇番めまでのポート(独自選定)のスキャン、全スキャンはしたくないけど有名なところだけ抑えたい場合などに利用します。
–top-ports nmap 192.168.1.1 –top-ports 1000
除外ポートを指定できます。
nmap 192.168.1.1 –exclude-ports ランダムにせず、ポート番号順にスキャンします。(Scan ports consecutively – don’t randomize)
nmap 192.168.1.1 -r スピード重視でスキャンします。通常Nmapは、プロトコルごとに一般的な1000ポートをスキャンしますが、このオプションにより100ポートに限定します。
nmap 192.168.1.1 -F Fast port scan (100 ports)
指定の使用率より大きい数値が設定されているポートのみをスキャンします。
nmap 192.168.1.1 –port-ratio <0と1の間の少数>

スキャン方法の指定(SCAN TECHNIQUES)

-sS … (TCP SYNスキャン/TCPハーフスキャン
ステルス・スキャンの一種、接続を完了しないためサーバーではこれをログに記録しないことが多いことを悪用します。TCPのSYNパケットを送ってSYN+ACKが返ってくるか調べればサービスのオープンが確認できるので、接続を完了する際のACKを返さず、SYN RSTを返して接続を完了しないままキャンセルしてしまいます。
-sT … TCP Connectスキャン
スキャンを行うプロトコルとしてTCPを明示的に指定する場合に利用します。ログにしっかり残るので簡単に発見できます。
-sU … UDP Scanスキャン
UDPを明示的に指定する場合に利用します。標的ポートにUDPパケットを送信し、標的ポートが “ICMP port unreachable” というメッセージで応答したポートがなければ稼動していることがわかります。稼働していない場合は何も返ってきません。スキャンの使用上TCP Connectスキャンに比べかなり時間がかかります。
-sW … Windowスキャン
windowとはTCP通信でデータを連続送信する際に使われるバッファ制御
特定のOSではポートが待ち受け状態にある場合、返信パケットにウィンドウサイズをセットして返す。これが0以外であればポートが開いていると判ります。

-sM … Maimonスキャン

-sA … ACKフラグだけのパケットを送って調べる(TCP ACKスキャン)
不正なACKフラグパケットには無条件でRSTフラグパケットが返されます。RSTフラグが返された場合、ファイアウォールのフィルターが存在しないか、あるいはSYNフラグパケットのみをフィルタリングするシステムであるかということが推測されます。一方、もしRST応答以外の反応があった場合は、そのポートはファイアウォールによってフィルタリングされているということを示すことになります。
-sI … -sI (Idleスキャン)
指定の送信元を踏み台にして送信元偽装を行うスキャン方法です。スキャン元のIPアドレスが全く記録されないというスキャン方法です。

Step1 対象ホストにゾンビホスト(踏み台ホスト)のIPアドレスを送信元とした偽装したSYNパケットを送信します。
Step2.ポートが開いていれ ばYSN/ACKを、開いてなければRST/ACKをゾンビホスト(踏み台ホスト)へ送信します。
Step3.ターゲットホストからSYN/ACKパケットを受け取った場合はRST/ACKを送信し、RST/ACKを受け取った場合は何も送信ません。
Step4.攻撃元ホストからStep3.の様子を観察することでターゲットホストのポートが開いているかどうかを判断することができます。

-sY/sZ … SCTP INIT/COOKIE-ECHO scans

-sO … IP protocol scan

-b … -b : FTP バウンス スキャン
FTPプロトコル(RFC 959)は、プロキシFTP接続に対応しています。これを悪用しファイルを第三者サーバに送るように要求できます。そのため原則この機能が無効化が推奨されています。
-sN … まったくフラグなしのパケットを送って調べる(TCP Nullスキャン)
RFC793では「SYN、RST、ACKなどのフラグビットを含まないパケットに対しては、ポートが閉じている場合はRSTが返され、ポートが開いている場合は何の応答も返されない」としているため間接的にオープンポートの情報を与えてしまいます。
-sF … FINフラグだけのパケットを送って調べる(TCP FINスキャン)
ステルススキャン(stealth scan)の一種、サービスが提供されているポートについては、何も帰って来ません。
サービスが提供されていない場合は、RSTパケットがを送り返します。したがって、RSTが返ったらサービスが稼働していると判断できます。
-sX … FIN/PSH/URGフラグを立てたパケットを送って調べる(クリスマススキャン)
標的サービスが稼働してなければRSTパケットを返しますが、稼働していれば何も返ってきません。FINスキャンの逆です。
–scanflags : フラグを自由設定してスキャンする(Customize TCP scan flags)

ホストの検出(HOST DISCOVERY)

-sL … List スキャン- simply list targets to scan

-sn … Pingスキャン ICMPのみで判断

Ping スキャンタイプ

-Pn … ICMPのみでなく80,443番ポートにもTCPパケットを送り、同セグメントではARPも送信しホストの存在を判断
-PS … TCP SYN スキャン(デフォルトはポート 80)
-PA … TCP ACK スキャン(デフォルトはポート 80)
-PU … Ping スキャンタイプとしてのUDPスキャン
-PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
-PE … ICMP エコー (Echo)スキャン
-PP … ICMP タイムスタンプ (timestamp)スキャン
-PM … ICMP アドレスマスクスキャン(netmask)スキャン
-PO … ホストの検知をおこなわずスキャンします。

DNSに関するオプション

-n … ホストを検出した場合でもDNSの逆引きを行わない
-R … 全てに対象(検出したホスト)のIPに対しDSNの逆引きを行う
–dns-servers … DNSの逆引き用のサーバーを指定する、指定なしの場合は動作ホストの定義に従う
–system-dns … DNSへの問い合わせをシステムのリゾルバを使用して行う
–traceroute … Trace hop path to each host

OSの検出(OS DETECTION)

※OSの検出には特権が必要になります。
-O … Enable OS detection
「-O」オプションでOSの種類まででバージョンは特定しません。
-A … Enable OS detection, version detection, script scanning, and traceroute
「-A」オプションでOSの種類とそのバージョンを検知する事が出来ます。
–osscan-limit … OSの検出をopenもしくはclosedのTCPポートを検出した対象のみに限定
–osscan-guess … Nmapが完全なOS検出できない場合、類似する情報を提示する、完全でなくても部分的で問題ない時

サービスとバージョンの特定(SERVICE/VERSION DETECTION)

-sV … バージョン検出、 126パターンが 登録されていますが–version-intensity 8、9に81のパターンが入っているのでデフォルトでは3割程度しか検査していません。ただし、8、9はかなり時間が掛かるので注意して実行してください。
–version-intensity … バージョン検出に対する精度を0-9で指定(デフォルトは7)
–version-light … バージョン検出の精度を(intensity 2)に指定
–version-all … バージョン検出の精度を(intensity 9)に指定
–version-trace … バージョンスキャンのトレース情報を表示
-sR … RPCスキャン,空のコマンドを送信することで相手のRPCのバージョンを取得する
-sVの中に内包されているので、特殊な需要しかない。rpcinfo -pの結果と同じ情報が得られます。(TCP 111、UDP 111)UDP 111 に対して偽装したデータを送りつけ、UDPリフレクション攻撃を行う
8545/TCP(ethereum)

スクリプトを利用したスキャン(SCRIPT SCAN)

-sC … デフォルトのスクリプトでスキャンします。–script=defaultと同じです。
–script= … スクリプトを明示的に指定してスキャンします。
–script-args= n1=v1,[n2=v2,…] … スクリプトへの引数を指定します。
–script-args-file=filename: provide NSE script args in a file
–script-trace … –packet-traceオプションが設定された際に、スクリプトの動作をトレースします。
–script-updatedb … scripts/script.dbのデータベースを更新します。
–script-help= … スクリプトコマンドのヘルプ、コマンドのカテゴリ、ファイル、スクリプトのリストを表示します。

検知回避となりすまし(FIREWALL/IDS EVASION AND SPOOFING)

検知の回避の前に、検知してくるファイアウィールやIDSについて知っておく必要があります。
まずはファイアウィールの基本であるiptablesについて知っておきましょう。
iptablesはLinux環境に標準に実装されたパケットフィルタリングおよびNAT(ネットワークアドレス変換)機能であるNetfilterの設定を操作するコマンドです。
設定は特権で行います。現状のルール確認を行う場合はiptables -L -v -t filterを実行し表示すると良いでしょう。
表示内容を理解するために①Chain、②target、

①Chain

iptableの設定は「iptables -t filter -A INPUT -p tcp -j ACCEPT」のように行うがこのINPUTはルーティングされてLinuxに入ってくる時のルールを示しています。すなわちChainとは設定したLinuxに対してルーティングされたパケットが入ってくた時(INPUT)、フォワードする時(FORWARD)、出て行く時(OUTPUT)と流れをざっくり分けて、それぞれの場合のパケットの扱いをどうするのかをその下に書いていくためのタイトルです。つまり表示の内容は以下の通りとなります。

Chain INPUT (policy DROP)
(パケットが入ってくた時の扱い)
Chain FORWARD (policy DROP)
(フォワードされた時の扱い)
Chain OUTPUT (policy ACCEPT)
(パケットが出ていく時の扱い)

初期状態はpolicy ACCEPTとなっているかもしれませんが、INPUT,FORWARDは原則policy DROPです。policy DROP、すなわち「全ての通信を遮断した上で必要な通信だけ許可する」はセキュリティの大前提だからです。

-f … パケットをフラグメント化して送信 f一個で8バイトのフラグメント化ができます。複数個で8バイト×指定した-fの数のフラグメント化ができるが、仕事ではぱっと見が判かりずらいので、下記の「–mtu」を使って指定します。
–mtu … パケットをフラグメント化して送信 –mtuのあとに数字を書くだけなので-fより判りやすいです。
-D  decoy1,decoy2 … 指定したデコイ(おとり)からもスキャンをすることで、複数のホストからスキャンされているように見せかけることができます。ポートの偽装は「–source-port」」で行うことができます。
-S … ソースIPアドレスを設定
-e … 指定したインターフェースを使用(eth0など)
-g/–source-port … Nmapが使用する自局のポート(ソースポート)を指定、送信元ポートの偽装などに利用されます。
–proxies url1,[url2], … Relay connections through HTTP/SOCKS4 proxies
–data … Append a custom payload to sent packets
–data-string … Append a custom ASCII string to sent packets
–data-length … Append random data to sent packets
–ip-options … Send packets with specified ip options
–ttl … TTL(time-to-live)を設定し送信する
–spoof-mac … MACアドレスを指定するオプション、イーサネットレベルの送信が必要となるので、–send-ethも一緒に設定です。
–badsum … Send packets with a bogus TCP/UDP/SCTP checksum

スキャンの間隔と速度(TIMING AND PERFORMANCE)

-T 0-5 … -T4が推奨です。高速スキャンの場合、「nmap -T4 -F 」などと指定することが多いです。
5は最速ですが精度を犠牲にするためあまり利用用途がありません。意図的に遅い0、1はIDS回避テスト用に利用されます。
0:paranoid、1:sneaky 、2:polite、3:normal(つまりデフォルト)、4:aggressive 、5:insane
–min-hostgroup/max-hostgroup … 同時スキャンのグループサイズを指定します。
–min-parallelism/max-parallelism … 同時実行するプローブ数を指定します。
–min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout

出力方法の指定(OUTPUT)

Outputのoから始まると考えると覚えやすいです。「-oH」(HTML出力)は「HTML output is not yet supported」または「HTML output is not directly supported, though Nmap includes an XSL for transforming XML output into HTML. See the man page.」だそうです。
-oN … 通常出力(Output scan in normal)
-oX … XML形式出力、XMLパーサで読み込みたいときなどに利用します。
-oS … スクリプトキディ出力と「l33t HaXXorZ」(leet hacker)向けに加工したファイルが出力されます。
-oG … grep用出力、各対象ホストが一行ずつ列挙されているため「検索しやすい」フォーマットが出力されます。
-oA … ALLの「A」です。上記の全ての出力形式で出力されます。実務と言うよりは検証用と行ったところでしょうか。

出力内容の設定

-v … 詳細の出力
-d … 最大レベル9までの冗長モードに設定できる(-d9)、膨大な出力量と時間がかかるので注意しましょう。
–packet-trace … Nmapが見えないところで何を行っているかをNmapが送受信した全パケットのサマリーを書き出すようにするオプションです。
–reason … ポートの状態の判断の根拠を示します。(Display the reason a port is in a particular state)
–open … オープンポートに表示を絞ります。(Only show open (or possibly open) ports)
–iflist … (Print host interfaces and routes (for debugging))
–append-output … Append to rather than clobber specified output files
–resume … 中断したスキャンを途中から再開できるオプションです。条件としては「ctrl-C」などで中断した際に通常出力(-oN)やgrep可能出力(-oG)で指定したログを参照できることです。(Resume an aborted scan)
–stylesheet path/URL … デフォルトではNmapに同梱されているXSLスタイルシート、nmap.xmlを参照するが別のフォーマットを指定したい場合利用するオプションです。(XSL stylesheet to transform XML output to HTML)
–no-stylesheet … 逆にNmapがXML出力をXSLスタイルシートと関連付けないようにするオプションです。(Prevent associating of XSL stylesheet w/XML output)
–webxml … Reference stylesheet from Nmap.Org for more portable XML

その他(MISC)

「-I」というオプションはそもそも実装されていないことが分かりました。「(-I)no longer Supported」と返ってきます。
–datadir … Specify custom Nmap data file location
–send-eth … IP(ネットワーク)層ではなくて、rawイーサネット(データリンク)層でパケットを送信するようにします。Windowsではraw ソケットに対応する機能を無効にしています。(Send using raw ethernet frames or IP packets)
–send-ip … rawイーサネット(データリンク)層ではなくて、IP(ネットワーク)層で送ることを明示させるオプションです。
–privileged … 特権を必要とするオプション(SYNスキャンやOS検出など)に対し、それらのオプションより前に指定することで、権限のないユーザが生パケットスキャンを実行できるようにするオプションです。「NMAP_PRIVILEGED」の設定をいじっても同じことができますが注意が必要です。(Assume that the user is fully privileged)
–unprivileged … 権限がなければ、「実行」を中止するようにします。やってみたけどエラー吐いてだめではなく最初からやらないということです。(Assume the user lacks raw socket privileges)
-V … Nmap自体のバージョン
-h … コマンドのオプションを含め、ヘルプを出力します

以上です。参考になれば幸いです。