Decripción del entorno
Atacante
| OS | Kali Linux |
| IP | 10.10.15.131 |
Maquina Objetivo
| OS | Windows |
| IP | 10.10.10.175 |
| Dificultad | 4.9/10 / Easy |
| URL | Sauna |
Enumeración
Se realiza la enumeración habitual para el reconocimiento e identificación de los puertos abiertos en el sistema:
1
$ nmap -sS -sV -sC -oA nmap_sauna 10.10.10.175
Resultado escaneo con nmap
Procedemos con la revisión detallada del sitio web pero no se encuentran enlaces o funcionalidades interactivas para atacar, solo son archivos CSS y HTML estático:
Sitio Web puerto 80
Por lo cual, nos vamos a enfocar estrictamente en los puertos y servicios adicionales, los cuales son propios de un controlador de dominio:
- Puerto 53: Corre un servicio de DNS
- Puerto 88: Corre el servicio de kerberos
- Puerto 3268: Corre un servicio LDAP
Todos estos servicios nos permiten identificar el servidor como un controlador de dominio, por lo que se recolecta la mayor cantidad de información del Active Directory mediante todos los servicios desplegados:
1
$ enum4linux 10.10.10.175
La herramienta enum4linux hace uso a modo de envoltorio de diferentes herramientas como SAMBA, SMBClient y RPCclient para poder recolectar la mayor cantidad de información, tal como:
- Identificación del sistema operativo
- SID y nombre del dominio
- Usuarios de maquina
- Carpetas o archivos compartidos
- Identificación de grupos
- Impresoras asociadas
Mediante la ejecución de esta herramienta, se identifica el nombre del Dominio EGOTISTICALBANK:
Enumeracion nombre de Dominio
Como no tenemos más información y los demás puertos no parecen ser concluyentes en cuanto a algún servicio vulnerable y otro vector de ataque, se intenta la enumeración de usuarios por diccionario. Para poder lograr esto, realizamos esta enumeración mediante el servicio de kerberos (puerto 88).
- Nota:
En este punto realmente es poco claro el camino a la explotación, ya que por lo general uno espera encontrar un servicio vulnerable o una especie de aplicativo web, sin embargo, también es muy importante plantearse la idea principal y es que estamos trabajando contra un Active Directory, por tanto, se deben considerar sus servicios más importantes (SMB, DNS, LDAP y Kerberos).
Para la enumeración de usuarios frente a un controlador de dominio tenemos diferentes opciones entre las que se encuentran hacer procesos de autenticación contra SMB o LDAP, y probando muchos usuarios, sin embargo, este tipo de enumeraciones puede resultar en un ataque demasiado ruidoso y que posibilita el bloqueo de los usuarios probados o de nuestra IP, sin mencionar que es bastante lento. No obstante, también es posible realizar una enumeración mediante el servicio de kerberos, utilizando una técnica llamada “Kerberos Pre-Authentication”.
Kerberos Pre-Authentication
Esta técnica tiene una gran ventaja respecto a las demás de enumeración de usuarios o ataques de fuerza bruta, ya que solo hace falta tener visibilidad con el AD y el nombre del dominio. Adicional, los errores en la pre-authentication de kerberos no son marcados como errores de Logon Failure (4625) sino como un evento especifico de Kerberos Pre-Authentication Failure (4771), esto nos permite evitar los filtros habituales de alertas o monitoreo, haciendo el ataque más sigiloso.
Enumeracion por kerberos
Para realizar este ataque utilizamos la herramienta kerbrute, la cual nos permite diferentes tipos de ataque sobre el servicio de kerberos en un AD:
- Enumeración de usuarios
- Fuerza Bruta
- Fuerza bruta a un usuario
- Password Spray
1
$ ./kerbrute userenum –dc sauna.htb -d AGOTISTICALBANK [FILE_usernames]
Enumeracion con la herramienta kerbrute
Utilizamos la opción de enumeración de usuarios y obtenemos como resultado la identificación de 3 usuarios del sistema:
- Administrator
- Fsmith
Hsmith
- Nota:
Considerando el patrón que existe con la variación de [CHAR]Smith, creamos un script para intentar identificar más usuarios. Esta prueba NO nos arroja resultados, pero había que intentarlo ;).
En este punto, al tener solo los usuarios y estar centrados en el servicio de kerberos, probamos una técnica llamada ASREPRoast Kerberos la cual nos permite capturar el hash de la contraseña de aquellos usuarios que tengan deshabilitada la opción de pre-authentication kerberos, con lo cual, el servidor de kerberos acepta la petición KRB_AS_REQ sin verificar que el usuario que las envía este previamente autenticado: (ver referencias si se quiere profundizar)
Esquema del KRB_AS_REQ
De esto, como solo depende del parámetro username y el SPN Krbtgt es el mismo siempre, podemos obtener una respuesta KRB_AS_REP que se encuentra firmada o cifrada con el hash NTLM de la contraseña del usuario que utilizamos:
Esquema del KRB_AS_REP
Como se puede observar, aunque lo importante de la respuesta es el Ticket (TGT) que nos permitiría el acceso a más tickets de servicio, este viene cifrado con el hash del krbtgt por lo cual NO podemos ver su contenido ni intentar password cracking, sin embargo, otros datos como el session_key y el TGT_expiration_Time están cifrados con el hash de la contraseña del usuario que ingresamos, por lo tanto, el proceso de captura del hash del usuario esta dado de la siguiente manera:
- Se envia un intento KRB_AS_REQ con un usuario enumerado previamente.
- Se recibe un KRB_AS_REP:
- Se toma la parte cifrada con el hash del usuario
- Session_key
- TGT_expiration_time
- Se intenta realizar password cracking
- Se prueba una posible contraseña.
- Se convierte a NTLM.
- El hash NTLM lo probamos como posible contraseña de los parametros anteriores.
- Si obtenemos la información en claro, ya hemos descubierto la contraseña original ;)
- Si no obtenemos la información, intentamos la siguiente contraseña :c
- Se toma la parte cifrada con el hash del usuario
De esta manera, podemos realizar un proceso offline de cracking de password para los usuarios que sean vulnerables a ASREPRoast Kerberos. (para más información del funcionamiento de kerberos, leer: https://www.tarlogic.com/blog/como-funciona-kerberos/)
GetNPUsers - ASREPRoast Kerberos
1
$ GetNPUsers.py AGOTISTICALBANK/ -usersfile usernames.txt -format hashcat -dc-ip 10.10.10.175 -outputfile hashes.asreproast
Al pasarle los usuarios identificados, vemos que el usuario fsmith es vulnerable a este tipo de ataques, por lo cual, podemos capturar su hash:
GetNPUsers para realizar el ataque ASREPRoast
Posterior a capturar su hash, utilizamos la herramienta hashcat para realizar un proceso de password cracking basado en un ataque por diccionario utilizando el rockyou.txt:
1
$ hashcat -m 18200 -a 0 hash.asreproast rocktou.txt
Logrando obtener así la contraseña original del usuario fsmith:
- Fsmith: Thestrokes23
Nota: En este punto de la explotación duramos atascados un tiempo al no poder descubrir una forma de interactuar con el servidor e incluir las nuevas credenciales obtenidas, se prueban múltiples servicios sin resultado, así que se decide re escanear todos los puertos de la maquina en busca de más información.
1
$ nmap -sS -p- 10.10.10.175
Nuevo escaneo completo sobre el equipo
En este nuevo escaneo profundo y completo, descubrimos el puerto 5985 que no teníamos presente al inicio, este puerto es utilizado para el manejo remoto de los equipos Microsoft a través del protocolo WINRM (Servicio de Administrador remoto), así que podemos aprovecharlo como una puerta de entrada para la ejecución remota e interactiva de comandos, para esto, descargamos la herramienta llamada evil-winrm hecha por hackplayers https://github.com/Hackplayers/evil-winrm.
evil-winrm
1
ruby evil-winrm.rb -i 10.10.10.175 -u fsmith -p Thestrokes23
Conexion utilizando la herramienta Evil-Winrm
En este punto, ya tenemos acceso interactivo con la maquina y podemos capturar la flag de bajos privilegios user.txt.
Elevación de Privilegios
Una vez tenemos el acceso interactivo mediante evil-winrm procedemos a realizar la escala de privilegios, por lo cual hacemos una carga de los siguientes scripts de powershell al sistema víctima, esto se logra con la opción -s e indicando la ruta local donde estarán los scripts:
- PowerView.ps1
- Script especial para la prueba e interacción con sistemas de directorio activo.
- PowerUp.ps1
- Compilación de scripts y técnicas para la recolección local de información y la explotación automática en escala de privilegios.
Lo primero que se hace es utilizar el script Invoke-AllChecks de PowerUp, que de forma automática lanzará todos los escáneres en busca de malas configuraciones que nos permitan elevar privilegios:
Mala configuración, captura de contraseña en el registro usando Autologon
El script identifica una mala configuración en la propiedad de Autologon que se guarda en el registro del equipo y partiendo de eso, logra la captura y lectura en texto claro de la credencial del usuario svc_loanmanager:
- svc_loanmanager: Moneymakestheworldgoround!
En este punto de la explotación ya tenemos acceso a 3 de los 4 usuarios en el sistema, por lo cual vamos a intentar conectarnos con estas nuevas credenciales, sin embargo, es importante recordar que por la información previa recolectada del dominio, el nombre de usuario para conectarnos es svc_loanmgr y lo realizamos también con Evil-WinRM.
1
ruby evil-winrm.rb -i 10.10.10.175 -u svc_loanmgr -p Moneymakestheworldgoround! -s /home/csl/shared/
Teniendo estas credenciales hacemos uso de secretsdump.py de Impacket para extraer los hashes de todos los usuarios del dominio, de forma remota:
1
python3 /usr/share/doc/python3-impacket/examples/secretsdump.py EGOTISTICALBANK/svc_loanmgr:Moneymakestheworldgoround\!@10.10.10.175
Uso de la herramienta SecretDump para extraer hashes del AD
Pass The Hash
Teniendo los hashes de los usuarios, tomamos el del administrator y se hace un Pass The Hash, por lo cual, usando el wmiexec.py de Impacket y pasamos los parámetros y el hash del administrador, esto nos permite ejecutar comandos e impersonar a dicho usuario:
1
python3 /usr/share/doc/python3-impacket/examples/wmiexec.py EGOTISTICAL-BANK.LOCAL/administrator@10.10.10.175 -hashes aad3b435b51404eeaad3b435b51404ee:d9485863c1e9e05851aa40cbb4ab9df
Impersonación del usuario Administrator con Pass The Hash
De esta forma, se logra la elevación de privilegios por medio de diferetes configuraciones inseguras en el Controlador de Dominio.
Referencias
- Funcionamiento de Kerberos y algunos de sus ataques:
- https://www.tarlogic.com/blog/como-funciona-kerberos/
- https://gist.github.com/TarlogicSecurity/2f221924fef8c14a1d8e29f3cb5c5c4a
- Leer el blog, tiene muy buenas publicaciones.
- Recopilación de distintas herramientas y ataques para Directorio Activo:
- WriteUP de una maquina en la que se ataca un directorio activo:
- Lectura interesante sobre el abuso de privilegios y acls en directorios activos: