安全矩阵

 找回密码
 立即注册
搜索
查看: 664|回复: 0

实战|一次APP密文Hook获取明文数据

[复制链接]

252

主题

252

帖子

1309

积分

金牌会员

Rank: 6Rank: 6

积分
1309
发表于 2023-3-17 22:16:33 | 显示全部楼层 |阅读模式
原文链接:实战|一次APP密文Hook获取明文数据


在APP测试过程中,可能会遇到各种阻碍,如:
  • Root检测,不能在root手机进行测试。
  • 代理检测,无法代理抓包。
  • 证书强校验,会出现“网络连接错误”等提示信息。
  • 请求包的body部分被加密,使用AES、RSA等等。

那么在遇到这些情况的如何去应对?
目前比较好用的方法是Hook抓包,绕过一些检测校验。(逆向加密算法成本太高,比较费时间,这里加密函数是在native层的。)
本文将讲述APP在密文通信下,通过hook手段看到明文数据。
1.请求包密文参数hook:
打开某APP,登入抓包发现数据加密处理了,想办法搞明文:
使用app查看工具查看apk是否加固,最终验证是360加固。
然后使用了脱壳机进行脱壳,脱壳机拖出了很多dex文件,最终目的是想知道 “明文”、“密文”相关的函数在哪个dex文件(仅展示部分文件)。


下一步思考,进行简单的定位,分析请求包的body部分,观察iv参数,很像base64编码。
尝试使用base64解码,解码后的数据为 “5b567f680892474e”,这数据可能是AES算法的IV,十六进制的。
既然body的iv部分使用了base64编码,下一步立马想到对“某APP”进行base64的hook,因为他的request请求体部分肯定调用了base64加密,js代码如下:
  1. Java.perform(function () {
  2.     function showStacks() {
  3.         console.log(
  4.             Java.use('android.util.Log').getStackTraceString(
  5.                 Java.use('java.lang.Throwable').$new()
  6.             )
  7.         )
  8.     }

  9.     var base64 = Java.use("android.util.Base64");
  10.     base64.encodeToString.overload('[B', 'int').implementation = function (a,b) {
  11.         showStacks();
  12.         console.log("base64.encodeToString: ", JSON.stringify(a));
  13.         var result = this.encodeToString(a,b);
  14.         console.log("base64.encodeToString: ",result)
  15.         return result;
  16.     };
  17. });
复制代码

Hook的结果,确实调用了android内置的base64方法,但是,结果和iv的不一样。进一步分析,他这个的base64是请求体cookie里面部分数据的base64结果,不是body部分的,所以加密和这块无关。
但是这一部分有价值,他的调用栈显示了整个调用过程,分析调用栈有个 “encryption” 字眼,第一印象,这估计就是加密函数,所以,下面根据调用栈的类名,定位脱壳后的dex文件(为什么要定位dex?因为脱壳后的dex文件太多,无法准确定位功能点)
通过上图调用栈,将encryption的类名进行全文搜索,关联到是5856160这个dex文件:
然后用jadx分析这个dex,发现都是方法a的重载
直接用objection批量hook,发现是调用了2个a方法,一个参数是“[object Object]”,另一个是“int, java.util.Map”:
针对上述两个方法进行hook,编写hook脚本:
  1. Java.perform(function () {
  2.     var name = "com.xxx.xx.util.encryption.c";
  3.     var encrypt = Java.use(name);
  4.     encrypt.a.overload('java.util.Map').implementation = function (obj) {
  5.         console.log("parameter is : ", JSON.stringify(obj));
  6.         var retval = this.a(obj);
  7.         console.log("1 return value : ",retval);
  8.         return retval;
  9.     };

  10.     encrypt.a.overload('int', 'java.util.Map').implementation = function (num, map) {
  11.         console.log("first parameter : ",num);
  12.         console.log("second parameter : ",JSON.stringify(map));
  13.         var retval = this.a(num, map);
  14.         console.log("2 return value : ", retval);
  15.         return retval;

  16.     };
  17. });
复制代码

然后运行打印,验证一下,一个是明文数据,一个是密文数据:

分析过程到此结束,即可看到明文数据。
2.响应数据hook
再进一步分析,然后发现com.xxx.xx.h.a方法有响应内容输出:
进入com.xxx.xx.h.a方法:
然后反编译dex文件,发现response关键字眼,代码中是将内容放入af的c方法中,下面看看af是什么:
发现af好像是kotlin的有一个底层库:(af是混淆后的名字)
然后用objection打印参数查看,确实有响应包的数据,下面直接hook这个kotlin模块:
编写hook脚本:
  1. Java.perform(function () {

  2.     var name = "com.xxx.xx.util.encryption.c";
  3.     var encrypt = Java.use(name);
  4.     encrypt.a.overload('java.util.Map').implementation = function (obj) {
  5.         //console.log("parameter is : ", JSON.stringify(obj));
  6.         var retval = this.a(obj);
  7.         send(retval);
  8.         var tmp;
  9.         var op = recv('python_send', function(value) {
  10.                 console.log("修改完的数据:", value.payload);
  11.                 tmp=value.payload;
  12.                 return value.payload;
  13.             }).wait();
  14.         //console.log("op: ",op);
  15.         return tmp;

  16.     };

  17.     var response = Java.use("kotlin.jvm.internal.af");
  18.     response.c.overload('java.lang.Object', 'java.lang.String').implementation = function (obj, s) {
  19.         var r = s.indexOf("try");
  20.         //console.log("r = ", r);
  21.         if (r!=-1) {
  22.             console.log("result is ",)
  23.             console.log("one param is ", obj);
  24.             //console.log("two param is ", s);
  25.         }

  26.         var retval = this.c(obj,s);
  27.         return retval;

  28.     };

  29. });
复制代码

这里hook脚本js和python脚本联合,将请求发送到burpsuite,再通过burpsuite将修改后的数据回调进app进行后序操作,如下图:
正常的请求过程
Hook的过程:
这个过程中需要一个中转服务器,一个和burpsuite通信的脚本:(其中hook的语句写入了通信脚本里面,让其自动加载进去)。最终控制台输出明文数据。
测试截图:












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 23:59 , Processed in 0.013714 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表