Controler
Last updated
Last updated
Muy buenas y bienvenidos a la resolución de la máquina Controler de VulNyx, esta una máquina hecha por d4t4s3c, el creador de la plataforma. Es muy buena máquina para el que quiera aprender Active Directory y tener una buena metodología.
A continuación veremos las técnicas que nos encontraremos, vamos a poner todas las que hay:
SMB Enumeration
Active Directory Enumeration
Kerberos Enumeration
AS-REP Roasting
DCSync Attack
Pass-The-Hash
Empecemos con el reconocimiento activo, primero tenemos que encontrar que máquina es la Controler en nuestra red.
Para ello utilizaremos fping
que es mi herramienta preferida para hacer esto, pero se pueden utilizar otras como arp-scan
o nmap
.
El resultado es:
En este caso salen la 1, 45 y 47, mi máquina es la 45 y la Controler es la 47, en vuestro caso será otra.
Ahora utilizaremos nmap
para hacer un primer reconocimiento de puertos para descubrir los activos, junto con los servicios corriendo en cada uno e información.
Os saldrá una lista larga de puertos, mi recomendación para tener una buena metodología es coger cada uno de los puertos junto su servicio y ponerlo de la siguiente manera para cuando tengamos que priorizar por donde empezar.
Por los puertos que hay nos estamos enfrentando a un Windows Server con Active Directory corriendo.
Para encontrarlo hay varias maneras, pero hay 2 exactamente que son las que suelo hacer yo:
NetBios (139) y DNS (53) suelen mostrar el nombre de dominio, o en el puerto 3389 (RDP).
Ejecutando netexec contra el servicio smb, que este incluso nos dará la versión del servidor.
Lo que suelo hacer para descubrir el dominio y asegurarme cuál es, es utilizando el comando básico de netexec
y no crackmapexec (ya que está deprecated, mejor utilizar el netexec).
De esta manera, hasta ahora sabemos que tenemos un Windows Server 2019 con el nombre de dominio control.nyx.
Ponemos en el /etc/hosts
el control.nyx referenciando a la IP 192.168.1.47
.
Me pasa que cuando me enfrento a un Active Directory me estreso al haber tanto puerto abierto, así que lo que hago es realizar una enumeración estructurada en 2 partes:
Sin credenciales
Con credenciales.
Actualmente no tenemos ningún usuario ni contraseña con el que podamos validarnos al dominio, así que vamos a ejecutar varios comandos de pura metodología para reconocer cual puede ser el camino para ser domain admin:
Shares (null session)
RPC (null session)
LDAP (null session)
Y si ninguno de los comandos sin credenciales nos da algo de información, lo siguiente sería encontrar usuarios con Kerbrute
aunque podríamos intentar envenenar la red para ver si hay alguna carpeta compartida mal configurada o no existe que podamos recibir un NTLM-hash, pero no es el caso en esta máquina.
Utilizaremos 3 herramientas diferentes para ver si nos saca alguna cosa, y si con una herramienta diferente cambia el output.
Como podéis ver con ningúna podemos ver alguna carpeta compartida.
Tampoco podemos sacar nada con el rpcclient
.
Probemos por último el LDAP.
Ya que no hemos encontrado nada, toca realizar un poco de fuerza bruta al puerto 88 con varias wordlist, a ver si alguna nos da un usuario válido.
Nos descargamos la herramienta por si no la tenemos en el link y ejecutamos el siguiente comando:
No me sale ningún usuario positivo.
Hay que pensar que en un entorno empresarial normalmente los usuarios no se suelen llamar David o Miguel a secas, muchas veces tienen nombres m.alvarez
o d.garcia
entonces tenemos que buscar otro tipo de wordlist, hay una wordlist muy famosa que se suele utilizar para Kerbrute.
Entrando dentro vemos que tenemos una wordlist llamda A.Z.surnames.txt
si entramos vemos que tiene la estructura que queremos.
La descargamos y volvemos a ejecutar el comando kerbrute.
De acuerdo, entonces, ahora tenemos un usuario válido (B.LEWIS) pero seguimos sin tener credenciales... el siguiente paso y metodología que tenemos que seguir es preguntarnos a nosotros mismos:
¿Qué podemos hacer con este usuario?
En está situación podemos hacer los siguientes ataques:
AS-Rep Roasting
Password Spraying
Fuerza bruta con el usuario obtenido
En este caso estaremos enfrentandonos a un AS-Rep Roasting.
Quiero recordar así como nota, de que si tuvieramos un usuario y contraseña, entonces podriamos intentar atacar al dominio con un Kerberoasting.
Para entender un poco como funciona este ataque por detrás y poner mejor contexto, voy a explicar un poco en que consiste este ataque.
Este problema yace cuando el usuario (en este caso B.LEWIS) está mal configurado en sus propiedades, por detrás se vería de la siguiente manera al acceder a su cuenta:
Esto se encuentra en Usuario > Propiedades > Cuenta
.
Esto es cuando se ve desde dentro, pero esto no podemos verlo nosotros desde fuera, pero tenemos una manera de comprobarlo, y es con el script que viene pre-instalado con el paquete impacket:
GetNPUsers.py
Con el comando de arriba podemos comprobar si el usuario en cuestión que no tenemos contraseña tiene puesto "No pedir la autenticación Kerberos previa" activado.
Si no encontráis el script haced un locate GetNPUsers.py
y os mostrará donde lo tenéis del sistema.
Si no fuera vulnerable no nos daría un hash, pero en este caso si, eso quiere decir que lo tiene activado y no hace una autenticación previa a Kerberos.
Ahora cogemos el hash entero y lo guardamos en un archivo llamado hash y lo crackeamos con john
Nos da la password 101Music para el usuario B.LEWIS.
Cuando hemos obtenido una credenciales que parecen ser correctas, no nos vengamos arriba, primero tenemos que comprobar que funcionen, para ello utilizaremos netexec
.
Esto es un truco que me ha enseñado el propio creador de la máquina d4t4s3c que creo que es muy importante hacer:
Esto se hace por qué imaginad que no te han funcionado con el login al dominio, pero si con el local, eso quiere decir que si que existe, pero si no te va con ningúna ya nos dice que no funcionan. Esto se hace para evitar rabbit holes.
WIII, hemos encontrado credenciales correctas!
Ahora tenemos varias opciones con credenciales, una de las más logicas es enumerar más usuarios del dominio, ya que ahora si que podremos hacerlo al tener las credenciales.
Si el comando nos enumera más usuarios lo que tenemos que buscar es cuales de las cuentas están habilitadas.
Vemos que tenemos un nuevo usuario que tiene habilitada la cuenta j.levy
así que probamos de encontrar su contraseña haciendo fuerza bruta.
Nuevo usuario con contraseña j.levy:Password1
sabiendo que ahora tenemos esta nueva credencial y en la enumeración de puertos, había el WinRM (5989) activo podemos intentar darnos una shell interactiva y conseguir acceso al dominio.
Conseguimos acceso al sistema!
PERO, esperad, no tan rápido... ¿no os preguntáis por qué con este usuario sí hemos accedido al sistema y con el usuario b.lewis
no se nos ocurrió?
Pues aquí vamos a comentarlo, por qué yo si que me lo pregunté... aún soy novato con el Active Directory y lo que os diré ahora me hizo que entendiera como funciona realmente por detrás.
He estado comentando este tema con d4t4s3c y me comenta que el usuario b.lewis
está en el grupo de Samba pero no en el grupo Windows Remote Management, ya que una cosa no tiene que ver con la otra, es decir por detrás los grupos están gestionados así:
b.lewis: Grupo Samba
j.levy: Grupo Samba y Windows Remote Management
Esto hace que podemos aprovecharnos que j.levy
tiene ese grupo asignado para conectarnos por el puerto 5987 WinRM.
La mejor manera de enumerar un dominio es con Bloodhound y Sharphound, sharphound para recopilar toda la información y bloodhound para analizarla.
Primero pasamos el Sharphound.exe al dominio, para ello nos descargamos la siguiente versión que es la 4.3.1, que es la que funciona con mi versión de Bloodhound.
Una vez descargada la pasamos a la shell interactiva que tenemos:
Después ejecutamos:
Y entonces nos generará un .zip que lo tenemos que descargar y pasarlo a nuesta máquina.
Una vez lo tenemos levantamos el demonio de neo4j start
y entramos a bloodhound, seguidamente vamos a Upload Data (a la derecha en el panel) y subimos el .zip.
Nos cargara la información recopilada del dominio.
Ahora tenemos que ir mirando cada una de las queries que vienen hasta que encontremos algo interesante
Vamos a Dangerous Privileges > Find Principals with DCSync Rights
y seleccionamos control.nyx
.
Vemos que el usuario que tenemos en posesión tiene el privilegio AllExtendedRights
Clicamos encima del AllExtendedRights y le damos a Help
Seguidamente a Linux Abuse para ver como abusarlo desde Linux.
Si nosotros ejecutamos el comando de arriba podremos obtener las contraseñas almacenadas en el dominio, todo usuario que tenga el permiso AllExtendedRights tiene la capacidad de leer las contraseñas del dominio, de eso justo nos vamos a aprovechar con el comando de arriba.
Para más info del LAPS:
Cogemos el hash que hemos obtenido sacando la LAPS del dominio, obteniendo las credenciales de todos los usuarios, le ponemos el hash de administrator y obtenemos la shell con su usuario.
Aquí acaba el writeup de la máquina Controler, espero que la hayáis disfrutado y aprendido mucho.
Chao