Para la enumeración de servicios y puertos se utiliza nmap, con una parametrización enfocada en: extraer información y versionado de estos mediante los parámetros "-sCV", a todos los puertos TCP existentes (65535) con "-p-", con un mínimo de paquetería enviada por segundo de 4500 paquetes y guardando el output en un archivo grepeable.
┌──(root㉿maritrini)-[/home/kali]
└─# nmap -sCV -p- -n --min-rate=4500 192.168.1.69 -oG nmap
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-03 11:47 EST
Nmap scan report for 192.168.1.69
Host is up (0.00040s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 f0e624fb9eb07a1abdf7b185237fb16f (RSA)
| 256 99c87431451058b0cecc63b47a82573d (ECDSA)
|_ 256 60da3e3138fab549ab48c3432c9fd132 (ED25519)
80/tcp open http Apache httpd 2.4.56 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.56 (Debian)
1880/tcp open http Node.js Express framework
|_http-title: Node-RED
|_http-cors: GET POST PUT DELETE
MAC Address: 08:00:27:A9:0C:72 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
┌──(root㉿maritrini)-[/home/kali]
└─# wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u 192.168.1.69/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.69/FUZZ
Total requests: 220546
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000045226: 200 368 L 933 W 10701 Ch "http://192.168.1.69/"
000095510: 403 9 L 28 W 277 Ch "server-status"
000190041: 404 9 L 31 W 274 Ch "126575"
Total time: 361.7233
Processed Requests: 191736
Filtered Requests: 191734
Requests/sec.: 530.0625
┌──(root㉿maritrini)-[/home/kali]
└─# wfuzz -c --hc=404 -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -z list,html-php-css-js -u 192.168.1.69/FUZZ.FUZ2Z
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.69/FUZZ.FUZ2Z
Total requests: 18860
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000094: 403 9 L 28 W 277 Ch ".htaccess - php"
000000090: 403 9 L 28 W 277 Ch ".hta - php"
000000097: 403 9 L 28 W 277 Ch ".htpasswd - html"
000000096: 403 9 L 28 W 277 Ch ".htaccess - js"
000000093: 403 9 L 28 W 277 Ch ".htaccess - html"
000000095: 403 9 L 28 W 277 Ch ".htaccess - css"
000000092: 403 9 L 28 W 277 Ch ".hta - js"
000000098: 403 9 L 28 W 277 Ch ".htpasswd - php"
000000089: 403 9 L 28 W 277 Ch ".hta - html"
000000100: 403 9 L 28 W 277 Ch ".htpasswd - js"
000000091: 403 9 L 28 W 277 Ch ".hta - css"
000000099: 403 9 L 28 W 277 Ch ".htpasswd - css"
000008765: 200 368 L 933 W 10701 Ch "index - html"
Total time: 31.29138
Processed Requests: 18860
Filtered Requests: 18847
Requests/sec.: 602.7218
El archivo index.html da como respuesta 200 a la petición por protocolo HTTP, con "curl" se comprueba las cabeceras y respuestas, desde el navegador también se puede visualizar el contenido, resultando en el propio archivo de configuración por defecto del gestor web Apache.
No se encuentra ninguna vulnerabilidad por versión para el servicio SSH, por lo que directamente se continúa por la tecnología y servicio de "Node.js Express Framework" en el puerto 1880.
1880/tcp open http Node.js Express framework
|_http-title: Node-RED
|_http-cors: GET POST PUT DELETE
Enumeración e intrusión a través de Node-Red
Como siempre, a cada tecnología que se descubre, se investiga sobre la misma en internet, principalmente para ser pragmático y resolutivo dado que, si se comprueba la documentación se podrá comprender mejor por dónde se debe encaminar la enumeración.
Generalmente en estos WriteUps es añadida una tabla con información importante sobre la tecnología a tocar (esta opción me parece interesante para mis lectores ya que, quizás algún recurso no lo habéis ojeado pero os interesa guardarlo en vuestra wiki).
Aunque los CVE como tal son de versiones anteriores al Node-Red que está desplegado en este servidor, se encuentran dos técnicas de explotación que sí pueden ejecutarse en esta versión, estas son LFI y RCE.
Se prueba el LFI (aunque lo marca para versiones 2.x intento de igual forma la técnica) a través de curl con la intención de leer el fichero /etc/passwd alojado en el servidor, pero no se consigue ningún resultado dado que la respuesta HTTP es de 404 ("Not found") y no existe ningún otro directorio dependiente de este framework que tenga permisos para realizar la técnica LFI. (Esta técnica está explicada en el enlace correspondiente de la tabla anterior, en la pestaña de LFI).
Se realizan varios intentos sin resultado como se muestra a continuación:
Según la lectura de la documentación, se pueden generar estructuras de funciones atribuidas a la comunicación de hardware, servicios e interacciones con API's a través del flujo del propio editor web de Node-Red, como se puede ver en la siguiente captura.
Después de leer la documentación sobre vulnerabilidades (disponible al principio de esta sección) y de realizar alguna prueba, encuentro la conexión de 3 funciones que ofrecen una escalada al sistema a través del usuario "dev".
Existen un par de formas de conectar una Reverse Shell, como por ejemplo por protocolo UPD o TCP, en este caso las pruebas realizadas por UDP no dieron resultado (porque no se puede o porque yo soy muy manco y no lo he hecho bien) así que se aprovecha del protocolo TCP para generar en primer lugar un "TCP IN" que mande una petición de conexión a mi IP, en esta petición de conexión comunico un nodo "EXEC" para ejecutar un "Netcat" y enviar una Shell de Bash a mi IP, como último paso creo otro nodo "TCP OUT" que genera una conexión TCP por el puerto 6969 hacía mi IP de nuevo (sí, has entendido bien, se necesitan dos puertos en escucha, uno para entablar la petición TCP y otro para recibir la Shell de Bash).
Y el resultado de esta configuración sería la siguiente:
Como se ha comentado anteriormente, se necesita ejecutar dos Netcat a la escucha, uno en el puerto 3333 para entablar la conexión TCP y otro con el puerto 6969 para recibir la shell de bash por TCP también.
En la parte superior derecha del panel web de Red-Node está ubicado el botón de "Deploy" que permite ejecutar las conexiones creadas con los nodos, se despliega la configuración anterior y recibo una shell remota con el usuario "dev".
Para obtener esta Shell se debe aceptar con un "ENTER" en la conexión de Netcat por puerto 3333, lo que genera directamente la conexión con la máquina remota a través del otro puerto 6969 como se aprecia en la siguiente captura.
Netcat puerto 3333:
┌──(kali🐼maritrini)-[~]
└─$ nc -lvnp 3333
listening on [any] 3333 ...
connect to [192.168.1.62] from (UNKNOWN) [192.168.1.69] 38122
id
Netcat puerto 6969:
┌──(kali🐼maritrini)-[~]
└─$ nc -lvnp 6969
listening on [any] 6969 ...
connect to [192.168.1.62] from (UNKNOWN) [192.168.1.69] 51396
id
uid=1000(dev) gid=1000(dev) grupos=1000(dev)
Enumeración y escalada en sistema Linux
Enumerando con sudo y buscando por permisos especiales se descubre que se puede ejecutar el binario node como usuario root sin contraseña por lo que buscando este binario en la página GTFOBins. Se obtiene el abuso de este binario para ejecutar una Shell de bash bajo usuario privilegiado.
sudo -l
Matching Defaults entries for dev on node:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User dev may run the following commands on node:
(root) NOPASSWD: /usr/bin/node
find / -perm -4000 2>/dev/null
/usr/bin/mount
/usr/bin/su
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/chsh
/usr/bin/umount
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/newgrp
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
Finalmente puede accederse como usuario root y, oficialmente, esta máquina está deliciosamente hackeada.
Este es el primer WriteUp de esta wiki pero poco a poco encontrarás más contenido sobre VulNyx. Si quieres estar al día de las publicaciones puedes seguirme en Twitter o través de nuestro servidor de Discord. Saludos y delicioso hack para tod@s.
Como primer paso inicial, y común en los CTF con estructura virtualizada en local, (véase este para más información) se ejecuta la orden de sistema "arp-scan" con el objetivo de identificar la IP relacionada con la máquina víctima.
Es una buena práctica comprobar las tecnologías e información dependiente del servicio web con la herramienta WhatWeb para la shell. Existen otras alternativas para el navegador como
El servicio de Apache en puerto 80, alberga el index correspondiente a la configuración del gestor web. Se realiza una búsqueda de archivos (con extensiones) y directorios obteniendo el archivo "index.html" y sin resultados por parte de los directorios. (Para comprender el uso de wfuzz léase este).
En este punto, evidentemente después de comprobar con el resultado de nmap que el servidor tiene un servicio de "Node" con , lo más seguro es que tenga disponible algún tipo de gestión que me permita algún tipo de maniobra abusando de este concepto. Pero antes, no está de más comprobar si la aplicación en red de SSH tiene vulnerabilidades, se puede apoyarse en la herramienta "searchsploit" para enumerarlas.
Enlace a la documentación oficial de Node-Red:
Reportes OpenCVE:
Reportes de CVE Details:
Reportes de Synk Security:
Repositorio con ejemplo de ejecución de LFi:
CVE Mitre:
Explicación de RCE a través del panel web de Node-Red: