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

[原创] F5 shape 分析

2023-4-28 18:01
16400

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) 图片描述
图片描述

刚开始本来想遵循着知道结果知道算法就能解出原文的思路来分析,当我看到第一个数组的时候是我想的太天真了,总结一句话不如补环境
一共是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
现在帖子是真能瞎编
图片描述
然后就可以请求了
图片描述


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

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

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

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

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

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