微信又改版了,为了我们能一直相见
你的加星和在看对我们非常重要
点击“长亭安全课堂”——主页右上角——设为星标🌟
期待与你的每次见面~
00
背景
• 扫描RWX内存(正常进程中的Private Data区域一般没有执行权限)
• DOS头
• 字符串特征
• ReflectiveLoader
• beacon.x64.dll
• ...
• Beacon Config(使用前)
01
BeaconEye核心原理
02
Beacon.dll
03
Beacon Config Generate
04
Beacon Struct
05
BeaconEye规则
[ ID ] [ DATA TYPE ID ] [ LENGTH OF VALUE ] [ VALUE ]
DWORD DWORD
[ DATA TYPE] [ VALUE ]
06
Bypass BeaconEye
07
SymInitialize作用
hProcess: 代表进程句柄
UserSearchPath: 符号文件的搜索路径
fInvadeProcess: 是否对进程中已加载的每个模块调用SymLoadModule64函数
仅仅从传参来看,并没有办法明确的判定为什么能Bypass,因此我们使用windbg进行对比抓取
08
Windbg调试
09
Windows中Heap结构
dt !_heap
可以看到heap结构的字段非常的多,这里重点关心3个字段
BaseAddress ~ BaseAddress + NumberOfPages * PageSize
A
NtQueryVirtualMemory
B
猜想与验证
C
BeaconEye修复(伪)
这个时候我们重新编译,扫描原先使用了SymInitialize的Cobalt Strike Beacon,发现已经可以扫出来了
D
为什么还是被Bypass了?
E
HeapBlock
不难发现每一个堆段包含了大量的堆块,这也解释了为什么BeaconEye会检测失效,因为堆块和堆块之间存在属性不一致的内存页,导致只能读取部分内存空间
而在实际的进程当中,堆块对应的结构体是_HEAP_ENTRY
F
BeaconEye修复(真)
10
结语
11
参考资料
https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-gong-ji-fang-yu/untitled-1
《Windows Internals 6 part 1》