
Acerca de Compiled
Compiled es una máquina Windows de dificultad media que cuenta con una instancia de Gitea y una aplicación web que clona URLs de repositorios Git en el backend. La versión Git del servidor es vulnerable a CVE-2024-32002, que puede explotarse para obtener acceso inicial con una shell Git Bash como Richard. Descifrando el hash de la contraseña recuperada del archivo de base de datos Gitea, se puede obtener la contraseña del usuario Emily. La escalada de privilegios a Administrador se consigue explotando CVE-2024-20656, una vulnerabilidad en la versión de Visual Studio Code instalada en el servidor.
Matriz de la máquina.
*Características de explotación de la máquina.

*Sin actualizaciones.
Comienzo enumerando los puertos, servicios y versiones.
rustscan -a 10.10.11.25 -- -sCV -oN scan.txt

rustscan -a 10.10.11.26 -- -sCV -Pn -oN scan.txt

En el puerto 3000 corre un servidor web basado en Go Golang. Este servidor solo admite los métodos HTTP HEAD y GET. Además, incluye una cabecera Set-Cookie con una cookie marcada como Path=/ HttpOnly y SameSite=Lax, no tendra via con los subdominios y protege contra ataques de XSS y CSRF. También contiene un enlace a un archivo manifest.json codificado en Base64.
Decodifico el base64 y logramos ver en texto plano start_url al servidor web accesible en el puerto 3000, muestra un subdominio y el nombre dominio correspondiente.

Adjunto la dirección IP al nombre de dominio y el subdominio para facilitar un manejo más eficiente en la web. Esto nos permite acceder a recursos que podrían no estar disponibles al utilizar solo la dirección IP.
echo "10.10.11.25 compiled.htb gitea.compiled.htb" | sudo tee -a /etc/hosts

1) Indica que el servidor está utilizando Werkzeug, una biblioteca de Python (flask) para crear aplicaciones web. La versión es 3.0.3 y está utilizando Python 3.12.3.
2) Los metodos que podriamos utilizar por medio de curl, burpsuite y automatizar por medio de bash y python.
3) Compiled – Code Compiling Services, este es el título de la página web, lo que sugiere que el servicio podría estar relacionado con la compilación de código.
4) El puerto predeterminado para WinRM esta abierto e Indica que el servidor está utilizando Microsoft HTTPAPI, una API para servicios de red en Windows. La versión es 2.0 y está relacionado con SSDP (Simple Service Discovery Protocol) busca dispositivos (UPnP) y conectarlos a otro dispositivo dentro de una red privada o pública, UPnP (Universal Plug and Play) crean canales de comunicación más directos. Esto nos da un indicio que podriamos utilizar evil-winrm.
5) El servidor está activo pero no se encontró el recurso.

La única diferencia es una ligera variación en los tiempos de carga de 0ms a 1ms, aun así no le encuentro tanta diferencia relevantes entre el subdominio y el dominio, en el puerto 5000 no tiene ninguna diferencia.

Encuentro dos repositorios del usuario Richard.

Verifico las versiones.

Muestra la versión que utiliza GIT.

El puerto 5000 espera recibir una URL de un repositorio Git. Si la URL es válida, se guarda en el archivo C:\Users\Richard\source\repos\repos.txt en modo de anexado ‘a‘. Probablemente sea el punto de entrada.

Teniendo en cuenta que windows no distingue entre mayusculas y minusculas este podria ser la via de explotacion.

Este “CVE-2024-32002 RCE via git clone”, por el momento corresponde con la version y el escenario.
https://amalmurali.me/posts/git-rce/
Me registro, creo 2 repositorios “hook” y “project”.



Esta es la revshell que se ejecutará como parte del flujo del (RCE).

Descargué el repositorio vacío de Gitea y creé los directorios correspondientes, incluyendo uno para los hooks. Luego, elaboré una revshell llamado post-checkout en la carpeta de hooks y cambié los permisos para que fuera ejecutable. A continuación, lo añadí al índice de Git y realicé un commit con el mensaje “hook”. Después, envié los cambios al repositorio.Luego, cloné un segundo repositorio y añadí el directorio de hooks como un submódulo dentro de project en la ruta A/modules/x. Finalmente, realicé un commit para registrar la adición del submódulo y envié los cambios al repositorio.


creo un archivo dotgit.txt que contiene la cadena “.git”, tambien un objeto de Git a partir de este, guardando su hash en dot-git.hash. Luego, genero el índice para un enlace simbólico con el código 120000 y se actualiza el índice de Git para incluirlo. Finalmente, realizo un commit para guardar los cambios en el repositorio.

Utilizo el repositorio project para explotarlo en el puerto 5000.

Dado que Git incluye un entorno de Bash, la revshell en bash es válida en este contexto, teniendo encuenta que es windows

Realizo todos los pazos anteriores agregando en post-checkout la revshell en bash al repositorio.

Obtengo shell en bash

Obtengo shell en cmd

Obtengo acceso a una consola de PowerShell del usuario Richard.

Me descargo el archivo gitea.db a local.

Por medio de la descarga Obtengo un hash de NetNTLMv2.


El archivo es una base de datos de SQLite.

Accedí a la base de datos y obtuve los hashes de las contraseñas guardadas.

También logro obtener los hashes usando strings junto con grep para filtrar y analizar los datos.

Administrator Hash:1bf0a9561cf076c5fc0d76e140788a91b5281609c384791839fd6e9996d3bbf5c91b8eee6bd5081e42085ed0be779c2ef86d
emily Hash:97907280dc24fe517c43475bd218bfad56c25d4d11037d8b6da440efd4d691adfead40330b2aa6aaf1f33621d0d73228fc16
richard Hash:4b4b53766fe946e7e291b106fcd6f4962934116ec9ac78a99b3bf6b06cf8568aaedd267ec02b39aeb244d83fb8b89c243b5e
Logro identificar el tipo de cifrado que utiliza GITEA.

PBKDF2 Hashing Algorithm
https://nishothan-17.medium.com/pbkdf2-hashing-algorithm-841d5cc9178d
new add request for mode 10900 PBKDF2-HMAC-SHA256 #1583
https://github.com/hashcat/hashcat/issues/1583

Codifico la sal y el hash en formato Base64.

También se puede automatizar con python para codificar la sal y el hash a base64 y crackear la contraseña.

Obtengo la contraseña.

Pruebo las credenciales proporcionadas en la base de datos, por medio del puerto 5985 de WinRM. Utilizando la herramienta evil-winrm.

Gano user flag.

Leo privilegios del usuario actual e información básica del sistema.

Usuarios del sistema.

Encuentro habilitado el history.

Verifico el ConsoleHost_history.txt encontré una posible escalada de privilegio a administrator.

Las aplicaciones instaladas suelen tener entradas en el registro de Windows que pueden ser manipuladas.

Tengo permisos de lectura y ejecución.

Verifico la versión del Visual Studio en el sistema.

Encuentro este CVE-2024-20656 que corresponde a la versión de Visual Studio.
Durante esta entrada de blog exploraremos el servicio VSStandardCollectorService150 que Visual Studio utiliza con fines de diagnóstico y se ejecuta en el contexto NT AUTHORITY\SYSTEM, y cómo se puede abusar de él para realizar un restablecimiento arbitrario de DACL de archivos con el fin de escalar privilegios.
https://github.com/Wh04m1001/CVE-2024-20656
Por medio de Visual Studio Community, modifico la ruta en donde se encuentra VSDiagnostics.exe que usa el servicio VSStandardCollectorService150.

Aclaro en donde se va a encontrar mi revshell shell.exe con el cual obtendre privilegio de administrator.

La función cb1 comienza imprimiendo un mensaje que indica la activación de un “Oplock!”. Luego, entra en un bucle en el que intenta mover un archivo asociado con el maneja hFile2 hasta que la operación sea exitosa, momento en el cual imprime un mensaje de éxito. Posteriormente, copia un archivo llamado shell.exe desde la ubicación C:\windows\tasks\ a C:\ProgramData\Microsoft\VisualStudio\SetupWMI\ con el nuevo nombre MofCompiler.exe. Finalmente, marca la operación como completada al establecer la variable finished en TRUE.

Defino la configuración de compilación disponible en Release x64, ya que puedo compilar la aplicación de manera optimizada para sistemas de 64 bits y lo compilo



Obtengo el exploit compilado Expl.exe.

Genero una revshell evitando caracteres nulos.

No es la primera vez que tengo este tipo de problemas con evil-winrm ya que es muy inestable, asique voy a utilizar runas para obtener una shell lo más estable posible.

Estabilizo la shell, ya que me genera un intérprete y establece una conexión por TCP.

Acomodo mi revshell en C:\Windows\Tasks.

Descargo el exploit.

Al ejecutar el exploit, logré pasar el mensaje Oplock! y efectivamente, reemplacé mi shell.exe por MofCompiler.exe consiguiendo shell con permisos de NT AUTHORITY\SYSTEM.

Gano flag root.

You must be logged in to post a comment.