检测Cobalt Strike只使用40行代码

安全 网站安全
无文件落地的木马主要是一段可以自定位的shellcode组成,特点是没有文件,可以附加到任何进程里面执行。

无文件落地的木马主要是一段可以自定位的shellcode组成,特点是没有文件,可以附加到任何进程里面执行。一旦特征码被捕获甚至是只需要xor一次就能改变特征码,由于传统安全软件是基于文件检测的,对目前越来越多的无文件落地木马检查效果差。

[[416030]]

基于内存行为特征的检测方式,可以通过检测执行代码是否在正常文件镜像区段内去识别是否是无文件木马.由于cobaltstrike等无文件木马区段所在的是private内存,所以在执行loadimage回调的时候可以通过堆栈回溯快速确认是否是无文件木马。

检测只需要40行代码:

  • 在loadimagecallback上做堆栈回溯
  • 发现是private区域的内存并且是excute权限的code在加载dll,极有可能,非常有可能是无文件木马或者是shellcode在运行:
    1. void LoadImageNotify(PUNICODE_STRING pFullImageName, HANDLE pProcessId, PIMAGE_INFO pImageInfo) 
    2.     UNREFERENCED_PARAMETER(pFullImageName); 
    3.     UNREFERENCED_PARAMETER(pProcessId); 
    4.     UNREFERENCED_PARAMETER(pImageInfo); 
    5.     if (KeGetCurrentIrql() != PASSIVE_LEVEL) 
    6.         return; 
    7.     if (PsGetCurrentProcessId() != (HANDLE)4 && PsGetCurrentProcessId() != (HANDLE)0) { 
    8.         if (WalkStack(10) == false) { 
    9.  
    10.             DebugPrint("[!!!] CobaltStrike Shellcode Detected Process Name: %s\n", PsGetProcessImageFileName(PsGetCurrentProcess())); 
    11.             ZwTerminateProcess(NtCurrentProcess(), 0); 
    12.             return; 
    13.         } 
    14.     } 
    15.     return; 

堆栈回溯:

  1. bool WalkStack(int pHeight)  
  2.  
  3. bool bResult = true 
  4. PVOID dwStackWalkAddress[STACK_WALK_WEIGHT] = { 0 };  
  5. unsigned __int64 iWalkChainCount = RtlWalkFrameChain(dwStackWalkAddress, STACK_WALK_WEIGHT, 1);  
  6. int iWalkLimit = 0 
  7. for (unsigned __int64 i = iWalkChainCount; i > 0; i--)  
  8.  
  9. if (iWalkLimit > pHeight)  
  10. break;  
  11. iWalkLimit++;  
  12. if (CheckStackVAD((PVOID)dwStackWalkAddress[i])) {  
  13. DebugPrint("height: %d address %p \n", i, dwStackWalkAddress[i]);  
  14. bResult = false 
  15. break;  
  16.  
  17.  
  18. return bResult;  

使用:

编译好驱动,加载驱动,之后运行测试看看:

普通生成(x32与x64)测试:

基于VirtualAlloc的C代码测试:

测试结果:

基于powershell的测试:

基于python的测试:

测试结果:

弊端:

目前已知的ngentask.exe、sdiagnhost.exe服务会触发这个检测规则(看样子是为了执行一些更新服务从微软服务端下载了一些shellcode之类的去运行).如果后续优化则需要做一个数字签名校验等给这些特殊的进程进行加白操作.这是工程问题,不是这个demo的问题

一如既往的 github:https://github.com/huoji120/CobaltStrikeDetected

责任编辑:赵宁宁 来源: FreeBuf
相关推荐

2013-11-26 10:12:57

2013-11-26 10:48:12

2013-08-15 17:32:51

2023-09-27 07:57:54

2022-08-30 10:06:34

网络安全黑客网络攻击

2022-10-08 06:14:36

Sliver工具箱恶意攻击

2021-08-13 16:05:26

僵尸网络漏洞网络攻击

2022-04-15 08:07:21

ReactDiff算法

2017-07-24 15:06:02

代码人脸识别实践

2021-09-17 16:28:10

Linux系统攻击渗透测试

2022-06-16 11:02:21

漏洞攻击

2018-01-23 09:17:22

Python人脸识别

2023-02-07 13:42:44

代码实现并发

2020-02-28 15:33:12

代码人工智能检测

2017-03-28 21:03:35

代码React.js

2020-08-21 13:40:17

Python代码人体肤色

2020-08-24 15:49:28

代码bug出错

2022-09-25 23:10:53

Python数据集机器学习

2012-07-23 09:58:50

代码程序员

2018-05-11 14:10:17

Python人脸识别
点赞
收藏

51CTO技术栈公众号