1. 首页
  2. 安全防御

修改1个字节绕过BeaconEye

【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。

写在前面:

其实是为了发个招聘才水了这篇文章,杭州大型互联网公司招聘渗透测试攻城狮/砖家,文末是招聘详情,推荐简历入职成功赠送下个版本的原版CobaltStrike,如果推荐简历的人数不多,每个推荐者都赠送破解版


9月初的时候有安全人员开源了一款检测Cobalt Strike Beacon的工具,名字叫BeaconEye,核心原理是通过扫描Cobalt Strike中的内存特征,并解析出对应的Beacon配置信息,项目地址是https://github.com/CCob/BeaconEye。很多人觉得这东西很难绕过,写了很多很复杂的东西来绕过他,比如加密整个堆、hook malloc等,当时长亭科技专门分析过这个东西,写了篇分析文章叫做“如何正确的 “手撕” Cobalt Strike”,还帮项目修复了获取堆块信息不全的bug

修改1个字节绕过BeaconEye


原理分析

BeaconEye的原理很简单,就是预置了yara规则,然后扫描内存去匹配Beaon的配置信息,详情建议大家先去看长亭科技的那篇分析文章,我这里只简略过一遍。

Beacon的配置信息在java中是用TLV(Type-Length-Value)格式表示的,借用长亭科技那篇文章的图

修改1个字节绕过BeaconEye

实际beacon运行时配置信息存储到内存中的时候,Type有3种值:1 – Short,2 – Int, 3 – Data。本质上只有Data类型保留了TLV中的L,其他两种Short和Int的长度直接被Type表达了,所以逆向32位beacon.dll的代码可看到写配置的时候,Short和Int其实是TV格式,Data才是TLV格式,如下图:

修改1个字节绕过BeaconEye

那么最终BeaconEye的yara规则,其实就匹配Type+数据,本质上用的是类似正则表达式的东西。检测32位beacon的规则如下图:

修改1个字节绕过BeaconEye

现在,请注意观察我前面三张图中所有蓝色框的内容

修改1个字节绕过BeaconEye

Type的值在java中使用的是short类型(2字节),在beacon.dll的逆向代码中,Type使用的是WORD(2字节)。重点来了,在BeaconEye的规则中,Value前面表示Type的地方却有4个字节(DWORD)

从java的代码来看,这个Type设计的长度就是2字节,在Beacon运行的时候使用的长度也是2字节,但是在内存中存储的时候,Type和Data之间有2个字节gap。从这个角度来讲,BeaconEye的规则实际上应该理解成:

[2字节Type] + [2字节gap] + [Value]

这2字节的gap实际上并没有被beacon使用到,所以内容是可以任意填充的。另外其实不光这两字节,所有value为short类型的地方,value后面都有2字节的gap。

那么也就是说,如果我们能修改gap里的值,就能绕过BeaconEye的检测规则。gap的默认值是memset的时候设置的值,也就是0。所以理论上只要修改memset的参数值,就能绕过BeaconEye!

 

Let’s do it

原版CS的jar包中资源文件都是加密的,需要用到一个开源的项目CrackSleeve来解密,项目地址:https://github.com/ca3tie1/CrackSleeve

需要修改CrackSleeve.java里面的OriginKey为4.4版本的解密key,java代码里的key格式是整数数组:

 OriginKey={27,-27,-66, 82,-58,37,92,51,85,-114,-118,28,-74,103,-53,6}

4.4版本的key 16进制格式是5e98194a01c6b48fa582a6a9fcbb92d6,用python转换成整数格式:

>>>import binascii;[byte if byte <= 127 else (256-byte) * (-1) for byte in binascii.unhexlify('5e98194a01c6b48fa582a6a9fcbb92d6')][94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42]

在cobaltstrike目录下编译和解密

javac -classpath cobaltstrike.jar CrackSleeve.javajava  -classpath cobaltstrike.jar:. CrackSleeve decode

找到Resource/Decode/sleeve目录下的beacon.dll和beacon.x64.dll,用IDA、OD或者x64dbg之类任意你喜欢的工具修改memset的参数。

32位下memset的参数值是通过push压到栈上的,也就是只要修改push的参数值即可。

修改1个字节绕过BeaconEye

push 0的机器码为6A 00,只需要修改00这一个字节为任意非0值。64位同理,具体怎么改算留给读者的作业吧。

我这里把00修改成01

修改1个字节绕过BeaconEye

修改后替换刚才Resource/Decode/sleeve目录下的beacon.dll和beacon.x64.dll文件,然后再运行CrackSleeve把文件加密回去

java -classpath cobaltstrike.jar:. CrackSleeve encode

加密后的文件在Resource/Encode/sleeve目录下

接下来有个小trick,在cobaltstrike同级目录下新建sleeve目录,然后从Resource/Encode/sleeve复制beacon.dll和beacon.x64.dll到刚才新建的sleeve目录就完成了资源替换。

这个trick之前在CSAgent汉化里面也用过,cobaltstrike加载资源的时候会首先从本地磁盘找相对目录里的文件,如果找不到再加载jar包里的资源,也就是说你在cobaltstrike.jar的同级目录下,新建一个sleeve文件夹,里面放beacon.dll和beacon.x64.dll这两个文件,那么CS在运行的时候会优先使用这两个文件,而不是jar包里的beacon.dll,这样就可以在不修改jar包的前提下替换beacon.dll和beacon.x64.dll,另外resources、scripts文件夹也是同理,CSAgent中的汉化其实就是这样替换jar包资源的。

测试

先给BeaconEye打长亭提交的补丁,修复堆块获取的问题

git clone https://github.com/CCob/BeaconEye.gitwget https://github.com/CCob/BeaconEye/commit/a542901984ad7d5588e62f9d9a88fb243444a095.patchpatch -p1 < a542901984ad7d5588e62f9d9a88fb243444a095.patch

然后编译打补丁后的源码

 

先测试原始的Beacon,直接被检测出来

修改1个字节绕过BeaconEye

使用修改后的beacon.dll和beacon.x64.dll,不做其他任何修改,上线后用BeaconEye扫不出来

修改1个字节绕过BeaconEye

招聘

杭州某上市失败互联网公司招聘渗透测试攻城狮/砖家,负责网络安全和黑灰产技术对抗

岗位层级:P6、P7

岗位要求:

  1. 3年以上工作经验,具备独立开展渗透工作的能力

  2. 至少熟悉一种编程语言,如Python、C、Java、Go等

  3. 掌握常见Web漏洞原理,具备代码审计能力

有以下技能或经验者优先录用:

  1. 独立开发过优质的安全相关工具、平台、项目等;

  2. 在t00ls、freebuf、seebug、先知等社区发布过优质漏洞、文章;

  3. 在各个SRC、众测提交过优质安全漏洞;

  4. 具备优秀的漏洞挖掘和漏洞利用工具编写能力。

上述岗位要求都是从其他地方抄的,只要技术叼上面都是扯淡

欢迎各路大佬推荐简历,推荐候选人入职成功赠送下个版本的原版CobalStrike,如果推荐简历的人数不多,每个推荐者都赠送破解版

简历请发送到邮箱 twi1ight@t00ls.net

或者扫码入群联系群主,也算是之前CSAgent的一个交流群吧。如果是想入群学习技术的就别抱幻想了,没见过几个在群里学到技术了的,倒是表情包存了一大堆

原创文章,作者:mOon,如若转载,请注明出处:https://www.moonsec.com/5644.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息