NOTE
この記事は合法的なペネトレーションテスト環境(HTB, THM等)での使用を前提としています。許可のないシステムへの攻撃は違法です。
シリーズ: HTB Enumeration シリーズ - Initial Foothold への道
TL;DR
すぐに使いたい人向けのクイックリファレンスです。
# 1. 準備mkdir -p nmap
# 2. 全ポートスキャン(TCP)nmap -Pn -p- --min-rate=1000 -T4 <target> -oG nmap/allports.gnmap
# 3. ポート番号を抽出grep -oP '\d+/open' nmap/allports.gnmap | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//'
# 4. 詳細スキャン(見つかったポートを指定)nmap -Pn -p 22,80,443 -sC -sV -oA nmap/detailed <target>
# 5. UDPスキャンnmap -Pn -sU --top-ports 20 -oA nmap/udp <target>ワンライナー版(全ポート→詳細を一気に実行)
mkdir -p nmap && ports=$(nmap -Pn -p- --min-rate=1000 -T4 <target> -oG - | tee nmap/allports.gnmap | grep -oP '\d+/open' | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//') && nmap -Pn -p$ports -sC -sV -oA nmap/targeted <target>各オプションの詳細は以下で解説します。
はじめに
nmap(Network Mapper)は、ネットワーク探索とセキュリティ監査のためのオープンソースツールです。HTBやTHMでマシンを攻略する際、最初に実行するツールといっても過言ではありません。
この記事では、nmapの基本的な使い方から、実践的なテクニックまでを詳しく解説します。
nmapの基本
基本的な使い方
最もシンプルな使い方は、ターゲットを指定するだけです。
nmap <target>これだけで、よく使われる1000ポートをスキャンしてくれます。
ホスト発見のスキップ (-Pn)
HTBのマシンはPing(ICMP Echo Request)に応答しない設定になっていることが多く、その場合nmapは「ホストがダウンしている」と判断してスキャンを中止してしまいます。
ターゲットが生きていることが確実な場合(HTBなど)は、-Pn オプションを付けてホスト発見をスキップするのが無難です。
nmap -Pn <target>スキャンタイプ
nmapには様々なスキャンタイプがあります。状況に応じて使い分けましょう。
TCP SYNスキャン (-sS)
nmap -sS <target>- 別名: ステルススキャン、ハーフオープンスキャン
- 仕組み: SYNパケットを送信し、SYN/ACKが返ればポートオープン、RSTが返ればクローズと判断
- 特徴: 完全なTCP接続を確立しないため、ログに残りにくい
- root権限: 必要
TCP Connectスキャン (-sT)
nmap -sT <target>- 仕組み: 通常のTCP 3ウェイハンドシェイクを完了させる
- 特徴: root権限不要だが、ログに残りやすい
- 使用場面: root権限がない場合、またはプロキシ経由でスキャンする場合
UDPスキャン (-sU)
nmap -sU <target>- 仕組み: UDPパケットを送信し、ICMPポート到達不能が返ればクローズと判断
- 特徴: 非常に時間がかかる(UDPは応答がないことが多い)
- ポイント:
--top-ports 100などで対象を絞ると効率的
NOTE
UDPスキャンは、ポートが開いている場合に「応答がない」ことが多いです(open|filteredと判定されます)。そのため、TCPスキャンに比べてタイムアウト待ちが発生しやすく、非常に時間がかかります。
# よく使うUDPスキャンnmap -sU --top-ports 100 <target>その他のスキャンタイプ
| オプション | 名称 | 用途 |
|---|---|---|
-sA | ACKスキャン | ファイアウォールのルール確認 |
-sW | Windowスキャン | ACKスキャンの拡張 |
-sN | NULLスキャン | フラグなしパケット |
-sF | FINスキャン | FINフラグのみ |
-sX | Xmasスキャン | FIN, PSH, URGフラグ |
NOTE
NULL, FIN, Xmasスキャンは、ファイアウォール回避に使えることがありますが、Windowsでは正しく動作しません。
ポート指定オプション
基本的なポート指定
# 単一ポートnmap -p 80 <target>
# 複数ポートnmap -p 22,80,443 <target>
# ポート範囲nmap -p 1-1000 <target>
# 全ポート(1-65535)nmap -p- <target>
# よく使われるポート上位N個nmap --top-ports 100 <target>おすすめの使い方
HTBでは、まず全ポートスキャンを行い、その後詳細スキャンを行うのが定番です。 詳しいワークフローは「実践的なワークフロー」で解説します。
サービス・バージョン検出
バージョン検出 (-sV)
nmap -sV <target>各ポートで動作しているサービスとバージョンを特定します。Exploit検索に必要な情報を取得できます。
バージョン検出の強度
# 強度を下げて高速化(デフォルトは7)nmap -sV --version-intensity 2 <target>
# 全プローブを試す(最も詳細)nmap -sV --version-all <target>OS検出 (-O)
nmap -O <target>- 仕組み: TTLやTCPウィンドウサイズなどの特徴からOSを推測
- root権限: 必要(生のパケットを扱うため)
タイミングオプション
タイミングテンプレート (-T)
nmap -T4 <target>| テンプレート | 名称 | 特徴 |
|---|---|---|
-T0 | Paranoid | 非常に遅い、IDS回避用 |
-T1 | Sneaky | 遅い、IDS回避用 |
-T2 | Polite | 控えめ、帯域を抑える |
-T3 | Normal | デフォルト |
-T4 | Aggressive | 高速、信頼できるネットワーク向け |
-T5 | Insane | 最速、パケットロスの可能性あり |
HTBでは-T4が一般的に使われます。
詳細なタイミング設定
# 最小送信レートnmap --min-rate=1000 <target>
# 最大送信レートnmap --max-rate=100 <target>
# パラレル実行数nmap --min-parallelism=10 <target>NSE(Nmap Scripting Engine)
nmapにはNSEスクリプトという強力な機能があります。
デフォルトスクリプト (-sC)
nmap -sC <target>-sCは--script=defaultと同等で、安全なデフォルトスクリプトを実行します。
スクリプトカテゴリ
# 脆弱性スキャンnmap --script=vuln <target>
# 認証関連nmap --script=auth <target>
# ブルートフォースnmap --script=brute <target>
# 発見系nmap --script=discovery <target>便利なスクリプト例
# SMB脆弱性チェックnmap --script=smb-vuln* -p 445 <target>
# HTTP関連情報収集nmap --script=http-enum,http-headers,http-methods -p 80 <target>
# FTP匿名ログイン確認nmap --script=ftp-anon -p 21 <target>
# SSH認証方式確認nmap --script=ssh-auth-methods -p 22 <target>
# デフォルトクレデンシャル確認nmap --script=*-brute -p 21,22,80 <target>スクリプトの検索
# インストール済みスクリプト一覧ls /usr/share/nmap/scripts/
# スクリプト検索ls /usr/share/nmap/scripts/ | grep http出力オプション
出力形式
# 通常出力nmap -oN output.nmap <target>
# XML形式nmap -oX output.xml <target>
# Grepable形式nmap -oG output.gnmap <target>
# 全形式を一度に出力nmap -oA output <target>おすすめの出力設定
# 常にファイル出力する習慣をつけるnmap -sC -sV -oA nmap/initial <target>ディレクトリnmap/を作っておき、そこに出力すると整理しやすいです。
実践的なワークフロー
HTBでの定番フロー
全ポートスキャンには -oG(Grepable出力)を使うと、後からポート番号を抽出しやすくなります。
# 1. ディレクトリ作成mkdir -p nmap
# 2. クイック全ポートスキャンnmap -Pn -p- --min-rate=1000 -T4 <target> -oG nmap/allports.gnmap
# 3. 結果から開いているポートを抽出grep -oP '\d+/open' nmap/allports.gnmap | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//'
# 4. 詳細スキャン(上記で見つかったポートを指定)nmap -Pn -p 22,80,443 -sC -sV -oA nmap/detailed <target>
# 5. UDPも忘れずにnmap -Pn -sU --top-ports 20 -oA nmap/udp <target>ワンライナー(全ポート→詳細)
# ディレクトリ作成 & 全ポートスキャン(ファイルにも保存しつつポート番号を抽出)mkdir -p nmapports=$(nmap -Pn -p- --min-rate=1000 -T4 <target> -oG - | tee nmap/allports.gnmap | grep -oP '\d+/open' | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//')
# 詳細スキャンを実行nmap -Pn -p$ports -sC -sV -oA nmap/targeted <target>よくある落とし穴と対処法
1. UDPを忘れる
TCPだけでなく、UDPも確認しましょう。SNMP(161)やDNS(53)など、重要なサービスがUDPで動いていることがあります。
2. 高番号ポートを見逃す
デフォルトでは上位1000ポートしかスキャンしません。-p-で全ポートスキャンを忘れずに。
3. スキャン速度が遅い
-T4と--min-rate=1000を組み合わせると、信頼できるネットワーク(HTBなど)では効率的にスキャンできます。
4. 結果を保存しない
毎回スキャンし直すのは時間の無駄です。-oAで常に保存する習慣をつけましょう。
便利なエイリアス
.bashrcや.zshrcに追加しておくと便利です。
# クイック全ポートスキャンalias nmapquick='nmap -Pn -p- --min-rate=1000 -T4'
# 詳細スキャンalias nmapdetail='nmap -Pn -sC -sV -oA nmap/detailed'
# フルスキャン(全ポート + 詳細)nmapfull() { mkdir -p nmap ports=$(nmap -Pn -p- --min-rate=1000 -T4 $1 -oG - | tee nmap/allports.gnmap | grep -oP '\d+/open' | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//') nmap -Pn -p$ports -sC -sV -oA nmap/full $1}まとめ
nmapはEnumerationの基礎であり、使いこなせるようになると効率が大幅に上がります。
ポイントをまとめると以下の通りです。
- ホスト発見をスキップ (
-Pn) - 全ポートスキャンを忘れない (
-p-) - UDPもチェック (
-sU) - バージョン検出を行う (
-sV) - NSEスクリプトを活用 (
-sC,--script) - 結果は必ず保存 (
-oA)
次回は、発見したWebサービスに対するディレクトリ探索について解説します。
Happy Hacking!