Skip to content

Lab 1.4: Nmap

オンライン演習

接続性: この演習を行うには、クラス内ネットワーク(560A VPN経由)に接続している必要があります

目的

  • Nmapを使用してネットワーク範囲10.130.10.0/24をスイープすることでターゲットマシンを特定する
  • Nmapでポート範囲を指定し、より一般的なポートを決定するためにNmap-servicesファイルを分析する
  • TCPおよびUDPポートスキャンを実施し、両者の違いを分析する

ウォークスルービデオ

ラボのセットアップ

使用するVM:

  • Linux

Slingshot Linux VMから10.130.10.10にpingできる必要があります:

コマンド

ping -c 4 10.130.10.10

想定される結果

sec560@560vm:~$ ping -c 4 10.130.10.10
PING 10.130.10.10 (10.130.10.10) 56(84) bytes of data.
64 bytes from 10.130.10.10: icmp_seq=1 ttl=63 time=77.3 ms
64 bytes from 10.130.10.10: icmp_seq=2 ttl=63 time=77.1 ms
64 bytes from 10.130.10.10: icmp_seq=3 ttl=63 time=79.7 ms
64 bytes from 10.130.10.10: icmp_seq=4 ttl=63 time=81.3 ms

--- 10.130.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 77.051/78.840/81.315/1.757 ms

ラボ – ステップバイステップの手順

1: 初期スキャン

ターゲットサブネットのスキャンを実行しましょう。

コマンド

nmap -n 10.130.10.1-10

想定される結果

sec560@560vm:~$ nmap -n 10.130.10.1-10
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:08 UTC
Nmap scan report for 10.130.10.5
Host is up (0.083s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT     STATE SERVICE
80/tcp   open  http
445/tcp  open  microsoft-ds
3389/tcp open  ms-wbt-server

Nmap scan report for 10.130.10.6
Host is up (0.082s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT     STATE SERVICE
80/tcp   open  http
3389/tcp open  ms-wbt-server

Nmap scan report for 10.130.10.10
Host is up (0.086s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT     STATE SERVICE
22/tcp   open  ssh
23/tcp   open  telnet
80/tcp   open  http
9100/tcp open  jetdirect

Nmap done: 10 IP addresses (3 hosts up) scanned in 11.85 seconds

-nはNmapがドメイン名を解決しないことを意味します。Nmapスキャンの実行中にpキーを押すとパケット単位のロギングがオンになり、Shift-pでオフになります。

講義で説明したように、Nmapはrootとして実行されていない限り、ICMPパケットを送信できないことを思い出してください。前のコマンドをsudoで実行するか、rootユーザーとして実行すると、ICMPパケットも確認できます。

また、vキーとdキーをそれぞれ複数回押して、冗長性とデバッグ情報を試してみてください。十分な速さで入力できない場合は、スキャンを再起動してから押してみてください。

2: 10.130.10.33のスキャン

次に、ターゲットマシン10.130.10.33のTCPポートスキャンを実施しましょう。

新しいターミナルを開く

ネットワーク10.130.10.0/24に関連するトラフィックを表示するようにtcpdumpを起動します(名前解決なし)。

パケットを観察するためにスニファーを実行できるように、新しいターミナルウィンドウを起動してください:

コマンド

sudo tcpdump -i tun0 -nn net 10.130.10.0/24

想定される結果

sec560@slingshot:~$ sudo tcpdump -i tun0 -nn net 10.130.10.0/24

以下のコマンドが実行されるまで、パケットは表示されません。

次に、元のNmapターミナルウィンドウに戻って、Nmapを起動して10.130.10.33ホストをスキャンし、TCP接続スキャン(完全な3ウェイハンドシェイク)を実行します:

コマンド

sudo nmap -n -sT 10.130.10.33 -F

想定される結果

sec560@560vm:~$ sudo nmap -n -sT 10.130.10.33 -F
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:11 UTC
Nmap scan report for 10.130.10.33
Host is up (0.075s latency).
Not shown: 98 filtered tcp ports (no-response)
PORT     STATE SERVICE
1433/tcp open  ms-sql-s
3389/tcp open  ms-wbt-server

Nmap done: 1 IP address (1 host up) scanned in 3.12 seconds

上記のように、Nmapはスキャンの完了にかかる合計時間を表示します。

また、スニファーの出力を確認してください。マシンからターゲットへ送信される多数のSYNパケット(S)が表示されるはずです。3ウェイハンドシェイクを完了するために、比較的少ない数のSYN-ACKが返ってきて、マシンからACKが送信されます。

ただし、Nmapはこの呼び出しですべてのTCPポートをスキャンしたわけではありません。/usr/share/nmap/nmap-servicesファイルに示されているように、最も頻繁に使用される上位100ポート(-Fを使用したため、そうでなければ上位1,000ポート)をスキャンしました。-p 0-を使用してすべてのポートをスキャンする場合、このコマンドは5分以上かかる可能性があります。すべてのポートをスキャンしたい場合は、最初にラボを完了した後に実行してください。--top-ports 3000を使用してより多くのポートをスキャンした場合の結果を見てみましょう。

コマンド

sudo nmap -n -sT 10.130.10.33 --top-ports 3000

想定される結果

sec560@560vm:~$ sudo nmap -n -sT 10.130.10.33 --top-ports 3000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:12 UTC
Nmap scan report for 10.130.10.33
Host is up (0.078s latency).
Not shown: 2997 filtered tcp ports (no-response)
PORT     STATE SERVICE
1433/tcp open  ms-sql-s
3389/tcp open  ms-wbt-server
5985/tcp open  wsman

Nmap done: 1 IP address (1 host up) scanned in 14.40 seconds

このスキャンは時間がかかりましたが、Nmapがより多くのオープンポートを発見したことに注目してください。もちろん、スキャンするポートが多いほど時間がかかります。これは時間と精度のトレードオフです。すべての65,536ポートをチェックすることもできますが、それには長い時間がかかります(1,000ポートの約65倍)。少数のホストでは問題にならないかもしれませんが、より大きなネットワークやターゲット範囲では、スキャンが禁止的に遅くなる可能性があります。

3: 出力フォーマット

次に、Nmapが-oAオプションを介して作成できる出力フォーマットファイルを確認します。デフォルトのポートで-sTスキャンを再実行し、すべての主要なフォーマットスタイル(Normal、Greppable、XML出力を示す-oA)で結果を保存します。結果を/tmpディレクトリのファイルに、スキャンタイプとターゲットのIPアドレスを示すベース名scanで保存します。また、-F(上位100ポートのみをスキャン)と-T4(タイムアウトを減らして並列にスキャン)でスキャンを高速化します。

コマンド

sudo nmap -n -sT 10.130.10.0/24 -oA /tmp/scan -F -T4

想定される結果

sec560@560vm:~$ sudo nmap -n -sT 10.130.10.0/24 -oA /tmp/scan -F -T4
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:13 UTC
Nmap scan report for 10.130.10.4
Host is up (0.081s latency).
Not shown: 93 filtered tcp ports (no-response)
PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
3389/tcp open  ms-wbt-server

[...trimmed for brevity...]

Nmap scan report for 10.130.10.45
Host is up (0.079s latency).
Not shown: 99 filtered tcp ports (no-response)
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server

Nmap done: 256 IP addresses (13 hosts up) scanned in 10.07 seconds

/tmp内のスキャンに関連するファイルのリストを取得します。

コマンド

ls -l /tmp/scan*

想定される結果

sec560@560vm:~$ ls -l /tmp/scan*
-rw-r--r-- 1 root root  2627 Aug 14 18:13 /tmp/scan.gnmap
-rw-r--r-- 1 root root  3065 Aug 14 18:13 /tmp/scan.nmap
-rw-r--r-- 1 root root 19786 Aug 14 18:13 /tmp/scan.xml

同じベース名で異なる拡張子を持つ3つのファイルが表示されるはずです:

  • .gnmapサフィックスのGreppable形式
  • .nmapサフィックスのNormal形式
  • .xmlサフィックスのXML形式

lessを使用して.nmapファイルを確認します(qを押して終了):

コマンド

less /tmp/scan.nmap

このファイルには、スキャン中に画面に表示されたのと同じ情報が含まれていることがわかります。

次に、.xml出力ファイルを見てみましょう(qを押して終了):

コマンド

less /tmp/scan.xml

このファイルはXMLであり、人間にとってははるかに読みにくいです。ただし、この形式は、EyeWitness(このコースで後ほど説明します)を含む他のツールで読み取ることができます。

最後に、catを使用して.gnmapの内容を表示しましょう。

コマンド

cat /tmp/scan.gnmap

想定される結果

sec560@560vm:~$ cat /tmp/scan.gnmap
# Nmap 7.94SVN scan initiated Wed Aug 14 18:13:03 2024 as: nmap -n -sT -oA /tmp/scan -F -T4 10.130.10.0/24
Host: 10.130.10.4 ()    Status: Up
Host: 10.130.10.4 ()    Ports: 53/open/tcp//domain///, 88/open/tcp//kerberos-sec///, 135/open/tcp//msrpc///, 139/open/tcp//netbios-ssn///, 389/open/tcp//ldap///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server///    Ignored State: filtered (93)
Host: 10.130.10.5 ()    Status: Up
Host: 10.130.10.5 ()    Ports: 80/open/tcp//http///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server/// Ignored State: filtered (97)
Host: 10.130.10.6 ()    Status: Up
Host: 10.130.10.6 ()    Ports: 80/open/tcp//http///, 3389/open/tcp//ms-wbt-server///    Ignored State: filtered (98)
...trimmed for brevity...

特定のホストのすべての結果が、各オープンポートと関連サービスが識別された状態で1行に保存されていることに注意してください。この形式はgrepを使用して簡単に検索できます。実際に今やってみましょう!

4: オープンポートによるホストの検索

LDAPで使用されるポート389でリスニングしているすべてのシステムを見つけましょう。

コマンド

grep 389/open /tmp/scan.gnmap

想定される結果

sec560@560vm:~$ grep 389/open /tmp/scan.gnmap
Host: 10.130.10.4 ()    Ports: 53/open/tcp//domain///, 88/open/tcp//kerberos-sec///, 135/open/tcp//msrpc///, 139/open/tcp//netbios-ssn///, 389/open/tcp//ldap///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server///    Ignored State: filtered (93)
Host: 10.130.10.5 ()    Ports: 80/open/tcp//http///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server/// Ignored State: filtered (97)
Host: 10.130.10.6 ()    Ports: 80/open/tcp//http///, 3389/open/tcp//ms-wbt-server///    Ignored State: filtered (98)
Host: 10.130.10.7 ()    Ports: 135/open/tcp//msrpc///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server///   Ignored State: filtered (97)
Host: 10.130.10.21 ()   Ports: 135/open/tcp//msrpc///, 139/open/tcp//netbios-ssn///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server/// Ignored State: filtered (96)
Host: 10.130.10.23 ()   Ports: 135/open/tcp//msrpc///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server///   Ignored State: filtered (97)
...truncated for brevity...

よく見ると、.4システムのみがポート389でリスニングしていますが、他のホストもこのリストに表示されます。これは3893389の一部であるためです。正確に389を探したい場合は、別のコマンドを使用する必要があります。ポート番号の前にスペースがあることに注意してください。grepの-wオプションを使用して「完全な単語を形成する一致を含む行のみを選択」することができます(man grepの出力に記載されています)。

コマンド

grep -w 389/open /tmp/scan.gnmap

想定される結果

sec560@560vm:~$ grep -w 389/open /tmp/scan.gnmap
Host: 10.130.10.4 ()    Ports: 53/open/tcp//domain///, 88/open/tcp//kerberos-sec///, 135/open/tcp//msrpc///, 139/open/tcp//netbios-ssn///, 389/open/tcp//ldap///, 445/open/tcp//microsoft-ds///, 3389/open/tcp//ms-wbt-server///    Ignored State: filtered (93)

wc -l(小文字のL)を使用して、ポート445でリスニングしているホストの数を調べましょう。

wc -lコマンドを使用して、ポート445が開いているホストの数を取得できます。

コマンド

grep -w 445/open /tmp/scan.gnmap | wc -l

想定される結果

sec560@560vm:~$ grep -w 445/open /tmp/scan.gnmap | wc -l
7

wcコマンドは「単語数」を取得するために使用され、-l(小文字のL)オプションは行数を返すようにコマンドに指示します。ポート445でリスニングしている6つのシステムがあることに注意してください。

ポート445でリスニングしているシステムのリストが必要な場合は、cutを使用してIPアドレスを抽出できます。区切り文字を-dで指定し、スペース' 'を区切り文字として使用します。IPアドレスは2番目のフィールドで、-f 2で選択できます。

コマンド

grep -w 445/open /tmp/scan.gnmap | cut -d ' ' -f 2

想定される結果

sec560@560vm:~$ grep -w 445/open /tmp/scan.gnmap | cut -d ' ' -f 2
10.130.10.4
10.130.10.5
10.130.10.7
10.130.10.21
10.130.10.23
10.130.10.25
10.130.10.44

5: nmap-servicesファイル

次に、以下を実行してnmap-servicesファイル(Nmapがスキャンする最も頻繁なポートのリストを取得するファイル)のポートを確認します:

コマンド

less /usr/share/nmap/nmap-services

このファイルの形式には、サービス名(例: ftp)、関連するポートとプロトコル(例: 21/tcp)、Fyodorの広範なインターネットスキャン研究中に特定のポートが発見された相対的な頻度、およびオプションのコメントが含まれます。ポート自体は通常TCPまたはUDPですが、RFC 4960で定義されている代替レイヤー4プロトコルであるStream Control Transmission Protocol(SCTP)に関連するものもあります。

6: UDPスキャン

NmapでTCPポートスキャンを確認したので、次はUDPポートスキャンを試してみましょう。前に説明したように、LinuxカーネルはICMPポート到達不能応答を抑制して、毎秒1つだけ送信します。10.130.10.10はLinuxマシンであるため、1秒に1メッセージの動作が表示されます。tcpdumpスニファーを実行し続けて、ホスト10.130.10.10との間のパケットを表示してください。

次に、-sUを使用して10.130.10.10のUDPポートスキャンを実行するようにNmapを起動します

コマンド

sudo nmap -n -sU 10.130.10.10

スニファーの出力では、複数のUDPパケットと定期的に送信されるいくつかのICMPポート到達不能が表示される可能性があります。

Nmapウィンドウで、スペースバーを押してステータスレポートを取得します。システムの速度とネットワークの速度に応じて、スキャンがわずかな割合しか完了していないことがわかる可能性があります。

出力は以下のようになります:

想定される結果

スペースバーを押してステータスを表示します。

sec560@560vm:~$ sudo nmap -n -sU 10.130.10.10
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:18 UTC
Stats: 0:00:12 elapsed; 0 hosts completed (1 up), 1 undergoing UDP Scan
UDP Scan Timing: About 2.57% done; ETC: 18:27 (0:08:13 remaining)

遅い!

このスキャンは非常に遅いです。スキャンが完了する前にCTRL-Cを押してNmapを停止してください。

7: ターゲットUDPスキャン

次に、ターゲットのNmap UDPスキャンを再実行します。今回は、より狭いポートのリスト(53,111,414,500-501)に焦点を当てます。.4および.10ホストをターゲットにします。

コマンド

sudo nmap -n -sU 10.130.10.4,10 -p 53,111,414,500-501

想定される結果

sec560@560vm:~$ sudo nmap -n -sU 10.130.10.4,10 -p 53,111,414,500-501
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:19 UTC
Nmap scan report for 10.130.10.4
Host is up (0.085s latency).

PORT    STATE         SERVICE
53/udp  open          domain
111/udp open|filtered rpcbind
414/udp open|filtered infoseek
500/udp open|filtered isakmp
501/udp open|filtered stmf

Nmap scan report for 10.130.10.10
Host is up (0.077s latency).

PORT    STATE  SERVICE
53/udp  closed domain
111/udp closed rpcbind
414/udp closed infoseek
500/udp closed isakmp
501/udp closed stmf

Nmap done: 2 IP addresses (2 hosts up) scanned in 3.94 seconds

.4(Windows Domain Controller)ホストではポートがopen|filteredとして表示されることに注意してください。

.10(Linux)ホストでは、すべてのポートがclosedです。一見すると、これは混乱を招く可能性があります。これが、オープンポートのみを表示するために--openオプションを使用したい理由です。

--openを使用してコマンドを再度実行すると、Nmapが10.130.10.10でリスニングしているUDPポートを見つけられなかったことがはるかに明確になります:

コマンド

sudo nmap -n -sU 10.130.10.4,10 -p 53,111,414,500-501 --open

想定される結果

sec560@560vm:~$ sudo nmap -n -sU 10.130.10.4,10 -p 53,111,414,500-501 --open
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 18:19 UTC
Nmap scan report for 10.130.10.4
Host is up (0.078s latency).

PORT    STATE         SERVICE
53/udp  open|filtered domain
111/udp open|filtered rpcbind
414/udp open|filtered infoseek
500/udp open|filtered isakmp
501/udp open|filtered stmf

Nmap done: 2 IP addresses (2 hosts up) scanned in 1.98 seconds

結論

このラボでは、Nmapスキャンがターゲット環境をスイープして潜在的なターゲットシステムを特定する方法を確認しました。また、TCPおよびUDPスキャンのさまざまなオプションと、非常に便利な--open Nmapコマンドラインオプションについても調べました。