
Langsames und leises Password Spraying-Tool, das in Intervallen über einen langen Zeitraum sprayt.
Hey, yo, ich fühle mich wie Spraycharles – Chiddy Bang
Langsames und stetiges Passwort-Spraying-Tool, das darauf ausgelegt ist, über ein langes Zeitintervall in regelmäßigen Abständen zu sprayen.
Enthält Spraying-Plugins für Office365, OWA, EWS, Okta, ADFS, Cisco SSL VPN, Citrix Netscaler, Sonicwall, NTLM über HTTP und SMB.
Zugehöriger Blogbeitrag von @sprocket_ed über NTLM über HTTP, Exchange Web Services und Spraycharles.
Spraycharles ist ein relativ einfacher Password-Sprayer, der zu einer Zeit entwickelt wurde, als es noch nicht viele öffentlich verfügbare Tools gab, die Password-Spraying während eines Penetrationstests als nicht-manuellen Prozess ermöglichten. Das vielleicht beste Feature von Spraycharles ist die Möglichkeit, mit -a/--attempts und -i/--interval einen länger laufenden Spray einzurichten, der über mehrere Tage hinweg läuft, während du ihn regelmäßig überprüfst. Falls du einen einmaligen Dienst oder etwas Einzigartiges zum Sprayen hast, ist es auch sehr einfach, ein neues Modul zu erstellen und mit dem Sprayen zu beginnen.
Spraycharles wurde nicht primär für moderne Authentifizierungs-/Cloud-Anbieter entwickelt. Wenn du fortgeschrittenere Funktionen suchst, solltest du dir Tools wie CredMaster oder TeamFiltration ansehen. Spraycharles wurde nicht dafür entwickelt, schnell zu sein – es ist single-threaded und eher auf einen Volumen/Zeit-Ansatz ausgerichtet.
Spraycharles kann mit pip3 install spraycharles installiert werden oder indem du dieses Repository klonst und pip3 install . ausführst.
[!TIP] Dadurch werden die Aliase
spraycharlesundsc(kurz) in deinem Pfad registriert. Log- und Ausgabedateien werden in~/.spraycharlesgespeichert. Ein alternativer Ausgabeort kann über ein CLI-Flag angegeben werden.
Führe die folgenden Befehle aus, um den Spraycharles-Docker-Container zu erstellen:
git clone https://github.com/Tw1sm/spraycharles
cd spraycharles/extras
docker build . -t spraycharles
Führe den folgenden Befehl aus, um den Spraycharles-Docker-Container zu verwenden:
docker run -it -v ~/.spraycharles:/root/.spraycharles spraycharles -h
Möglicherweise musst du zusätzliche Volumes angeben, je nachdem, wo die Benutzernamen- und Passwortlisten gespeichert sind.
Für Nix- oder NixOS-Benutzer ist ein Paket verfügbar. Beachte, dass die neuesten Versionen möglicherweise nur im unstable-Kanal vorhanden sind.
nix-env -iA nixos.spraycharles
Der spray-Unterbefehl:
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] │
╰───────────────────────────────────────────────────────────────────────────────────────╯
Aufgrund der vielen häufig verwendeten CLI-Flags besteht eine Alternative darin, die Befehlszeilenparameter aus einer YAML-Datei mit dem --config-Flag zu laden. Außerdem werden jedes Mal, wenn du Spraycharles verwendest, deine CLI-Optionen in einer YAML-Datei (last-config.yaml) im aktuellen Verzeichnis gespeichert, die du leicht ändern und wiederverwenden kannst.
Spraycharles kann nach einem potenziell erfolgreichen Anmeldeversuch Benachrichtigungen an Discord, Slack und Microsoft Teams senden. Diese Liste der Benachrichtigungsdienste kann mit dem Skript utils/notify.py erweitert werden. Für jeden potenziellen Benachrichtigungsdienst musst du dessen Namen und eine Webhook-URL angeben.
Du kannst diese Einstellungen über die Konfigurationsdatei vornehmen, um deinen Befehl kürzer zu halten:
notify: Slack
webhook: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
An einen der Dienste gesendete Benachrichtigungen enthalten den Zielhostnamen, der mit dem Spraying-Job verknüpft ist. Dies ist besonders nützlich, wenn du mehrere Ziele gleichzeitig besprühst.
Du hast die Möglichkeit, während des laufenden Sprays Änderungen an den angegebenen Benutzernamen- und Passwortdateien vorzunehmen. Hinzufügungen oder Entfernungen in den Listen werden bei der nächsten Passwortrotation wirksam.
[!NOTE] Wenn du ein neues Passwort in die Liste einfügst, muss es nach dem aktuell gesprühten Passwort stehen, damit es besprüht wird (Spraycharles führt einen internen Schleifenzähler, der als Index verwendet wird, um das nächste Passwort an der entsprechenden Stelle in der aktualisierten Liste abzurufen).
Spraycharles wird mit einigen zusätzlichen Hilfsprogrammen ausgeliefert, die bei Spraying-Bemühungen helfen. Vollständige Liste der Spraycharles-Module:
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 │
╰───────────────────────────────────────────────────────────────────────────────────────╯
Der Spraycharles-Unterbefehl "gen" erstellt eine Passwortliste basierend auf den Spezifikationen in extras/list_elements.json.
spraycharles gen extras/list_elements.json custom_passwords.txt
Der Spraycharles-Unterbefehl "parse" extrahiert die interne Domäne sowohl aus NTLM-über-HTTP- als auch aus SMB-Diensten mit einem Befehl ähnlich dem unten aufgeführten.
spraycharles parse https://example.com/ews
spraycharles parse smb://host.domain.local
Das Untermodul analyze kann deine JSON-Ausgabeobjekte lesen und Antwortlängen bestimmen, die statistisch relevant sind. Mit genügend Daten sollte es in der Lage sein, erfolgreiche Anmeldungen aus deiner Ergebnisdatei herauszufiltern. Dies ist nicht die einzige Möglichkeit, erfolgreiche Anmeldungen zu ermitteln – es hängt von deiner Zielseite ab – und ich würde dennoch empfehlen, die Daten selbst zu überprüfen, um sicherzustellen, dass nichts übersehen wird. Bei SMB werden lediglich Einträge mit NTSTATUS-Codes gefunden, die auf Erfolg hinweisen.
spraycharles analyze myresults.json
Dieses Tool wurde für den Einsatz während Penetrationstests entwickelt; die Nutzung dieses Tools zum Angriff auf Ziele ohne vorherige gegenseitige Zustimmung ist illegal. Es liegt in der Verantwortung des Endbenutzers, alle geltenden lokalen, staatlichen und bundesstaatlichen Gesetze einzuhalten. Die Entwickler übernehmen keine Haftung und sind nicht verantwortlich für jeglichen Missbrauch dieses Programms.
Spraycharles verwendet Poetry zur Verwaltung von Abhängigkeiten. Installiere aus dem Quellcode und richte die Entwicklung ein mit:
pip3 install poetry
git clone https://github.com/Tw1sm/spraycharles
cd spraycharles
poetry install
ntlm_challenger.py, das im Ordner utils enthalten ist