前言
使用CobaltStrike 4.0生成多个payload,分析其加载过程和检测方法
生成Payload
设置监听之后生成EXE
加载过程
先说结论:
-
生成的exe只是为了加载恶意DLL
-
恶意DLL是使用了XOR加密存储的,原始数据和密钥都存放在exe的.data段
-
恶意DLL头部被修改过,使用反射注入技术将DLL注入自身
拖进IDA查看,循环结构,休眠十秒继续执行。执行逻辑如下:
main.png1、在函数sub_401800
中创建了管道%c%c%c%c%c%c%c%c%cMSSE-%d-server
,可以作为特征提取
2、创建管道结束后在sub_401608
中将.data
段的数据复制到管道,大小是33000h
。
3、在函数sub_4017A2
中申请内存,调用sub_401559
进行解密数据。
4、创建新线程去执行恶意DLL
createthread.png动态分析
在最后CreateThread函数处下断点,查看解密出的DLL
dll1.png dll2.png这时可以利用脚本dump出文件,便于之后单独分析。
from idc import *
tmp_list = []
for byte in idc.GetManyBytes(0x690000, 0x33000):
tmp_list.append(byte)
with open("dump.bin", "wb") as f:
f.write(bytes(tmp_list))
print("success")
关注创建新线程逻辑的sub_401550
处代码,是跳到eax处,这时eax保存的是恶意dll的地址。
这个时候就很奇怪,存在一个问题:为什么跳到一个PE头部可以正常执行??答案就是这个PE头部是被精心构造的。
pe_head.pngMsf中也有相似的加载手法,可以参考meterpreter_loader
的源码:https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/payload/windows/meterpreter_loader.rb
对照函数asm_invoke_metsrv
处的逻辑可以理解上述汇编的作用。
def asm_invoke_metsrv(opts={})
asm = %Q^
; prologue
dec ebp ; 'M'
pop edx ; 'Z'
call $+5 ; call next instruction
pop ebx ; get the current location (+7 bytes)
push edx ; restore edx
inc ebp ; restore ebp
push ebp ; save ebp for later
mov ebp, esp ; set up a new stack frame
; Invoke ReflectiveLoader()
; add the offset to ReflectiveLoader() (0x????????)
add ebx, #{"0x%.8x" % (opts[:rdi_offset] - 7)}
call ebx ; invoke ReflectiveLoader()
; Invoke DllMain(hInstance, DLL_METASPLOIT_ATTACH, config_ptr)
; offset from ReflectiveLoader() to the end of the DLL
add ebx, #{"0x%.8x" % (opts[:length] - opts[:rdi_offset])}
^
unless opts[:stageless] || opts[:force_write_handle] == true
asm << %Q^
mov [ebx], edi ; write the current socket/handle to the config
^
end
asm << %Q^
push ebx ; push the pointer to the configuration start
push 4 ; indicate that we have attached
push eax ; push some arbitrary value for hInstance
call eax ; call DllMain(hInstance, DLL_METASPLOIT_ATTACH, config_ptr)
^
end
这里就是精心构造了PE头部,使用了反射注入技术,将dll注入自身,返回的是dllmain的地址。0x650022
处call eax
实际上就开始执行DLLMain处的逻辑了,可以对比下面两张图。之后就正常分析dump出的DLL即可
检测
1、创建管道的部分存在硬编码%c%c%c%c%c%c%c%c%cMSSE-%d-server
,可以使用yara规则检测。
2、原始加密数据和解密密钥存放的位置在不同版本的cs中是不同的,可以收集不同版本的CS生成恶意payload进行分析,可以区分不同的CS版本。
网友评论