はじめに
ペネトレーションテストや Web アプリケーション分析では、Burp Suite Intruder のようなツールを使用して、ターゲットに対して大量のリクエストを送信することがよくあります。「Grep - Match」は、特定のキーワード(例:「Welcome」、「Login successful」、「admin_access_granted」)を含むレスポンスを自動的にフラグ付けできる重要な機能です。これにより、数千ものレスポンスの中から興味深いものを素早く見つけることができます。
この実験(Lab)では、標準的な Linux コマンドラインツールを使用して、この強力な「Grep - Match」機能を再現する方法を学びます。curlを使用して HTTP リクエストを行い、シェルループを使用してペイロードのリストに対するプロセスを自動化し、grepを使用してレスポンス内の成功キーワードを検索します。これは、セキュリティ自動化やスクリプティングに興味のあるすべての人にとって基本的なスキルです。
Intruder > Options の「Grep - Match」セクションにスクロール
Burp Suite のような GUI ツールでは、このステップでオプションパネルに移動し、マッチングルールを設定します。私たちのコマンドライン環境では、これに相当する操作は、ペイロードのリストとターゲット URL という必要なコンポーネントを準備することです。
セットアッププロセスにより、~/project ディレクトリに payloads.txt という名前のファイルが既に作成されています。このファイルには、Web アプリケーションに対してテストしたい潜在的な値のリストが含まれており、Intruder のペイロードリストと同じ目的を果たします。
このファイルのコンテンツを見てみましょう。
cat ~/project/payloads.txt
以下の出力が表示されるはずです。
orange
banana
apple
grape
mango
ターゲットアプリケーションは、http://localhost:8000 で実行されているシンプルな Web サーバーです。各ペイロードをこのターゲットに対してテストします。
デフォルトルールのクリア
Burp Suite では通常、事前に存在するルールやデフォルトのルールをクリアして、明示的に定義したものだけがマッチするようにします。今回のシミュレーションでは、既知の「失敗」ペイロードで単一のリクエストを行い、ベースラインを確立します。これにより、通常の、成功しないレスポンスがどのようなものか理解するのに役立ちます。
curl を使用して、正しいものではないとわかっているペイロード orange でサーバーにリクエストを送信してみましょう。
curl "http://localhost:8000/?item=orange"
このコマンドは Web ページを取得し、その HTML ソースをターミナルに出力します。出力は以下のようになります。
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<script>
const params = new URLSearchParams(window.location.search);
if (params.get("item") === "apple") {
document.body.innerHTML = "<h1>Welcome to the secret page!</h1>";
} else {
document.body.innerHTML = "<h1>Item not found.</h1>";
}
</script>
</body>
</html>
JavaScript のロジックと、その結果として表示される「Item not found」というテキストに注目してください。これが私たちのベースラインとなる「失敗」レスポンスです。
成功キーワード(例:「Welcome」、「Logged in」)をマッチさせる新しいルールの追加
これは「Grep - Match」テクニックの中核部分です。成功したレスポンスにのみ表示される一意の文字列またはパターンを定義する必要があります。前のステップの HTML を見ると、成功したリクエスト(item=apple の場合)は、「Welcome to the secret page!」というテキストを生成することがわかります。「Welcome」というキーワードは、私たちのルールに最適な候補です。
grep コマンドを使用して curl の出力をフィルタリングし、キーワードの存在を確認できます。curl の -s フラグはサイレントモードで実行するために使用され、プログレスメーターを非表示にします。
まず、このルールを失敗したペイロードに対してテストしてみましょう。このコマンドは、レスポンスに「Welcome」という単語が含まれていないため、何も出力しないはずです。
curl -s "http://localhost:8000/?item=orange" | grep "Welcome"
次に、既知の成功したペイロードである apple に対してテストしてみましょう。
curl -s "http://localhost:8000/?item=apple" | grep "Welcome"
今回は、grep がマッチを見つけ、キーワードを含む行を出力します。
document.body.innerHTML = '<h1>Welcome to the secret page!</h1>';
パイプ (|) と grep "Welcome" コマンドを組み合わせることで、「Grep - Match」ルールが形成されます。これにより、成功したレスポンスと失敗したレスポンスを区別する方法を正常に作成しました。
イントルーダー攻撃の実行
「イントルーダー攻撃」とは、リスト内の各ペイロードに対してリクエストを自動化するプロセスです。これは簡単なシェルループで実現できます。このループは payloads.txt から各行を読み込み、それに対して curl | grep コマンドを実行し、結果を表示します。
出力をよりきれいに、結果テーブルのようにするために、小さなシェルスクリプトを作成します。nano エディタを使用して attack.sh という名前の新しいファイルを作成します。
nano attack.sh
次に、以下のスクリプトを nano エディタにコピー&ペーストします。
#!/bin/bash
echo "Payload,Found"
for payload in $(cat ~/project/payloads.txt); do
response=$(curl -s "http://localhost:8000/?item=$payload")
if echo "$response" | grep -q "Welcome"; then
echo "$payload,True"
else
echo "$payload,False"
fi
done
このスクリプトは、まずヘッダー(Payload,Found)を出力します。次に、各ペイロードをループします。ループ内では、grep -q(サイレントモード)を使用して「Welcome」キーワードをチェックします。見つかった場合は、ペイロードの後に True を出力します。それ以外の場合は False を出力します。
Ctrl+X、次に Y、そして Enter を押してファイルを保存し、nano を終了します。
次に、スクリプトを実行可能にします。
chmod +x attack.sh
最後に、攻撃を実行します。
./attack.sh
マッチ結果の新しい列を結果テーブルで確認する
前のステップでスクリプトを実行した後、ターミナルにクリーンでテーブルのような出力が表示されます。
Payload,Found
orange,False
banana,False
apple,True
grape,False
mango,False
この出力は、Burp Suite Intruder の結果テーブルのコマンドライン版です。最初の列はテストされたペイロードをリストし、2 番目の列は「Found」と名付けたもので、「Grep - Match」インジケーターとして機能します。
この 2 番目の列を単に True の値でスキャンするだけで、成功したペイロードをすぐに特定できます。ご覧のとおり、apple,True という行が明確に際立っており、ペイロード apple がターゲットキーワードを含むレスポンスをもたらしたことを示しています。これは、大量の HTTP レスポンスの中から特定のデータを見つけるためのテクニックがいかに効果的であるかを示しています。
まとめ
この実験では、「Grep - Match」機能、すなわち多くの自動化されたウェブセキュリティツールの基盤となる機能をシミュレートしました。複数の基本的な Linux コマンドラインツールを組み合わせて強力な結果を得る方法を学びました。
以下のことを実践しました。
curlを使用してターミナルからウェブリクエストを行う。grepを使用してレスポンスデータ内の特定のキーワードを検索する。- シェルの
forループを記述して、入力リストに対するタスクを自動化する。 - これらのツールを単一のスクリプトに組み合わせて、体系的にペイロードをテストし、成功した試みを特定する。
このコマンドラインアプローチは、洗練されたツールが内部でどのように機能するかを理解するための優れた方法であるだけでなく、独自のカスタム自動化やセキュリティスクリプトタスクにおいても非常に柔軟で強力なスキルとなります。
