Cobalt Strike的DLL Stager分析

渗透技巧 11个月前 admin
342 0 0

分析过程

cs生成分阶段的dll x64位,丢进IDA分析Cobalt Strike的DLL Stager分析

DllMain函数:

  1. CreateThread启动线程调用sub_6BAC16B0函数
  2. 调用sub_6BAC15B2函数Cobalt Strike的DLL Stager分析

sub_6BAC16B0函数:

  1. 将WInMain函数的dll句柄传入到sub_6BAC1605函数执行Cobalt Strike的DLL Stager分析

sub_6BAC1605函数:

  1. 系统启动以来经过的毫秒数*0x26AA
  2. 拼接获取管道名 -> .pipeMSSE-%d-server (例如:.pipeMSSE-1234-server)。该管道的格式是有据可查的“钴罢工”危害指标
    3.CreateThread启动线程调用调用StartAddress函数Cobalt Strike的DLL Stager分析

StartAddress函数:

  1. 调用sub_6BAC1440函数,传入一个指针和nNumberOfBytesToRead变量Cobalt Strike的DLL Stager分析

sub_6BAC1440函数:

  1. CreateNamedPipeA创建管道
  2. ConnectNamedPipe连接管道
  3. 连接成功,WriteFile管道写入shellcode
  4. CloseHandle关闭句柄(一旦将shellcode写入管道后,先前通过管道打开的句柄就通过闭合CloseHandle。这表明管道的唯一目的是传输加密的Shellcode)Cobalt Strike的DLL Stager分析

sub_6BAC1512函数:

  1. 读取管道里的shell复制到数组 (一旦管道以只读模式打开,该FillBufferFromPipe函数将继续在shellcode上进行复制,直到使用填充分配的缓冲区ReadFile。缓冲区填满后,将关闭命名管道的句柄CloseHandle并FillBufferFromPipe返回TRUE)Cobalt Strike的DLL Stager分析

sub_6BAC176E函数:

  1. 使用VirtualAlloc更改内存区域权限(MEM_RESERVE|MEM_COMMIT)
  2. 一旦分配了区域,该函数就会在shellcode缓冲区上循环并使用简单的xor操作将每个字节解密到新分配的区域中
  3. 调用sub_6BAC1733函数
  4. VirtualProtect更改区域页面权限为PAGE_EXECUTE_READ
  5. CreateThread启动线程调用sub_6BAC1730函数
Cobalt Strike的DLL Stager分析

sub_6BAC1733函数:

  1. 根据判断确定将GetModuleHandleA、GetProcAddress函数地址写入内存(数组)
Cobalt Strike的DLL Stager分析

sub_6BAC1730函数:

  1. shellcode执行
Cobalt Strike的DLL Stager分析

总结:

  1. 创建管道写shellcode
  2. 从管道读取shellcode复制到数组
  3. 更改内存区域权限(MEM_RESERVE|MEM_COMMIT),xor解密shellcode,将GetModuleHandleA、GetProcAddress函数地址写入内存,更改区域页面权限为PAGE_EXECUTE_READ
  4. shellcode执行

参考链接:

https://blog.nviso.eu/2021/04/26/anatomy-of-cobalt-strike-dll-stagers


https://422926799.github.io/posts/78291ddc.html

wx

Cobalt Strike的DLL Stager分析


原文始发于微信公众号(红队蓝军):Cobalt Strike的DLL Stager分析

版权声明:admin 发表于 2023年5月19日 下午3:01。
转载请注明:Cobalt Strike的DLL Stager分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...