CobaltStrike的检测

VSole2021-10-15 07:21:54

CobaltStrike是一款渗透测试神器,支持http/https、tcp、smb等多种通信方式。

在hvv防守方、应急响应等场景中,都有检测CobaltStrike的需求。

现有检测方案

使用特征码扫描

  • https://github.com/Apr4h/CobaltStrikeScan
  • https://github.com/CCob/BeaconEye
  • https://github.com/jas502n/cs_yara

通常使用yara规则去匹配内存或者文件,但缺点如不支持3.x、只支持http/https的beacon等

内核检测方案

  • [2021]检测Cobalt Strike只使用40行代码

其技术原理是

   1. 在内核通过PsSetLoadImageNotifyRoutine设置镜像加载通知回调,之后任何exe,dll的加载都会被检测。

    2. 而CobaltStrike使用sRDI方案,shellcode会调用LoadLibrary来加载需要dll,此时获取堆栈回溯

    3. 检测调用者的内存属性为是否为private,是否可写

但缺点是

    1. 内核模块启动要先与CobaltStrike,如果已经运行则无法检测

    2. 在客户业务环境中内核模块要保证稳定性兼容性,还要解决数字签名等问题

CobaltStrike特征分析

鉴于以上两种方案各有缺点,CobaltStrike的特征到底是什么?

我认为有两个通用的特征

    1. 对于http/https通信而言CobaltStrike均使用WinINet.dll来进行通信

    2. 无论选择exe/dll/raw等格式,CobaltStrike内存均会sRDI

通过ETW记录WinINet日志

ETW可以记录WinINet的进程id、线程id、url、请求头、返回状态码、返回头等信息

在应急中,可以通过进程id、线程id、url进一步排查,进而阻断其网络和进程。

手动操作步骤

    1. 打开事件查看器

    2. 打开菜单 查看->显示分析和调试日志

  3. 进入 应用程序和服务日志->Microsoft->Windows->WinINet(Microsoft-Windows-WinINet)

    4. 右键启动 Microsoft-Windows-WinINet/UsageLog 日志

                                        wininetlog

工具

用C#写了个简单的工具WinINetLogger

                                    wininetlogger

通过应用层的堆栈回溯判断sRDI和CobaltStrike

sRDI本身具有很强的隐蔽性,在内存中可以任意编码、加密。

但正如前文提到的内核检测方案中,其调用系统api时,调用者的内存属性有问题。

正常调用系统api时,调用者内存属性一般为IMAGE类型,并且不可写。

但也有例外如C#和V8等包含jit即时编译的代码。

此时就需要结合CobaltStrike自身的特征

  • http/https时,堆栈回溯只有两种情况
  1.    1. 睡眠时:sRDI -> kernel32.dll!Sleep
  2.    2. 通信时:sRDI -> WinINet.dll!xxxx
  • bindSMB时,堆栈回溯只有两种情况
  1.    1. 监听管道时:sRDI -> kernel32!ConnectNamedPipe
  2.    2. 读取数据时:sRDI -> kernel32!ReadFile
  • bindTCP时,堆栈回溯只有两种情况
  1.    1. 监听端口时:sRDI -> ws2_32.dll!accept
  2.    2. 接收数据时:sRDI -> ws2_32.dll!recv

分析调用堆栈时,如果这些api的调用者内存有问题,那么就可以确定是CobaltStrike

通过ProcessHacker插件检测CobaltStrike

参考链接

  • https://github.com/Apr4h/CobaltStrikeScan
  • https://github.com/CCob/BeaconEye
  • https://github.com/jas502n/cs_yara
  • https://medium.com/threat-hunters-forge/threat-hunting-with-etw-events-and-helk-part-1-installing-silketw-6eb74815e4a0
  • https://key08.com/index.php/2021/07/25/1260.html

工具和代码

  • https://github.com/howmp/WinINetLogger
  • https://github.com/howmp/CobaltStrikeDetect
  • https://guage.cool/cobaltstrike-detect/processhacker.zip
  • https://guage.cool/cobaltstrike-detect/WinINetLogger.zip
https堆栈
本作品采用《CC 协议》,转载必须注明作者和本文链接
CobaltStrike的检测
2021-10-15 07:21:54
CobaltStrike是一款渗透测试神器,支持http/https、tcp、smb等多种通信方式。 在hvv防守方、应急响应等场景中,都有检测CobaltStrike的需求。
ASLR程序加载到内存后不使用默认的加载地址,将加载基址进行随机化,依赖重定位表进行地址修复。地址随机化之后,shellcode中固定的地址值将失效。图-程序地址未随机化处理开启/关闭软件地址随机化。每个页目录表和页表项都存在 基址与属性控制位,通过修改这些控制位,达到当前内存是否有执行、读、写等权限。图-表项构成windows 系统上可以调用 VirtualProtect 函数完成内存属性的修改操作。DWORD flNewProtect, // 请求的保护方式。大小超过 8 个字节且不包含指针的数据结构。
NVIDIA OFED堆栈架构
2022-07-21 11:45:10
应用程序级别还显示了NVIDIA OFED适用于的市场的多功能性。mlx5_ib处理 InfiniBand 特定的功能并插入 InfiniBand 中间层。设置此变量可启用 CQE 压缩。它允许直接将数据传入和传出 SCSI 缓冲区,而无需中间数据副本。
另外需要说明一下,原文只是一个系列(https://sploitfun.wordpress.com/2015/06/26/linux-x86-exploit-development-tutorial-series/)中的一篇文章:
SYN FLOOD攻击是在TCP三次握手过程中产生的。攻击者通过发送大量伪造的带有SYN标志位的TCP报文,与目标主机建立了很多虚假的半开连接,在服务器返回SYN+ACK数据包后,攻击者不对其做出响应,也就是不返回ACK数据包给服务器,这样服务器就会一直等待直到超时。这种攻击方式会使目标服务器连接资源耗尽、链路堵塞,从而达到拒绝服务的目的。
BPF之路二(e)BPF汇编
2021-12-28 16:18:32
原始的BPF又称之为class BPF(cBPF), BPF与eBPF类似于i386与amd64的关系
GitHUB安全搬运工
2021-10-15 12:58:23
Github干货集合
SigFlip:将数据隐写到已签名的PE文件上Github地址: https://github.com/me
功能列表HWBP hook检测 检测线程中所有疑似被hwbp隐形挂钩内存免杀shellcode检测可疑进程检测无文件落地木马检测简易rootkit检测检测异常模块,检测绝大部分如"iis劫持"的后门运行截图项目地址:https://github.com/huoji120/DuckMemoryScan2、ASP.NET-Memshell-Scanner v1.3asp.net内存马检测工具,通过aspx脚本来实现asp.net内存马的检测以及查杀。如侵权请联系删除。
CVE-2021-24086漏洞分析
2022-07-19 16:41:30
漏洞信息2021年,Microsoft发布了一个安全补丁程序,修复了一个拒绝服务漏洞,编号为CVE-2021-24086,该漏洞影响每个Windows版本的IPv6堆栈,此问题是由于IPv6分片处理不当引起的。
VSole
网络安全专家