
低速かつ長期にわたるパスワードスプレー攻撃ツール。長期間にわたって間隔を開けて攻撃するように設計されています。
やあ、俺はスプレー・チャールズみたいな気分だ - Chiddy Bang
低くゆっくりとしたパスワードスプレー攻撃ツール。長期間にわたって間隔を置いてスプレーするように設計されています。
以下のスプレー用プラグインを含みます: Office365, OWA, EWS, Okta, ADFS, Cisco SSL VPN, Citrix Netscaler, Sonciwall, NTLM over HTTP, SMB。
関連ブログ記事: NTLM over HTTP、Exchange Web Services、Spraycharlesについての記事 by @sprocket_ed
Spraycharlesは比較的シンプルなパスワードスプレー攻撃ツールで、ペネトレーションテスト中にパスワードスプレーを手動以外のプロセスとして実行できる公開ツールがほとんどなかった時代に設計されました。Spraycharlesの最も優れた機能は、-a/--attemptsと-i/--intervalを使用して長時間実行のスプレーを設定し、数日間にわたって実行しながら定期的に確認できることです。一度きりのサービスやユニークなスプレー対象がある場合でも、新しいモジュールをテンプレート化してスプレーを開始するのは非常に簡単です。
Spraycharlesは当初、最新の認証/クラウドプロバイダーを念頭に置いて設計されたわけではありません。より高度な機能をお探しの場合は、CredMasterやTeamFiltrationなどのツールをご確認ください。Spraycharlesは_高速_であることを目的として設計されていません。シングルスレッドであり、ボリューム/時間のアプローチを重視しています。
Spraycharlesはpip3 install spraycharlesで、またはこのリポジトリをクローンしてpip3 install .を実行することでインストールできます。
[!TIP] これにより、
spraycharlesおよび短縮形のscエイリアスがパスに登録されます。ログおよび出力ファイルは~/.spraycharlesに保存されます。別の出力場所はCLIフラグで指定できます。
以下のコマンドを実行してSpraycharles Dockerコンテナをビルドします:
git clone https://github.com/Tw1sm/spraycharles
cd spraycharles/extras
docker build . -t spraycharles
以下のコマンドを実行してSpraycharles Dockerコンテナを使用します:
docker run -it -v ~/.spraycharles:/root/.spraycharles spraycharles -h
ユーザー名とパスワードリストが保存されている場所に応じて、追加のボリュームを指定する必要がある場合があります。
NixまたはNixOSユーザー向けにパッケージが用意されています。最新リリースはunstableチャンネルにしか存在しない場合があることに注意してください。
nix-env -iA nixos.spraycharles
sprayサブコマンド:
Usage: spraycharles spray [OPTIONS] COMMAND [ARGS]...
Low and slow password spraying
╭─ Options ─────────────────────────────────────────────────────────────────────────────╮
│ --debug Enable debug logging (overrides --quiet) │
│ --config TEXT Configuration file. │
│ --help -h Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ User/Pass Config ────────────────────────────────────────────────────────────────────╮
│ * --usernames -u TEXT Filepath of the usernames list [default: None] │
│ [required] │
│ * --passwords -p TEXT Single password to spray or filepath of the passwords │
│ list │
│ [default: None] │
│ [required] │
│ --equal -e Does 1 spray for each user where password = username │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Spray Target ────────────────────────────────────────────────────────────────────────╮
│ --host -H TEXT Host to password spray (ip or │
│ hostname). Can by anything when │
│ using Office365 module - only │
│ used for logfile name │
│ [default: None] │
│ * --module -m [ADFS|CiscoSSLVPN|Citrix|NTLM Module corresponding to target │
│ |Office365|Okta|OWA|SMB|Sonic host │
│ wall] [default: None] │
│ [required] │
│ --path TEXT NTLM authentication endpoint │
│ (i.e., rpc or ews) │
│ [default: None] │
│ --port -P INTEGER Port to connect to on the │
│ specified host │
│ [default: 443] │
│ --fireprox -f TEXT URL of desired fireprox │
│ interface │
│ [default: None] │
│ --domain -d TEXT HTTP - Prepend DOMAIN\ to │
│ usernames; SMB - Supply domain │
│ for smb connection │
│ [default: None] │
│ --no-ssl Use HTTP instead of HTTPS │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Output ──────────────────────────────────────────────────────────────────────────────╮
│ --output -o TEXT Name and path of result output file [default: None] │
│ --quiet Will not log each login attempt to the console │
│ --analyze Run the results analyzer after each spray interval (Early │
│ false positives are more likely) │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Spray Behavior ──────────────────────────────────────────────────────────────────────╮
│ --attempts -a INTEGER Number of logins submissions per interval (for each │
│ user) │
│ [default: None] │
│ --interval -i INTEGER Minutes inbetween login intervals [default: None] │
│ --timeout -t INTEGER Web request timeout threshold [default: 5] │
│ --jitter INTEGER Jitter time between requests in seconds │
│ [default: None] │
│ --jitter-min INTEGER Minimum time between requests in seconds │
│ [default: None] │
│ --pause Pause the spray between intervals if a new potentially │
│ successful login was found │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Notifications ───────────────────────────────────────────────────────────────────────╮
│ --notify -n [Slack|Teams|Discord] Enable notifications for Slack, Teams or │
│ Discord │
│ [default: None] │
│ --webhook -w TEXT Webhook used for specified notification │
│ module │
│ [default: None] │
╰───────────────────────────────────────────────────────────────────────────────────────╯
頻繁に使用されるCLIフラグの量が多いため、--configフラグを使用してYAMLファイルからコマンドラインパラメータを設定する方法もあります。さらに、Spraycharlesを使用するたびに、CLIオプションが現在のディレクトリのYAMLファイル(last-config.yaml)に書き込まれ、簡単に変更や再利用ができます。
Spraycharlesは、潜在的に成功したログイン試行後にDiscord、Slack、Microsoft Teamsに通知を発行する機能があります。この通知プロバイダのリストは、utils/notify.pyスクリプトを使用して拡張できます。通知エージェントごとに、その名前とwebhook URLを指定する必要があります。
設定ファイルを使用してこれらを指定し、コマンドを短く保つことができます:
notify: Slack
webhook: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
いずれかのプロバイダに送信される通知には、スプレージョブに関連付けられた対象ホスト名が含まれます。これは、複数のターゲットを同時にスプレーする場合に特に便利です。
スプレー実行中に、提供されたユーザー名ファイルとパスワードファイルを変更できます。リストへの追加または削除は、次のパスワードローテーションで有効になります。
[!NOTE] リストに新しいパスワードを挿入する場合、スプレーされるためには現在スプレー中のパスワード_より後_に配置する必要があります(Spraycharlesは内部ループカウンタを保持しており、更新されたリスト内の対応する位置から次のパスワードを取得するためのインデックスとして使用します)。
Spraycharlesには、スプレー作業を支援する追加のユーティリティが含まれています。Spraycharlesモジュールの完全なリスト:
Usage: spraycharles [OPTIONS] COMMAND [ARGS]...
╭─ Options ─────────────────────────────────────────────────────────────────────────────╮
│ --help -h Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────────────────────────────────────────╮
│ analyze Analyze Spraycharles output files for potential spray hits │
│ gen Generate custom password lists from JSON file │
│ modules List spraying modules │
│ parse Parse NTLM over HTTP and SMB endpoints to collect domain information │
│ spray Low and slow password spraying │
╰───────────────────────────────────────────────────────────────────────────────────────╯
Spraycharlesの "gen" サブコマンドは、extras/list_elements.jsonで提供される仕様に基づいてパスワードリストを生成します。
spraycharles gen extras/list_elements.json custom_passwords.txt
Spraycharlesの parse サブコマンドは、以下のようなコマンドを使用して、NTLM over HTTPおよびSMBサービスの両方から内部ドメインを抽出します。
spraycharles parse https://example.com/ews
spraycharles parse smb://host.domain.local
analyzeサブモジュールは、出力JSONオブジェクトを読み取り、統計的に有意な応答長を特定できます。十分なデータがあれば、結果ファイルから成功したログインを抽出できるはずです。これが成功ログインを判断する唯一の方法ではなく、ターゲットサイトによって異なります。何も見逃していないことを確認するために、自分でデータを確認することをお勧めします。SMBの場合、成功を示すNTSTATUSコードを持つエントリを単純に見つけます。
spraycharles analyze myresults.json
このツールはペネトレーションテスト中に使用するために設計されています。事前の相互同意なしにターゲットを攻撃するためにこのツールを使用することは違法です。エンドユーザーは、該当するすべての地域、州、連邦法を遵守する責任があります。開発者は一切の責任を負わず、このプログラムの誤用について責任を負いません。
Spraycharlesは依存関係管理にPoetryを使用しています。ソースからインストールし、以下のコマンドで開発環境をセットアップします:
pip3 install poetry
git clone https://github.com/Tw1sm/spraycharles
cd spraycharles
poetry install
utilsフォルダに含まれているntlm_challenger.pyスクリプトの提供