連日投稿35本目です。昨日の夜に投稿おすの忘れてた....
今回の目的
今週はこちらに従って進めます。
古典的な脆弱性である「LFI(ローカルファイルインクルージョン)」と「RFI(リモートファイルインクルージョン)」をテーマにおいてます。
正直、これらの脆弱性が具体的にどのようなビジネスインパクトをもたらすのか、まだ肌感覚で理解できていないので、今週もサイバーキルチェーンの各段階を実際に手を動かしながら追体験して確認していく。
このチャレンジについて
目的: セキュリティエンジニアとしての技術力向上
手段: シェルスクリプト作成を通じて学習
実施する事: 自動化,監視,ツール開発基礎学習など
目次
実行結果
本日作成した偵察用スクリプトrecon.shを実行した結果。
# 結果は以下
$ ./recon.sh
--- Starting LFI/RFI Recon Scan ---
--- Scan Complete ---
# 理論上は↓3つの結果が表示されるはずであった。
--- Starting LFI/RFI Recon Scan ---
Potential vulnerability found: http://example.com/index.php?page=home
Potential vulnerability found: http://example.com/products.php?file=item1
Potential vulnerability found: http://example.com/main.asp?include=footer
--- Scan Complete ---
実行環境
- クラウド環境: AWS EC2
- 接続元(ローカルPC): Windows 11
- ターミナルソフト: Windows Terminal
- 接続先(サーバー): EC2 Instance
- 使用言語: Bash
- 外部ライブラリ: curl, grep
-
テスト対象:
targets.txtに記載したURLリスト
開発中の気づき
今日は、LFI/RFIの偵察を自動化する簡単なBashスクリプトを作成した。その過程でシェルスクリプトの挙動について、だいぶ深堀りできた。
-
while readループの仕組み: 最初、while read url; do ... done < targets.txtという構文がどう動いているのか、正直忘れていた。「なぜ最後に書かれた< targets.txtをループの開始前に認識できるのか?」という疑問が湧いたが、これはシェルがコードを実行する前に、まずブロック全体を**構文解析(Parse)**し、コマンドの構造とリダイレクトを先にセットアップするためだと理解した。ビルダーが設計図全体を読んでから作業を始めるのと同じ、というアナロジーで腹落ちした。 -
理論と現実のギャップ: スクリプトのロジックは完成し動くはずだった。しかし、実行結果は「一致ゼロ」。
curlで取得したexample.comのHTMLソースを直接見てみたところ、URLパラメータの文字列(page=など)がHTMLのボディ内には含まれていなかった。grepはあくまで取得したテキストの中を探すだけなので、これでは見つからない。何の検索を行うかをもう少し調査しておいた方がよかったかもしれない。
コード全文
targets.txt
http://example.com/index.php?page=home
http://example.com/about.html
http://example.com/products.php?file=item1
http://example.com/login.php
http://example.com/main.asp?include=footer
recon.sh
#!/bin/bash
echo "--- Starting LFI/RFI Recon Scan ---"
while read url; do
# curlでURLの内容を取得し、パイプ(|)でgrepに渡す
# grepが-q(quiet)モードでパターンに一致した場合(終了コード0)、thenブロックが実行される
if curl -s "$url" | grep -q -E "page=|file=|include="; then
echo "Potential vulnerability found: $url"
fi
done < targets.txt
echo "--- Scan Complete ---"
コードの詳細な解説
今回のコードの中心は、if文の中にあるパイプライン。
curl -s "$url" | grep -q -E "page=|file=|include="
-
curl -s "$url":-sオプションで進捗表示を消し(サイレントモード)、指定されたURLのHTMLコンテンツを標準出力に流す。 -
|(パイプ):curlの標準出力を、次に続くgrepコマンドの標準入力へと繋ぎ変える。 -
grep -q -E "...":-
-q(quiet): これが重要。grepは一致した行を出力せず、パターンが見つかったかどうかの事実だけを終了コード(0=成功, 1=失敗)で返す。 -
-E: 拡張正規表現を使うためのオプション。これにより、|を「OR」の意味で使えるようになる。 -
"page=|file=|include=": 「page=」または「file=」または「include=」という文字列を探す、というパターン。
-
この一行で、「URLの内容を取得し、特定のパターンが含まれているか静かにチェックし、結果をYes/Noで返す」という処理をしている。
実行方法
- 上記内容で
recon.shとtargets.txtを同じディレクトリに作成する。 -
recon.shに実行権限を付与する:chmod +x recon.sh - スクリプトを実行する:
./recon.sh
まとめ
今日は今週の学習計画を立て、最初のステップとして偵察用スクリプトを完成させた。スクリプト作成の過程で、シェルのリダイレクトやコマンドの終了コードといった基礎的ながら重要な概念を再確認できた。