【ディレクトリ列挙編】リンクされてない隠しエンドポイントを掘る|CTF思考フレームワーク R04

ディレクトリ列挙って、URLを総当たりするやつ?🔓

そうです。/admin、/backup、/.git、/.env など、リンクされていない隠しエンドポイントを、辞書攻撃で発見します。ffuf・dirsearch・gobuster ――この種のツールで、開発者が忘れたバックアップファイルや、設定ファイルが見つかります。
ディレクトリ列挙は、Webサーバ上の隠しエンドポイントを総当たり発見する技術。/admin、/backup、/.git、/.env、/wp-config.php.bak など、リンクされていないがアクセス可能なファイル・パスを発見します。SecLists の辞書と ffuf/dirsearch/gobuster の組み合わせが定番。
広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

.gitフォルダが公開されちゃってるサーバーもあるの…?
この記事は、CTF思考フレームワーク Recon編 R04。ディレクトリ列挙の基本ツール(ffuf・dirsearch・gobuster)と、SecLists の使い方、自社サーバーから漏れる『忘れ物』のチェック方法を整理します。
ディレクトリ列挙(コンテンツディスカバリ)は、サイトに「リンクされていない隠しURL」を見つける作業。/admin、/api/internal、/backup.zip、/.env… 公開してるつもりじゃなかったものが、実は外から叩ける状態で残っている、というのがWebの永遠のあるあるです🗂️
リンクされてないから安全、は最大の勘違い。攻撃者は最初から「隠してるはずの場所」を探しに来ます。
先に意味を押さえておくと読みやすい用語です。
- CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
- 認証: 本人かどうかを確認する仕組み。パスワード、SMS、アプリ承認などがあります。
難易度:★☆☆(初級) / この枝ルートの記事は、必要な回だけ選んで読めます。
👀 観察フェーズ:まず何を見る?
存在チェックの「肯定的応答」と「否定的応答」の差を見極めることが、ファジングの精度を決めます。
🤔 仮説フェーズ:攻撃者は何を考える?
攻撃者は「リンクされていないだけで存在は残っているパス」を頭に思い浮かべます。代表は /admin、/api/v1/internal、/backup.zip、/wp-config.php.bak、/.git/config、/.env、/swagger.json あたり。さらに『このサービスは Laravel っぽいから /storage/logs/laravel.log が読めるかも』『Rails 系なら /rails/info/routes が出るかも』とフレームワークの癖まで推測してから辞書を選びます。レスポンスサイズや応答時間のわずかな差から「ある/ない」を判定するので、404 を 200 で返す独自実装にも騙されません。
ディレクトリ列挙は「経験的によくあるURLリスト」が物を言う世界。SecListsを覚えるとぐっと効率上がります。
🔬 検証フェーズ:どうやって確かめる?
実行手順はおおよそ三段階です。まず『ffuf -u https://target/FUZZ -w SecLists/Discovery/Web-Content/raft-small-words.txt -mc all -fs
⚔️ 攻撃フェーズ:実際の手口
古典的だが今も刺さるのが .git ディレクトリの公開です。/.git/HEAD が 200 で返れば、git-dumper でリポジトリ全体を復元でき、コミット履歴から DB パスワードや S3 のキーがそのまま読み出せます。もう一つ多いのが、リリース前に作った backup.zip や db_dump_2024.sql.gz の置き忘れ。/backup/、/old/、/_old/、/v1/ の下に潜んでいることが多く、辞書に企業名や西暦を混ぜると一気に当たります。Swagger UI が /api-docs や /v3/api-docs で素っ裸になっているケースも依然として頻発し、そこから内部 API への足掛かりが取られます。
CTF{not_linked_does_not_mean_not_reachable}
「リンクされていない=隠れている」は幻想。攻撃者は最初から定番パスを総当たりします。
🛡️ 防御フェーズ:どう守る?
防御は「外から見える表面積を減らす」と「叩かれていることを検知する」の二本立てが基本です。前者では、.git や .env を Web ルート外に置く、Nginx で『location ~ /\. { deny all; }』のようにドットファイルを 403、本番に Swagger UI を出さない、バックアップは S3 など別ストレージへ送る、といった構成上の手当てを徹底します。後者では、本番には絶対に存在しないハニーポットパス(/admin-old/、/.env.bak など)を仕込み、そこに来た IP を WAF で即遮断するルールが効果的です。さらに自社向けに SecLists を月次で回し、攻撃者と同じ辞書で先回り点検するのが結局いちばん漏れが少ない方法です。
🧪 自分で検証ラボを作る
Reconコマンドを安全に試すには、自分専用の検証ラボが一番。🏗️ ConoHa VPSなら月額数百円からLinux環境を立てられ、nmapやgobusterなどのツールを「自分のサーバ」に打ち込んで安全に試せます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
現場でよく見るのは、本番リリース時に「あとで消す」と置いた backup.zip がそのまま残るケースと、SPA の build 成果物と一緒に .git をデプロイしてしまうケースです。どちらも CI から「公開ディレクトリに .git/ や *.zip があったらビルド失敗」というガードを入れるだけで防げますが、ガードが無いまま属人運用に頼っているチームが多数派です。また Honeypot パスを置かずにファジングを完全スルーしているサイトも多く、攻撃者が一晩中辞書を回しても 1 行もアラートが上がらない、という事態がしばしば起きます。
- 本番Webルートに .git ディレクトリを残す(よくある事件)。
- データベースバックアップを「一時的に」公開ディレクトリに置いて忘れる。
- Swagger UI を本番でも認証なしで公開。
- エディタの一時ファイル(.swp、~ 末尾)を削除せずデプロイ。
- Honeypotパスを設置せず、ファジングを検知できない。
- SecListsを使ったテストを自社向けに実施していない(攻撃者は使ってる)。
🧰 ツール早見表
ディレクトリ列挙まわりは、用途別にツールを使い分けるのがコツです。一次列挙の速度と精度なら ffuf、深掘りや大規模なら Rust 製の feroxbuster、辞書は SecLists の Discovery/Web-Content 配下を基準にし、.git 漏洩が見つかったら git-dumper でソース復元、.env や Swagger のような既知エクスポージャは nuclei の exposures テンプレートで網羅的に拾います。CTF と業務監査どちらでも、この組み合わせで大体の課題はカバーできます。
| ツール | 用途 | ひと言 |
|---|---|---|
| ffuf | 高速ファジング | 現代の標準 |
| feroxbuster | 再帰的ディレクトリ列挙 | Rust製、深掘り強い |
| SecLists | ワードリストの宝庫 | Discovery/Web-Content 配下が要 |
| git-dumper | .git からソース復元 | ディレクトリ漏洩からソース取得 |
| nuclei + exposures templates | 機微ファイル検出 | テンプレート豊富 |
🎓 本気で学びたい人へ
Recon・OSINTを絵空事だけで終わらせず、セキュリティエンジニアをキャリアとして目指したい方に。🎓 ササエルは現場で使えるスキルを体系的に学べるスクールです。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
📚 次に読みたい
- 【Google Dork編】検索演算子で機微情報を引き出す受動偵察|CTF思考フレームワーク R05
- 【Recon統合運用編】偵察結果を攻撃計画に落とすASMの発想|CTF思考フレームワーク R06
- 【ログイン画面の攻撃者目線】何を狙う?どう守る?|CTF思考フレームワーク #01
✍️ 学んだことを発信する
セキュリティブログを自分で始めたい方へ。🌐 ConoHa WINGなら初期費用無料でWordPressを起こせ、学んだことをアウトプットしていけます。



