首页
社区
课程
招聘
[原创] F5 shape 分析
2023-4-28 18:01 14290

[原创] F5 shape 分析

2023-4-28 18:01
14290

前言:

F5 Networks 收购了Shape Security又叫F5 shape。
本来想5.1后发的,因为还有很多参数得改,暂时只能手动改改过一下风控,但既然做出来了就得水一下,看看vmp天花板怎么个事。

算法分析

1、打下断点,看到XMLHttpRequest被改写了加了很多hook,触发send就会进入F5的sdk里面
图片描述
2、先单步调试看看都做了什么操作,进到第一个函数调用里面就初始化了一个数组,这很大概率就是解释存放的寄存器,直接打日志,在断个xhr断点观察一下
图片描述
3、保存下curl在分析 图片描述
找一下161初始位置,发现161,162是后来加进去的,还得继续往前找
图片描述
发现多处一段数据,在往上看看
图片描述
就发现3550的数组后面就没了,上面那段数据有很大概率跟这个数组有关系,流程先分析到这数组怎么来的先不管,先看看
图片描述
图片描述
图片描述
图片描述
图片描述
判断类型,string 还是 number,number直接push
图片描述
发现跟一个数组拼接到一起了,追踪一下那个数组的来源
图片描述
图片描述
调试的时候发现了一组数组243,87,42,173,219,172,165,124开头对应上面图片红框的大数组,也是拼上去的,这时候重新刷新一下调试一下
图片描述
断到最开始0,0的地方,发现是这个this.d取出来的,大概看了一眼this.d估计是收集的大量浏览器信息加密好的,很长有45个,估计就是45条信息
图片描述
然后这个只是数组的拼接,这是取了this.d的第一个,先拼接的数组长度口面跟的就是内容,先把这个d拿出来把后面的算法跟一下,然后在找这个d的来源
图片描述
用py还原这一步时候diff两个数组发现我的跟网页不一致,点就在数组长度上,这里在回头trace的时候是有一个大于128的一个分组算法
图片描述
然后就是两个数组的拼接,第二个数组的长度大于128分割成两个字节
图片描述
再往下看日志的话输出的都是一堆Math了,但是结果最后出来显然被加密了
图片描述
图片描述
计算加密轮数
图片描述
后面是算法,里面流程有点复杂,不一一讲了,贴下python还原出来之后的图吧,这是key的调度
图片描述
图片描述
每64个字节一组数据,进行key的调度,虽说算法是还原出来了,我真没看出来这个是啥算法,也不是正常的算法,还有shape的这个key是动态的,根据js改变而改变,而且发现那个数组还是不规律的,只能是官方定义的解释器运行出来的才能生成这个key。
图片描述
验证一下这个结果长度6298,最后拼了8个校验位,我代码输出的是6290
图片描述
然后trace一下这个校验位,发现是key最后拼接的两个32位随机数,
3509636349其实=-785330947 & 0xFFFFFFFF
负数转换了32位无符号整数
图片描述
验证一下结果,发现两个数据有点区别
图片描述
看了一下发现是python的数字截断问题,把js的%到py变成&就好了
看一下md5值都是同一个了
图片描述
然后就是魔改的b64,编码表也是随着js不同而变化的,到这里结果就是headers里面的a
b是f+a进行位运算在crc32的一个base36进制的字符串,vmp流程也很长不贴了,直接贴结果,这个crc32的校验方式和实现算法都不是标准的,尤其结果要注意转成有符号整数不然会影响结果
(重要算法还是打个码吧,毕竟是企业sdk) 图片描述
图片描述

sdk信息收集

刚开始本来想遵循着知道结果知道算法就能解出原文的思路来分析,当我看到第一个数组的时候是我想的太天真了,总结一句话不如补环境
一共是45个数组,最让我无语的是每个数组有单独的uint32进行混淆加密,这个数会根据js变化而不同,而且收集顺序每个js都是没有规律的,都是不同js自己的解释器执行到哪里,才会按照自己的方式收集。。。。

 

这时候就有人说了,你怎么知道,你不就分析这一个文件了吗
no no no,因为第一次获取的js我已经把信息收集都还原完了,才发现他有格式化检测。

 

所以说,就分析了一个新的。从头开始,发现所有的东西都是会变的,
就比如第一个数组
第一个文件收集顺序是 ua,height,width.....................
第二个文件收集顺序是 width,ua,height .................

 

最离谱的是每个字段都有自己空字符的表现方式
比如当前收集你的ua是空的第一个文件可能用个数字130占位
第二个文件就有可能变成了128占位
这个规律我反正是一点没发现,反正就可一个文件先给写死得了
收集方式有点像ali 的255,但是255比这个简单多了

 

图片描述
分析日志真的没法贴,太多太多了,展示下我包装还原的代码吧
图片描述
基础的环境监测 random_key 乘方的数就是每个数组固定的key

 

图片描述

 

这些就是占位的数,其实这个数在运行的时候就是个空串

 

图片描述

 

还有一堆环境监测啊,什么的,很多很多,不能再贴了。

 

反正收集还是在js收集,毕竟python不好补环境
他这个key混淆的算法我就封装了一个类,流程就是初始化这个key,然后递归的方式获取uint8进行乘方混淆计算,直到这个字段收集完毕

 

图片描述
然后就是a,b,c,d,f和a0拼接,我看shape分析算法的很少,找到一篇文章写着
图片描述
我真乐了,看看a0到底是啥吧,还有c和d
应该是固定值根据js文件变化而变,这个我是真没有分析到,懂的大哥可以留言告诉老弟一下,我看着反正是固定值
不影响后面重点是a和b
现在帖子是真能瞎编
图片描述
然后就可以请求了
图片描述

 

总结:
1、收集的信息里面随机点东西就能请求,校验不是很严格,逻辑性和环境比较严。
2、还有最后算法有一个跟请求的返回值在一起运算,发现那玩意不带也行,暂时不清楚干啥用的,懂的大哥可以告诉老弟一下
3、感觉他这个风控确实没有akamai和px3那么强,就是算法比较屌
4、重点是环境要正常,重点是环境要正常,重点是环境要正常
5、分析的时间不是很久,也不是做这个东西的spider,就是比较感兴趣,懂的大哥轻喷


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2023-4-28 18:02 被wbwnnx编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (24)
雪    币: 1929
活跃值: (12850)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
珍惜Any 2 2023-4-28 18:05
2
0
虽然看不懂,但是我大受震撼。
雪    币: 2944
活跃值: (3931)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0xEA 2023-4-28 18:05
3
0
虽然看不懂,但是我大受震撼。
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_fajamhlm 2023-4-28 18:22
4
0
大佬私信联系方式
雪    币: 128
活跃值: (2117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
powerpcer 2023-4-28 19:46
5
0
講一下akamai 的吧!!
雪    币: 62
活跃值: (556)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-4-29 13:58
6
0
大受震撼
雪    币: 1469
活跃值: (1390)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_wpuyiaon 2023-4-30 16:32
7
0
c和d都是由js中的字符串计算来的,大佬加个V呗
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 13:33
8
0
最重要的一步没有还原不就等于静态js么,所以并不能真正的过shape,shape难就难在初始化的规律,总结就是没有实际用处
雪    币: 344
活跃值: (644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wbwnnx 2023-5-4 14:35
9
0
mb_lgyjzpak 最重要的一步没有还原不就等于静态js么,所以并不能真正的过shape,shape难就难在初始化的规律,总结就是没有实际用处
1、哪个最重要一步,大佬能说明白吗?
2、这个刷新页面js就是随机的指令,初始化收集的信息确实是没找到规律
3、我认为能正常获取到数据就是暂时过了盾,算法还原跟补环境肯定没法比,但也不至于没有实际用处吧,不如您写一篇我观摩观摩
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 16:18
10
0
你有做并发请求么 你不知道会封key么
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 16:24
11
0
而且我不会去公开做这种东西,没有这么卷,何必呢,别人外面需求一大堆,公开不是有毛病
雪    币: 344
活跃值: (644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wbwnnx 2023-5-4 17:04
12
0
mb_lgyjzpak 你有做并发请求么 你不知道会封key么
是吗?我又不是抓这个的,影响你利益了?
我只是分析玩玩而已,杠什么呢你,封不封的得测到了再说,前言说了只是算法调通了,不会看文章把眼睛带上
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 17:37
13
0
你在骄傲什么啊大兄弟,我只是想告诉你,你并没有还原完整算法,好像是你急了吧,没事你继续膨胀吧
雪    币: 344
活跃值: (644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wbwnnx 2023-5-4 17:47
14
0
mb_lgyjzpak 你在骄傲什么啊大兄弟,我只是想告诉你,你并没有还原完整算法,好像是你急了吧,没事你继续膨胀吧
我膨胀及了现在,要不我把完整算法发你一份你验证下呗哈哈哈哈
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 18:02
15
0
你写的真的好搞笑,又想别人指出你哪里不足又不会虚心求教,初始化的list你用都没用到就口出狂言说自己破了天花板,你醒一醒吧孩子,估计都都没有去跟过这个地方吧,有没有规律你也不知道。大数是怎么生成的我估计你都是写死的并不知道跟key有关系吧。
雪    币: 344
活跃值: (644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wbwnnx 2023-5-4 18:18
16
0
mb_lgyjzpak 你写的真的好搞笑,又想别人指出你哪里不足又不会虚心求教,初始化的list你用都没用到就口出狂言说自己破了天花板,你醒一醒吧孩子,估计都都没有去跟过这个地方吧,有没有规律你也不知道。大数是怎么生成的我估 ...
好的叔叔,你是专业的,我业余,没必要专门注册个账号来这喷我,感谢指正,我会看你的建议分析出来再改一下这个文章的,希望最后不会影响到你的利益
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lgyjzpak 2023-5-4 18:19
17
0
想多了,就你这水文章不至于
雪    币: 344
活跃值: (644)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wbwnnx 2023-5-4 18:33
18
0
我没有公开,的确是水文章,不水前提是代码都贴上就不水了,而且只分析了两周,大数固定的那个一万多长度的大数组,我嫌麻烦确实没跟,但是这个一点用没有不至于吧哥们儿……
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_aleuyyzd 2023-5-19 17:40
19
0

佬,能指点一下吗,想搞搞,**

最后于 2023-6-4 10:22 被kanxue编辑 ,原因:
雪    币: 19
活跃值: (1056)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iceway 2023-6-4 03:19
20
0
F5 Shape是否有域名检测,如果我用反向代理+修改本机hosts文件的方法可以打开目标网站,但是登录的时候没有Shape的headers。
雪    币: 19381
活跃值: (29004)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-6-4 16:40
21
1
感谢分享
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_eqzydxqs 2023-7-23 17:16
22
0
大佬私信联系方式
雪    币: 201
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
撸菲斯 2023-9-9 11:15
23
0
这个怎么插桩的哇,没看懂
雪    币: 201
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
撸菲斯 2023-9-18 12:22
24
0
这个补环境怎么补啊,入口好像都在vmp里面设置的回调
雪    币: 2208
活跃值: (896)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
rushmaster 1 2024-3-10 14:01
25
0

分析这个东西确实极其耗费精力,对js的栈式虚拟机熟悉还容易些,要是不熟悉,根本无从下手。

几年前搞过这个东西,也还原了加解密算法,分析办法和要点基本和楼主分享的一致。
这个东西加密所需的密钥是编译到code流里的,所以除非能从code流还原原始js,否则必须跑一遍才能取到密钥。

最后于 2024-3-10 14:04 被rushmaster编辑 ,原因:
游客
登录 | 注册 方可回帖
返回