
シングルスレッドのコマンドラインアプリケーションを、CIDR と glob 対応の高速なマルチスレッドアプリケーションに簡単に変換できます。
単一スレッドのコマンドラインアプリケーションを、CIDRやグロブ対応の高速なマルチスレッドアプリケーションに簡単に変換します。
Interlace: コードを一切書かずにペネトレーションテストやバグバウンティのワークフローを自動化・マルチスレッド化するツール
以下のコマンドでインストール:
$ python3 setup.py install
依存関係がインストールされ、Interlace が interlace として PATH に追加されます。
| 例 | 表記の種類 |
|---|---|
| 80 | 単一ポート |
| 1-80 | ダッシュ表記、1から80までの各ポートに対してコマンド実行 |
| 80,443 | ポート80とポート443の両方に対してコマンド実行 |
-t と -tL はどちらも同じように処理されます。nmap を使用するときと同じようにターゲットを渡すことができます。CIDR表記、ダッシュ表記、またはカンマ区切りのターゲットリストが使用可能です。1つのターゲットリストファイル内で、行ごとに異なる表記タイプを使用することもできます。
あるいは、STDIN 経由でターゲットを渡すこともでき、その場合は -t や -tL は不要です。
実行時に以下の変数がコマンド内で置き換えられます:
Interlace はコマンドファイル内の実行フローを制御するための2つの追加機能も提供します: _blocker_ と _block:<name>_。ブロッカーは、その前にリストされたすべてのコマンドが完了するまで、その後にリストされたコマンドの実行を防ぎます。ブロックは、ブロック内にリストされたコマンドをターゲットに対して順次実行するために使用できます。
これらはターゲットごとに実行されます。利用可能なスレッドがあり、現在のターゲットに対してブロッカーが邪魔をしている場合、Interlace は効率を最大化するためにターゲットリスト内の次のターゲットからコマンドを開始します。
これらの機能を使用することで、個々のターゲットに対する実行フローをより直接的に制御し、コマンドが順番通りに実行されない事態を防ぐことができます。
ブロッカーは、その上のすべてのコマンドが完了するまで、その下の何も実行しないようにします(現在アクティブなホストに対して)。例えば、以下の場合:
mkdir -p _output_/_target_/scans/
_blocker_
nmap _target_ -oA _output_/_target_/scans/_target_-nmap
ここでブロッカーを使用することで、ベースフォルダ構造が作成される前に nmap がターゲット上で実行されるのを防ぎ、nmap が例外をスローするのを防ぎます。
ブロックはその内部のすべてを順次実行させます。コマンドファイルごとに複数のブロックを使用することもできます。例えば、以下の場合:
_block:nmap_
mkdir -p _target_/output/scans/
nmap _target_ -oN _target_/output/scans/_target_-nmap
_block:nmap_
nikto --host _target_
この例では、ブロックは以前と同じように実行されますが、スレッド数が十分に高い場合、nikto は即座に実行を開始し、結果を端末に返します(その間、nmap とファイル作成はバックグラウンドで行われます)。
targets.txt というファイルに以下の内容があると仮定します:
bugcrowd.com
hackerone.com
Interlace を使用して、このファイル内の任意の数のターゲットに対して以下のように実行できます: bash
➜ /tmp interlace -tL ./targets.txt -threads 5 -c "nikto --host _target_ > ./_target_-nikto.txt" -v
=========================================================================
Interlace v1.0 by Michael Skelton (@codingo_) & Sajeeb Lohani (@sml555_)
=========================================================================
[14:33:23] [THREAD] [nikto --host hackerone.com > ./hackerone.com-nikto.txt] Added to Queue
[14:33:23] [THREAD] [nikto --host bugcrowd.com > ./bugcrowd.com-nikto.txt] Added to Queue
これにより、各ホストに対して Nikto が実行され、各ターゲット用のファイルに保存されます。上記の例では > 演算子を使用しているため、結果は端末にフィードバックされません。しかし、これは意図された機能であり、そうしないと Nikto の結果がどのターゲットのものかを特定できなくなります。
フィードバックが必要なアプリケーションの場合は、コマンドを通常通りに渡すか(tee を使用)してください。
上記の例を使用して、同じターゲットに対してポート 80 と 443 の両方で個別のスキャンを実行したいとします。その場合は以下のようにします:
➜ /tmp interlace -tL ./targets.txt -threads 5 -c "nikto --host _target_:_port_ > ./_target_-_port_-nikto.txt" -p 80,443 -v
=========================================================================
Interlace v1.0 by Michael Skelton (@codingo_) & Sajeeb Lohani (@sml555_)
=========================================================================
[14:33:23] [THREAD] [nikto --host hackerone.com:80 > ./hackerone.com-nikto.txt] Added to Queue
[14:33:23] [THREAD] [nikto --host bugcrowd.com:80 > ./hackerone.com-nikto.txt] Added to Queue
[14:33:23] [THREAD] [nikto --host bugcrowd.com:443 > ./bugcrowd.com-nikto.txt] Added to Queue
[14:33:23] [THREAD] [nikto --host hackerone.com:443 > ./hackerone.com-nikto.txt] Added to Queue
ペネトレーションテストでは、ほとんどのジョブで実行したいコマンドのリストがあることがよくあります。そのリストに testssl.sh, nikto, sslscan が含まれていると仮定し、commands.txt というファイルに以下の内容を保存します:
nikto --host _target_:_port_ > _output_/_target_-nikto.txt
sslscan _target_:_port_ > _output_/_target_-sslscan.txt
testssl.sh _target_:_port_ > _output_/_target_-testssl.txt
その後、ターゲット example.com が与えられた場合、以下のように各コマンドをこのターゲットに対して実行できます:
interlace -t example.com -o ~/Engagements/example/ -cL ./commands.txt -p 80,443
これにより、nikto, sslscan, testssl.sh が example.com のポート80と443の両方に対して実行され、ファイルがエンゲージメントフォルダに保存されます。
Interlace はスレッド起動時に自動的にCIDR表記を展開します(--no-cidr フラグが渡されていない場合)。これにより、さまざまなアプリケーションにCIDR表記を渡すことができます:
192.168.12.0/24 内のすべてのターゲットに対して、直接コマンドを使用してバーチャルホストスキャンを実行するには:
interlace -t 192.168.12.0/24 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50
VHostScan にはCIDR表記の組み込みサポートがないにもかかわらず、これは動作します。Interlace がスレッドのキューを構築する前に表記を展開するため、VHostScan は実質的にスキャンする直接IPアドレスのリストのみを受け取ります。
Interlace はスレッド起動時に自動的にグロブ範囲を展開します。これにより、さまざまなアプリケーションにグロブ範囲を渡すことができます:
192.168.12.* 内のすべてのターゲットに対して、直接コマンドを使用してバーチャルホストスキャンを実行するには:
interlace -t 192.168.12.* -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50
繰り返しますが、VHostScan にはグロブ範囲形式の組み込みサポートはありません。
Interlace はスレッド起動時に自動的にダッシュ範囲を展開します。これにより、さまざまなアプリケーションにグロブ範囲を渡すことができます:
192.168.12.1-15 内のすべてのターゲットに対して、直接コマンドを使用してバーチャルホストスキャンを実行するには:
interlace -t 192.168.12.1-15 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50
繰り返しますが、VHostScan にはダッシュ範囲形式の組み込みサポートはありません。
ファイル (target-list.txt) 内の各ホストに対してバーチャルホストスキャンを実行し、同時に最大50スレッドに制限します。
直接コマンドを使用して実行:
interlace -tL ./target-list.txt -c "vhostscan -t _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50
または、コマンドファイルを使用して同じコマンドを実行:
interlace -cL ./vhosts-commands.txt -tL ./target-list.txt -threads 50 -o ~/scans
これは、コマンドファイルの内容が以下の場合を前提としています:
vhostscan -t $target -oN _output_/_target_-vhosts.txt
これにより、指定された出力フォルダに各ターゲットのファイルが出力されます。コマンドファイルにコマンドを追加するだけで、複数のコマンドを実行することもできます。
Interlace は、-e または -eL 引数で指定されたホストを自動的に除外します。これらの引数は、上記の範囲表記(CIDR、グロブ、ダッシュ)とも互換性があります。
CIDR範囲 192.168.12.0/24 内のすべてのターゲットに対して、ただし範囲 192.168.12.0/26 のターゲットは除いて、バーチャルホストスキャンを実行するには、直接コマンドを使用:
interlace -t 192.168.12.0/24 -e 192.168.12.0/26 -c "vhostscan _target_ -oN _output_/_target_-vhosts.txt" -o ~/scans/ -threads 50
上記の例を使用して、同じターゲットに対して異なるプロキシを経由して個別のスキャンを実行したいとします。その場合は以下のようにします:
➜ /tmp interlace -tL ./targets.txt -pL ./proxies.txt -threads 5 -c "nikto --host _target_:_port_ -useproxy _proxy_ > ./_target_-_port_-nikto.txt" -p 80,443 -v
元々は Michael Skelton (codingo) と Sajeeb Lohani (sml555) によって作成され、スレッドリファクタリングと全体的なアプローチについて Charelle Collett (@Charcol0x89)、テストとアプローチについて Luke Stephens (hakluke) の助けを得ました。
このプロジェクトへの貢献を歓迎します。オープンソース初心者で、何らかの助けが必要な場合は、Twitter (@codingo_) / (@sml555_) までお気軽にお問い合わせください。可能な限りサポートいたします。
| 引数 | 説明 |
|---|
| (stdin) | 他のアプリケーションからターゲットリストをカンマ区切り形式、CIDR表記、または個別ホストとしてパイプで渡す |
| -t | ターゲットまたはドメイン名をカンマ区切り形式、CIDR表記、または個別ホストとして指定 |
| -tL | ターゲットまたはドメイン名のリストを指定 |
| -e | 除外するターゲットのリストをカンマ区切り形式、CIDR表記、または個別ホストとして指定 |
| -eL | 除外するターゲットのリストを指定 |
| -threads | 同時に実行する最大スレッド数を指定 (デフォルト:5) |
| -timeout | 各スレッドのタイムアウト値(秒)を指定 (デフォルト:600) |
| -c | 各ターゲットまたはドメインに対して実行する単一のコマンドを指定 |
| -cL | 各ターゲットまたはドメインに対して実行するコマンドのリストを指定 |
| -o | コマンド内で _output_ として使用できる出力フォルダ変数を指定 |
| -p | コマンド内で _port_ として使用できるポート変数のリストを指定。単一ポート、カンマ区切りリスト、ダッシュ表記の範囲が使用可能 |
| -pL | プロキシのリストを指定 |
| --proto | コマンド内で _proto_ として使用できるプロトコルを指定 |
| -rp | コマンド内で _realport_ として使用できる実際のポート変数を指定 |
| -random | コマンド内で _random_ としてランダムに使用されるファイルのディレクトリを指定 |
| --no-bar / --sober | 設定するとプログレスバーが表示されなくなります |
| --no-cidr | 設定するとターゲットファイル内のCIDR表記が自動的に個別ホストに展開されなくなります |
| --no-color | 設定すると前景色や背景色がすべて除去されます |
| --silent | 設定すると重要な情報のみが表示され、バナーなどの情報は伏せられます |
| -v | 設定すると端末に詳細な出力が表示されます |
| 変数 | 置き換え内容 |
|---|
| _target_ | 現在のスレッドが実行中の、展開されたターゲットリストで置き換えられる |
| _cleantarget_ | http:// または https:// が除去されたターゲットに置き換えられる |
| _safe-target_ | コマンドから自動的に引用符で囲まれ、サブコマンドの実行を防ぐターゲットに置き換えられる |
| _host_ | _target_ と同じ動作をし、互換的に使用可能 |
| _output_ | Interlace の出力フォルダ変数で置き換えられる |
| _port_ | Interlace の展開済みポート変数で置き換えられる |
| _realport_ | Interlace の実際のポート変数で置き換えられる |
| _proxy_ | Interlace のプロキシリストで置き換えられる |
| _random_ | Interlace からランダムに選択されたファイルで置き換えられる |