Webサーバ上の隠れたディレクトリやファイルを探索するPython製ツール
- dirsearch -

Webアプリケーション診断において、隠れたディレクトリやファイルの把握は基本かつ重要な工程です。dirsearchは、その工程を効率化できる定番ツールとして多くの現場で利用されています。

本記事では、dirsearchとは何かという基礎からインストール手順基本的な使い方を体系的に解説しています。

また、検証環境での実行例各種オプションの具体的なコマンド例も解説しているので、すぐに活かせる内容が満載です!

目次

dirsearchとは

dirsearchは、Webアプリケーションに存在するディレクトリやファイルを列挙するためのオープンソースツールです。HTTP/HTTPS経由で指定したURLに対し、ワードリストを用いて多数のパスを自動的にリクエストし、存在する可能性のある管理画面、未公開API、バックアップファイル、設定ファイルなどを検出します。

主に脆弱性診断やペネトレーションテストの初期フェーズにおいて、攻撃対象となりうるディレクトリや設定ファイル、バックアップファイルなどを発見する目的で使用されます。

内部的には、Pythonで実装された高速なリクエスト処理と、HTTPステータスコード(200,301,302,401,403など)を基にした判定ロジックを用いています。特にHTTPステータスコード・レスポンスサイズ・リダイレクト挙動を組み合わせて結果を判断できる点は、誤検知を減らすうえで有用です。

主な特徴

  • Webサーバ上の隠れたディレクトリやファイルを探索
  • ワードリスト(辞書ファイル)ベースのスキャン
  • プレースホルダ%EXT%を任意の拡張子に置換できる
  • マルチスレッドによる高速スキャン
  • HTTPステータスコード、レスポンスサイズなどによるフィルタリング
  • 再帰的探索(Recursive)
  • OWASP ZAPやBurp Suiteとの連携
  • Python製でクロスプラットフォーム対応
  • 豊富なレポート形式(テキスト、JSON、XML など)

注意事項

dirsearchは強力なツールである一方、使用方法を誤ると法的リスクや業務影響につながる可能性があります。以下の点は必ず理解したうえで利用してください。

必ず許可を得た環境でのみ使用すること

診断対象のサイトが自身の管理下にある、もしくは診断の許可を取得済みであることが大前提です。第三者が管理するWebサイトや本番環境に対して無断で実行すると、不正アクセス禁止法や利用規約違反に該当する可能性があります。

学習目的の場合、意図的に脆弱性を含んだトレーニング環境(通称:やられアプリ)を利用しましょう。本記事では、OWASP BWAに搭載されているWordPressを使用しています。

対象サーバへの負荷

dirsearchは大量のHTTPリクエストを高速に送信するため、対象サーバに高負荷をかける可能性があります。低スペックな環境やWAF配下のシステムでは、レート制限や一時的なサービス低下を引き起こす可能性があるため、スレッド数やリクエスト間隔の調整が必要です。

検出結果=脆弱性ではない

dirsearchはディレクトリやファイルの列挙を目的としたツールであり、検出されたパスに脆弱性が存在するかどうかまでは判断できません。あくまで「可能性のある入口」を洗い出すための補助的ツールとしてご活用ください。

dirsearchのインストール

このセクションでは、Kali Linuxへのdirsearchインストール手順を解説します。

インストール環境の前提条件
  • Kali Linux 2025.4
  • Python 3.9 以上

Kali Linuxの場合、APT経由でのインストールも可能です。しかし、dirsearchの公式サイトではAPT経由での導入は非推奨と明記されています。そのため、本手順では公式サイト推奨のgit cloneを使用してインストールを行います。

STEP

Pythonバージョンの確認

$ python3 -V
Python 3.13.9

Python 3.9 以上が必要です。

STEP

インストールディレクトリを作成

$ mkdir ~/tools
$ cd ~/tools

本記事では、$HOME/tools配下にdirsearchをインストールします。

STEP

GitHubリポジトリからdirsearchを取得

$ git clone https://github.com/maurosoria/dirsearch.git --depth 1

GitHubの公式リポジトリからdirsearchをクローンします。--depth 1を指定することで、最新コミットのみを取得します。

STEP

Python仮想環境を作成

$ cd dirsearch
$ python3 -m venv .venv

dirsearch用のPython仮想環境を作成します。これにより、システム全体のPython環境に影響を与えず依存パッケージを管理できます。

STEP

仮想環境の有効化

$ source .venv/bin/activate

仮想環境を有効化します。この操作により、パッケージのインストールは仮想環境内で実施されます。

STEP

Pythonパッケージのインストール

$ pip3 install -r requirements.txt

requirements.txtに基づいて、dirsearchが依存しているPythonパッケージをインストールします。

STEP

仮想環境の無効化

$ deactivate

依存関係のインストールが完了したら、仮想環境を無効化します。

STEP

dirsearchコマンドのエイリアス作成

# 以下を~/.zshrcに追記
DIRSEARCH_HOME="$HOME/tools/dirsearch"
alias dirsearch="$DIRSEARCH_HOME/.venv/bin/python3 $DIRSEARCH_HOME/dirsearch.py"

# 設定を再読み込み
$ source ~/.zshrc

仮想環境を意識せずにdirsearchを実行できるようにエイリアスを設定します。この方法により、毎回activateを実行しなくても、仮想環境内でdirsearchを実行できます。

ここではzshを前提としていますが、bashの場合は ~/.bashrc に読み替えてください。

STEP

コマンドパスの確認

$ which dirsearch
dirsearch: aliased to /home/kali/tools/dirsearch/.venv/bin/python3 /home/kali/tools/dirsearch/dirsearch.py

エイリアスが正しく設定されているか確認します。

STEP

バージョン確認

$ dirsearch --version
dirsearch v0.4.3

最後に、バージョン情報を表示してdirsearchが正常に動作するか確認します。

dirsearchの使い方

基本構文

$ dirsearch -u <対象URL> [オプション]

最もシンプルな実行例は、以下のとおりです。

$ dirsearch -u http://example.com

このコマンドは、デフォルト設定でスキャンを実行します。ワードリストを指定しない場合、dirsearchインストールディレクトリ内にあるdb/dicc.txtがデフォルトで使用されます。

対象URL-uの指定のみで実行可能ですが、ワードリストや拡張子、レスポンスフィルタなどを明示的に指定することで、より効率的な探索が可能となります。

検証環境でdirsearchを実行してみた

このセクションでは、検証用に構築したローカル環境を使用して、dirsearchを実行した事例を取り上げます。

検証環境の前提条件
  • dirsearch実行マシン
    • Kali Linux 2025.4
    • dirsearch 0.4.3
    • OWASP ZAPが起動しており、localhost:8080でプロキシとして動作していること
  • 診断対象マシン
    • WordPress(OWASP BWA収録アプリ)
    • 対象URL:http://192.168.10.105/wordpress/

dirsearchのリクエストをOWASP ZAP(ローカルプロキシ)経由で送信し、ディレクトリ探索を行う手順について解説します。

STEP

dirsearchの実行

$ dirsearch \
    -u http://192.168.10.105/wordpress/ \
    -w ~/tools/dirsearch/db/categories/php/wordpress.txt \
    -p localhost:8080
  • -u:スキャン対象のURL
  • -w:使用するワードリスト
  • -p:プロキシ(localhost:8080は、OWASP ZAPの待ち受けポート)

ワードリストはwordpress.txtを使用しており、wp-admin/wp-content/など、WordPress特有のパスが含まれています。アプリケーション特化型リストを使うことで不要なリクエストを減らし、スキャン効率が向上します。

STEP

実行結果の確認

$ dirsearch \
    -u http://192.168.10.105/wordpress/ \
    -w ~/tools/dirsearch/db/categories/php/wordpress.txt \
    -p localhost:8080

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, asp, aspx, jsp, html, htm | HTTP method: GET | Threads: 25 | Wordlist size: 19

Target: http://192.168.10.105/

[02:11:53] Scanning: wordpress/
[02:11:54] 200 -    2KB - /wordpress/wp-config-sample.php
[02:11:54] 200 -    8KB - /wordpress/readme.html
[02:11:54] 200 -    1KB - /wordpress/wp-content/themes/
[02:11:54] 200 -    8KB - /wordpress/wp-includes/
[02:11:54] 200 -   15KB - /wordpress/license.txt
[02:11:54] 200 -    2KB - /wordpress/wp-content/plugins/
[02:11:54] 200 -     0B - /wordpress/wp-content/
[02:11:54] 200 -     0B - /wordpress/wp-config.php
[02:11:54] 500 -     0B - /wordpress/wp-settings.php
[02:11:54] 200 -    2KB - /wordpress/wp-login.php
[02:11:54] 200 -    42B - /wordpress/xmlrpc.php
[02:11:54] 200 -    1KB - /wordpress/wp-links-opml.php
[02:11:54] 200 -   135B - /wordpress/wp-trackback.php
[02:11:54] 200 -   122B - /wordpress/wp-mail.php
[02:11:54] 302 -     0B - /wordpress/wp-admin/  ->  http://192.168.10.105/wordpress/wp-login.php?redirect_to=%2Fwordpress%2Fwp-admin%2F

Task Completed

dirsearchの実行結果は、以下の情報が1行単位で表示されます。

  • 実行時刻
  • HTTPステータスコード
  • レスポンスサイズ
  • 検出されたパス
  • リダイレクト先

今回の実行結果では、WordPress特有のディレクトリ・ファイルが露出していることが確認できます。

ディレクトリやファイルが露出していること自体が、直ちに脆弱性を意味するわけではありません。重要なのは、検出された各パスがどのような用途で使用されており、外部からのアクセスが設計上許容されるものか、あるいは制限されるべきものかを一つひとつ精査することです。意図せず管理機能や内部情報にアクセス可能な状態となっていないかを確認した上で、必要に応じてアクセス制御や設定の見直しを行うことが求められます。

STEP

OWASP ZAPの通信履歴を確認

OWASP ZAPの通信履歴

今回の検証では、OWASP ZAPを経由してHTTPリクエストを送信しました。OWASP ZAPの「履歴」タブを確認すると、dirsearchが送信したリクエストが時系列で表示されます。各リクエストを選択すると、リクエスト内容およびレスポンスの詳細を確認できます。

このように、dirsearchは単体で使うよりも、OWASP ZAPと組み合わせることで「ディレクトリ列挙 → 通信可視化 → 詳細分析」という診断フローを構築できます。

オプションの使用方法

このセクションでは、以下のオプションの使用方法について、具体的なコマンド例を交えながら解説します。

  • ターゲット指定
    • -u,--url:スキャン対象のURL
    • -l,--urls-file:スキャン対象のURLを記載したファイル
    • --stdin:標準入力からスキャン対象のURLを受け取る
    • --subdirs:指定したサブディレクトリ配下のみスキャン
  • ワードリスト(辞書ファイル)
    • -w,--wordlists:使用するワードリスト
    • -e,--extensions:プレースホルダを拡張子に置換
    • -f,--force-extensions:すべてのワードに付与する拡張子
    • --exclude-extensions:探索から除外する拡張子
    • --prefixes:ワードの先頭に付与する文字列
    • --suffixes:ワードの末尾に付与する文字列
    • -U,--uppercase:ワードリストを大文字に変換
    • -L,--lowercase:ワードリストを小文字に変換
  • 検出結果のフィルタリング
    • -i,--include-status:検出対象とするHTTPステータスコード
    • -x,--exclude-status:除外するHTTPステータスコード
    • --exclude-sizes:除外するレスポンスサイズ
    • --exclude-text:指定した文字列を含むレスポンスを除外
    • --exclude-regex:指定した正規表現を含むレスポンスを除外
    • --exclude-redirect:特定のリダイレクトを含む結果を除外
  • HTTPリクエスト
    • --user-agent:リクエストに使用するUser-Agent
    • --random-agent:User-Agentをランダムに切り替える
    • -m,--http-method:使用するHTTPメソッド
    • -p,--proxy:使用するプロキシを指定
    • --replay-proxy:検出したパスのみプロキシに再送
    • --skip-on-status:指定したステータスコードが返された場合にスキャンをスキップ
  • 再帰探索(Recursive)
    • -r,--recursive:検出したディレクトリを再帰的に探索
    • -R,--max-recursion-depth:再帰探索の深さ
    • --recursion-status:再帰対象とするHTTPステータスコード
    • --exclude-subdirs:再帰探索から除外するサブディレクトリ
  • パフォーマンス
    • -t,--threads:並列実行するスレッド数
    • --max-rate:1秒あたりの最大リクエスト数
    • --delay:各リクエスト間の待機時間
    • --max-time:スキャン全体の最大実行時間
  • 出力
    • -o,--output-file:スキャン結果をファイルに出力
    • -O,--output-formats:出力ファイルの形式を指定
    • --full-url:出力結果に完全なURLを表示
    • --no-color:出力のカラー表示を無効化
    • -q,--quiet-mode:スキャン結果のみ出力

ターゲット指定

dirsearchでは、用途や目的に応じてスキャン対象(ターゲット)を柔軟に指定できます。

-u, --url(スキャン対象のURL)

$ dirsearch -u http://example.com

単一のURLを指定してスキャンを実行する最も基本的なオプションです。指定したURLを起点にディレクトリ探索を行います。

-l, --urls-file(スキャン対象のURLを記載したファイル)

$ dirsearch -l targets.txt

スキャン対象のURLを記述したテキストファイルを読み込み、順次スキャンします。

$ cat targets.txt
http://example1.com
http://example2.com
http://example3.com

URL数 × ワード数分のリクエストが発生するため、実行時間も比例して増加します。

--stdin(標準入力からスキャン対象のURLを受け取る)

$ echo http://example.com | dirsearch --stdin

標準入力(STDIN)からURLを受け取ります。スクリプト連携時や、動的にURLを生成してスキャンする際に有用です。

--subdirs(指定したサブディレクトリ配下のみスキャン)

$ dirsearch -u http://example.com --subdirs admin,api,v1

特定のサブディレクトリを起点として探索を行います。

  • カンマ区切りで複数指定可能。
  • 指定したディレクトリ配下のみを探索するため、スキャン範囲を限定できる。

ワードリスト(辞書ファイル)

dirsearchの診断精度は、「どのパスを探索するか」によって大きく左右されます。実際、使用するワードリストや拡張子の設定次第で、検出可能なエンドポイント数が数倍以上変化するケースも珍しくありません。

-w, --wordlists(使用するワードリスト)

$ dirsearch -u http://example.com -w /path/to/wordlist.txt

指定したワードリストをもとにディレクトリやファイルの存在を確認します。ワードリストの行数が多いほど網羅性は向上しますが、リクエスト数は増加します。

dirsearchをインストールすると、専用のワードリストがインストールディレクトリ直下の/db/配下に格納されます。-wオプションでワードリストを指定しない場合、デフォルトで/db/dicc.txtが使用されます。

dirsearch専用のワードリスト以外にも、ディレクトリ探索で広く利用されているワードリストとして「Wordlists」や「SecLists」があります。

-e, --extensions(プレースホルダを拡張子に置換)

$ dirsearch -u http://example.com -e php,conf,bak

ワードリスト内の%EXT%プレースホルダを、指定した拡張子に置き換えてリクエストを生成します。

  • スキャン対象のシステムで使用している要素技術に対応した拡張子を指定すると、診断の精度が向上します。
  • bakoldtartgzなどを指定すると、バックアップファイルの確認にも有効です。

-f, --force-extensions(すべてのワードに付与する拡張子)

$ dirsearch -u http://example.com -e php,ini -f

ワードリスト内のすべての単語の末尾に-eオプションで指定した拡張子を付与します。

前述の通り、-eオプションを指定すると、%EXT%というプレースホルダを指定した拡張子で置換します。これに対し、-fオプションを併用すると、%EXT%の有無に関わらず、ワードリスト内のすべての単語の末尾に-eオプションで指定した拡張子が付与されます。

--exclude-extensions(探索から除外する拡張子)

$ dirsearch -u http://example.com --exclude-extensions png,css,dll

特定の拡張子を探索対象から除外します。

--prefixes(ワードの先頭に付与する文字列)

$ dirsearch -u http://example.com --prefixes .,_,-,~

ワードの前に付与する文字列(プレフィックス)を指定します。.admin_configのような隠しディレクトリ・ファイルの検出に有効です。

--suffixes(ワードの末尾に付与する文字列)

$ dirsearch -u http://example.com --suffixes _,-,~

ワードの末尾に付与する文字列(サフィックス)を指定します。エディタやOSが生成する一時ファイル・バックアップファイルの確認に有効です。(例:index.php~config.ini_など)

-U, --uppercase(ワードリストを大文字に変換)

$ dirsearch -u http://example.com -U

ワードリスト内の文字列をすべて大文字に変換して実行します。

-L, --lowercase(ワードリストを小文字に変換)

$ dirsearch -u http://example.com  -L

ワードリスト内の文字列をすべて小文字に変換して実行します。

検出結果のフィルタリング

dirsearchは大量のHTTPレスポンスを受信する性質上、誤検出やノイズを適切に除去できるかどうかが、診断効率に大きく影響します。

-i, --include-status(検出対象とするHTTPステータスコード)

$ dirsearch -u http://example.com -i 200,301,302,403

指定したHTTPステータスコードのみを結果として表示します。例えば、有効なリソース200やリダイレクト301/302、権限エラー403だけを確認したい時に有効です。

-x, --exclude-status(除外するHTTPステータスコード)

$ dirsearch -u http://example.com -x 404

指定したHTTPステータスコードを結果から除外します。例えば、Not Found404などノイズになりやすいレスポンスを除外します。

--exclude-sizes(除外するレスポンスサイズ)

$ dirsearch -u http://example.com --exclude-sizes 216B,8KB

レスポンスサイズを指定して除外します。カスタム404ページなど、一定のサイズで返されるノイズを取り除く用途に適しています。

--exclude-text(指定した文字列を含むレスポンスを除外)

$ dirsearch -u http://example.com --exclude-text "Not Found"

レスポンスボディに特定の文字列を含む場合、その結果を除外します。例えば、ソフト404の除外に有効です。

--exclude-regex(指定した正規表現を含むレスポンスを除外)

$ dirsearch -u http://example.com --exclude-regex "<title>404.*</title>"

レスポンスボディにマッチする正規表現が含まれる場合に除外します。--exclude-textより柔軟で、エラーメッセージの表記ゆれが多い環境に適しています。

--exclude-redirect(特定のリダイレクトを含む結果を除外)

$ dirsearch -u http://example.com --exclude-redirect login.php

指定したリダイレクト先URLと一致するレスポンスを結果から除外します。(用途:ログインページや認証系のリダイレクト など)

HTTPリクエスト

このセクションでは、dirsearchが送信するHTTPリクエストを制御するオプションについて解説します。

--user-agent(リクエストに使用するUser-Agent)

$ dirsearch -u http://example.com --user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"

User-Agentを明示的に指定します。

--random-agent(User-Agentをランダムに切り替える)

$ dirsearch -u http://example.com --random-agent

リクエストごとにランダムなUser-Agentを使用します。

-m, --http-method(使用するHTTPメソッド)

$ dirsearch -u http://example.com -m POST

HTTPリクエストメソッドを指定します。(デフォルト:GET

-p, --proxy(使用するプロキシ)

$ dirsearch -u http://example.com -p localhost:8080

ローカルプロキシ経由でリクエストを送信します。OWASP ZAP、Burp Suiteなどでリクエストの中継・解析を行いたい場合に有用です。

--replay-proxy(検出したパスのみプロキシに再送)

$ dirsearch -u http://example.com --replay-proxy localhost:8080

スキャン自体は(プロキシを経由せず)直接実行し、見つかった有効パスだけをプロキシへ再送信します。

-p--proxy--replay-proxyの違い

-p、--proxy--replay-proxy
送信方法すべてのリクエストがプロキシ経由で送信される検出されたパスのみプロキシに送信される
使用目的能動的調査検出されたURLの分析
大規模スキャン×

--skip-on-status(指定したステータスコードが返された場合にスキャンをスキップ)

$ dirsearch -l targets.txt --skip-on-status 500

指定したステータスコードが返ってきた場合、そのターゲットの探索をスキップし、次のターゲットの探索を開始します。

再帰探索(Recursive)

dirsearchは、指定したディレクトリだけでなく、その配下のディレクトリも含めて再帰的に探索する機能を有しています。これにより、情報収集フェーズにおいてより包括的な調査が可能となります。

-r, --recursive(検出したディレクトリを再帰的に探索)

$ dirsearch -u http://example.com -r

検出したディレクトリを起点に、再帰的に探索を行う基本オプションです。

例えば、/admin/というディレクトリを検出した場合、/admin/配下も自動的に探索します。/admin/backup//dev/api/のように、2階層目以降に重要なパスが存在するケースが少なくありません。

-R, --max-recursion-depth(再帰探索の深さ)

$ dirsearch -u http://example.com -r -R 3

再帰探索の最大深度を指定します。上記コマンド例では、3階層まで探索します。

--recursion-status(再帰対象とするHTTPステータスコード)

$ dirsearch -u http://example.com -r --recursion-status=200,301,302,403

再帰探索するHTTPステータスコードを指定します。再帰条件を限定できるため、無駄な深掘りを防止できます。

--exclude-subdirs(再帰探索から除外するサブディレクトリ)

$ dirsearch -u http://example.com -r --exclude-subdirs image,media,css

再帰探索から特定のサブディレクトリを除外します。静的リソース配下を除外することで、スキャン効率を大幅に改善できます。

パフォーマンス

ここでは、スキャン速度を調整するオプションについて解説します。これらのオプションを適切に設定することで、ターゲット環境への影響を最小限に抑えつつ、効率的なスキャンを実施できます。

-t, --threads(並列実行するスレッド数)

$ dirsearch -u http://example.com -t 10

並列スレッド数を指定します。(デフォルト値:25スレッド)

--max-rate(1秒あたりの最大リクエスト数)

$ dirsearch -u http://example.com --max-rate 5

1秒あたりの最大リクエスト数を制限します。

--delay(各リクエスト間の待機時間)

$ dirsearch -u http://example.com --delay 1

各リクエストの間に待機時間(秒)を挿入します。※小数指定可

--max-time(スキャン全体の最大実行時間)

$ dirsearch -u http://example.com --max-time 1800    # 1800秒 = 30分

スキャン全体の最大実行時間(秒)を指定します。指定時間を超えるとスキャンが自動終了します。

出力

dirsearchはスキャン結果を標準出力に表示するだけでなく、後続の分析やレポーティングを前提としたファイル出力が可能です。

-o, --output-file(スキャン結果をファイルに出力)

$ dirsearch -u http://example.com -o result.txt

スキャン結果をファイルに保存します。(デフォルト:plain形式)

-O, --output-formats(出力ファイルの形式を指定)

$ dirsearch -u http://example.com --output-formats json --output-file result.json

スキャン結果の出力フォーマットを指定します。

対応しているフォーマット

simple、plain、json、xml、md、csv、html、sqlite

--full-url(出力結果に完全なURLを表示)

$ dirsearch -u http://example.com --full-url

このオプションを指定すると、フルパス形式(完全なURL)で結果が出力されます。

# 通常
[21:50:50] 200 -    8KB - /php.ini

# フルパス
[21:50:50] 200 -    8KB - http://example.com/php.ini

OWASP ZAPやBurp Suiteなど、他ツールへの連携時に加工が不要になるため、作業効率が向上します。

--no-color(出力のカラー表示を無効化)

$ dirsearch -u http://example.com --no-color

ターミナル出力時の色付けを無効化します。

デフォルトではdirsearchの出力にはカラーが付いており、視認性が高くなっています。しかし、CI環境やログ管理など色付き出力を好まない場合には、--no-colorを指定することで色なし出力に変更できます。

-q, --quiet-mode(検出結果のみ出力)

$ dirsearch -u http://example.com -q

不要な進捗表示を抑制し、検出結果のみを出力します。

デフォラボ

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次