前言 [color=rgba(0, 0, 0, 0.9)]在对某次渗透测试任务中,目标为一个apk,对其进行渗透测试,在使用抓包测试中发现存在sign的数据包防篡改,通过分析获取加密方法。 初步渗透[color=rgba(0, 0, 0, 0.9)]配置好https证书,使用Burpsuite配置代理,抓取目标apk注册数据包 [color=rgba(0, 0, 0, 0.9)]发现存在用户遍历的问题,不存在的用户会显示未注册,存在的用户显示已发送短信。放到intruder模块进行手机号爆破,看下有没有测试的手机号信息姜姜,修改mobile参数发现会显示认证失败,请求的数据包中存在sign参数 [color=rgba(0, 0, 0, 0.9)] 这里解释下什么是sign[color=rgba(0, 0, 0, 0.9)]sign签名校验法本质上是对客户端传输数据合法性的一种校验手段其常用手法为,在用户客户端传输的数据中额外加上时间戳以及特殊字符,随后一起得出整体数据的加密值(常用MD5,SHA1等加密算法)这就导致了用户在不知晓程序的原始数据生成sign值的方法情况下,若对传输到服务端的数据进行篡改,在后端都会鉴权失败,导致用户篡改后的数据无效。 解决sign签名问题[color=rgba(0, 0, 0, 0.9)]目前想到的有三种方法: 测试下sign是否为弱加密方法 测试下sign是否可以置空绕过 对apk进行逆向,分析其加密算法
[color=rgba(0, 0, 0, 0.9)]首先看来下加密字符,长度不太像md5的,可能是其他的加密算法,丢到cmd5上也没解开,G下一个置空发送也是失败了 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]只能尝试最不擅长的apk分析源码了首先使用几个查壳工具查看下存不存在加壳 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]还行,用了几个工具都没显示加壳了,省了不少事情使用AndroidKiller工具分析一下这个apk [color=rgba(0, 0, 0, 0.9)]我干,试了好几个工具不知道为啥都会爆这个错误,有没有大佬讲解下的。既然这样不行的话只能使用frida-dexdump脱源码了,这里就不讲怎么操作了,网上应该都有操作流程。脱下来了两个dex文件,通过dex2还原成jar格式查看源码。 [color=rgba(0, 0, 0, 0.9)]通过搜索sign关键字,分析了半天,并未发现存在相关的加密代码。 神奇的思路二[color=rgba(0, 0, 0, 0.9)]想着既然java代码里没有,它又是存在加密的想到可能是通过js实现的,所以想着怎么把apk中的其他源码搞出来。在网上搜寻找到了一个方法,在没有壳的情况下,把apk后缀名改成zip方法,在解压缩,获取到了更多的信息了 [color=rgba(0, 0, 0, 0.9)]使用idea再次进行搜索,终于在漫长的查询中发现了其加密的算法,果然是在js当中的。 [color=rgba(0, 0, 0, 0.9)]存在一个为secretKey的加密密钥,通过跳转也获取到了 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]懒得写python的脚本,直接丢给chatgpt,帮我写一下。 [color=rgba(0, 0, 0, 0.9)]gpt牛皮,面向gpt渗透不过目前还是有个问题,不知道是传什么样的值来做加密,主要因为菜看不懂js,调的层级太多了。 [color=rgba(0, 0, 0, 0.9)]想到了两种方法: 通过hook查看能不能获取到加密之前的信息 通过分析猜一下,会加密那些数据包信息
[color=rgba(0, 0, 0, 0.9)]测试方法一:因为我安装了现成的环境,使用xp框架配合Inspeckage来进行hook [color=rgba(0, 0, 0, 0.9)]首先打开Inspeckage,选择你要抓取的apk,然后打开目标的apk程序 [color=rgba(0, 0, 0, 0.9)]然后使用adb工具执行下面的命令adb forward tcp:8008 tcp:8008 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]打开你本机的127.0.0.1:8008 [color=rgba(0, 0, 0, 0.9)]要保证App is running: true Module enable: true都为true然后打开burp进行抓包,获取当前加密的sign值 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]获取到的为d3开头的,打开网页点击成on状态,然后查看hash [color=rgba(0, 0, 0, 0.9)]又陷入的坑里,发现并没有存在我想要的值,只能把最后的希望放到方法二了 [color=rgba(0, 0, 0, 0.9)]方法二:首先需要判断下这个sign有没有把head包也做了加密,还是只是data的数据一些数据。通过测试发现,更改cookie的信息和token都不会影响sign的认证,只有在改data里面的值会显示认证失败。那就好办了直接把data要发送的数据,放到py脚本中,进行加密,看看加密后的结果一不一致 [color=rgba(0, 0, 0, 0.9)] [color=rgba(0, 0, 0, 0.9)]奈斯 后言[color=rgba(0, 0, 0, 0.9)]这是本小白的第一次进行sign的逆向,中间遇到了很多挫折,绕过很多弯路,搞了好几天才成功,总体过程中也学到了很多知识点,只能说坚持就是胜利,成功就在眼前。
|