Nmapの使い方

目次

最新版のダウンロード

最新版は公式サイトから入手することができます。

Nmapの簡単な使い方

Nmapは引数にIPアドレスもしくはホスト名を指定するだけでポートスキャンを実行できます。

nmap example.com

オプションを指定しない場合、icmp echoの送信と80/tcpへの接続要求を送信します。何の応答もない場合はホストダウンとみなしてポートスキャンを中止し、応答があればポートスキャンを実行します。

スキャンタイプの理解

Nmapには非常に多くのスキャンタイプがありますが重要で利用頻度が高いのは太字のふたつだけです。

  • TCP SYNスキャン(-sS)
  • TCP Connectスキャン(-sT)
  • UDPスキャン(-sU)
  • TCP NULLスキャン(-sN)
  • TCP FINスキャン(-sF)
  • TCP Xmanスキャン(-sX)
  • TCP ACKスキャン(-sA)
  • TCP Windowスキャン(-sW)
  • TCP Maisonスキャン(-sM)
  • TCP カスタムスキャン(--scanflags)
  • TCP IDLEスキャン(-sI)
  • IPプロトコルスキャン(-sO)
  • FTPバウンススキャン(-b)

TCP SYNスキャン(-sS)

TCPの仕様として、接続要求の「SYN」パケットを送信するとポートが待ち受け状態の場合は「SYN+ACK」を返します。そしてポートが待ち受け状態になければ「RST」を返します。この応答によってポートが開いているのか閉じているのか判断できます。もしも何も返ってこない場合はFW(ファイアウォール)などでフィルタリングされている可能性があります。

TCP SYNスキャンのメリットは高速にスキャンできる点です。というのも、TCP SYNスキャンはTCP接続が確立しないため応答を待たずにSYNパケットを一気に送信できるためです。

またTCP SYNスキャンはTCPコネクションが確立しないためWEBサーバーやFTPサーバーなどのアクセスログには残りません。

注意点としてTCP SYNスキャンは管理者権限(root権限)が必要なため一般ユーザーはこのスキャンタイプを指定できません。

TCP Connectスキャン(-sT)

Nmapのデフォルトのスキャンタイプです。何も指定しなければTCP Connectスキャンをおこないます。

TCP Connectスキャンはその名の通りTCPコネクションが確立できるか調べます。

TCP Connectスキャンは大量のポートをスキャンするには効率が悪く時間がかかるというデメリットがあります。また、TCPコネクションを確立させるためポートスキャンされた側のログに残ります。

UDPスキャン(-sU)

TCPではなくUDPのポートをスキャンします。

ただしUDPポートのスキャンは信頼性が高くありません。というのもUDPの仕様としてポートが閉じている場合は応答しないため、ポートが閉じているのかFWなどでフィルタリングされているのか判断できないためです。

TCP NULL、FIN、Xman、ACK、Window、Maionスキャン

これらのスキャンタイプはNmapが公開された当時(1997年ごろ)、FW(ファイアウォール)を超えてポートスキャンを実行することを目的に利用されていたスキャンタイプです。

TCPヘッダーにはTCPフラグという1オクテット(8ビット)の領域があります。通常のTCP接続ではSYNフラグを立てて通信を開始しますが、FINフラグを立てたりACKフラグを立てたり、あるいは複数のフラグを立てたりするなど通常とは異なるTCPフラグで通信してその反応からポートの状態を判断します。

昔のFWの中には通常とは異なるTCPフラグが設定されたパケットを通過させてしまうものがあったため、FWを超えてポートスキャンするための機能として実装されていました。

TCP カスタムスキャン(--scanflags)

TCPカスタムスキャンは自分でTCPフラグを指定します。どうしても自分でTCPフラグを指定したい場合に使います。たとえばURGフラグとSYNフラグを組み合わせたい場合は --scanflags URGSYN のように指定します。

TCP IDLEスキャン(-sI)

TCP IDLEスキャンは引数にゾンビホストを指定します。ゾンビホストはほとんど(できればまったく)通信がないホストである必要があります。

このスキャンタイプは最初にゾンビホストのIPID(IPヘッダーの識別子)を調べ、その後ポートスキャン先に対してゾンビホストのIPアドレスを送信元IPアドレスに設定したパケットを送信します。

もしもポートが待ち受け状態であればゾンビホストへSYN+ACKが返され、それに対してゾンビはRSTを返送するのでゾンビホストのIPIDが増加します。逆にポートが待ち受け状態でなければポートスキャン先のホストはゾンビホストに何も送られないかRSTを送信します。しかし、RSTに対してゾンビホストは何も返送する必要がないためゾンビホストのIPIDは増加しません。

この特性を利用して、ポートスキャン後にゾンビホストのIPIDを調べてポートスキャン先のポート状態を判断します。

ただし、このスキャンタイプは匿名でおこなうことができるメリットがありますが、おそらくあなたの自宅から実行することはできないでしょう。

というのもISP(プロバイダー)の網内では送信元IPアドレスと経路情報を突き合わせてフィルタリングしているためです。簡単に言うと、外から入ってくるべき通信が中から外に向かうというのはあり得ない通信と判断し遮断します。

IPプロトコルスキャン(-sO)

これはポートスキャンではなくプロトコルスキャンと呼ばれるものです。

IPヘッダーには1オクテット(8ビット)のプロトコルフィールドがあり、ここにはICMPやTCPなどのプロトコル番号が格納されています。IPプロトコルスキャンはこのプロトコルフィールドをすべて繰り返し試行します。

実際にスキャンすると次のように表示されます。

PROTOCOL STATE         SERVICE
1        open          icmp
2        open|filtered igmp
6        open          tcp
17       open          udp
103      open|filtered pim
136      open|filtered udplite
255      open|filtered unknown

注意点として、-sOでスキャンした場合は-p オプションがポート番号ではなくプロトコル番号として解釈されます。

FTPバウンススキャン(-b)

FTPバウンススキャンとは踏み台にできるftpサーバーかどうか判定するスキャンタイプです。

スキャンポートの指定

Nmapでスキャンポートを指定しない場合、1~1024番までの全ポートと nmap-servicesファイルに記載されているポートをスキャンします。

nmap-servicesファイルはKali Linuxであれば /usr/share/nmap/nmap-services に格納されているはずです。

-p <port range>

スキャンするポートを自分で指定する場合に使います。ポートはカンマ区切りで複数指定することも可能です。

nmap -p 80,443 example.com

また「-」で範囲指定することも可能です。

nmap -p 80,443,8000-9000 example.com

1~65535番までの全ポートをスキャンしたい場合は「-p-」と指定します。

nmap -p- example.com

注意点として、スキャンタイプにIPプロトコルスキャン(-sO)を指定した場合は「-p」オプションはポート番号ではなくプロトコル番号として解釈されます。

-F(高速スキャン)

nmap-servicesファイル(Kali Linuxであれば /usr/share/nmap/nmap-services に格納されている)に記載されているポート番号だけをスキャンします。

自分で作成した nmap-services ファイルを使用したい場合は --datadir オプションでファイルの格納場所を指定します。

-r (シーケンシャルスキャン)

Nmapのデフォルト動作ではポート番号をランダムにします。つまり1,2,3という順ではなく443,21,80のように実行ごとにランダムなポート番号でスキャンします。

しかし -r オプションを使うとポート番号順にスキャンできます。

サービスとバージョンの検出

Nmapは単にポートが空いているか閉じているか判断するだけでなくサービスの種類とバージョンの検出をおこなう機能があります。

たとえばSSHが22番でなく10022番や20022番で稼働していることは珍しくありません。

-sV(サービスの種類とバージョン検出)

開いているポートのサービスの種類とバージョン検出を試みます。

-A(OSとサービスの種類・バージョン検出)

サービスの種類とバージョン検出に加えてOSの検出を実行します。-sV -O オプションと等価です。

--allports(全ポートのバージョン検出を対象にする)

-sV オプションを使った場合でも9100/tcpのバージョン検出はスキップするように動作します。これは9100/tcpがプリンタで使用されるポートであり、TCP接続すると送信した内容をすべてプリントアウトしてしまうためです。

--allports オプションを付けると9100/tcpをスキップせずにバージョン検出します。ただし、プリンターが接続されていると数十枚のプリントアウトが発生する可能性があるので注意してください。

--version-intensity <強度>(バージョン検出の強度を指定する)

バージョン検出の強度を調整した場合に0~9までの値を指定します(デフォルトは7)。値が多くなるほどバージョン検出の精度が上がりますが、その代わり時間がかかります。

--version-light(ライトモード)

これは --version-intensity 2 のエイリアスです。

--version-all(試行モード)

これは --version-intensity 9 のエイリアスです。

--version-trace(詳細モード)

バージョン検出の動作の状態を知るためにデバッグ情報を出力します。

-sR (RPC スキャン)

開いているポートに対してSunRPCプログラムのNullコマンドを送信しRPCポートであれば実行されているプログラム名とバージョンを検出します。

ただし、このオプションを個別に指定しなくても -sV オプションで同様の検出をおこなうため出番はないでしょう。

スクリプトスキャン

NmapはLua言語によるスクリプトスキャン機能を搭載しています。スクリプトを利用することにより、さらに高度なスキャンができるようになります。

Kali Linuxの場合、/usr/share/nmap/scripts/ にスクリプトが格納されています。

-sC(スクリプトスキャン)

-sCオプションを使うとデフォルトカテゴリーのスクリプトを実行します。例としてwww.yahoo.co.jpの443/tcpをスキャンするとSANs証明を使っていることが分かります。

$ nmap -sC -p 443 www.yahoo.co.jp
Nmap scan report for www.yahoo.co.jp (182.22.25.252)
Host is up (0.21s latency).

PORT    STATE SERVICE
443/tcp open  https
| tls-nextprotoneg: 
|   h2
|   http/1.1
|_  http/1.0

-sCオプションは--script=defaultと等価です。

--script=<Lua scripts>(スクリプト/カテゴリーを指定する)

スクリプトはカンマ区切りで複数指定できます。指定できるのはスクリプトとカテゴリーです。なお、スクリプトを指定する場合は拡張子(.lua)は不要です。

nmap --script http-headers example.com

カテゴリーは以下のものが用意されています。

  • auth
  • broadcast
  • brute
  • default
  • discovery
  • dos
  • exploit
  • external
  • fuzzer
  • intrusive
  • malware
  • safe
  • version
  • vuln

詳しくは公式ドキュメントをご覧ください。

NSEDoc Reference Portal: NSE Categories &emdash; Nmap Scripting Engine documentation

--script-args=<n1=v1,[n2=v2,…]>

スクリプトに引数が必要な場合は--script-argsで指定します。

--script-args-file=<filename>

スクリプへの引数をファイルで指定することもできます。

--script-trace

スクリプトの挙動をトレースしたい場合に使います。

--script-updatedb

スクリプトを更新する場合に使います。

--script-help=<Lua scripts>

スクリプトの情報を出力します。攻撃を実行するスクリプトもあるため、まずは--script-helpでどのようなスクリプトなのか把握しておきましょう。

$ nmap --script-help http-put
http-put
Categories: discovery intrusive
https://nmap.org/nsedoc/scripts/http-put.html
  Uploads a local file to a remote web server using the HTTP PUT method. You must specify the filename and URL path with NSE arguments.
$ 

たとえばhttp-putのカテゴリーは「discovery」「intrusive」であると分かります。ただし、これだけだと引数の情報が分かりません。

必要であればNmapの公式ドキュメントを見る必要があります。

公式ドキュメントにあるように「http-put.file」と「http-put.url」を指定する必要があります。公式ドキュメントの「Example Usage」には具体的な使い方も書いてあるので参考になるでしょう。

OS検出

NmapはTCP/IPのフィンガープリントからOSを検出する機能を備えています。

-O(OS検出)

ターゲットのOSを検出します。

--osscan-limit(無駄なOS検出を避ける)

OS検出の基準に満たないホストはOSを検出できる可能性が低いため、そのようなホストでのOS検出をスキップします。このオプションを有効にしておくとスキャンの時間短縮につながります。

--osscan-guess; --fuzzy (OS検出の結果を推測する)

Nmapのデフォルト動作ではフィンガープリントに完全一致するか、かなり近いものをOS検出結果として表示します。厳密な判定が不要であれば、--osscan-guessか--fuzzyオプションで大まかな判定ができます。

ターゲットの指定方法

スキャンするターゲットは複数のホストやネットワークを指定できます。

引数で指定する

ひとつのホストをスキャンする場合は次のようにします。

nmap 192.168.0.1

ネットワークで指定することもできます。

nmap 192.168.0.0/24

またホストやネットワークを複数指定することも可能です。

nmap 192.168.0.1 192.168.1.0/24

範囲指定もできます。

nmap 192.168.0.1,2,3,100-105

-iL <ファイル名>(ファイルで指定する)

ひとつ以上のスペースやタブ、あるいは改行区切りでターゲットを記載したファイルを指定できます。ファイルでなく標準入力から読み込ませたい場合は「-」をファイル名に指定します。

cat list.txt | nmap -iL -

-iR <ホスト数>(無作為スキャン)

ホスト数を指定して無作為にインターネットをスキャンしたい場合に使います。プライベートIPアドレスやマルチキャストIPアドレスは除外されます。

--exclude <host1[,host2][,host3],…>(特定のホストを除外する)

スキャン対象から除外したいホストやネットワークを指定できます。たとえば10.0.0.0/8をスキャンしたいが10.0.1.1だけ除外したいという場合は次のようにします。

nmap 10.0.0.0/8 --exclude 10.0.1.1

--excludefile <ファイル名>(除外リストをファイルで渡す)

--exclude オプションと同じですが引数で直接指定するのではなくファイルで除外リストを指定します。除外したいホストやネットワークはひとつ以上のスペースやタブ、あるいは改行区切りで記載する必要があります。

スキャンタイミング

Nmapはスキャンが完了するまで非常に時間がかかる場合があるため、状況に応じてスキャンタイミングを調整する必要があります。

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane>

スキャンタイミングの指定を分かりやすく指定するためのオプションです。通常は0~5までの数字を指定しますがテンプレート名を指定することできます。

テンプレート名で指定数字で指定
Paranoid0
Sneaky1
Polite2
Normal3
Aggressive4
Insane5

-T5(Insane)

遅延速度の上限をを5msに設定するため非常に高速に動作します。ただし遅延がなく信頼性の高い高速ネットワークでないと正確なスキャンを期待できないため注意してください。-T5はあまりおすすめしません。

-T4(Aggressive)

遅延速度の上限を10msに設定するため高速に動作します。信頼性のある高速ネットワーク内で最も高いパフォーマンスを発揮します。遅延のないネットワークであれば-T4にするとパフォーマンスがあがるでしょう。

-T3(Normal)

Nmapのデフォルト動作です。通常はNormalで良いでしょう。

-T2(Polite)

慎重にスキャンを進めたい場合におすすめですが、Normalの10倍の時間がかかります。

-T1(Sneaky)

IDS(侵入検知システム)による検出を防ぐため非常に低速でスキャンします。

-T0(Paranoid)

IDS(侵入検知システム)による検出を防ぐため非常に低速でスキャンします。Sneakyよりも更に低速にスキャンします。

--min-hostgroup <size>; --max-hostgroup <size>

Nmapはスキャンするホストが多い場合にホストをグループに分け、グループ内のホストを並列してスキャンします。そのためグループのサイズを大きくすると高速にスキャンできる一方、スキャン結果が表示されるまで時間がかかります(グループ内のすべてのホストでスキャンが完了している必要があるため)。

Nmpaのデフォルト動作では小さなグループから開始して徐々にグループサイズを増やしていきます。

このオプションを使うとグループの最小値と最大値を指定できます。

--min-parallelism <numprobes>; --max-parallelism <numprobes>

グループ内の並列処理を調整する場合に使います。デフォルトではパケット破棄などの状態をNmapが検知して最適な並列処理をおこないます。

--min-rtt-timeout <milliseconds>, --max-rtt-timeout <milliseconds>, --initial-rtt-timeout <milliseconds>

--min-rtt-timeout はタイムアウトの最小値を指定します。このオプションは通常は使う必要がありません。

--max-rtt-timeout と--initial-rtt-timeoutの値を小さくするとスキャン速度が向上しますが、小さくし過ぎると正確なスキャン結果を得ることができません。

どれくらいの値が妥当か判断するにはPingを実行して応答時間を計測すると良いでしょう。--initial-rtt-timeout には応答時間の2倍程度、--max-rtt-timeout には応答時間の3倍か4倍程度にするとうまく動作するでしょう。

--host-timeout <milliseconds>

指定した時間内に応答がないホストのスキャンをスキップします。

--scan-delay <milliseconds>; --max-scan-delay <milliseconds>

スキャンする際に指定した時間だけNmapは待機します。IDS(侵入検知システム)による検出を避けたり、閾値監視しているシステムをスキャンする場合に役立ちます。

ホスト検出

Nmapにはポートスキャンだけでなくネットワーク上のホストを発見するための機能もあります。

注意点として、デフォルト動作では同一ネットワーク上のホストを発見する際はARP PINGを実行します。たとえばこれから紹介するホスト検出オプション(-sLと-P0を除く)を指定しても実際にはARP PINGが実行されます。ARP PINGを実行しないようにするには --send-ip オプションを付けてください。

-sL(ホストのリスト化)

このオプションは実際にはスキャンせずターゲットのホストをリスト表示するものです。その際にDNSで逆引きして表示します。

多数のネットワークをスキャンする場合、どのようなホストが対象なのか確認する際に実行すると良いでしょう。

-sP(PINGスキャン)

このオプションを使うとICMO ECHO要求と80/tcpに対してパケットを送信し応答のあったホストを表示します。ネットワーク内で稼働しているホストを特定する際に役立ちます。

-P0(PINGを実行しない)

Nmapはスキャンの前にホストに大してPing(ICMP ECHO)を実行します。しかし中にはPingに応答しないホストもありホストダウンと誤検知するためこのオプションを使ってPingを実行しないようにします。

ネットワーク単位でスキャンする場合にこのオプションを使うと稼働していない、あるいは存在しないホストに対してスキャンを実行するため非常に時間がかかる場合があります。

-PS [portlist](TCP SYN PING)

このオプションはTCP SYNパケットを送信してSYN+ACKあるいはRSTが返ってきた場合にホストが稼働していると判断します。デフォルトは80/tcpにSYNを送信しますが引数でポートを指定することもできます。

nmap 192.168.0.0/24 -PS 25,80,443

-PA [portlist](TCP ACK PING)

このオプションは -PSと似ていて、TCP SYNではなくTCP ACKを送信します。もしもホストが稼働していればRSTが返ってくるので、その応答で判断します。

-PU [portlist](UDP PING)

このオプションはUDPパケットを使ってホストが稼働しているか判断します。デフォルトでは31338/udpへUDPパケットを送信します。

-PE; -PP; -PM(ICMP PING)

このオプションはICMPパケットを使ってホストが稼働しているか判断します。-PEはICMP ECHOであり通常のPingと等価です。-PPはICMP タイムスタンプ要求で-PMはICMP アドレスマスク要求を送信します。

インターネット上のホストをスキャンする場合は-PPと-PMはFWで遮断される可能性が高いため使えないでしょう。

-PR(ARP PING)

このオプションはARPリクエストによるホスト検出をおこないます。ただし同一ネットワーク上のホストでないと検出できないので注意してください。

FW/IDS回避機能

NmapはFWやIDSによる検知を避けるための機能が早い段階から搭載されています。

-f(パケットをフラグメント化する)

パケットを小さくフラグメント化して送信することによりFW検知を逃れます。昔のFWではフラグメント化されたパケットが通過してしまうものがあったのですが、現代のFWはアセンブル機能が発達しているのでこのオプションが役に立つ機会は少ないでしょう。

-D <decoy1 [,decoy2][,ME],…>(おとりパケットを送信する)

複数のIPアドレスをおとりに使って自分のスキャンを隠すというものですが、これはインターネット上では機能しないでしょう。ISP網内では送信元IPアドレスと経路情報の突き合わせをおこなっているため、おとりにつかったIPアドレスのネットワークが外部にある場合は網内で破棄されます。

-S <IPアドレス>(送信元IPアドレスを指定する)

Nmapが送信元IPアドレスを正しく検出できない場合に使います。たとえばセカンダリIPアドレスを設定している場合などが該当します。

スプーフィング目的では使っても意味がありませんので注意してください(理由は-Dオプションに記載)

--source-port <portnumber>; -g <portnumber>

送信元ポート番号を指定したい場合に使います。

単純なFWポリシー設定の場合、53/udpと53/tcpを送信元ポートとする通信をすべて許可している場合があります。そのようなFWを突破する場合はポート番号を指定すると良いでしょう。

スキャン結果の出力フォーマット

-oN <ファイル>(通常の出力)

通常の出力です。※--resume 対応

-oX<ファイル>(XMLファイルに出力)

XML形式のファイルに出力します。スキャン結果をスクリプトなどで処理したい場合に使います。※ --resume 非対応

-oG <ファイル> (Grep検索可能出力)

これは廃止予定です ※ --resume対応

-oA <ファイルベース>(すべてのフォーマットで出力する)

スキャン結果を「通常」「XML」「Grep可能」の3つのフォーマットで保存します。

拡張子は「通常」が.nmap、「XML」が.xml、「Grep可能」が.gnmapとなります。

その他のオプション

--append-output(追記モード)

スキャン結果をファイルに残す場合(-oN, -oX, -oG, -oAオプション)、既存ファイルは上書きされてしまいます。それを避けるには追記モードを使用してください。

--resume <filename>(スキャンの再開)

-oNあるいは-oG、-oAオプションでログを残している場合は中断したNmapを再開できます。

何らかの理由でNmapが中断された場合(Ctrl-Cによる終了も含む)、残ったログファイルからNmapを再開できます。注意点として、XML形式のログ(-oXオプションで残したファイル)では再開できません。

-n(DNS解決しない)

Nmapはアクティブと検知したIPアドレスに対して逆引きを実行します。逆引きを実行しない場合は-nオプションを使います。

-R(すべてのターゲットホストのIPアドレスを逆引きする)

このオプションを使うとアクティブと検知していない場合でも逆引きを実行します。大きなネットワークをスキャンする場合は非常に時間がかかる可能性があるので注意してください。

-A(アグレッシブスキャン)

アグレッシブスキャンは現時点ではOS検出(-O)とサービスバージョン検出(-sV)オプションの組み合わせと等価です。

このオプションは今後さらに機能が追加される可能性があります。

-v / -V(冗長レベル切替)

-vオプションにより、より細かな情報を出力できます。逆に冗長レベルを下げたい場合は -Vオプションを使います。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。