前言
来自Ricordi..学员的app逆向破解签名的案例!
在写完解密脚本后发现存在签名认证所以我们需要进行绕过sign才能重发
然后我们修改数据包重发过后报错
这个时候呢我们就需要去逆向sign位置去绕过他,这里我们使用到hook方法中的排序定位去锁定sign函数被调用的位置,什么是排序定位呢?
排序定位(collections)
在APP应用程序请求数据时,为了确保数据不被篡改,通常会在请求参数加上一个sign签名算法,而这个签名算法一般使用消息摘要算法来进行加密,如MD5、SHA、MAC算法等。
一般APP应用程序在进行数据签名的时候,会先对数据进行排序。因为摘要结果不可逆,服务端需要根据接收到的数据来复现算法,以此来比对摘要结果。而排序可以保证不会因为参数顺序不同而导致摘要结果不同。
脚本如下:
Java.perform(function () {
varcollections=Java.use("java.util.Collections");
collections.sort.overload('java.util.List').implementation=function (a) {
varresult=Java.cast(a, Java.use("java.util.ArrayList"));
console.log("collections.sort List: ", result.toString());
showStacks();
returnthis.sort(a);
}
collections.sort.overload('java.util.List', 'java.util.Comparator').implementation=function (a, b) {
varresult=Java.cast(a, Java.use("java.util.ArrayList"));
console.log("collections.sort List Comparator: ", result.toString());
showStacks();
returnthis.sort(a, b);
}
})
functionshowStacks() {
Java.perform(function () {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
});
}
我们将这个脚本使用进行hook一下,看看效果
然后被com.******.online.http.RequestUtil.paraMap调用所有我们反编译去看一下
我们锁定到代码后使用frida打印一下看看
我们右键代码部分生成frida片段进行打印一下
打印代码如下
然后我们进行输入打印一下
我们输入的值确实传入了sign参数进行会话验证
我们发现他传入了addMap这个是一个HashMap的一个数据所以我们使用打印HashMap的方法去打印一下这个参数
脚本如下
TargetClass.exampleHashMapMethod.implementation=function (hashmap){
console.log("n直接打印hashmap结果:n"+hashmap);
//遍历 map
varmap=hashmap.keySet().iterator();
while (map.hasNext()){
varkeySet=map.next().iterator();
varvalueSet=hashmap.get(keySet);
console.log("n遍历map打印hashmap结果:nkey:"+keySet+"nvalue:"+valueSet);
}
//修改map
hashmap.clear();
hashmap.put("change","66666");
returnthis.exampleHashMapMethod(hashmap);
}
我们将这段代码中我们所需要的复制一下然后拿到我们的hook代码中遍历一下,注意我们需要将其中的hashmap改为源代码中的addMap
我们的打印结果如图,我们打印了在进行添加sign之前的账号,密码,时间戳等这些东西,这些函数和数据在源代码中也能看的出来是先获取addMap中的数据后在进行添加sign
代码中也说明了,我们也可以打印一下md5看一下
生成frida片段去登录打印一下md5函数进行处理后的这个字符串的值
在结果中也能看出来,将string这一段的字符串进行md5加密得到
所以我们要去提交我们修改过后的数据就需要进行这一步操作服务器才会接收我们的数据
签名绕过
为什么服务器会知道呢,因为开发人员也会同样的在后端配置相同的加密和方法去比对sign中的数据是否和出去sign值的参数拼接进行一次md5的加密判断是否相同,相同则认为数据包没有被篡改,否则判断存在篡改行为执行丢弃数据包。
所以我们需要将这两个数据都进行修改才能让服务接收,所以我们就去hook md5拦截md5的数据并篡改即可,将刚刚生成的hook md5的片段放到我们写的脚本中去,注意我们需要修改一下参数才能进行发送到python在联动burp
我们这里拦截了签名原文和加密后的原文数据包我们需要修改两次
我们将签名前的原文和签名后的原文都进行修改后服务器响应密码错误
至此我们的sign就绕过了并且服务器正常响应了我们修改后的数据
总结
感谢学员分享,已发kfc奖励。感兴趣的可以公众号回答回复"深情哥"进群,有公开课会在群里面通知,包括审计和src。edu邀请码获取也可以联系深情哥。
内部edu+src培训,包括src挖掘,edu挖掘,小程序逆向,js逆向,app渗透,导师是挖洞过30w的奥特曼,edu上千分的带头大哥!!!联系深情哥即可。
原文始发于微信公众号(湘安无事):app逆向-apk的sign签名绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论