この記事について
TryHackMeの「Nmap: The Basics」というルームで学んだ内容を、Task単位でまとめたノートです。Cyber Security 101の「Networking」モジュールにあるルームで、ネットワークスキャナー Nmap の基本を一通り扱います。ライブホストの発見から、ポートスキャンの種類、サービス・バージョンの検出、スキャン速度の制御、結果の保存形式まで、Nmap を使ううえで最初に押さえるべき範囲がまとまった内容でした。
課題の設問や答え、フラグはここには含めていません。各Taskで学んだオプションの意味や、なぜそのオプションが必要なのかという考え方を、自分の理解として整理したものです。
Nmap という名前は Network Mapper の略です。ネットワーク偵察(reconnaissance、対象の情報を集める工程)で最初に使う定番ツールで、「どの機器が生きているか」「その機器のどのポートで何のサービスが動いているか」を高速に調べられます。
Task 1: 導入
まず、ネットワーク調査で出てくる2つの問いが提示されます。1つは「このネットワーク上に、他にどんな機器が生きて動いているか」、もう1つは「その機器の上でどんなサービスが動いているか」です。
手作業でもできなくはありません。/24(IPアドレス256個ぶん)のネットワークなら、ping や arp-scan で1個ずつ確認していけば、生きている機器の一覧は作れます。ただし ping はターゲットのファイアウォールが ICMP(ping が使うプロトコル)を遮断していると何も返しませんし、arp-scan は自分が同じネットワークに直接つながっているときしか使えません。サービスの調査も、telnet で1ポートずつ試すのは数千ポートを相手にすると非現実的です。
こうした制約をまとめて解決するのが Nmap です。1997年に公開されて以来、機能が積み重なってきた、柔軟なネットワークスキャナーだと紹介されていました。
学んだこと
「専用ツールが必要な理由」は、既存の手段(ping、arp-scan、telnet)の限界を先に知っておくと腹落ちしました。Nmap のオプションは、これらの限界を1つずつ埋めるために用意されている、という見方ができます。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| Nmap (Network Mapper) | オープンソースのネットワークスキャナー。host discovery・port scan・version検出などを備える |
| reconnaissance | 偵察。攻撃や調査の前に対象の情報を集める工程 |
| ICMP | ping や到達不能通知に使うプロトコル。ファイアウォールで遮断されやすい |
CIDR (/24 など) |
プレフィックス長でネットワーク範囲を表す記法。/24 は256アドレス |
Task 2: ホスト発見 — 誰がオンラインか
ライブホスト(live host、電源が入っていてネットワークに応答する機器)を見つける方法を学ぶTaskです。
まず、ターゲットの指定方法が3種類あることを確認します。範囲指定(192.168.0.1-10)、サブネット指定(192.168.0.1/24)、ホスト名(example.thm)です。
ホスト発見だけを行うオプションが -sn です。「ping scan」と呼ばれますが、ping コマンドより多くの手段を組み合わせて判定します。ここで重要だったのが、ローカルとリモートで判定方法が変わるという点です。
- ローカル(自分が Ethernet や WiFi で直接つながっているネットワーク)では、Nmap は ARP リクエストを送ります。ARP は同じセグメント内でしか使えませんが、ファイアウォールで止めにくいので非常に確実です。応答があった機器の MAC アドレスも取得でき、その先頭部分(OUI)からネットワークカードのベンダーが分かり、機器の種類の推測につながります。
- リモート(間にルーターが1台以上ある)では ARP が使えないため、Nmap は ICMP echo、ICMP timestamp、TCP SYN(443番)、TCP ACK(80番)といった複数のプローブを撒き、どれか1つでも応答があれば「up」と判定します。
このほか、実際にはスキャンせず対象IPを一覧表示するだけの -sL(list scan)も紹介されていました。スキャン範囲の指定ミスを事前に確認するのに使います。
学んだこと
同じ -sn でも、自分の立ち位置(直接接続かルーター越しか)で内部の動きと精度が変わることを知りました。「スキャン結果が思ったより少ない/多い」ときに、まず環境を疑う視点が持てます。MAC アドレスとベンダー情報がローカルスキャンでしか得られない、というのも実務で効いてきそうな知識です。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
-sn (ping scan) |
host discovery のみを行い、ポートスキャンをしないモード |
| ARP (Address Resolution Protocol) | 同一セグメント内でIP→MACを解決するプロトコル。ローカルのホスト発見に使われる |
| OUI (Organizationally Unique Identifier) | MACアドレス先頭24ビット。NICベンダーを示す |
-sL (list scan) |
対象IPを列挙するだけで実スキャンしないモード |
| hop | 通信が経由するルーターの数。ローカル=0、リモート=1以上 |
Task 3: ポートスキャン — 誰が待ち受けているか
ライブホストの上で、どのポートにサービスが紐づいているかを調べるTaskです。TCP・UDP はそれぞれ 65,535 個のポートを持ちます。
主なスキャン方式は3つでした。
-
-sT(TCP connect scan): OS の通常の接続機能を使い、TCP の3ウェイハンドシェイク(SYN → SYN/ACK → ACK)を最後まで完了します。root 権限は不要ですが、接続が成立するのでターゲット側のログに残りやすいです。 -
-sS(TCP SYN scan / half-open scan): SYN だけ送り、SYN/ACK が返ってきたら(=ポートが開いている)ハンドシェイクを完了せず RST で即座に打ち切ります。接続を確立しないためログに残りにくく、「ステルス」と呼ばれます。生パケットを組み立てる必要があるので root/sudo 権限が必要です。 -
-sU(UDP scan): UDP は応答を返さないことが多いため、判定は「ICMP port unreachable が返る → closed」「無応答 → open|filtered」「UDP応答あり → open」となります。DNS、DHCP、SNMP など UDP を使うサービスは、TCP スキャンだけでは見えません。
ポート状態は主に open(サービスが待ち受け中)、closed(応答はあるがサービスなし)、filtered(ファイアウォール等で応答が返らず判別不能)の3つです。filtered と closed は意味が違う、という点は読み間違えやすいので意識しておきたいところです。
スキャンするポート数を絞るオプションも学びました。-F(Fast mode、上位100ポート)、-p22,80,443(個別指定)、-p1-1023(well-known ports)、-p-(全65535ポート)。徹底性とスキャン時間はトレードオフです。
このTaskで、非標準ポートで動く Web サーバーに触れる場面がありました。Web だからといって必ず80番や443番にいるとは限らず、スキャン結果に出てきたポート番号をブラウザの URL に明示しないとつながらない、という当たり前だけど見落としやすい点を、手を動かして確認しました。
学んだこと
-sT と -sS の違いは、単なる速度差ではなく「OS の接続機能に頼るか、生パケットを自作するか」という仕組みの違いで、それが権限要件(sudo が要るかどうか)に直結していると理解しました。この理解は Task 7 の「権限でデフォルトのスキャンが変わる」話につながります。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| TCP three-way handshake | SYN → SYN/ACK → ACK でTCP接続を確立する手順 |
-sT / -sS / -sU
|
TCP connect / TCP SYN(ステルス) / UDP の各スキャン |
| port state: open / closed / filtered | 待ち受け中 / 応答はあるがサービスなし / FWで遮られ判別不能 |
-F / -p[range] / -p-
|
上位100ポート / 範囲指定 / 全ポート |
| well-known ports | 0〜1023。主要サービスが使うポート番号帯 |
Task 4: バージョン検出 — さらに情報を引き出す
開いているポートについて、より詳しい情報を取るオプションのTaskです。
-
-sV(service/version detection): 開放ポートに実際につないでバナー(接続時にサービスが返す識別文字列)などを集め、Nmap のデータベースと照合して「何のソフトの何バージョンか」を推定します。出力にVERSION列が増えます。ソフト名とバージョンが分かると、その版に既知の脆弱性(CVE)があるかを調べられるので、脆弱性調査の入口になります。 -
-O(OS detection): TCP/IP スタックの細かな挙動の指紋(fingerprint)から OS の種類とだいたいのバージョンを推測します。「Linux 4.15 - 5.8」のように幅を持った推定になるのが普通で、完璧ではないと明記されていました。 -
-A:-Oと-sVに traceroute やデフォルトスクリプトを加えた「全部入り」です。情報量は増えますが、通信量・痕跡も増えます。 -
-Pn: ホスト発見フェーズを丸ごとスキップし、全ターゲットを「生きている前提」でポートスキャンします。ICMP を遮断しているホスト(Windows のデフォルト設定など)を「down」と誤判定して取りこぼすのを防ぎます。
学んだこと
-sV の出力はそのまま脆弱性調査につながる、という一連の流れが見えました。バージョン文字列を見て終わりではなく、「このバージョンに既知の問題はないか」を次に調べる、というところまでが1セットだと意識しておきたいです。-Pn は、特に Windows ターゲットで「Host seems down」と言われたときの定番の対処として覚えました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
-sV (version detection) |
開放ポートのサービス名とバージョンを推定する |
| service banner | 接続時にサービスが返す識別文字列。バージョン推定の主な材料 |
-O (OS detection) |
TCP/IPスタックの指紋からOSを推定する |
-A |
OS検出・バージョン検出・traceroute・既定スクリプトを一括有効化 |
-Pn |
ホスト発見をスキップし全ホストを online 扱いでスキャン |
| CVE | 既知脆弱性の識別番号。検出バージョンから該当CVEを調べる |
Task 5: タイミング — 速いとはどれくらい速いか
スキャンの速度を制御するオプションのTaskです。速いスキャンは IDS(侵入検知システム、Intrusion Detection System)などを発動させやすいため、速度をコントロールする意味があります。
Nmap には6段階のタイミングテンプレートがあり、名前が性格を表しています。paranoid(0)、sneaky(1)、polite(2)、normal(3)、aggressive(4)、insane(5) です。-T0 のように番号でも、-T paranoid のように名前でも指定でき、両者は等価です。指定しない場合のデフォルトは -T3(normal)です。
ルームでは、同じ100ポートのスキャンを T0〜T4 で試した所要時間の比較表が示されていました。T0 は数分に1ポートというペースで、T3・T4 になると1秒未満で終わる、という桁違いの差です。
テンプレート以外に、細かく制御するオプションも紹介されていました。
-
--min-rate/--max-rate: 1秒あたりの送信パケット数の下限・上限。スキャン全体に適用されます。 -
--min-parallelism/--max-parallelism: 同時に飛ばすプローブの本数。多いほど速いですが、取りこぼしや誤判定が増えやすくなります。 -
--host-timeout: 1ホストに費やす最大時間。超えたら諦めて次へ進みます。遅いホストのせいでスキャン全体が止まるのを防ぎます。
学んだこと
CTF やラボ環境では回線が安定しているので -T4 が定番ですが、本番の顧客ネットワークや不安定な VPN 越しでは -T2〜-T3 に落として --host-timeout などと併用するのが安全だと理解しました。「速さ」は精度と検知リスクとのトレードオフで選ぶもの、という整理ができました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
timing template (-T0–-T5) |
待ち時間・並列数・タイムアウトをまとめたプリセット |
| IDS / IPS | 不審な通信を検知・遮断する仕組み。速いスキャンほど発動しやすい |
--min-rate / --max-rate
|
送信パケットレート(pps)の下限・上限。スキャン全体に適用 |
--min-parallelism / --max-parallelism
|
同時実行プローブ数の下限・上限 |
--host-timeout |
1ホストに費やす最大時間。超過で打ち切り |
Task 6: 出力 — 見えるものを制御する
スキャン中の表示と、結果の保存形式に関するTaskです。
リアルタイムの表示
-
-v(verbose、冗長): スキャンの進行状況を表示します。長いスキャンで止まっていないかの確認や、開放ポートを見つけた瞬間の通知に役立ちます。-vv、-vvvとさらに詳しくできます。 -
-d(debug、デバッグ): Nmap 自身の内部動作のログです。-d単体から-d9まであり、-d9は数千行規模になります。スキャンが不可解な動きをするときの原因調査や、NSE スクリプトのトラブルシュートなど、限定的な場面で使うものです。
-v が「スキャンの実況中継」、-d が「Nmap の頭の中を覗く」もの、という役割分担で覚えました。
結果の保存
-
-oN <ファイル名>: Normal 出力(画面表示とほぼ同じ、人間が読む用) -
-oX <ファイル名>: XML 出力(他ツールへの取り込み用) -
-oG <ファイル名>: grepable 出力(1ホスト1行でgrep/awkで加工しやすい) -
-oA <basename>: 上記3形式を一度に出力。basename.nmap/.xml/.gnmapの3ファイルができる
-oA に渡すのはオプションではなく「保存先ディレクトリ+ファイル名の頭」です。指定したディレクトリが存在しないと書き込みエラーになるので、先に作っておく必要があります。
学んだこと
ペンテストや演習では、最初から -oA で全形式を保存する癖をつけると、後から結果を検索・再利用・レポート化しやすく、生の証跡(evidence)としても残せる、という運用を学びました。-oG は現在では非推奨気味とされつつも、コマンドラインでの後処理には今も便利です。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
-v / -vv (verbose) |
スキャン進行状況を詳細表示。開放ポート発見を即時通知 |
-d / -d9 (debug) |
Nmap内部動作のデバッグ出力。トラブルシュート用 |
-oN / -oX / -oG
|
Normal / XML / grepable の各保存形式 |
-oA <basename> |
3形式を一括保存。拡張子は自動で付く |
.gnmap |
grepable Nmap出力ファイルの拡張子 |
Task 7: まとめ
ルーム全体の振り返りと、オプションの早見表があるTaskです。
締めくくりの重要ポイントは、実行権限によってデフォルトのスキャンが変わることでした。
-
sudo nmap ...(root): 生パケットを自作できるため、デフォルトは SYN スキャン(-sS)。-O、-sUなどの高度な機能も使えます。 - 一般ユーザーで
nmap ...: 生パケットを作れず OS の接続機能に頼るしかないため、デフォルトは TCP connect スキャン(-sT)。多くの機能が制限されます。
TCP SYN パケットの送信のような操作には root 権限が必要、というのがその理由です。Task 3 で学んだ -sT と -sS の仕組みの違いが、ここで「なぜ sudo で実行するのか」という実践的な結論につながりました。
このルームは基礎編で、続きとして Network Security モジュールに Nmap 専用のルームが4つあり、NSE(Nmap Scripting Engine)やファイアウォール回避(firewall evasion)といった、より実戦的な内容に進めるとのことでした。
学んだこと
Nmap は基本的に sudo を付けて実行するもの、という原則を、理由とセットで理解できました。演習用の環境は最初から root なので意識しにくいですが、自分の端末で sudo を付け忘れると、-sS を指定したのに黙って -sT にフォールバックしたり -O が動かなかったりと、結果が変わってしまう点に注意が必要です。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| raw packet crafting | OSのソケットを介さず自前でパケットを組み立てる技術。root権限が必要 |
| SYN scan default (root) | root実行時のNmapの既定スキャン(-sS) |
| connect scan default (non-root) | 一般ユーザー実行時のNmapの既定スキャン(-sT) |
| NSE (Nmap Scripting Engine) | Luaスクリプトでスキャンを拡張する仕組み。次段階のルームで学ぶ |
| firewall evasion | フラグメント化やデコイなどで検知・遮断を回避する手法群 |
おわりに
Nmap のオプションは数が多く、最初は丸暗記の対象に見えていました。ただこのルームを通すと、host discovery → port scanning → service detection → timing → output という工程順にオプションが並んでいて、それぞれが「手作業の限界を埋める」か「速さ・静かさ・情報量のトレードオフを調整する」かのどちらかだと整理できました。特に「root か一般ユーザーかでデフォルトが変わる」点は、理由まで含めて理解しておくと実際のスキャンでハマらずに済むと感じています。