Nmap と Gobuster を組み合わせてターゲット発見を行う

LinuxBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、Nmap と Gobuster の機能を組み合わせた強力なターゲット発見技術を学びます。Nmap は、コンピュータネットワーク上のホストやサービスを発見するために使用される多機能なネットワークスキャナーであり、Gobuster は、URI (ディレクトリやファイル) および DNS サブドメインをブルートフォースするために使用されるツールです。これらの 2 つのツールを統合することで、指定されたネットワーク範囲内の潜在的な Web サーバーを特定し、その後、それらのサーバー上の隠されたディレクトリやファイルを体系的に発見するプロセスを自動化できます。このアプローチは、偵察活動を大幅に強化し、発見プロセスをより効率的かつ包括的なものにします。

開いている Web ポート (80, 443) を対象にネットワーク範囲をスキャンする Nmap の使用

このステップでは、Nmap を使用してローカルネットワーク範囲内の一般的な Web ポート (HTTP 用の 80、HTTPS 用の 443) が開いているホストをスキャンします。これは、潜在的な Web サーバーを特定する初期段階です。ここでは、通常 Docker が内部ネットワークに使用する 172.17.0.0/24 のネットワーク範囲をスキャンします。

まず、Nmap がインストールされていることを確認します。LabEx VM にはプリインストールされているはずです。

nmap --version

以下のような出力が表示されれば、Nmap がインストールされていることを示しています。

Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f libpcre-8.39 libpcap-1.9.1 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select

次に、Nmap スキャンを実行します。-p フラグを使用してポート 80 と 443 を指定し、-oG を使用して結果を Grepable 形式で出力します。この形式は解析が容易です。

nmap -p 80,443 -oG nmap_web_scan.txt 172.17.0.0/24

このコマンドは、指定されたネットワーク範囲内のポート 80 または 443 が開いているホストをスキャンし、結果を nmap_web_scan.txt に保存します。スキャンには数分かかる場合があります。

スキャンが完了したら、出力ファイルの内容を表示できます。

cat nmap_web_scan.txt

検出されたホストとその開いているポートを示す行が表示されます。例えば以下のようになります。

## Nmap 7.80 scan initiated Mon Jan 1 00:00:00 2024 as: nmap -p 80,443 -oG nmap_web_scan.txt 172.17.0.0/24
Host: 172.17.0.2 ()	Ports: 80/open/tcp//http///, 443/open/tcp//https///
Host: 172.17.0.3 ()	Ports: 80/open/tcp//http///
## Nmap done at Mon Jan 1 00:00:00 2024 -- 256 IP addresses (2 hosts up) scanned in 5.00 seconds

Nmap の出力を解析して Web サーバーの URL リストを作成する

このステップでは、nmap_web_scan.txt ファイルを解析して、開いている Web ポートを持つホストの IP アドレスを抽出し、URL のリストとしてフォーマットします。このリストは、後で Gobuster の入力として使用されます。

nmap_web_scan.txt ファイルを処理するために、grepawk を使用します。目標は、「open」ポート 80 または 443 を含む行を抽出し、次に IP アドレスを抽出し、最後に URL (例:http://172.17.0.2 または https://172.17.0.2) を構築することです。

Nmap の出力を解析して web_servers.txt を作成するには、次のコマンドを実行します。

grep "open" nmap_web_scan.txt | awk '/80\/open/ {print "http://" $2} /443\/open/ {print "https://" $2}' | sort -u > web_servers.txt

このコマンドを分解してみましょう。

  • grep "open" nmap_web_scan.txt: nmap_web_scan.txt から「open」という単語を含む行をフィルタリングします。これは開いているポートを示します。
  • awk '/80\/open/ {print "http://" $2} /443\/open/ {print "https://" $2}': フィルタリングされた行を処理します。
    • /80\/open/ {print "http://" $2}: 行に「80/open」が含まれている場合、「http://」に続いて 2 番目のフィールド ($2)、つまり IP アドレスを出力します。
    • /443\/open/ {print "https://" $2}: 行に「443/open」が含まれている場合、「https://」に続いて 2 番目のフィールド ($2)、つまり IP アドレスを出力します。
    • 注意:ホストが 80 と 443 の両方を開いている場合、同じ IP に対して 2 つの URL が生成される可能性があります。
  • sort -u: URL をソートし、重複エントリを削除します。
  • > web_servers.txt: 最終的な出力を web_servers.txt という名前の新しいファイルにリダイレクトします。

次に、web_servers.txt ファイルの内容を表示します。

cat web_servers.txt

以下のような、1 行に 1 つの URL がリストされたものが表示されるはずです。

http://172.17.0.2
https://172.17.0.2
http://172.17.0.3

このファイルには、Gobuster スキャンのターゲットが含まれています。

URL リストをループ処理する簡単な Bash スクリプトを作成する

このステップでは、web_servers.txt から各 URL を読み込み、Gobuster スキャンの準備を行う Bash スクリプトを作成します。このスクリプトは、Nmap と Gobuster を組み合わせたワークフローの自動化の基盤となります。

まず、nano を使用して gobust_scan.sh という名前の新しいスクリプトファイルを作成します。

nano gobust_scan.sh

以下の内容を gobust_scan.sh ファイルに貼り付けます。

#!/bin/bash

## Gobuster 用の単語リストを定義する
WORDLIST="/usr/share/wordlists/dirb/common.txt" ## ディレクトリの総当たり攻撃に一般的な単語リスト

## 単語リストが存在するか確認する
if [ ! -f "$WORDLIST" ]; then
  echo "Error: Wordlist not found at $WORDLIST. Please ensure it exists."
  echo "You might need to install 'dirb' or 'wordlists' package, e.g., sudo apt install dirb"
  exit 1
fi

## web_servers.txt が存在するか確認する
if [ ! -f "web_servers.txt" ]; then
  echo "Error: web_servers.txt not found. Please run Step 2 first."
  exit 1
fi

echo "Starting Gobuster scans..."
echo "-------------------------"

## web_servers.txt の各 URL をループ処理する
while IFS= read -r url; do
  echo "Scanning $url..."
  ## Gobuster コマンドのプレースホルダー - 次のステップで追加されます
  ## gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"
  echo "Finished scanning $url."
  echo "-------------------------"
done < web_servers.txt

echo "All scans completed."

ファイルを保存するには、Ctrl+X を押し、次に Y を押して確認し、Enter を押して現在のファイル名で保存します。

次に、スクリプトを実行可能にします。

chmod +x gobust_scan.sh

これで、スクリプトが URL を正しくループ処理することを確認するためにテストを実行しましょう。まだ Gobuster は実行しませんが、各 URL に対してメッセージが表示されます。

./gobust_scan.sh

以下のような出力が表示され、スクリプトが各 URL を正しく読み込んで処理していることを示しているはずです。

Starting Gobuster scans...
-------------------------
Scanning http://172.17.0.2...
Finished scanning http://172.17.0.2.
-------------------------
Scanning https://172.17.0.2...
Finished scanning https://172.17.0.2.
-------------------------
Scanning http://172.17.0.3...
Finished scanning http://172.17.0.3.
-------------------------
All scans completed.

これにより、スクリプトが Gobuster コマンドを組み込む準備ができていることが確認できました。

発見された各ターゲットに対してスクリプト内で Gobuster を呼び出す

このステップでは、gobust_scan.sh スクリプトを変更して Gobuster コマンドを統合します。Nmap によって発見された各 URL に対して、Gobuster は一般的な単語リストを使用して隠されたディレクトリやファイルを見つけようとします。

まず、Gobuster がインストールされていることを確認します。これは LabEx VM にプリインストールされているはずです。

gobuster --version

以下のような出力が表示されるはずです。

gobuster v3.1.0

次に、編集のために gobust_scan.sh スクリプトを再度開きます。

nano gobust_scan.sh

プレースホルダー行を見つけます。 ## gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"

この行のコメントを解除し、正確に以下のようになるようにします。

#!/bin/bash

## Gobuster 用の単語リストを定義する
WORDLIST="/usr/share/wordlists/dirb/common.txt" ## ディレクトリの総当たり攻撃に一般的な単語リスト

## 単語リストが存在するか確認する
if [ ! -f "$WORDLIST" ]; then
  echo "Error: Wordlist not found at $WORDLIST. Please ensure it exists."
  echo "You might need to install 'dirb' or 'wordlists' package, e.g., sudo apt install dirb"
  exit 1
fi

## web_servers.txt が存在するか確認する
if [ ! -f "web_servers.txt" ]; then
  echo "Error: web_servers.txt not found. Please run Step 2 first."
  exit 1
fi

echo "Starting Gobuster scans..."
echo "-------------------------"

## web_servers.txt の各 URL をループ処理する
while IFS= read -r url; do
  echo "Scanning $url..."
  ## Gobuster コマンド
  gobuster dir -u "$url" -w "$WORDLIST" -o "gobuster_$(echo $url | sed -e 's/http:\/\///g' -e 's/https:\/\///g' -e 's/\//_/g').txt"
  echo "Finished scanning $url."
  echo "-------------------------"
done < web_servers.txt

echo "All scans completed."

変更されたスクリプトを保存します (Ctrl+XYEnter)。

次に、スクリプトを実行します。これにより、各 URL に対して Gobuster が実行され、結果は個別のファイルに保存されます。

./gobust_scan.sh

スクリプトは各 URL に対して Gobuster を実行します。実行中に Gobuster の出力がターミナルに直接表示され、結果は gobuster_172.17.0.2.txtgobuster_172.17.0.2_443.txt などのファイルに保存されます(正確なファイル名は URL によって異なります)。

スクリプトが完了した後、生成された Gobuster 出力ファイルを一覧表示できます。

ls gobuster_*.txt

以下のようなファイルが表示されるはずです。

gobuster_172.17.0.2.txt  gobuster_172.17.0.2_443.txt  gobuster_172.17.0.3.txt

全ターゲットからの Gobuster 結果を統合する

この最終ステップでは、個々の Gobuster 出力ファイルをすべて 1 つの包括的なレポートに統合します。これにより、スキャンされたすべての Web サーバーにわたるすべての発見されたディレクトリとファイルを簡単に確認できるようになります。

cat コマンドを使用して、gobuster_*.txt に一致するすべてのファイルを all_gobuster_results.txt という名前の単一ファイルに連結します。

cat gobuster_*.txt > all_gobuster_results.txt

このコマンドは、gobuster_ で始まり .txt で終わるすべてのファイルのコンテンツを結合し、all_gobuster_results.txt にまとめます。

これで、統合された結果を表示できます。

cat all_gobuster_results.txt

スキャンされた Web サーバーで見つかったすべてのディレクトリとファイルの結合された出力が表示されます。出力は Web サーバーのコンテンツによって異なりますが、次のようなものになる可能性があります。

===============================================================
Gobuster v3.1.0
...
[+] Found: /index.html (Status: 200)
[+] Found: /css (Status: 301)
[+] Found: /js (Status: 301)
...
===============================================================
Gobuster v3.1.0
...
[+] Found: /admin (Status: 301)
[+] Found: /login.php (Status: 200)
...

この統合されたファイルは、発見されたすべての Web アセットの単一の参照ポイントを提供し、自動化されたターゲット検出プロセスを完了します。

まとめ

この実験では、Nmap と Gobuster を組み合わせて Web サーバーとディレクトリの検出プロセスを自動化することに成功しました。まず Nmap を使用してネットワーク範囲内の開いている Web ポートをスキャンし、その出力を解析してターゲット URL のリストを作成しました。次に、これらの URL を反復処理し、各 URL に対して Gobuster を呼び出して隠されたディレクトリとファイルを見つける Bash スクリプトを開発しました。最後に、すべての Gobuster 結果を単一のレポートに統合し、効率的で包括的な偵察ワークフローを実証しました。この統合アプローチは、ネットワーク セキュリティまたは Web アプリケーション テストに関わるすべての人にとって貴重なスキルです。