Nmapを検証してみました【ヘルプ編】
※本投稿に記載の内容を自身の管理下にないネットワーク・コンピュータに行った場合は、攻撃行為と判断され、最悪の場合、法的措置を取られる可能性もあります。同内容の調査を行われる場合には、必ず自身の管理下にあるネットワークやサーバーに対してのみ実施してください。
【検証概要】
Nmapの「日本語リファレンス」について、長らく更新されていないこともあり、「日本語リファレンス」記載の動作と「実際の動作」とに多数の差異が確認できました。本検証はNmapの「実際の動作」に基づいたヘルプを作成することを目的としております。
なお、公式リファレンスは以下をご参照ください。(下記、検証結果の項目にて多数引用しております。)
日本語版リファレンスガイド
「Nmap リファレンスガイド (Man Page)」 https://nmap.org/man/jp/
英語版リファレンスガイド
「Chapter 15. Nmap Reference Guide」 https://nmap.org/book/man.html
【検証環境】
下図、2パターンの検証環境にて、Nmapの全オプションを各々指定し、Nmapを実行しました。Nmap実行ホストおよびターゲットホストにてNmap実行時のパケットキャプチャを取得し、日本語リファレンスに記載されている内容と比較の上、差異を確認しました。
なお、各ホストは以下のOS、Versionを使用しました。
・Nmap実行ホスト:Kali Linux Rolling (Nmap version 7.25 BETA1)
・ターゲットホスト:metasploitable-linux-2.0.0
【検証結果】
以下に各コマンド、コマンドの説明およびコマンド例を記載します。
※1 Nmapのヘルプに記載なし
※2 タブ補完不可
■ターゲットの指定
コマンド | コマンドの説明
コマンド例 |
デフォルト | オプション(もしくはオプションの引数)以外の入力値は、すべてターゲットホストの指定として扱われる。 |
コマンド例) nmap 192.168.1.0/24 nmap 192.168.1.4/24 nmap 192.168.1.1-254 |
|
-iL <inputfilename> (リストから入力) |
ターゲットとするホスト/ネットワークを記載したファイルを指定する。 ファイルの記載形式は、Nmapがコマンドラインで対応しているもの(IPアドレス、ホスト名、CIDR、IPv6、オクテット範囲)であれば指定可能。ただし各入力は1つ以上のスペース、タブ、改行文字で区切る必要がある。標準入力からホストを読み込ませたい場合は、ファイル名としてハイフン(-)を指定する。 |
コマンド例) nmap iL target |
|
-iR <num hosts> (ターゲットを無作為に選ぶ) |
全世界全てのIPアドレス(プライベート、マルチキャスト、未割り当てなどのアドレス範囲以外)からターゲットを無作為に選ぶ。 <num hosts>はターゲットのIP数を指定。0(ゼロ)を指定すると、全てのIPをターゲットとする。 |
コマンド例) nmap -iR 2 |
|
–exclude <host1[,host2][,host3],…> (ホスト/ネットワークを除外する) |
ターゲットから除外するホスト/ネットワークを指定する。 ホスト名、CIDR表記のネットブロック、オクテット範囲などを指定可能。 |
コマンド例) nmap 192.168.1.0/24 –exclude 192.168.1.0/26 |
|
–excludefile <exclude_file> (ファイルからリストを除外する) |
ターゲットから除外するホスト/ネットワークを記載したファイルを指定する。 |
コマンド例) nmap 192.168.1.0/24 –excludefile excludetarget |
■ホストの発見
≪Nmap実行ホストとターゲットホストが同セグメントの環境≫
コマンド | コマンドの説明
コマンド例 |
デフォルト | ・ターゲットのIPアドレスに対しARPを実行。応答があったホストをUPしているとみなす。 ・応答があったホストについては、DNSの逆引き解決を行う。 ・応答があったホストに対して、ポートスキャンを実施。 |
コマンド例) nmap 192.168.1.96/29 |
|
-sL (リストスキャン) |
ターゲットの全IPアドレスに対しDNSの逆引き解決のみを行う。(他スキャンとの組み合わせ不可) |
コマンド例) nmap 192.168.1.96/29 -sL |
|
-sn -sP※1 (Ping スキャン) |
pingスキャン(ホスト発見)のみを実行し、応答があったホストの一覧を出力する。ポートスキャンやOS検出などは行わない。 |
コマンド例) nmap 192.168.1.96/29 -sn |
|
-Pn -P0※1※2 (ping なし) |
デフォルト時と同じ動作を行う。(UPしているホストにのみポートスキャンを実施。) |
コマンド例) nmap 192.168.1.96/29 -Pn |
|
-PS<portlist> (TCP SYN Ping) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PS3389 |
|
-PA<portlist> (TCP ACK Ping) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PA3389 |
|
-PU<portlist> (UDP Ping) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PU161 |
|
-PY (SCTP PIng) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PY22 |
|
-PE; -PP; -PM (ICMP Ping タイプ) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PE nmap 192.168.1.96/29 -PP nmap 192.168.1.96/29 -PM |
|
-PR (ARP Ping) |
デフォルト時と同じ動作を行う。 |
コマンド例) nmap 192.168.1.96/29 -PR |
|
-n (DNS解決を行わない) |
ホストの発見により発見したアクティブなホストに対して逆引きのDNS解決を行わないように指定する。 |
コマンド例) nmap 192.168.1.96/29 -n |
|
-R (全ターゲットにDNS解決を行う) |
ターゲットのIPアドレスについて、ホストのUP/Downに関わらず、全てのホストの逆引きDNS解決を行う。 |
コマンド例) nmap 192.168.1.96/29 -R |
|
–dns-servers <serv1[,serv2],…> | DNSサーバーを個別に指定する。 |
コマンド例) nmap 192.168.1.96/29 –dns-servers 8.8.8.8 |
|
–system_dns (システムのDNSリゾルバを使う) |
Nmapを実行しているサーバーのリゾルバを使用する。デフォルトではNmapが直接DNS問い合わせを行う。 |
コマンド例) nmap 192.168.1.96/29 –system-dns |
|
–traceroute | ターゲットホストに対しTraceRouteを行う。 |
コマンド例) nmap 192.168.1.96/29 –traceroute |
≪Nmap実行ホストとターゲットホストが別セグメントの環境≫
コマンド | コマンドの説明
コマンド例 |
デフォルト | ・以下のパケットを送信。いずれかのプロトコルで応答があれば、そのホストが存在すると判断し、以降パケット送信は行わない。 -ICMPエコー -TCP443(SYN) -TCP80(ACK) -ICMPタイムスタンプ ・応答があったホストについては、DNSの逆引き解決を行う。 ・応答があったホストに対して、ポートスキャンを実施。 |
コマンド例) nmap 192.168.1.96/29 |
|
-sL (リストスキャン) |
ターゲットの全IPアドレスに対しDNSの逆引き解決のみを行う。(他スキャンとの組み合わせ不可) |
コマンド例) nmap 192.168.1.96/29 -sL |
|
-sn -sP※1 (Ping スキャン) |
pingスキャン(ホスト発見)のみを実行し、応答があったホストの一覧を出力する。ポートスキャンやOS検出などは行わない。 |
コマンド例) nmap 192.168.1.96/29 -sn |
|
-Pn -P0※1※2 (ping なし) |
ホスト発見を行わず、ターゲットの全IPアドレスに対してスキャンを実行する。 ・全ホストに対しDNSの逆引き解決を行う。 ・全ホストに対しポートスキャンを実施。 |
コマンド例) nmap 192.168.1.96/29 -Pn |
|
-PS<portlist> (TCP SYN Ping) |
指定したTCPポートへのSYNパケット送信にてホストの発見を行う。(ICMPパケットは送信しない。)デフォルトはTCP80番ポート。コンマ区切りで複数のポート(例:-PS22,23,25)を指定することも可能。複数のポートを指定した場合、各ポートに対するプローブ送出は同時に行われる。 SYN/ACKもしくはRSTの応答でターゲットホストがUPしていると判断する。なお、ターゲットがOpenポートの場合には、ハーフオープン接続をリセットする。デフォルトで2回送信して応答がない場合はホストがDownしているとみなす。 |
コマンド例) nmap 192.168.1.96/29 -PS3389 |
|
-PA<portlist> (TCP ACK Ping) |
指定したTCPポートへのACKパケット送信にてホストの発見を行う。(ICMPパケットは送信しない。)デフォルトはTCP80番ポート。コンマ区切りで複数のポート(例:-PS22,23,25)を指定することも可能。複数のポートを指定した場合、各ポートに対するプローブ送出は同時に行われる。 RSTの応答でターゲットホストがUPしていると判断する。デフォルトで2回送信して応答がない場合はホストがDownしているとみなす。 |
コマンド例) nmap 192.168.1.96/29 -PA3389 |
|
-PU<portlist> (UDP Ping) |
指定したUDPポートへの送信にてホストの発見を行う。デフォルトは40125ポート。 ICMPポート到達不能パケット(ICMP3-3)の応答でターゲットホストがUPしていると判断する。デフォルトで2回送信して応答がない場合はホストがDownしているとみなす。 |
コマンド例) nmap 192.168.1.96/29 -PU161 |
|
-PY (SCTP PIng) |
指定したSCTPポートへのINITチャンク送信にてホストの発見を行う。 デフォルトは80ポート。コンマ区切りで複数のポート(例:-PY22,23,25)を指定することも可能。複数のポートを指定した場合、各ポートに対するプローブ送出は同時に行われる。 INIT- ACK、ABORTもしくはICMPプロトコル到達不能パケット(ICMP3-3)の応答でターゲットホストがUPしていると判断する。2回送信して応答がない場合はホストがDownしているとみなす。 |
コマンド例) nmap 192.168.1.96/29 -PY22 |
|
-PE; -PP; -PM (ICMP Ping タイプ) |
指定したICMP要求パケットの送信にてホストの発見を行う。 2回送信して応答がない場合はホストがDownしているとみなす。 -PE:ICMPエコー要求 -PP:タイムスタンプ要求 -PM:アドレスマスク要求 |
コマンド例) nmap 192.168.1.96/29 -PE nmap 192.168.1.96/29 -PP nmap 192.168.1.96/29 -PM |
|
-PR (ARP Ping) |
実行不可。 |
コマンド例) nmap 192.168.1.96/29 -PR |
|
-n (DNS解決を行わない) |
ホストの発見により発見したアクティブなホストに対して逆引きのDNS解決を行わないように指定する。 |
コマンド例) nmap 192.168.1.96/29 -n |
|
-R (全ターゲットにDNS解決を行う) |
ターゲットのIPアドレスについて、ホストのUP/Downに関わらず、全てのホストの逆引きDNS解決を行う。 |
コマンド例) nmap 192.168.1.96/29 -R |
|
–dns-servers <serv1[,serv2],…> | DNSサーバーを個別に指定する。 |
コマンド例) nmap 192.168.1.96/29 –dns-servers 8.8.8.8 |
|
–system_dns (システムのDNSリゾルバを使う) |
Nmapを実行しているサーバーのリゾルバを使用する。デフォルトではNmapが直接DNS問い合わせを行う。 |
コマンド例) nmap 192.168.1.96/29 –system-dns |
|
–traceroute | 各ホストに対し、TraceRouteを実行する。 ポートスキャンを行う場合は、ポートスキャン時のプローブでTraceRouteを実行。ポートスキャンを行わない場合はICMPを別途送信しTraceRouteを実行する。 |
コマンド例) nmap 192.168.1.96/29 –traceroute |
■ポートスキャンのテクニック
このオプションは一度に1つしか使えないが、UDPスキャン(-sU)だけは例外で、TCPスキャンタイプのいずれか1つと組み合わせて用いることができる。
コマンド | コマンドの説明
コマンド例 |
デフォルト | TCP SYNスキャンを実行。 |
コマンド例) nmap 192.168.1.96/29 |
|
-sS (TCP SYN スキャン) |
TCPのSYNパケットでポートスキャンを実行。Openポートに対してハーフオープン接続をリセットするため、TCPコネクションを確立しない。(ターゲットからSYN/ACKで応答があった場合、RSTパケットを送信して、コネクションを終了させる。)複数ホストが対象の場合は、同時に実行する。
スキャン対象ポートの応答によりポートの状態を以下に分類する。 |
コマンド例) nmap 192.168.1.96/29 -sS |
|
-sT (TCP connect() スキャン) |
TCPのSYNパケットでポートスキャンを実行。Openポートに対してハーフオープン接続をリセットできないため、TCPコネクションを確立してしまう。Nmap実行ユーザが生パケットへの書き込み権限を持たないか、IPv6ネットワークをスキャンする場合に使用。 |
コマンド例) nmap 192.168.1.96/29 -sT |
|
-sU (UDP スキャン) |
空の(データなし)UDPヘッダを各UDPポートに送ることでUDPスキャンを実行。 スキャン対象ポートの応答によりポートの状態を以下に分類する。 ICMPポート到達不能エラー(タイプ3、コード 1、2、9、10、13)で応答:Filteredポートと判断 ICMPポート到達不能エラー(タイプ3、コード3)で応答:Closedポートと判断 UDPパケットで応答:Openポートと判断 数回の再試行の後も応答がない場合:Open|Filteredポートと判断 応答パケットの送信数が制限されている場合が多く、Nmapはそれに応じて処理速度を下げる。 |
コマンド例) nmap 192.168.1.96/29 -sU |
|
-sN; -sF; -sX (TCP Null、FIN、およびXmasスキャン) |
それぞれTCPの以下フラグを立てたパケットでポートスキャンを実行。 SYN、RST、ACKなどのフラグビットを含まないパケットに対しては、ポートが閉じている場合はRSTが返され、ポートが開いている場合は何の応答も返されない。 Null スキャン 「-sN」: 何のビットも設定しない(tcpヘッダのフラグは0) FIN スキャン 「-sF」: TCP FINビットだけを設定する Xmas スキャン 「-sX」: FIN、PSH、URGのフラグをすべて設定する スキャン対象ポートの応答によりポートの状態を以下に分類する。 RSTで応答:Closedポートと判断 数回再送信しても応答なし:Open|Filteredと判断 ICMP到達不能エラー(タイプ 3、コード 1、2、3、9、10、13)で応答:Filteredと判断 |
コマンド例) nmap 192.168.1.96/29 -sN nmap 192.168.1.96/29 -sF nmap 192.168.1.96/29 -sX |
|
-sA (TCP ACK スキャン) |
TCPのACKパケットでポートスキャンを実行。 スキャン対象ポートの応答によりポートの状態を以下に分類する。 RSTパケットで応答:Unfilteredポートと判断 応答を返さないポートや、ICMPポート到達不能エラー(タイプ3、コード 1、2、3、9、10、13)で応答:Filteredポートと判断 |
コマンド例) nmap 192.168.1.96/29 -sA |
|
-sW (TCP ウィンドウスキャン) |
TCPのACKパケットでポートスキャンを実行。 スキャン対象ポートの応答によりポートの状態を以下に分類する。 RSTパケット(TCPウインドウ=0)で応答:Closedポートと判断 RSTパケット(TCPウインドウ=正の値)で応答:Openポートと判断 応答を返さないポートや、ICMPポート到達不能エラー(タイプ3、コード 1、2、3、9、10、13)で応答:Filteredポートと判断 |
コマンド例) nmap 192.168.1.96/29 -sW |
|
-sM (TCP Maimon スキャン) |
TCPのFIN/ACKパケットでポートスキャンを実行。 ターゲットホストがBSD由来のシステムの場合、ポートの状態により以下の動作を行う(BSDでは未検証。WindowsではOpen/Closed関係なく、全てのポートでRSTパケットで応答した。) Openポート:パケットが破棄される。 Closedポート:RSTパケットで応答。 |
コマンド例) nmap 192.168.1.96/29 -sM |
|
–scanflags (カスタム TCP スキャン) |
任意のTCPフラグを指定し、ポートスキャンを実行。 引数は、例えば9(PSH と FIN)といった数字のフラグ値で指定することも、記号名を使った指定(順不同)も可能。 フラグに対応する数字は以下を参照。 URG(32)、ACK(16)、PSH(8)、RST(4)、SYN(2)、FIN(1)TCPスキャンタイプ(-sA や -sFなど)を指定でき、ポート状態の分類は同スキャンタイプの分類に準ずる。デフォルトはSYNスキャンが使用される。 |
コマンド例) nmap 192.168.1.96/29 –scanflags URGACKPSH nmap 192.168.1.96/29 -sA –scanflags URGACKPSH |
|
-sI <zombie host[:probeport]> (Idle スキャン) |
ゾンビホストを利用して、同ホストからTCPポートスキャンを実行する。(Nmap実行ホストの実IPアドレスからは、ターゲットホストにプローブが送信されない。) ホスト発見時はNmap実行ホストのIPアドレスを使用。TCPポートスキャン時のソースポートはデフォルトでTCP443。 スキャン結果は、指定したゾンビホストから見たOpenポートが表示される。 |
コマンド例) nmap 192.168.1.96/29 -sI 192.168.110.1 |
|
-sY (SCTP INIT) |
任意のTCPフラグを指定し、ポートスキャンを実行。 引数は、例えば9(PSH と FIN)などの数字のフラグ値で指定することもできるが、記号名を使った指定(順不同)も可能である。 フラグに対応する数字は以下を参照。 URG(32)、ACK(16)、PSH(8)、RST(4)、SYN(2)、FIN(1)TCPスキャンタイプ(「-sA」や「-sF」など)を指定でき、ポート状態の分類は同スキャンタイプの分類に準ずる。デフォルトはSYNスキャンが使用される。 |
コマンド例) nmap 192.168.1.96/29 -sY |
|
-sZ (COOKIE-ECHOスキャン) |
SCTPのCOOKIE ECHOチャンクでポートスキャンを実行。スキャン対象ポートはデフォルトで52ポート。 スキャン対象ポートの応答によりポートの状態を以下に分類する。 ABORTで応答:Closedポートと判断(未検証) ICMP到達不能エラー(タイプ 3、コード 2)の応答:Filteredポートと判断 数回再送信しても応答なし:Open|Filteredポートと判断 |
コマンド例) nmap 192.168.1.96/29 -sZ |
|
-sO (IPプロトコルスキャン) |
ターゲットマシン上でどのIPプロトコル(TCP、ICMP、IGMPなど)がサポートされているかをスキャンする。スキャンするプロトコル番号を指定するには「-p」オプションを使う。 IPパケットヘッダのIPプロトコル番号フィールドにスキャン対象のプロトコル番号を挿入して送信する。 スキャン対象プロトコルの応答によりプロトコルの状態を以下に分類する ICMPプロトコル到達不能エラー以外の応答があった場合:プロトコルをOpenと判断 ICMPプロトコル到達不能エラー(タイプ 3、 コード 2)で応答:プロトコルをClosedと判断 その他のICMP到達不能エラー(タイプ 3、 コード 1、3、9、10、13)で応答:プロトコルはFilteredと判断 数回再送信しても応答なし:プロトコルはOpen|Filteredと判断 以下のプロトコルスキャンには下記パケットを使用する。 TCP=ポート80番にACKパケット送信 UDP=ポート40125番にパケット送信 ICMP=ECHO request送信 SCTP=ポート80番にINITチャンク送信 |
コマンド例) nmap 192.168.1.96/29 -sO |
|
-b <ftp relay host> (FTPバウンススキャン) |
プロキシFTP接続の脆弱性を持つFTPサーバーに他のホストをポートスキャンさせる。(未検証)引数は<username>:<password>@<server>:<port>。<server>は、この脆弱性を持つFTPサーバーの名前かIPアドレスを指定する。 匿名ログインが可能な場合は、<username>:<password>の部分を、使用するポート番号がFTPポート(21)の場合は、ポート番号(と前のコロン)をそれぞれ省略できる。 |
コマンド例) nmap 192.168.1.96/29 -b admin:password@192.168.1.1 |
■ポートの指定とスキャンの順序
コマンド | コマンドの説明
コマンド例 |
デフォルト | TCP/UDPともに1000ポートをスキャン。また、スキャンするポートの順番はランダムで選択する。 |
コマンド例) nmap 192.168.1.96/29 |
|
-p <port ranges> (指定されたポートのみスキャン) |
ポートスキャン時のスキャン対象ポートを指定する。 スキャンタイプ「-s*」で指定したプロトコルのポートが対象となる。(TCP/UDPポート両方のスキャンを実行するには、-sUおよび最低1つのTCPスキャンタイプ(「-sS」、「-sF」、「-sT」など)を指定する必要がある。) IPプロトコルスキャン「-sO」では、本オプションでスキャン対象とするプロトコル番号を指定する(0-255)。指定方法は以下を参照。 -p- (1番から65535番までのポート) -p U:53,111,137,T:21-23,80 (UDPポートの53番、111番、137番と、TCPポートの21~23番、80番) |
コマンド例) nmap 192.168.1.96/29 -sS -sU -p U:53,T:3389,21-25,80 nmap 192.168.1.96/29 -sO -p 1-17 |
|
–exclude-ports <port ranges>※2 | ポートスキャンから除外したいポートを指定する。ポートの指定方法は-pオプションと同様。IPプロトコルスキャン「-sO」では、本オプションでスキャンから除外したいプロトコル番号を指定する。(0-255) |
コマンド例) nmap 192.168.1.96/29 –exclude-ports 40-50 nmap 192.168.1.96/29 -sO –exclude-ports 4-16 |
|
-F (高速 (限定したポートだけ) スキャン) |
100ポートのスキャンのみ実施。(デフォルトは1000ポート) 「–datadir」オプションを使用して、独自に作成したnmap-servicesファイルを指定可能。 |
コマンド例) nmap 192.168.1.96/29 -F |
|
-r (ポートの順番を無作為にしない) |
番号順にポートスキャンを実行する。 |
コマンド例) nmap 192.168.1.96/29 -r |
|
–top-ports <number> | nmap-servicesファイル記載のポートの内、スキャン優先度が高い上位ポート<number>ポートをスキャンする。<number>は1以上の数値で指定。なお、「–exclude-ports」で指定されたポートは除外される。 以下、上位10ポートを記載。 “ftp, ssh, telnet, smtp, http, POP3, netbios-ssn, https, microsoft-ds, ms-wbt-server” |
コマンド例) nmap 192.168.1.96/29 –top-ports 10 |
|
–port-ratio <ratio> | nmap-servicesファイル記載のポートの内、open-Frequencyが指定した値より大きいポートのみをスキャン対象とする。<ration>は0以上1以下の値で指定。 |
コマンド例) nmap 192.168.1.96/29 –port-ratio 0.002 |
■サービスとバージョンの検出
コマンド | コマンドの説明
コマンド例 |
-sV (バージョン検出) |
ポートスキャン実施後、Openポートのバージョン検出(サービスプロトコル、アプリケーション名、バージョン番号などの特定)を行う。 |
コマンド例) nmap 192.168.110.128/30 -sV |
|
–allports※1※2 (バージョン検出の対象からすべてのポートを除外しない) |
デフォルトでは、TCPポート9100番はバージョン検出を行わないが(一部のプリンタはこのポートに送られたものを全て出力するため)、同オプションを指定することにより、全ポートのバージョン検出を行う。 |
コマンド例) nmap 192.168.110.128/30 -sV –allports |
|
–version-intensity <intensity> (バージョンスキャンの強度を設定) |
Nmapは、バージョンスキャン(-sV)を実行する際に、1から9までの希少(rarity)値が割り振られた一連のプローブを送信する。この希少値が小さいプローブほど、よく用いられる各種サービスに対して有効であり、この希少値が大きいプローブほど、用途が限られることになる。この数字が大きいほど、サービスが正しく特定される確率は高くなるが、強度が高いスキャンは、それだけ時間がかかる。強度は0から9の間で指定する必要があり、デフォルトは7である。 |
コマンド例) nmap 192.168.110.128/30 -sV –version-intensity 3 |
|
–version-light (ライトモードを有効にする) |
「–version-intensity 2」と同義。 |
コマンド例) nmap 192.168.110.128/30 -sV –version-light |
|
–version-all (プローブを1つずつ試行する) |
「–version-intensity 9」と同義。 |
コマンド例) nmap 192.168.110.128/30 -sV –version-all |
|
–version-trace (バージョンスキャンの動作状況を追跡する) |
バージョンスキャンのデバッグ情報を出力する。 (「–packet-trace」オプションの方がより詳細な情報を出力) |
コマンド例) nmap 192.168.110.128/30 -sV –version-trace |
|
-sR (RPCスキャン)※1※2 |
「-sV」と同義。(「-sV」オプションでもRPCのバージョン検出を行うため、同義となった。) |
コマンド例) nmap 192.168.110.128/30 -sR |
■OS検出
コマンド | コマンドの説明
コマンド例 |
-O (OS検出を実行) |
OSの検出を行う。 ポートスキャン実施後、ICMP、TCP、UDPパケットを送信。の応答パケットの内容よりOSを推測。ポートを全てFilterdにした場合にも、OS検出を行う。 |
コマンド例) nmap 192.168.110.128/30 -O |
|
–osscan-limit (OS検出を有望なターゲットに絞る) |
少なくとも1つのopenおよびclosedのTCPポートがないホストに対してはOS検出を行わない。 |
コマンド例) nmap 192.168.110.128/30 -O –osscan-limit |
|
–osscan-guess –fuzzy※1※2 (OS検出の結果を推測) |
どちらかのオプションを指定することで、ポートが全てFilteredのホストであってもOS検出を行う。(精度は下がる) |
コマンド例) nmap 192.168.110.128/30 -O –osscan-guess nmap 192.168.110.128/30 -O –fuzzy |
■タイミングとパフォーマンス
コマンド | コマンドの説明
コマンド例 |
–min-hostgroup <size> –max-hostgroup <size> (並列スキャンのグループサイズを調節する) |
Nmapはデフォルトで複数のホストをグルーピングし並行してポートスキャンやバージョンスキャンを行う。「–max-hostgroup」、「–min-hostgroup」でグループサイズの最大数、最小数を指定する。ホストの検出には適用されない。 |
コマンド例) nmap 192.168.110.1-20 –min-hostgroup 10 nmap 192.168.110.1-20 –max-hostgroup 2 |
|
–min-parallelism <numprobes> –max-parallelism <numprobes> (プローブの並列処理を調節する) |
ターゲットホストグループに向けて同時に送信するプローブの上限と下限を指定する。デフォルトでは、ネットワークパフォーマンスに基づいて、自動計算を行う。ホストの検出には適用されない。 |
コマンド例) nmap 192.168.110.1-20 –min-parallelism 20 nmap 192.168.110.1-20 –max-parallelism 2 |
|
–min_rtt_timeout <seconds> –max-rtt-timeout <seconds> –initial-rtt-timeout <seconds> (プローブのタイムアウトを調節する) |
プローブを中止もしくは再送信するまでの実行タイムアウト値を指定する。デフォルトは動的に決定する。「–max-rtt-timeout」と「–initial-rtt-timeout」はデフォルトより小さな値を指定することで、スキャン時間を大幅に短縮できる。 以下、設定値の目安。 ・Nmap実行ホストとターゲットホストが同セグメントの環境 「–max-rtt-timeout」の値は100ミリ秒(ms)が推奨最小値。 ・Nmap実行ホストとターゲットホストが別セグメントの環境 最大往復時間(RTT)を調べ、「–initial-rtt-timeout」の値を、同値を2倍に、また「–max-rtt-timeout」の値は、これを3倍か4倍にしたものが推奨。 |
コマンド例) nmap 192.168.110.128/30 –min_rtt_timeout 3 nmap 192.168.110.128/30 –max-rtt-timeout 0.1 nmap 192.168.110.128/30 –initial-rtt-timeout 0.1 |
|
–host-timeout <milliseconds> (遅いターゲットホストを見切る) |
ホスト毎のスキャンタイムアウト時間をミリ秒単位の数値で指定する。 タイムアウトしたホストのポートスキャン、OS検出結果は出力されない。 |
コマンド例) nmap 192.168.110.128/30 –host-timeout 1 |
|
–scan-delay <seconds> –max_scan-delay <seconds> (プローブ間の遅滞時間を調節する) |
ホスト発見、ポートスキャン実行時、ホスト毎に指定した送信間隔でプローブを送出する。 |
コマンド例) nmap 192.168.110.128/30 –scan-delay 1 |
|
–max-retries <tries> | ホスト発見、ポートスキャン実行時のプローブ再送回数を指定。 デフォルトは10。(信頼性の高いネットワークの場合は通常1回のみ再送を実施。)0を指定すると再送を行わない。なお、DNSの逆引き解決のプローブ再送回数については本オプションの影響を受けない。 |
コマンド例) nmap 192.168.110.128/30 –max-retries 0 |
|
–min-rate <number> –max-rate <number> | 「–min-rate」は1秒あたりに送信するプローブの最小値を、「–max-rate」は1秒あたりに送信するプローブの最大値をそれぞれ指定する。 なお、同オプションは各ターゲットホスト毎ではなく、ターゲットホスト全体に対して送信するプローブ数の1秒あたりの上限、下限を決定する。ホスト発見、ポートスキャンで有効となるが、OS検出には影響を与えない。 |
コマンド例) nmap 192.168.110.128/30 –min-rate 10 nmap 192.168.110.128/30 –max-rate 5 |
|
-T <Paranoid|Sneaky|Polite| Normal|Aggressive|Insane> (タイミングのテンプレートを設定する) |
スキャン用のタイミングテンプレートを使用する。 テンプレートは、paranoid (0)、sneaky (1)、polite (2)、normal (3)、aggressive (4)、insane (5)があり、-Tオプションと番号(0 – 5)か名前で指定できる。 デフォルトは「-T3(normal)」で、番号より小さくなるにつれスキャン処理速度を落として実行する。逆に番号が大きくなるにつれ、スキャン速度を上げて実行する。(プローブの送信間隔でタイミングをとる。) テンプレートを最初に指定することで、その他制御オプションと組み合わせて使用することができる。 |
コマンド例) nmap 192.168.1.128/30 -T3 nmap 192.168.1.128/30 -T2 nmap 192.168.1.128/30 -T4 |
■ファイアウォール/IDSの回避とスプーフィング
コマンド | コマンドの説明
コマンド例 |
-f (パケットをフラグメント化する) –mtu (指定したMTUを用いる) |
ホスト発見を含む全てのスキャンにてパケットをフラグメント化する。 は小さく断片化されたIPパケットを利用するようになる。「-f」を一度指定すると、IPヘッダを8バイトかそれ以下のパケットに分割、「-f」を二度指定すると、IPヘッダを16バイトのパケットに分割。 「–mtu」では、ユーザ独自の分割サイズを指定することも可能。(分割サイズは8の倍数にする必要がある。) |
コマンド例) nmap 192.168.1.96/29 -f nmap 192.168.1.96/29 -f -f nmap 192.168.1.96/29 –mtu 8 |
|
-D <decoy1 [,decoy2][,ME],…> (おとりを使ってスキャンを隠蔽する) |
実際のスキャンの他に、おとりとして指定したホストアドレス(複数可)もスキャンしているようにターゲットホストに見せかける。各おとりホストはコンマで区切って指定する。おとりの1つとしてME(自分)オプションを用いて、Nmap実行ホストのIPアドレスをその位置で稼働させることもできる。 MEオプションを使わない場合、Nmapがランダムに位置を指定する。おとりホストのMACアドレスはNmap実行ホストのものを使用。おとりホストはNmap実行ホストと別セグメントのIPアドレスも指定可能。おとりとして使用するホストが稼動中でないと、OpenポートのSYN/ACKパケットに対するRSTを返さないため、ハーフオープン接続が大量に発生する可能性がある。 おとりは、ホスト発見およびポートスキャンの両方で使用される。OS検出「-O」を行う際にも使われる。 |
コマンド例) nmap 192.168.1.96/29 -D 192.168.110.1,ME nmap 192.168.1.96/29 -D 192.168.111.1,ME |
|
-S <IP_Address> (ソースアドレスを偽装する) |
プローブの送信に利用したいインターフェースのIPアドレスを指定する。 ・Nmap実行ホストとターゲットホストが同セグメントの環境 ホスト発見、ポートスキャンにて偽装IPアドレスを使用。Nmap実行ホストと別セグメントの偽装IPアドレスも使用可能。 ・Nmap実行ホストとターゲットホストが別セグメントの環境 ホスト発見、ポートスキャンにて偽装IPアドレスを使用。Nmap実行ホストと別セグメントの偽装IPアドレスは使用不可。 |
コマンド例) nmap 192.168.1.96/29 -S 192.168.110.132 -e eth0 -Pn nmap 192.168.1.96/29 -S 192.168.1.131 -e eth0 -Pn |
|
-e <interface> (特定のインターフェースを使用する) |
プローブを送受信に使用するNmap実行ホストのインターフェースを指定。 |
コマンド例) nmap 192.168.1.96/29 -e eth0 |
|
–source-port <portnumber> -g <portnumber> (ソースポート番号を偽装する) |
ポートスキャン時のソースポート番号を偽装する際に使用する。 |
コマンド例) nmap 192.168.1.96/29 -sS –source-port 20 nmap 192.168.1.96/29 -sU –source-port 53 |
|
–proxies <url1,[url2],…> | HTTP / SOCKS4プロキシを介するときに使用する。 |
コマンド例) nmap 192.168.1.96/29 –proxies http://proxy.com |
|
–data <hex string>※2 (送信パケットにバイナリデータを付加する) |
送信するパケット内のペイロードにバイナリデータを含めることができる。 データは以下のとおり16進数で指定する。 ・0xAABBCCDDEEFF<…> ・AABBCCDDEEFF<…> |
コマンド例) nmap 192.168.1.96/29 –data 0xAAAABBBB nmap 192.168.1.96/29 –data AAAABBBB |
|
–data-string <string>※2 (送信パケットに文字列データを付加する) |
送信するパケット内のペイロードに文字列データを含めることができる。 文字列はユニコードにて送信する。 |
コマンド例) nmap 192.168.1.96/29 –data-string test |
|
–data-length <number> (送信パケットにランダムデータを付加する) |
送信パケットに指定したバイト数のランダムデータを付加する。 ホストの発見およびポートスキャン時のパケットには概ねデータが付加されるが、OS検出時のパケットにはデータは付加されない。 |
コマンド例) nmap 192.168.1.96/29 –data-length 10 |
|
–ip-options <options> | 指定されたIPオプション(sourceルーティング、Recordルートなど)付きパケットを送信する。 R: Record Route T: Record-timestamp U: Record Route、Record-timestampの両方 L: Looseソースルーティング S: Strictソースルーティング |
コマンド例) nmap 192.168.1.96/29 –ip-options R nmap 192.168.1.96/29 –ip-options L |
|
–ttl <value> (IPのTTLフィールド値を設定する) |
送信パケットのIPv4生存時間(TTL)フィールドを指定した値に設定する。 |
コマンド例) nmap 192.168.1.96/29 –ttl 10 |
|
–randomize-hosts※1※2 (ターゲットホストの順番を無作為化する) |
ターゲットホストのスキャン順序(ホストの発見、ポートスキャンともに)をランダムにする。デフォルトでは昇順にスキャンが行われる。 (スキャン前に、各グループあたり最大8096のホストをランダムに並び替える。) |
コマンド例) nmap 192.168.1.0/24 –randomize-hosts |
|
–spoof-mac <mac address, prefix, or vendor name> (MACアドレスを偽装する) |
Nmapが送信するイーサネットフレームに、指定したMACアドレスを使用する。オプション「–send-eth」が必須。 MACアドレスの指定方法は以下のとおり 文字列の“0”:MACアドレスをランダムに指定 16進数(2桁ずつコロンで区切る)の数値:同値をMACアドレスとして使用。12桁未満の16進数が指定された場合は、残りの6バイトにはランダムに指定する。 引数が0以外の文字列(Apple, Ciscoなど):nmap-mac-prefixes を調べ、指定した文字列を含むベンダ名を見つける。一致するものがあった場合、そのベンダのOUIを使用し、残りの3バイトにはランダムに指定する。 Nmap実行ホストとターゲットホストが同セグメントの環境では、ホスト発見の段で失敗する。Nmap実行ホストとターゲットホストが別セグメントの環境では、スキャンは成功するが「-Pn」オプションが必須となる。 |
コマンド例) nmap 192.168.1.96/29 –send-eth –spoof-mac 0 -Pn nmap 192.168.1.96/29 –send-eth –spoof-mac 00:00:0D:11:11:11 -Pn nmap 192.168.1.96/29 –send-eth –spoof-mac cisco -Pn |
|
–badsum (送信パケットに無効なチェックサムを使用する) |
ターゲットホストに送信されるパケットに対して無効なTCP、UDPまたはSCTPチェックサムを使用する。 ターゲットホストは受け取ったパケットをドロップし、なにも応答しない。 Nmap実行ホストとターゲットホストが別セグメントの環境の場合には、「-Pn」オプションが必須。(ホスト発見時のICMPその他パケットにも応答しなくなるため。) |
コマンド例) nmap 192.168.1.96/29 –badsum |
■出力
コマンド | コマンドの説明
コマンド例 |
デフォルト | 標準出力(Nmapを実行中のターミナル)に出力。 |
コマンド例) nmap 192.168.1.96/29 |
|
-oN <filespec> (通常出力) |
指定した名前のファイルにテキストで結果が書き込まれる。標準出力に比べ、実行時間情報や警告の出力が削られている。 |
コマンド例) nmap 192.168.1.96/29 -oN test |
|
-oX <filespec> (XML出力) |
指定した名前のファイルにXML形式で結果が書き込まれる。 デフォルトでは、nmap.xslののスタイルシートが使用される。 |
コマンド例) nmap 192.168.1.96/29 -oX test |
|
-oS <filespec> (ScRipT KIdd|3 oUTpuT) |
指定した名前のファイルにleet形式((一部のアルファベット文字を音や形状の似た別の文字に置き換える形式)のテキストで結果が書き込まれる。 |
コマンド例) nmap 192.168.1.96/29 -oS test |
|
-oG <filespec> (Grep検索可能出力) |
指定した名前のファイルにGrep可能なテキストで結果が書き込まれる。 出力結果の構成はコメント行(#記号で始まる行)とターゲット行で構成されており、ターゲット行は、6つのラベル付きフィールドの組み合わせになっており、それぞれのフィールドはタブで区切られている。各フィールドは、Host、Ports、Protocols、Ignored State、OS、Seq Index、IPID、Statusになっている。Ports(ポート)エントリはカンマ区切りリストになっており、各ポートエントリは、7つのスラッシュ(/)で区切られたサブフィールドから成る。各サブフィールドはポート番号/ポートの状態/プロトコル/所有者/サービス/SunRPC情報/バージョン情報/を示す。 |
コマンド例) nmap 192.168.1.96/29 -oG test |
|
-oA <basename> (全フォーマットに出力する) |
スキャン結果を通常、XML、grep可能の3つのフォーマットで出力する。それぞれ、<basename>.nmap、<basename>.xml、<basename>.gnmapというファイルに保存される。 |
コマンド例) nmap 192.168.1.96/29 -oA test |
|
-v (出力結果の詳細(冗長)レベルを上げる) |
より詳細なスキャン結果を出力する。二度指定すると、より詳細なスキャン結果を出力する。(ホスト検出、DNS逆引きなどの進捗状況や、Openポートのreasonなどが表示される。Openポートは見つかり次第表示される。) 本オプションは標準出力を対象にしたものだが、通常出力とスクリプトキディ出力にも一部効果がある。 |
コマンド例) nmap 192.168.1.96/29 -v |
|
-d (デバッグレベルを上げる/設定する) |
「-v」オプション以上の詳細なスキャン結果を出力する。複数回指定すると、より詳細なスキャン結果を出力する。 ホスト検出、DNS逆引き、ポートスキャンの進捗状況や、TimingReport、およびOpenポートのReasonなどが表示される。デバッグレベルを指定することで、結果の詳細レベルを設定できる。(1~9から9が最も詳細。) |
コマンド例) nmap 192.168.1.96/29 -d |
|
–reason (ホストおよびポートステータスの理由を表示する) |
各ポートの状態(Open、Closedポートなど)を特定した理由、および各ホストがUPまたはDownしている理由を示す。例えば、RSTパケットが来たからClosedポート、エコー応答があったからホストはUPしているなど。 XMLで出力した場合には、同オプションを指定していなくても理由を出力する。 |
コマンド例) nmap 192.168.1.96/29 –reason |
|
–open (Openポートのみ表示する) |
少なくとも1つのOpen、open|filteredもしくは、unfilteredポートがあるホストのみを特定し(すべてのポートがFilteredのホストは出力しない)、また同状態にあるポートのみを出力。 |
コマンド例) nmap 192.168.1.96/29 –open |
|
–packet-trace (送受信したパケットやデータを追跡する) |
Nmapが送受信した全パケットを表示する。 |
コマンド例) nmap 192.168.1.96/29 –packet-trace |
|
–iflist (インターフェースや経路の一覧を表示する) |
Nmap実行ホストのインタフェースおよびルーティングテーブル表示。 |
コマンド例) nmap 192.168.1.96/29 –iflist |
|
–append-output (出力ファイルは上書きせず追加する) |
「-oX」や「-oN」などでスキャン結果をファイルに出力する際、指定したファイル名が既に存在する場合には、既存のファイルに結果を追記する。 (デフォルトでは結果を上書きする。) |
コマンド例) nmap 192.168.1.96/29 -oN test –append-output |
|
–resume <filename> (中断したスキャンを再開する) |
Nmapのスキャンは、ctrl+Cを押すことによってキャンセルできる。 通常出力「-oN」もしくはgrep可能出力「-oG」のログが存在すれば、本オプションで中断されたスキャンを再開することができる。 引数として、通常もしくはgrep可能出力ファイルをとる。 (検証では”Unable to parse supposed log file test7. Sorry”のメッセージが表示され再開できず。) |
コマンド例) nmap 192.168.1.96/29 -v -sV -oN test nmap –resume test |
|
–stylesheet <path or URL> (XML出力変換のXSLスタイルシートを設定する) |
XML形式のファイル出力に際し、カスタムのスタイルシートを使用する場合に使用。引数はフルパス名かURLで指定する。 |
コマンド例) nmap 192.168.1.96/29 -oX test –stylesheet http://www.insecure.org/nmap/data/nmap.xsl |
|
–webxml (Nmap.OrgよりXSLスタイルシートを読み込む) |
XML形式のファイル出力に際し、以下のスタイルシートを指定する場合に使用するオプション。 https://nmap.org/svn/docs/nmap.xsl |
コマンド例) nmap 192.168.1.96/29 -oX test –webxml |
|
–no-stylesheet (XSLスタイルシート宣言をXMLから除外する) |
XML形式のファイル出力に際し、XSLスタイルシートを関連付けないようにする。 |
コマンド例) nmap 192.168.1.96/29 -oX test –no-stylesheet |
■その他オプション
コマンド | コマンドの説明
コマンド例 |
-6 (IPv6スキャンを有効にする) |
IPv6スキャンを有効にする。IPv6で使用するためには、スキャンのソースとターゲットの両方をIPv6対応に設定する必要がある。なお、ホストの発見(TCPのみ)、connect()スキャン、バージョン検出はIPv6に対応している。 |
コマンド例) nmap 2001:0db8:1234:5678:90ab:cdef:0000:0000 -6 |
|
-A (アグレッシブ・スキャンオプション) |
このオプションを指定すると、OS検出「-O」とバージョンスキャン「-sV」を実行できる。タイミングオプション(例えば-T4)や冗長オプション「-v」との併用不可。 ホスト名やworkgroupの検出も行う。 |
コマンド例) nmap 192.168.1.96/29 -A |
|
–datadir <directoryname> (Nmapの特別データファイルの位置を指定する) |
Nmap実行時に使用する”nmap-service-probes、nmap-services、nmap-protocols、nmap-rpc、nmap-mac-prefixes、nmap-os-fingerprints”のファイル位置を指定する。Nmapは同ファイル群を以下の順序で探す。 1. 「–datadir」オプションで指定したディレクトリ内 2. [NMAPDIR]環境変数で指定したディレクトリ内 3. 実在する有効なUID(POSIXシステムの場合)やNmapの実行ファイル(Win32の場合)が格納されているディレクトリの~/.nmap 4. 組み込みディレクトリの/usr/local/share/nmap や/usr/share/nmap 5. Nmapのカレントディレクトリ |
コマンド例) nmap 192.168.1.96/29 –datadir /root |
|
–send-eth (raw(生の)イーサネット層で送信する) |
フレームの送信をraw Ethernetソケットを介して行う。(イーサネットフレームヘッダがカスタマイズ可) |
コマンド例) nmap 192.168.1.96/29 –send-eth |
|
–send-ip (raw IPレベルで送信する) |
パケットの送信をraw IPソケットを介して行う。(IPヘッダががカスタマイズ可) |
コマンド例) nmap 192.168.1.96/29 –send-eth |
|
–privileged※2 (ユーザが十分な権限を持つことを想定する) |
Nmap実行ユーザがルート権限を与えられていると仮定して実行。 |
コマンド例) nmap 192.168.1.96/29 –privileged |
|
–unprivileged※2 (ユーザが十分な権限を持っていないことを想定する) |
Nmapを権限のないユーザとして実行する。 ポートスキャンはデフォルトで「-sT」になる。 |
コマンド例) nmap 192.168.1.96/29 –unprivileged |
|
-V –version (バージョン番号を表示する) |
Nmapのバージョン番号を表示。 |
コマンド例) nmap -V |
|
-h –help (ヘルプのサマリーページを表示する) |
各コマンドについてのヘルプ画面を表示する。Nmapを引数なしで実行してもヘルプ画面を表示する。 |
コマンド例) nmap -h |
以上です。
reported by ntsuji, kuno
SMBログインパスワードのクラックツールを比較検証してみました
※本投稿に記載の内容を自身の管理下にないネットワーク・コンピュータに行った場合は、攻撃行為と判断され、最悪の場合、法的措置を取られる可能性もあります。同内容の調査を行われる場合には、必ず自身の管理下にあるネットワークやサーバーに対してのみ実施してください。
【検証概要】
SSHログインパスワードクラックの検証時に使用したものと同じ、下記4ツールについてSMBパスワードのクラッキング速度を比較検証をしました。
- Metasploit(smb_loginモジュール)
- hydra
- medusa
- ncrack
【検証環境】
1台の物理PCに、攻撃用サーバ(KaliLinux)および被攻撃用サーバ(Windows7)を仮想マシンとして構築し、同サーバ間で検証を行いました。
攻撃は1つのユーザに対し、多数のパスワードを試行する手法を採用しました。試行するパスワードには1000個のユニークなパスワードが記載されたファイルを使用し、被攻撃用サーバのSMBログインパスワードは同パスワードファイルの一番最後に記載されているパスワードを設定しました。
また、クラッキングツールのオプション値および被攻撃用サーバのSMBサーバに関する設定値を適時変更し、各設定値毎に速度を測定しました。
なお、本検証では以下バージョンのクラッキングツールを使用しました。
「Metasploit(smb_loginモジュール)」:Version 4.11.5-2016010401-0kali1
「hydra」:Version 8.1-1+b1
「medusa」:Version 2.2-0kali2
「ncrack」:Version 0.5-0kali1
【検証結果】
検証結果は下表のとおりです。
表の列はツールおよびツールのオプション値を、表の行はSMBサーバの設定値を示しています。(設定値の詳細については次々項に記載しています。)
SMBサーバにてアカウントロックのしきい値を設けることにより、ほぼ全てのツールで“Crack不可”となりました。今回の検証のように、1つのユーザに対して、多数のパスワードを試行するクラック手法への対策としては、同値を0以外の値に設定することが非常に有用である言えます。
ただし、アカウントロックのしきい値を設けていない場合には、マルチコネクションのオプションを設定した「medusa」、次いで「hydra」が素晴らしいスピードでクラックに成功することが分かりました。
「Metasploit(ssh_loginモジュール)」および「ncrack」についても、「medusa」・「hydra」と比較すると、クラックスピードが非常に遅い印象を受けますが、問題なくクラックに成功しました。
【総評】
検証結果より、有用と判断できるツールを以下に示します。
■有用ツール
「medusa」
唯一マルチコネクションに対応しており、かつクラッキング速度が非常に早いため、クラックするにあたっての条件が特にない場合には、同ツールの使用が最も汎用的であると考えられます。
「hydra」
シングルコネクションのみの対応ですが、本ツールもクラッキング速度が非常に早いため、充分有用であると判断できます。
■非有用ツール
「Metasploit(ssh_loginモジュール)」
クラッキング速度が上記有用ツールに比べて非常に遅く、またアカウントがロックアウトされた状態でもパスワードを試行し続ける動作を鑑みて、あまり有用ではないと考えます。
「ncrack」
クラッキング速度が上記有用ツールに比べて非常に遅く、またアカウントがロックアウトされた状態でもパスワードを試行し続ける動作を鑑みて、あまり有用ではないと考えます。
SMBログインパスワードのクラッキングを行うにあたり、1つのユーザに対し多数のパスワードを試行するという手法は、前項にも記載したとおり、アカウントロックのしきい値を設けることにより成功率が著しく下がります。そのため、SMBログインパスワードのクラッキングには本検証の手法よりも、多数のユーザに対し1つのパスワードを試行するという手法が有用であると考えられます。
【設定値の詳細(下線は検証より判明した事項です。)】
※本項のコマンド実行例は、以下の環境を前提に記載しております。
被攻撃用サーバのIPアドレス:192.168.110.129
クラッキング対象のユーザ名:kuno
クラッキングに使用するパスワードファイル:/root/Desktop/passwords.1000
- SMBサーバの設定
設定項目 | デフォルト値 | 説明 |
アカウントの ロックアウトの しきい値 |
0 |
ユーザアカウントがロックアウトされる原因となるログオン失敗回数を決定します。ロックアウトされたアカウントは、管理者がリセットするか、そのアカウントのロックアウト期間が過ぎるまで使用できません。0 に設定すると、アカウントがロックアウトされることはありません。 |
設定手順)
1. コントロールパネルより、[管理ツール]選択し、[ローカル セキュリティ ポリシー]をクリックします。
2. [セキュリティの設定] > [アカウント ポリシー] > [アカウント ロックアウトのポリシー]を順に選択します。
3. [アカウントのロックアウトのしきい値]を右クリックし、[プロパティ]を選択します。設定値を入力し、[OK]ボタンをクリックします。
設定項目 | デフォルト値 | 説明 |
ロックカウンターの リセット |
なし | ログオン失敗後、ログオン失敗のカウンターが 0 (不良ログオン試行) にリセットされるまでに必要な時間を分単位で指定します |
設定手順)
1. コントロールパネルより、[管理ツール]選択し、[ローカル セキュリティ ポリシー]をクリックします。
2. [セキュリティの設定] > [アカウント ポリシー] > [アカウント ロックアウトのポリシー]を順に選択します。
3. [ロックアウト カウンターのリセット]を右クリックし、[プロパティ]を選択します。設定値を入力し、[OK]ボタンをクリックします。
設定項目 | デフォルト値 | 説明 |
ロックアウト期間 | なし | ロックアウトされたアカウントが自動的にロック解除されるまでのロックアウト期間を分単位で指定します。ロックアウト期間を 0 に設定すると、管理者が明示的にロックを解除するまでアカウントはロックアウトされます。 |
設定手順)
1. コントロールパネルより、[管理ツール]選択し、[ローカル セキュリティ ポリシー]をクリックします。
2. [セキュリティの設定] > [アカウント ポリシー] > [アカウント ロックアウトのポリシー]を順に選択します。
3. [ロックアウト期間]を右クリックし、[プロパティ]を選択します。設定値を入力し、[OK]ボタンをクリックします。
設定項目 | デフォルト値 | 説明 |
共有フォルダに同時に接続できるユーザ数 | 20 |
共有フォルダへ同時に接続できるユーザの数を指定します。 ⇒同値を1に設定したケースにおいても、「medusa」にてマルチコネクションでの試行が可能であったため、SMBの認証には関係性がない設定と考えられます。 |
設定手順)
1. 共有フォルダを右クリックし、[プロパティ]を選択します。
2. [共有]タブを選択し、[詳細な共有]ボタンをクリックします。
3. [設定]項目の[同時に共有できるユーザー数]に設定値を入力し、[OK]ボタンをクリックします。
- Metasploit(SMB_loginモジュール)の設定
設定項目 | デフォルト値 | 説明 |
BrutForceSpeed | 5 | ログイン試行するスピードを指定します。0~5が選択でき、5が一番早い設定となります。
⇒上記説明通り、ログイン試行のスピードを調整することが可能でした。 |
コマンド実行例) BrutForceSpeed = 4 の場合
msf auxiliary(smb_login) > set bruteforce_speed 4
bruteforce_speed => 4
設定項目 | デフォルト値 | 説明 |
Thread | 1 | 同時実行するスレッド数を指定します。
⇒設定を変更しても、ツールの動作に変化はなく、すべてシングルコネクションで実行されました。 |
コマンド実行例) Thread = 5 の場合
msf auxiliary(smb_login) > set threads 5
threads => 5
◆その他、Metasploit(SMB_loginモジュール)の検証で判明した事項
・デフォルトの設定では、下図のパケットキャプチャデータのとおり、試行する1パスワード毎に、SMBプロトコルのネゴシエーションを行い、セッション・セットアップ(パスワード試行)を実施するという動きをしました。(シングルコネクション)
・下図、ツール実行時の出力結果のとおり、アカウントロックアウトのしきい値に達しても、全てのパスワードを試行するまでは終了しませんでした。
※アカウントロックのしきい値を設けた状態で唯一クラックに成功したケースでは、設定したアカウントのロックアウト期間が過ぎ、ロックアウトが解除されたタイミングで偶然、正解のパスワードを試行し、クラックが成功しました。
- hydraの設定
設定項目 | デフォルト値 | 説明 |
Task | 1 | 同時実行するコネクションの数を指定します。
⇒設定を変更しても、ツールの動作に変化はなく、すべてシングルコネクションで実行されました。 |
コマンド実行例) Task = 4 の場合
hydra -l kuno -P /root/Desktop/passwords1000.txt -t 4 192.168.110.129 smb
◆その他、hydraの検証で判明した事項
・デフォルトの設定では、下図のパケットキャプチャデータのとおり、試行する1パスワード毎に、SMBプロトコルのネゴシエーションを行い、セッション・セットアップ(パスワード試行)を実施するという動きをしました。(シングルコネクション)
・下図のパケットキャプチャデータのとおり、アカウントロックアウトのしきい値に達した場合には即座にツールが終了しました。
- medusaの設定
設定項目 | デフォルト値 | 説明 |
-g[NUM] | 3 | ギブアップする前に再試行を実施する数。試行の合計数はNUM+1。
⇒設定を変更しても、ツールの動作に変化はありませんでした。 |
コマンド実行例) g = 1 の場合
medusa -h 192.168.110.129 -u kuno -P /root/Desktop/passwords1000.txt -M smbnt -g 1
設定項目 | デフォルト値 | 説明 |
-r[NUM] | 3 | 再試行までのスリープ時間(秒)。
⇒設定を変更しても、ツールの動作に変化はありませんでした。 |
コマンド実行例) r = 1 の場合
medusa -h 192.168.110.129 -u kuno -P /root/Desktop/passwords1000.txt -M smbnt -r 1
設定項目 | デフォルト値 | 説明 |
-t[NUM] | 1 | 同時実行するコネクションの数を指定。
⇒上記説明通り、指定したコネクション数、同時実行します。 |
コマンド実行例) t = 10 の場合
medusa -h 192.168.110.129 -u kuno -P /root/Desktop/passwords1000.txt -M smbnt -t 10
◆その他、medusaの検証で判明した事項
・デフォルトの設定では、下図のパケットキャプチャデータのとおり、ツール実行時の最初1回のみSMBプロトコルのネゴシエーションを行い、その後は連続してセッション・セットアップ(パスワード試行)を実施するという動きをしました。(シングルコネクション)
・下図、ツール実行時の出力結果のとおり、アカウントロックアウトのしきい値に達した場合には即座にツールが終了しました。
- ncrackの設定
設定項目 | デフォルト値 | 説明 |
cl=<time> | 自動計算で一番早い数値。 | 並行するコネクションの最小値。
⇒設定を変更しても、ツールの動作に変化はなく、すべてシングルコネクションで実行されました。 |
コマンド実行例) cl = 5 の場合
ncrack –user kuno -P /root/Desktop/passwords1000.txt 192.168.110.129:445,cl=5
設定項目 | デフォルト値 | 説明 |
CL=<time> | 自動計算で一番早い数値。 | 並行するコネクションの最大値。
⇒設定を変更しても、ツールの動作に変化はなく、すべてシングルコネクションで実行されました。 |
コマンド実行例) CL = 10 の場合
ncrack –user kuno -P /root/Desktop/passwords1000.txt 192.168.110.129:445,CL=10
設定項目 | デフォルト値 | 説明 |
cd=<time> | 自動計算で一番早い数値。 | 新しい接続を行う際の遅延時間。
⇒設定を変更しても、ツールの動作に変化はありませんでした。 |
コマンド実行例) cd = 3 の場合
ncrack –user kuno -P /root/Desktop/passwords1000.txt 192.168.110.129:445,cd=3
◆その他、ncrackの検証で判明した事項
・デフォルトの設定では、下図のパケットキャプチャデータのとおり、ツール実行時の最初1回のみSMBプロトコルのネゴシエーションを行い、その後は連続してセッション・セットアップ(パスワード試行)を実施するという動きをしました。(シングルコネクション)
・下図のパケットキャプチャデータのとおり、アカウントロックアウトのしきい値に達しても、全てのパスワードを試行するまでは終了しませんでした。
以上です。
reported by ntsuji, kuno
SSHログインパスワードのクラックツールを比較検証してみました
※本投稿に記載の内容を自身の管理下にないネットワーク・コンピュータに行った場合は、攻撃行為と判断され、最悪の場合、法的措置を取られる可能性もあります。同内容の調査を行われる場合には、必ず自身の管理下にあるネットワークやサーバーに対してのみ実施してください。
【検証概要】
SSHログインパスワードのクラックツールとして有名な下記4ツールについて、クラッキング速度の比較検証をしました。
- Metasploit(ssh_loginモジュール)
- hydra
- medusa
- ncrack
【検証環境】
1台の物理PCに、攻撃用サーバ(KaliLinux)および被攻撃用サーバ(CentOS7)を仮想マシンとして構築し、同サーバ間で検証を行いました。
攻撃は1つのユーザに対し、多数のパスワードを試行する手法を採用しました。試行するパスワードには1000個のユニークなパスワードが記載されたファイルを使用し、被攻撃用サーバのSSHログインパスワードは同パスワードファイルの一番最後に記載されているパスワードを設定しました。
また、クラッキングツールのオプション値および被攻撃用サーバのSSHサーバに関する設定値を適時変更し、各設定値毎に速度を測定しました。
なお、本検証では以下バージョンのクラッキングツールを使用しました。
「Metasploit(ssh_loginモジュール)」:Version 4.11.5-2016010401-0kali1
「hydra」:Version 8.1-1+b1
「medusa」:Version 2.2-0kali1
「ncrack」:Version 0.4-alpha-1kali2
【検証結果】
検証結果は下表のとおりです。
表の列はツールおよびツールのオプション値を、表の行はSSHサーバの設定値を示しています。(設定値の詳細については次々項に記載しています。)
純粋なクラッキング速度としては「ncrack」が圧倒的に早いことが分かります。
「Metasploit(ssh_loginモジュール)」については、ツールのオプション値およびSSHサーバの設定値にはあまり影響されず、ほぼ一定の速度でした。
「hydra」については、一部のケースを除いてパスワードクラック自体が不可でした。
「medusa」については、マルチコネクションのオプションを設定することにより、速度を改善することは可能でしたが、「ncrack」には敵わず、またSSHサーバの設定によってはマルチコネクションのオプションを設定しないケースより時間がかかってしまうケースもありました。
SSHサーバの設定については、パスワードがクラックされるまでの時間稼ぎには、「MaxStartups」をなるべく小さい値に設定することが最も有用であると考えられます。
【総評】
検証結果より、最も有用と考えられるツールおよび条件付きで有用と判断できるツールを以下に示します。
■有用ツール
「ncrack」
被攻撃サーバのSSH設定がいかなる場合であっても、クラッキング速度がその他ツールに比べ圧倒的に早いため、クラックするにあたっての条件が特にない場合には、同ツールの使用が最も汎用的であると考えられます。
■条件付き有用ツール
「medusa」
クラッキング速度については「ncrack」に劣りますが、同時実行するコネクション数の指定が柔軟なため、例えば複数台の攻撃サーバを用意して1台のサーバを攻撃する場合などには、攻撃サーバ間でコネクションの取り合いにならないよう、1台の攻撃サーバで使用するコネクション数を指定できる同ツールを使用するのがよいかと考えます。
「Metasploit(ssh_loginモジュール)」
クラッキング速度は他ツールに比べ劣っていますが、1コネクションにつき1パスワードしか試行しないという動作をするため(他ツールではコネクションあたりの最大認証試行回数、パスワードを試行します。次項参照。)、被攻撃サーバで「最大認証試行回数パスワード認証に失敗しました」というログ出力させるのを防ぎたい場合には、同ツールを使用するメリットがあると考えられます。
■非有用ツール
「hydra」
試行したいパスワードの数が少ない場合(被攻撃サーバがCentOS7でSSHサーバの設定がデフォルトであれば「96個以下」)には正常に動作しますが、それ以上のパスワードを試行したい場合にはクラックツールとして正常に動作しないため、あまり有用ではないと判断できます。
【設定値の詳細(下線は検証より判明した事項です。)】
- SSHサーバの設定
設定項目 | デフォルト値 | 説明 |
MaxtAuthTries | 6回 | 最大認証試行回数。SSHコネクション1つあたりの認証を最大で何回まで試みることができるかを指定します。 |
LoginGraceTime | 2分 | ログインの猶予時間。ユーザがこの時間内にログインしないとマシンは接続を切ります。なお、0は無制限を意味します。 |
MaxSessions | 10 | ネットワークコネクション1つあたりに許される最大のセッション数を指定します。 |
MaxStartups | 10:30:100 | 認証されていない段階の接続をSSHデーモンが受け付ける確率を指定できます。書式は、「開始数:確率:最大数」で、すべて半角数字で指定します。SSHの接続が開始数を超えた場合には、指定した確率で接続を拒否し始め、最大数になったらそれ以降の接続を拒否します。
⇒確率を0にすると、開始数の数に関わらずSSHコネクションが張れなくなりました。確率を100にすると、当然ですが開始数を超えるコネクションはすべて拒否しました。 |
- Metasploit(ssh_loginモジュール)の設定
設定項目 | デフォルト値 | 説明 |
BrutForceSpeed | 5 | ログイン試行するスピードを指定します。0~5が選択でき、5が一番早い設定となります。
⇒上記説明通り、ログイン試行のスピードを調整することが可能でした。 |
Thread | 1 | 同時実行するスレッド数を指定します。
⇒同時実行するような動作は行わず、すべてシングルコネクションで実行されました。 |
◆その他、Metasploit(ssh_loginモジュール)の検証で判明した事項
- デフォルトの動作は、試行するパスワード1つにつき、SSH認証のコネクションを張り、パスワードを試して認証失敗であればコネクションを閉じるという動きをしました。(シングルコネクション)
- コネクションタイムアウトなどで、3回連続接続に失敗するとモジュールが終了しました。
- hydraの設定
設定項目 | デフォルト値 | 説明 |
Task | 16 | 同時実行するコネクションの数を指定します。
⇒Taskの設定値が「MaxStartups」の開始値<Taskの設定値<「MaxStartups」の最大値であれば、設定したTask数でアタックしました。(「MaxStartups」の確率は影響しませんでした。)Taskの設定値>「MaxStartups」の最大値の場合は、「MaxStartups」の最大値でアタックしました。 |
◆その他、hydraの検証で判明した事項
- デフォルトの動作は、SSH認証コネクションを同時に16コネクション張り、各コネクションで試行可能な最大回数、パスワードを試し、試行可能な最大回数、認証失敗となりSSHサーバにコネクションを切断された場合、新たなコネクションを張ることなくクラック不可というステータスで終了、という動きをしました。
- 上記のとおり、あるSSHコネクションにおいて、パスワード試行の最大回数を超え、SSHサーバにコネクションを切断された場合には新たなコネクションを張りませんが、「LoginGraceTime」の猶予時間オーバーによりSSHサーバにコネクションを切断された場合には、再度SSHサーバへ新たなコネクションを張りにいきました。
- medusaの設定
設定項目 | デフォルト値 | 説明 |
-g[NUM] | 3 | ギブアップする前に再試行を実施する数。試行の合計数はNUM+1。
⇒設定を変更しても、ツールの動作に変化はありませんでした。 |
-r[NUM] | 3 | 再試行までのスリープ時間(秒)。
⇒設定を変更しても、ツールの動作に変化はありませんでした。 |
-t[NUM] | 1 | 同時実行するコネクションの数を指定。
⇒上記説明通り、同時実行します。ただし「MaxStartups」の確率に引っかかり、コネクションが拒否された場合には、同時実行するコネクション数を動的に減らしました。(「MaxStartups」の開始数の値より小さくなることもあります。逆に「MaxStartups」の開始数以下の値であれば、そのコネクション数を維持しました。 |
◆その他、medusaの検証で判明した事項
- デフォルトの動作は、シングルコネクションでSSH認証コネクションを張り、試行可能な最大回数パスワードを試し、試行可能な最大回数、認証失敗となりSSHサーバにコネクションを切断されると、新たにコネクションを張りに行き、同じように試行可能な最大回数パスワードを試します。これを繰り返すという動作をしました。
- ncrackの設定
設定項目 | デフォルト値 | 説明 |
cl=<time> | 自動計算で一番早い数値。 | 並行するコネクションの最小値。
⇒SSHのサーバおよびncrackの設定がデフォルトの場合は本検証環境では10~12コネクションからスタートしました。それより小さい値を指定した場合は無視され、10コネクションでスタートしました。clの値>「MaxStartups」の最大数の場合は、「MaxStartups」の最大数のコネクションを張りました。 |
CL=<time> | 自動計算で一番早い数値。 | 並行するコネクションの最大値。
⇒SSHのサーバおよびncrackの設定がデフォルトの場合は12~13コネクションを維持しました。CLの値を指定した場合はその値以上のコネクションは張りませんでした。 |
cd=<time> | 自動計算で一番早い数値。 | 新しい接続を行う際の遅延時間。
⇒マルチコネクションで接続する際、1コネクション毎に上記の設定時間待機してから接続しました。 |
◆その他、ncrackの検証で判明した事項
- デフォルトの動作は、ツール実行直後はシングルコネクションで接続し、SSH認証の試行最大回数失敗しSSHサーバにコネクションを切断されると、その後は、マルチコネクション(検証環境では12~13コネクション程度)で接続するという動作をしました(cl/CLの設定値を変えてもこの動作は変わりませんでした。)。SSHサーバの「MaxtAuthTries」が100など非常に大きい値の場合には、ツール実行直後のシングルコネクションでの試行は60回程度で終了し、マルチコネクションに移行しました。
- ncrackはmedusaのように、「MaxStartups」の確率に引っかかってコネクションが拒否されても、動的にコネクション数を減らすような動作はせず、コネクション数を維持しました。(概ね「MaxtAuthTries」の開始数以上、「MaxtAuthTries」の最大数未満でコネクションを張りました。)
以上です。
reported by ntsuji, kuno
OnionShare を使ってみました。
先日、参加した「江戸前セキュリティ勉強会(2014/07)」のLTで@kitagawa_takuji さん が「OnionShare」というツールの紹介をしていましたのでボクも使ってみました。
「OnionShare」は、Tor Hidden Serviceを使ってファイルを共有する為のツールで、Torネットワークに接続した状態で共有したファイルを指定すると一時的なURLが生成されそのファイルが共有状態になります。そのURLを受け取る側に安全な方法で伝え、受け取る側はTorネットワークに接続した状態でブラウザを使ってそのURLを指定しダウンロードするという単純な仕組みです。
公式サイトはこちら。
現在の対応OSは以下の通りです。
/
【OnionShare起動】
予めTorネットワークに接続しておく必要があります。
(一番簡単な方法はTor Browser Bundleをダウンロードして、Tor Browserを起動することです。)
接続していない状態で「OnionShare」を起動すると以下のようなエラーメッセージが表示されます。
Torネットワークに接続した状態で起動すると下図のように共有するファイルの選択画面が表示されます。
ここでファイルを選択をしたら共有完了でURLが生成されます。
ここで「Copy URL」ボタンをクリックするとクリップボードに生成されたURLがコピーされます。
また、「Close automatically」にチェックを入れていると接続してきた最初のユーザのみがダウンロードできるようです。
チェックを外している状態ですと自動でクローズされず、任意にクローズされるまではダウンロードし続けられるようでした。
コピーしたURLをTor Browserを利用して接続を行なうと下図のような画面が表示されます。
ここでファイル名のボタンをクリックすることでダウンロードが開始されます。
アクセスがあった際の「OnionShare」の画面はこちらです。
先程の画面から「Download page loaded」という通知が追加されていますね。
「Close automatically」にチェックが入っている状態だと、このあとウインドウが閉じられることになります。
そして、再度ブラウザでアクセスしても接続できないようになります。(終了しているので当然ですが)
また、チェックが入っていない場合は下図のように開きっぱなしとなり開いている以上、URLを知る人はダウンロード可能となります。
Torネットワークを使っているので速度的には若干のストレスはあるかもしれませんがルータの設定などを変更することなく手軽にファイルを共有できますし、ダウンロードされたことを知ることもできるので「◯◯に共有したのでダウンロードしたら消すから教えてね。」的なやり取りも必要ないためちょっとしたファイルを共有する際には便利かもしれませんね。肝としてはURLの受け渡しを安全に行う必要があるということでしょうか。
以上です。
ncrack オプションメモ
dd オプションメモ
入力から出力へデータをコピーするコマンド「dd」のオプションメモです。
超訳です。
Continue reading
Wireshark SMB file extraction plug-inをいれてみた。
TaddongというところからWiresharkのplug-inがリリースされていました。
blogのエントリを斜め読みしたところ、SMB通信をキャプチャすると流れたファイルを補足して表示し
保存までできるような感じです。
とまぁ、いつものごとくしっかりドキュメントも読まずに
とりあえず動かしみよう。ということで手元のUbuntu9.10に入れてみました。
このplug-inはソースにパッチを当てることで組み込むことができます。
ということで
Continue reading
PDFResurrectを使ってみました。
PDFファイルの情報を分析するツール[PDFResurrect]を使ってみました。
「Resurrect」というのは、復活、復興、生き返らせるという意味のようで
更新履歴や作成者情報などなど、色々な情報を抽出することが可能なようです。
ちょっと使ってみては?という意見をいただいたので
とりあえずという形ではありますが使ってみました。
Continue reading
Amap オプションメモ
今更ながらですが、オープンポートやポートなどの応答からアプリケーションマッピングを
行なうツールである「Amap」のオプションメモを作ってみました。
# 文章中にでてくるトリガー(trigger)というのは送信するパケット情報のことをそう呼んでいるのだと思います。
公式サイトはこちら。 Continue reading