
これは、指定されたターゲットに対して、エンドポイントの発見、潜在的なパラメータの発見、ターゲット固有のワードリストの生成、シークレットの検出を行うためのツールです。以下を通じてこれらを発見できます。
waymore -mode R のアーカイブ応答ファイルの検索、waymore.txt からのURLリクエスト、waymore_index.txt からの元のURLのリクエストも含む - waymore README.md を参照)このPythonスクリプトは、私のBurp拡張機能 GAP のリンク検出機能に基づいています。出発点として、Gerben Javadoによる素晴らしいツール LinkFinder を取り上げ、リンク検出のための正規表現を使用しつつ、さらに多くのリンクを見つけるための追加の改良を加えています。
xnLinkFinder は Python 3 をサポートしています。
デフォルト(グローバル)のPython環境に xnLinkFinder をインストールしてください。```bash
pip install xnLinkFinder
または```bash
pip install git+https://github.com/xnl-h4ck3r/xnLinkFinder.git -v
以下の方法でアップグレードできます
pip install --upgrade xnLinkFinder
```
### pipx
[pipx](https://pypa.github.io/pipx/) を使用した隔離されたPython環境でのクイックセットアップ```bash
pipx install git+https://github.com/xnl-h4ck3r/xnLinkFinder.git
```
**注記:PDFファイルからリンクを抽出するには、システムに`pdftotext`をインストールすることができます。Linuxでは`sudo apt install -y poppler-utils`、macOSでは`brew install poppler`を使用してインストールできます。`pdftotext`がインストールされていない場合、`xnLinkFinder`は`pypdf` Pythonライブラリを使用してフォールバックします。テキストが見つからない場合(例:スキャンされたPDF)、インストールされていれば`ocrmypdf`の使用を試みます(例:`sudo apt install -y ocrmypdf`)。一般に、`pdftotext`と`ocrmypdf`を使用すると、`pypdf`単独よりもはるかに良い結果が得られます。**
## 使用方法| 引数 | 長い引数 | 説明 |
| ----------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -i | --input | 入力: URL、URLのテキストファイル、検索するファイルのディレクトリ、Burp XML出力ファイル、ZAP出力ファイル、Caido CSVファイル、HAR JSONファイル、または内容を検索する単一のファイル。 |
| -o | --output | リンク出力を保存するファイル(必要に応じてパスを含む)(デフォルト: output.txt)。`cli` に設定すると、出力はSTDOUTにのみ書き込まれます。ファイルが既に存在する場合、`-ow`オプションが渡されない限り、追記されます(重複は除去されます)。 |
| -op | --output-params | 潜在的なパラメータ出力を保存するファイル(必要に応じてパスを含む)(デフォルト: parameters.txt)。`cli` に設定すると、出力はSTDOUTにのみ書き込まれます(ただし、他のプログラムにパイプされません)。ファイルが既に存在する場合、`-ow`オプションが渡されない限り、追記されます(重複は除去されます)。 |
| -owl | --output-wordlist | ターゲット固有のワードリスト出力を保存するファイル(必要に応じてパスを含む)(デフォルト: ワードリスト出力なし)。`cli` に設定すると、出力はSTDOUTにのみ書き込まれます(ただし、他のプログラムにパイプされません)。ファイルが既に存在する場合、`-ow`オプションが渡されない限り、追記されます(重複は除去されます)。 |
| -oo | --output-oos | スコープ外リンクの出力を保存するファイル(必要に応じてパスを含む)(デフォルト: OOS出力なし)。`cli` に設定すると、出力はSTDOUTにのみ書き込まれます(ただし、他のプログラムにパイプされません)。ファイルが既に存在する場合、`-ow`オプションが渡されない限り、追記されます(重複は除去されます)。 |
| -os | --output-secrets | レスポンスで見つかったシークレットを保存するファイル(JSON形式)(必要に応じてパスを含む)(デフォルト: シークレット出力なし)。ファイルが既に存在する場合、`-ow`オプションが渡されない限り、シークレットはマージされます。シークレットはタイプと値でグループ化され、それぞれが見つかったソースの配列を持ちます。 |
| -ow | --output-overwrite | 出力ファイルが既に存在する場合、追記ではなく上書きされます。 |
| -sp | --scope-prefix | `/` で始まるリンクは、元のリンクの代わりにスコープドメインが先頭に付加されて出力されます。渡された値が有効なファイル名の場合、そのファイルが使用され、そうでない場合は文字列リテラルが使用されます。 |
| -spo | --scope-prefix-original | `-sp` 引数が渡された場合、`/` で始まる元のリンクも出力に含めるかどうかを決定します(デフォルト: false) |
| -spkf | --scope-prefix-keep-failed | `-spkf` 引数が渡された場合、404またはRequestExceptionが発生した場合でも、プレフィックスが付いたリンクを出力に残すかどうかを決定します(デフォルト: false) |
| -sf | --scope-filter | リンクのドメインが指定されたスコープ内にある場合のみ、出力リンクをフィルタリングします。渡された値が有効なファイル名の場合、そのファイルが使用され、そうでない場合は文字列リテラルが使用されます。この引数は、入力がドメイン/URL(またはドメイン/URLのファイル)の場合、スコープ外のサイトのクロールや誤解を招く結果を防ぐために必須になりました。 |
| -c | --cookies † | HTTPリクエストに渡すクッキーを追加します。形式は `'name1=value1; name2=value2;'` で渡します。 |
| -H | --headers † | HTTPリクエストに渡すカスタムヘッダーを追加します。形式は `'Header1: value1; Header2: value2;'` で渡します。 |
| -ra | --regex-after | 出力前のエンドポイントに対するフィルタリング用の正規表現(例: `/api/v[0-9]\.[0-9]\*` )。一致した場合、リンクが出力されます。 |
| -d | --depth † | 検索する深さのレベル。例えば、値2が渡された場合、最初に見つかったすべてのリンクがさらに検索されます(デフォルト: 1)。このオプションは、Burpファイル、ZAPファイル、Caidoファイル、HARファイルでは無視されます。これらのファイルは巨大になる可能性があり、多くのメモリを消費するためです。また、ドメインなしで見つかったリンクへのリクエストが試行できるように、`-sp`(`--scope-prefix`)引数を使用することをお勧めします。 |
| -p | --processes † | URLまたはURLのファイル(Burpファイル、ZAPファイル、Caidoファイル、HARファイルではない)に対するリクエスト取得時に基本的なマルチスレッドが行われます。この引数は使用されるプロセス(スレッド)数を決定します(デフォルト: 25) |
| -rl | --rate-limit † | 1秒あたりに送信するリクエストの最大数(デフォルト: 0、レート制限なし)。これにより、ターゲットサーバーへの過負荷を防ぐことができます。 |
| -x | --exclude | 追加のリンク除外(`config.yml`のリストに加えて)をカンマ区切りリストで指定します。例: `careers,forum` |
| -orig | --origin | リンクの発生元を出力に含めるかどうか。出力に `LINK-URL [ORIGIN-URL]` として表示されます(デフォルト: false) |
| -prefixed | | プレフィックスが付いたリンクを出力に表示するかどうか。出力に `(PREFIXED)` をリンクと発生元の後に表示します(デフォルト: false) |
| -xrel | --exclude-relative-links | デフォルトでは、結果のリンクが `./` または `../` で始まる場合、それらが含まれます。この引数が使用されると、これらの相対リンクは追加されません。 |
| -t | --timeout † | サーバーがデータを送信するのを待つ秒数(デフォルト: 10秒) |
| -r | --retries † | 失敗(例: タイムアウト、接続エラーなど)後のリクエスト再試行回数。最大5回までです(デフォルト: 0) |
| -inc | --include | 入力(`-i`)リンクを出力に含める(デフォルト: false) |
| -u | --user-agent † | リンクを取得するユーザーエージェント。例: `-u desktop mobile`。設定可能な値は `desktop`、`mobile`、`set-top-boxes`、`game-console` です。また、`mobile` のサブセットとして `mobile-apple`、`mobile-android`、`mobile-windows` があり、個別に使用することもできます。 |
| -uc | --user-agent-custom † | すべてのリクエストに使用するカスタムユーザーエージェント文字列。これは `-u`/`--user-agent` 引数を上書きします。これは、例えばプログラムが特定のユーザーエージェントヘッダーを要求する場合に使用できます。 |
| -insecure | † | リクエスト時にTLS証明書のチェックを無効にするかどうか(デフォルト: false) |
| -s429 | † | レスポンスの95%以上が429 Too Many Requestsを返した場合に停止する(デフォルト: false) |
| -s403 | † | レスポンスの95%以上が403 Forbiddenを返した場合に停止する(デフォルト: false) |
| -sTO | † | リクエストの95%以上がタイムアウトした場合に停止する(デフォルト: false) |
| -sCE | † | リクエストの95%以上で接続エラーが発生した場合に停止する(デフォルト: false) |
| -m | --memory-threshold | メモリしきい値のパーセンテージ。マシンのメモリがしきい値を超えると、メモリ不足になる前にプログラムは正常に停止して終了します(デフォルト: 95) |
| -mfs | --max-file-size † | `-i` がディレクトリの場合にチェックするファイルの最大サイズ(バイト単位)。ファイルサイズがこれを超えると無視されます(デフォルト: 500 MB)。0に設定すると、サイズに関係なくファイルは無視されません。 |
| -mrs | --max-response-size † | ダウンロードする最大レスポンスサイズ(MB単位)。これより大きいレスポンスはスキップされます(デフォルト: 100 MB)。 |
| -fp | --forward-proxy † | URL(またはURLのファイル)を使用したアクティブリンク検出時に、BurpやCaidoなどのプロキシを介してリクエストを再生します。例: `http://127.0.0.1:8080` |
| -rp | --request-proxy | 使用するリクエストプロキシ。プロキシ文字列(例: `http://user:[email protected]:8000`、`socks5://host:port`)またはプロキシリストを含むファイル(1行に1つ、ランダム選択)を指定できます。 |
| | --heap | 訪問したURLのヒープスナップショットを取得し、ブラウザのメモリからリンクを抽出するかどうか。これにより時間がかかりますが、標準の静的解析では見逃される可能性がある動的に生成されたリンクを発見できる場合があります(Playwrightのインストールが必要)。 |
| -ro | --readable-only | 渡された場合、リンクを検索する前に、BeautifulSoupを使用してHTMLレスポンス/ファイルから人間が読めるテキストのみが抽出されます。これにより、`<script>`、`<style>`、`<noscript>`、`<template>` タグの内容が除外されます。 |
| -ascii-only | | リンクとパラメータがASCII文字のみを含む場合のみ追加されるかどうか。これは、ターゲットがASCII文字を使用する可能性が高い場合や、何らかの理由でバイナリファイルからの誤検出が多い場合に便利です。 |
| -mtl | --max-time-limit | 停止するまでの最大時間制限(分単位)(デフォルト: 0)。0が渡された場合は制限なし。 |
| | --config | YML設定ファイルへのパス。渡されない場合、デフォルトのディレクトリ(通常は `~/.config/xnLinkFinder`)の `config.yml` ファイルを探します。 |
| -nwlpl | --no-wordlist-plurals | ターゲット固有のワードリスト用に単語が見つかった場合、デフォルトでは複数形の単語から単数形があれば、またはその逆の場合に新しい単語が追加されます。この引数が使用されると、この処理は行われません。 |
| -nwlpw | --no-wordlist-pathwords | デフォルトでは、リンク内で見つかったパスワードはターゲット固有のワードリスト用に処理されます。この引数が使用されると、処理されません。**注意: YAML設定値 `respParamPathWords` が `True` の場合、`-nwlpm`/`--no-wordlist-parameters` も渡されない限り、この引数は効果がありません。** |
| -nwlpm | --no-wordlist-parameters | デフォルトでは、リンク内で見つかったパラメータはターゲット固有のワードリスト用に処理されます。この引数が使用されると、処理されません。 |
| -nwlc | --no-wordlist-comments | デフォルトでは、ページ内のコメントはターゲット固有のワードリスト用に処理されます。この引数が使用されると、処理されません。 |
| -nwlia | --no-wordlist-imgalt | デフォルトでは、画像の 'alt' 属性はターゲット固有のワードリスト用に処理されます。この引数が使用されると、処理されません。 |
| -nwld | --no-wordlist-digits | ターゲット固有のワードリストから数字を含む単語を除外します。 |
| -nwll | --no-wordlist-lowercase | デフォルトでは、大文字を含む単語が追加されると、その単語の小文字バージョンも追加されます。この引数が使用されると、小文字の単語は追加されません。 |
| -wlml | --wordlist-maxlen | ターゲット固有のワードリストに追加する単語の最大長(複数形は除く)(デフォルト: 0 - 制限なし) |
| -swf | --stopwords-file | YML設定ファイルの "stopWords" に加えて、ターゲット固有のワードリストから単語を除外するために使用される追加のストップワードファイル。ストップワードは自然言語処理で使用され、異なるライブラリで異なるリストが見つかります。ターゲットに応じて、異なる言語の単語を追加したい場合があります。 |
| -brt | --burpfile-remove-tags | `-i` で入力がBurpファイルの場合、ユーザーはインタラクティブにそのファイルから不要なタグを削除するかどうかを尋ねられます(Burp XMLファイルには、不要なタグを削除することで解決できる問題があり、ファイルも小さくなります)。スクリプトで xnLinkFinder を使用している場合、ユーザー入力で中断したくないため、この引数に `true` または `false` を渡すことで設定できます。注意: これはファイルへの永続的な変更です。 |
| -all | --all-tlds | 見つかったすべてのリンクが返されます。TLDが一般的でない場合でもです。これにより、変数名などが実際のドメインである可能性がある場合に、多くの誤検出が発生する可能性があります。デフォルトでは、一般的なTLD(`config.yml` の `commonTLDs`)を持つリンクのみが返されます。 |
| -cl | --content-length | クロール時にレスポンスの Content-Length を表示します。 |
| -nb | --no-banner | ツールのバナーを非表示にします。 |
| -v | --verbose | 詳細な出力 |
| -vv | --vverbose | より詳細な出力 |
| | --version | 現在のバージョン番号を表示します。 |
| -h | --help | ヘルプメッセージを表示して終了します。 |† ディレクトリ入力、Burp XMLファイル、ZAPファイル、Caido CSVファイル、HARファイルには関連しません
## config.yml
`config.yml` ファイル(通常は `~/.config/xnLinkFinder/` にあります)には、必要に応じて更新できるキーがあります:
- `linkExclude` - すべてのリンクがチェックされるカンマ区切りの文字列リスト(例: `.css,.jpg,.jpeg` など)。リンクにこれらの文字列のいずれかが含まれている場合、出力から除外されます。入力がディレクトリの場合は、ファイル名がこのリストに対してチェックされます。
- `contentExclude` - すべてのレスポンスの `Content-Type` ヘッダーがチェックされるカンマ区切りの文字列リスト(例: `text/css,image/jpeg,image/jpg` など)。これらのコンテンツタイプを持つレスポンスはすべて除外され、リンクはチェックされません。
- `fileExtExclude` - ディレクトリモードで全てのファイルがチェックされるカンマ区切りの文字列リスト(例: `.zip,.gz,.tar` など)。対象の拡張子を持つファイルはリンク検索の対象外となります。また、通常モードでは、レスポンスに除外チェック用のコンテンツタイプがない場合、URLの末尾でこれらの拡張子をチェックし、リンクを検索するかどうかを判断します。
- `regexFiles` - パイプ文字で区切られたファイルタイプのリスト(例: `php|php3|php5` など)。これらは、明らかなリンクではないが抽出したい興味深いファイルタイプが発見された場合に、リンク発見用の正規表現で使用されます。このリストに追加する場合は、正しい正規表現のためにドットをエスケープしてください(例: `js\.map`)。
- `respParamLinksFound` † - レスポンスで見つかったリンクから潜在的なパラメータを取得するかどうか: `True` または `False`
- `respParamPathWords` † - 取得したリンク内のパスワードを潜在的なパラメータとして追加するかどうか: `True` または `False`
- `respParamJSON` † - レスポンスのMIMEタイプにJSONが含まれる場合、JSONキー値を潜在的なパラメータとして追加するかどうか: `True` または `False`
- `respParamJSVars` † - `var`、`let`、`const`で設定されたJavaScript変数を潜在的なパラメータとして追加するかどうか: `True` または `False`
- `respParamXML` † - レスポンスのMIMEタイプにXMLが含まれる場合、XML属性値を潜在的なパラメータとして追加するかどうか: `True` または `False`
- `respParamInputField` † - レスポンスのMIMEタイプにHTMLまたはJAVASCRIPTが含まれる場合(HTMLはHTML内で構築される可能性があるため)、任意のINPUT(またはTEXTAREA/SELECT/BUTTON)フィールドのNAMEおよびID属性を潜在的なパラメータとして追加するかどうか: `True` または `False`
- `respParamMetaName` † - レスポンスのMIMEタイプにHTMLが含まれる場合、任意のMETAタグのNAME属性を潜在的なパラメータとして追加するかどうか: `True` または `False`
- `wordsContentTypes` - レスポンスのコンテンツタイプのうち、対象固有の単語リストに含める単語を検索するものを指定するカンマ区切りの文字列リスト(例: `text/html,text/plain`)。
- `stopWords` - 対象固有の単語リストから除外する単語を指定するカンマ区切りの文字列リスト(例: `then,this,that`)。このデフォルトリストは、英語の限定詞、等位接続詞、前置詞に加え、Python機械学習ライブラリScikit-Learnのストップワードリストで構成されています。
- `commonTLDs` - 最も一般的なTLDのカンマ区切りリスト。`-all`/`--all-tlds` 引数が渡されない限り、このリスト内のTLDを持つドメインのリンクのみが返されます。
† 設定ファイルに見つからない場合は、デフォルトで `True` になります。
## Examples
### 特定のターゲットからリンクを見つける - 基本```
xnLinkFinder -i target.com -sf target.com
```
### Find Links from a specific target - Detailed
理想的には、スコーププレフィックス(`-sp`)をプライマリドメイン(スキーマを含む)とともに指定し、スコープフィルター(`-sf`)を使用して結果を関連ドメインのみにフィルタリングします(これはファイルまたはスコープ内のドメインにできます)。また、Cookieやカスタムヘッダーを渡して、認可されたユーザーのみが利用可能なリンクのみを見つけることができます。User Agentの指定(`-u desktop mobile`)は、最初にデスクトップUser Agentを使用してすべてのリンクを検索し、次にモバイルUser Agentを使用して再度試行します。指定されたUser Agentに関連する特定のエンドポイントが存在する可能性があります。深度値(`-d`)を指定すると、前の深度検索で見つかったリンクにリクエストを送信し続けて、さらに多くのリンクを見つけます。```
xnLinkFinder -i target.com -sp target_prefix.txt -sf target_scope.txt -spo -inc -vv -H 'Authorization: Bearer XXXXXXXXXXXXXX' -c 'SessionId=MYSESSIONID' -u desktop mobile -d 10
```
### URLリストからリンクを検索 - 基本
例えば、JSファイルのURLが書かれたファイルがある場合、それらのリンクを検索できます:```
xnLinkFinder -i target_js.txt -sf target.com
```
注記: 渡されたファイルは、最初の行が `//` または `http` で始まる場合、またはドメインの形式(例: `example.com`, `sub.example.co.uk`)である場合、URLリストとみなされます。それ以外の場合は、内容を検索するファイルとみなされます(ただし、Burp, Zap, Caido, HAR ファイルでない限り)。
### ファイルの内容からリンクを検索 - 基本
例えば、保存されたレスポンスがある場合、その中からリンクを探すことができます:```
xnLinkFinder -i response.txt -sf target.com
```
注意:渡されたファイルは、先頭行が `//` または `http` で始まるか、ドメインの形式(例:`example.com`、`sub.example.co.uk`)である場合、URLのリストと見なされます。それ以外の場合は(Burp、Zap、Caido、またはHARファイルでない限り)コンテンツを検索するファイルと見なされます。
### ディレクトリ内のファイルからリンクを検索 - 基本
ファイル(例:JSファイル、HTTPレスポンスなど)がある場合、それらの中のリンクを探すことができます:```
xnLinkFinder -i ~/.config/waymore/results/target.com
```
注意:サブディレクトリもチェックされます。`-mfs` オプションを指定すると、特定のサイズ以上のファイルをスキップできます。
### Burpプロジェクトからのリンク検索 - 基本
Burpで、例えばスコープをハイライトして対象項目を選択し、右クリックして`Save selected items`を選択します。保存する前に、`base64-encode requests and responses`オプションがチェックされていることを確認してください。
ファイルからすべてのリンクを取得するには(巨大なファイルでも、すべてのリンクを取得できます):```
xnLinkFinder -i target_burp.xml
```
注記: xnLinkFinderは、`-i`で指定されたファイルの最初の行が`<?xml`で始まる場合、Burpファイルを処理しようとしていると想定します。
### Burpプロジェクトからのリンクの検索 - 詳細
理想的には、プライマリドメイン(スキーマを含む)を指定したスコーププレフィックス(`-sp`)と、結果を関連ドメインのみにフィルタリングするスコープフィルター(`-sf`)を指定します。```
xnLinkFinder -i target_burp.xml -o target_burp.txt -sp https://www.target.com -sf target.* -ow -spo -inc -vv
```
### ZAPプロジェクトからリンクを抽出する - 基本
ZAPで、検索したい項目を(例えばHistoryをハイライトして)選択し、メニュー `Export` をクリックして `Save Messages...`(古いバージョンでは `Export Messages to File...`)を選択します。これにより、検索したいすべてのリクエストとレスポンスを含むASCIIテキストファイルを保存できます。
ファイルからすべてのリンクを取得するには(巨大なファイルでもすべてのリンクを取得できます):```
xnLinkFinder -i target_zap.txt
```
**注:** `xnLinkFinder` は、`-i` で渡されたファイルの最初の行が `==== 99 ==========` や `===99 ==========` のような形式である場合、ZAP ASCII テキストファイルを処理しようとしていると想定します。
### CaidoのエクスポートCSVファイルからリンクを検索する - 基本
Caidoで、**History** セクションに移動し、**Export** オプションを選択します。
Caido Pro または Enterprise エディションを使用している場合は、**Export current rows** オプションを選択し、**As CSV** を選択します。**Exports** セクションに移動し、CSVファイルをダウンロードします。その後、それを入力として渡します:```
xnLinkFinder -i 2023-03-18-010332_csv_requests.csv
```
Caido Community エディションを使用している場合は、**Export all** オプションを選択し、**As CSV** を選ぶ必要があります。**Exports** セクションに移動し、CSV ファイルをダウンロードしてください。完全な履歴があるため、CSV ファイルから関連のないものをすべて削除したいでしょう。以下の例のように、`redbull` が調査対象のドメインの主要部分である場合を参考にしてください。```
cat 2023-03-18-010332_csv_requests.csv | grep -E '^id|^[0-9]+,[^,]*redbull' > caido_redbull.csv
xnLinkFinder -i caido_redbull.csv
```
注記:`-i`で渡されたファイルの最初の行が`id,host,method`の形式である場合、xnLinkFinderはCaidoエクスポートCSVファイルを処理しようとしているとみなします。
### HAR(HTTP Archive)JSONファイルからリンクを検索する - 基本
HARファイルは、HTTPリクエストとレスポンスのリストを含むJSONファイルです。HTTPトラフィックを保存する一般的な形式です。ほとんどのWebブラウザ(通常はデベロッパーツールのNetworkタブ)からHARファイルをエクスポートできます。ファイルを入力として渡します:```
xnLinkFinder -i browser.har
```
注意: xnLinkFinder は、ファイル名が `.har` で終わるか、ファイルの最初の行に `"log"` が含まれかつ `{` で始まる場合、HAR ファイルを処理しようとしていると仮定します。
### Waymore の結果ディレクトリからリンクを検索する
[waymore](https://github.com/xnl-h4ck3r/waymore) ツールは、さまざまなサードパーティ API から URL を取得したり、さまざまなソースからアーカイブされたレスポンスをダウンロードするために使用できます。`xnLinKFinder` に waymore の結果ディレクトリを渡すと、アーカイブされたレスポンスの内容を検索し、`waymore.txt` からの URL リクエストに加え、`waymore_index.txt`(または古いバージョンの waymore では `index.txt`)からのアーカイブ URL もリクエストし、それらのレスポンスからさらにリンクを取得します。`-d`/`--depth` が 0 の場合、`waymore_index.txt` の URL は返されるだけでリクエストはされません。```
xnLinkFinder -i ~/Tools/waymore/results/target.com
```
注記:通常のディレクトリとして渡されますが、xnLinkFinder はそれが waymore の結果ディレクトリであると判断し、それぞれ処理します。これは、URL ファイルのデフォルトの命名規則が `waymore.txt` であり、そのファイルがアーカイブファイルと同じディレクトリにあることに依存しています(デフォルトではそうなっています)。
### 他のツールへのパイプ
You can pipe xnLinkFinder to other tools. Any errors are sent to `stderr` and any links found are sent to `stdout`. The output file is still created in addition to the links being piped to the next program. However, potential parameters are not piped to the next program, but they are still written to file. 例:```
xnLinkFinder -i redbull.com -sp https://redbull.com -sf rebbull.* -d 3 | unfurl keys | sort -u
```
また、`-i` の代わりに `stdin` から入力を渡すこともできます。```
cat redbull_subs.txt | xnLinkFinder -sp https://redbull.com -sf rebbull.* -d 3
```
注:Burp、ZAP、Caido、またはHARファイルをパイプで渡すことはできません。これらは`-i`を使用して渡す必要があります。
## 推奨事項と注意点
- 常にScope Prefix引数`-sp`を使用してください。これは1つのスコープドメイン、または複数のスコープドメインを含むファイルにすることができます。
以下は使用される形式の例です(パスは含めず、ワイルドカードも使用しません。スキーマはオプションですが、デフォルトはhttpになります): ```
http://www.target.com
https://target-payments.com
https://static.target-cdn.com
```
リンクにドメインがない場合(例:`/path/to/example.js`)、`-sp http://www.target.com` を指定すると、出力は `http://www.target.com/path/to/example.js` となり、深さ(`-d`)が1より大きい場合は、そのURLにリクエストを送信してさらにリンクを検索できるようになります。`-sp` でドメインのファイルを渡した場合、出力には各ドメインの後に `/path/to/example.js` が含まれ、より多くのリンクが見つかる可能性が高まります。
- `-sp` を使用するが、出力に `/path/to/example.js` の元のリンク(ドメインなし)も追加で返してほしい場合は、引数 `-spo` を渡してください。
- 常にスコープフィルター引数 `-sf` を使用してください。これにより、関連するドメインのみが出力に返され、さらに重要なことに、深さ(`-d`)が1より大きい場合、スコープ外のターゲットはリンクやパラメータの検索対象になりません。これは1つのスコープドメインでも、複数のスコープドメインを含むファイルでもかまいません。以下に使用する形式の例を示します(スキーマやパスは含めないでください): ```
target.*
target-payments.com
static.target-cdn.com
```
これはリンクドメインのフィルタリング用です。
- 最終出力を何らかの方法でフィルタリングしたい場合は、`-ra`を使用します。正規表現が期待通りに動作するかどうかは、https://regex101.com/ で確認することを常にお勧めします。
- `-v`オプションを使用すると、ツールが何をしているのかをよりよく把握できます。
- 問題がある場合は、`-vv`オプションを使用すると、発生している可能性のあるエラーが表示される場合があり、それが解決できるか、またはGitHubで問題として報告できます。
- Cookie(`-c`)、ヘッダー(`-H`)、正規表現(`-ra`)の値はシングルクォートで囲んで渡します(例:`-ra '/api/v[0-9]\.[0-9]\*'`)。
- `-o`オプションを設定すると、Linksのデフォルトの出力ファイル名`output.txt`ではなく、特定の出力ファイル名を指定できます。大規模な検索深度を実行する予定がある場合は、まず深度2で`-v`オプションを指定して、何が返されるかを確認してください。その後、深度を増やすことができ、新しい出力は既存のファイルに追加されます(`-ow`を渡さない限り)。
- `-op`オプションを設定すると、Potential Parametersのデフォルトの出力ファイル名`parameters.txt`ではなく、特定の出力ファイル名を指定できます。出力は既存のファイルに追加されます(`-ow`を渡さない限り)。
- 高いDepth(`-d`)を使用する場合は、一部のサイトが動的リンクを使用していることに注意してください。その場合、新しいリンクが見つかり続ける可能性があります。新しいリンクが見つからなくなると、xnlLinkFinderは検索を停止します。停止フラグ(`s429`、`s403`、`sTO`、`sCE`)を指定することも検討する必要があります。
- 多数のリンク(特にDepth(`-d`値)が高い場合)が見つかっており、リソースが限られている場合、プログラムはメモリしきい値(`-m`)に達すると停止し、強制終了される前にデータをそのまま保持して正常に終了します。
- 実行中にxnLinkFinderをキャンセル(`Ctrl-C`を使用)することにした場合、辛抱強く待ってください。収集されたデータは、正常に終了する前に保存されます。
- `-orig`オプションを使用すると、リンクが見つかったURLが表示されます。これにより、同じリンクが複数のソースで見つかった場合、出力に重複リンクが含まれる可能性がありますが、角括弧内に元のURLが接尾辞として付加されます。
- リクエストを行う際、xnLinkFinderは現在のグループからランダムなUser-Agentを使用します。デフォルトは`desktop`です(`-uc`/`--user-agent-custom`引数が使用されていない場合)。ターゲットによっては、異なるUser-Agentグループで異なるリンクが存在する可能性がある場合は、例えば`-u desktop mobile`のように(スペースで区切って)指定します。`mobile`ユーザーエージェントオプションは、`mobile-apple`、`mobile-android`、`mobile-windows`の組み合わせです。可能な値は、`desktop`、`mobile`、`set-top-boxes`、`game-console`です。
- `-i`がディレクトリに設定されている場合、そのディレクトリのルートにあるファイルの内容からリンクが検索されます。サブディレクトリ内のファイルは検索されません。`-mfs`(デフォルト:500 MB)で設定されたサイズを超えるファイルはスキップされます。
- `-replay-proxy`オプションを使用すると、リクエストに時間がかかることがあります。`Request Timeout`エラーが増え始めた場合(`-v`または`-vv`オプションを使用するとエラーが表示されます)、`-t`を使用してタイムアウト制限を引き上げることを検討してください。
- ターゲットがリンクとパラメータにASCII文字のみを使用することがわかっている場合は、`-ascii-only`を渡すことを検討してください。これにより、バイナリデータから返される可能性のある誤検出を排除できます。
- [waymore](https://github.com/xnl-h4ck3r/waymore)の結果ディレクトリを渡す場合は、`-d`/`--depth`引数を渡してURLリクエストから見つかった追加のリンクを検索し、また、異なるコンテンツが見つかる可能性がある場合は`-u`/`--user-agent`も渡す価値があります(例:`-u desktop mobile`)。
- 常に`-owl`/`--output-wordlist`ファイル名を渡して、ターゲット固有のワードリストを保存してください。このリストは、ターゲットをファジングする際に非常に役立ちます。
- ターゲット固有のワードリストの単語は、以下のソースから取得されます(3文字以上のものすべて)。ただし、他のワードリスト引数(上記の使用方法のセクションを参照)によっても決定されます。
- 特定の条件を満たすすべてのレスポンス:
- YML設定の`wordsContentTypes`セクションで指定されたコンテンツタイプのレスポンスのみが検索されます。デフォルトは`text/html`、`application/xml`、`application/json`、`text/plain`です。
- `<meta>`タグのコンテンツからの単語。以下の場合:
- `Property`が`og:title`または`og:description`の場合
- `Name`が`description`、`keywords`、`twitter:title`、`twitter:description`の場合
- HTMLコメントからの単語
- ``タグの`alt`属性からの単語
- ページの残りの内部HTMLからの単語(`<style>`、`<script>`、`<link>`タグを除く)
- 見つかったリンクのパス単語からの単語
- レスポンスとリンクから見つかったパラメータ
- 有効なすべての単語について、可能であれば単数形/複数形もワードリストに追加されます。
- 元の単語に大文字が含まれている場合、小文字バージョンも追加されます。
- ターゲット固有のワードリストのデフォルトの「ストップワード」が適切でない場合は、YML設定ファイルで変更するか、`-swf`/`--stopwords-file`オプションを使用して追加のストップワードを提供してください。ターゲットに応じて、別の言語のストップワードを含めたい場合があります。ストップワードは自然言語処理(NLP)で使用され、さまざまなニーズに合わせたストップワードリストがオンラインで多数見つかります。
## 問題
何か問題が発生した場合、または改善のアイデアがある場合は、GitHubでIssueを起票してください。問題がある場合は、実行した正確なコマンドと問題の詳細な説明を提供していただけると役立ちます。可能であれば、`-vv`を指定して問題を再現し、表示されるエラーメッセージをお知らせください。
## TODO
- プロキシファイルが入力として渡された場合のリクエストに対する特定の正規表現チェックを追加する。現在は、リクエストと同じ正規表現を使用しているが、これは理想的ではない。
- 潜在的なパラメータのリストに追加するCookie名を取得する。
## 出力例
ドメインのアクティブリンク検索:
<center><img src="https://raw.githubusercontent.com/xnl-h4ck3r/xnLinkFinder/main/xnLinkFinder/images/example1a.png"></center>
...
<center><img src="https://raw.githubusercontent.com/xnl-h4ck3r/xnLinkFinder/main/xnLinkFinder/images/example1b.png"></center>
パイプされた入力と出力:
<center><img src="https://raw.githubusercontent.com/xnl-h4ck3r/xnLinkFinder/main/xnLinkFinder/images/example2.png"></center>
幸運を祈ります!良いハンティングを!
このツール(または他のツール)を本当に気に入っていただけた場合、または素晴らしいバウンティを得るのに役立った場合は、[コーヒーをご馳走になることをご検討ください!](https://ko-fi.com/xnlh4ck3r) ☕(カフェインが必要です!)
🤘 /XNL-h4ck3r
<a href='https://ko-fi.com/B0B3CZKR5' target='_blank'><img height='36' style='border:0px;height:36px;' src="https://storage.ko-fi.com/cdn/kofi2.png?v=3" border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>