戟星安全实验室
本文约3786字,阅读约需10分钟。
接上篇
修改checksum8特征扫描
针对默认配置的cs服务器,端口扫描可以识别到特征。使用fofa语法找一台服务器
cert.issuer="Cobalt Strike"
通过脚本进行爆破扫描,就可以获取到Stage端口的URI
https://github.com/jas502n/grab_beacon_config
--script=/home/kali/Desktop/grab_beacon_config-main/grab_beacon_config_rsa.nse
反向代理的内网地址也会泄露
使用自定义配置文件,可以规避默认扫描识别(无法规避uri扫描)
在源码beacon/BeaconPayload.java修改CheckSum8的特征,异或值由2e(46)改为9A(154)
同时需要修改代码中出现的几个resources/*.dll文件(beacon.dll、beacon.x64.dll、dnsb.dll、dnsb.x64.dll、pivot.dll、pivot.x64.dll、extc2.dll、extc2.x64.dll)
一个根据cs密钥解密的脚本
https://pingmaoer.github.io/2020/06/24/CobaltStrike%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87/
下载后修改源码,将解密的OriginKey修改为对应版本的(4.0、4.3、4.4保真,4.1、4.2未测试)
// private static byte[] OriginKey40 = {27, -27, -66, 82, -58, 37, 92, 51, 85, -114, -118, 28, -74, 103, -53, 6 };
// private static byte[] OriginKey41 = {-128, -29, 42, 116, 32, 96, -72, -124, 65, -101, -96, -63, 113, -55, -86, 118 };
// private static byte[] OriginKey42 = {-78, 13, 72, 122, -35, -44, 113, 52, 24, -14, -43, -93, -82, 2, -89, -96};
// private static byte[] OriginKey43 = {58, 68, 37, 73, 15, 56, -102, -18, -61, 18, -67, -41, 88, -83, 43, -103};
// private static byte[] OriginKey44 = {94, -104, 25, 74, 1, -58, -76, -113, -91, -126, -90, -87, -4, -69, -110, -42};
再将加密的CustomizeKey手动输入代码注释掉,改为对应版本的key
将CrackSleeve.java和原版jar包放一起
编译 javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java
无报错表示编译成功,同目录下多出两个class文件
解密文件 java -classpath cobaltstrike.jar;./ CrackSleeve decode
如果出现以下报错(Bad HMAC),则是对应cs版的解密key不对
使用快捷键Alt+T搜索全部2Eh字符
双击异或指令行(其他dll同样只改异或指令行)
使用字节修改功能
将2E改为9A
将改变应用(保存)到输入文件
将修改后的dll复制到decode文件夹下,替换
加密文件 java -classpath cobaltstrike.jar;./ CrackSleeve encode,会生成encode目录
将加密后的8个dll复制到src/sleeve/(新建)目录下
使用rebuild选项编译,查看生成的jar包,仅修改过的dll被替换
特征路径修改
以上的CheckSum8相关修改,只能防止设备对beacon异或解密(如果手动进行256爆破异或依旧可以解密),并不能bypass特征路径
因为即使如下配置自定义uri,如上图默认的Stage监听uri依旧会生效
在一些云服务或安全设备上依旧会被安全警告、标记,导致封禁网络出口
根据网上文章分析,可以不动CheckSum8算法本身,去修改uri计算方式
src/common/CommonUtils.java 生成代码,改动2个函数,每次checksum8生成的字符串是类似“/abcd”的5个字符,其中的“g-a8”可以改为任意带特殊字符的字符串,注意计算好修改后的总长度
src/cloudstrike/WebServer.java 解析代码,改动4个函数,先修改对总长度的校验,再对自定义的逻辑进行解析
测试,需要符合变化的请求才会返回
绕过beaconeye内存签名检测
“当启用`obfuscate-and-sleep`时,Beacon 会在进入睡眠状态之前在内存中混淆自身。”在cs配置文件中,配置:stage->sleep_mask为true
“Beacon 的 obfuscate-and-sleep 选项只会混淆字符串和数据,而负责进行加解密的代码部分不会混淆,且在内存中可以被标记出来”
4.2(~4.4)的内存特征hex
$a_x64 = {4C 8B 53 08 45 8B 0A 45 8B 5A 04 4D 8D 52 08 45 85 C9 75 05 45 85 DB 74 33 45 3B CB 73 E6 49 8B F9 4C 8B 03}
$a_x86 = {8B 46 04 8B 08 8B 50 04 83 C0 08 89 55 08 89 45 0C 85 C9 75 04 85 D2 74 23 3B CA 73 E6 8B 06 8D 3C 08 33 D2}
BeaconEye:一款开源cs进程内存检测工具,下载地址
https://github.com/CCob/BeaconEye
需要根据测试环境下载对应版本的exe
可发现未做内存bypass的cs进程,并解密部分beacon配置信息
使用ida对两个dll(beacon.dll、beacon.x64.dll)再次汇编修改,先使用ida快捷键G,跳转到指定地址
sleeve/beacon.dll 修改汇编绕过beaconeye内存签名检测,地址位:1000A0B9处6A 00 修改为6A 09(00修改为任意)
sleeve/beacon.x64.dll 修改汇编绕过beaconeye内存签名检测,地址位:000000018001879B处xor edx, edx,修改为mov edx, esi(使用指令修改功能)
修改后cs的http、https上线测试
对正在运行的cs进程进行检测,无发现
以http x86会话为例
文件浏览
文件上传与下载,注意是否有操作权限,默认下载到download目录
进程列表
屏幕截图
新建会话(进程派生),新建的进程也可以bypass内存检测
二次登录验证
功能实现
为防止密码泄露或被(蜜罐)反制后,被防守方登录操作,加上二次验证手段,网上的分析文章很多
https://github.com/HKirito/GoogleAuth
这里用这个项目源码稍微修改一下,src/main/java/sanwu/CsRewrite.java中,取消标题的自定义(非google的app也不识别)
设置生成的密钥保存到二维码图片
在idea的右边,使用maven插件生成jar包
先点击compile在点击install,到target目录下查看
如果生成报错,可以修改cs的jar路径
运行测试,生成的png用“标题-名称-SecretKey”格式命名
扫描二维码,绑定到app
这里分享两个apk安装包,来源于Google应用商店
链接:https://pan.baidu.com/s/18jrmNWYdTjsVyoBWYaPofw
提取码:99fr
使用测试
按照提示在teamserver启动里加入javaagent
客户端用默认连接方式,返回错误无法登录
使用用户名加6位认证码方式,成功登录
注意服务器时间与本地时间同步,因为“客户端每30秒使用密钥SecretKey和时间戳通过算法生成一个6位数字的一次性密码”
往期回顾
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,戟星安全实验室及文章作者不为此承担任何责任。
戟星安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经戟星安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
戟星安全实验室
# 长按二维码 || 点击下方名片 关注我们 #