渗透测试之浅谈APK数据包解密

一、 前言

在渗透测试的过程中,越来越多的APP开始对数据报文进行加密传输。本文主要对渗透测试过程中解决APP数据报文加密的原理及方案进行一个简单的介绍。希望能帮助到各位大佬。

APK数据包解密的核心原理,,可以简单的理解对app源码中加解密函数的定位以及Frida和python脚本的编写。理解原理以后剩余的操作基本就是各种工具的综合利用,以及简单脚本的编写。本文的三四五章节讲述的便是工具的使用和基本的代码框架。

本人菜鸡,还望大佬勿喷。

二、环境准备

1、测试机

首先还是建议有条件的大佬买一个Pixle手机并Root,一代或者二代就可以。
当然也可以选择使用模拟器,这里推荐一个笔者常用的模拟器配置

https://machao629.github.io/2022/01/15/%E5%AE%89%E5%8D%93%E6%A8%A1%E6%8B%9F%E5%99%A8%E8%AE%BE%E7%BD%AE/

当然也可以选择其他型号的手机或者模拟器,但是相对谷歌的亲儿子来说,暗坑可能会多一些。

这里需要着重注意的一点是:手机一定要是Root的

2、Jadx

jadx是一款APK的反编译工具

https://github.com/skylot/jadx

3、Frida

建议对Frida的还不是很熟悉的大佬,可以多了解一下,破解Apk加解密的核心还是在Frida这里。关于Frida的环境搭建在此不做过多叙述。不太了解的大佬建议自行百度。这里推荐一个Frida的新手学习Blog

https://11x256.github.io/

4、Objection

Objeciton 可以理解为一个Frida的集合工具。在Frida写多行代码才能实现的功能在Objection中可以用几行命令代替,非常的方便。直接使用pip安装即可

pip install Objection

关于Objection的具体使用会在后面的章节详解。

三、定位函数

接下来正式进入APK加密破解的核心-定位函数。

定位函数主要分为两种:

  • 静态分析:多用于APK未加固或加固APK可脱壳的情况,既可以看到APK的源码。
  • 动态分析:APK加固且无法脱壳,既无法看到APK源码的情况。

定位函数的核心原理便是根据关键字对APK代码(静态分析)或内存(动态分析)中的类和方法进行匹配过滤。然后通过hook来判断匹配到的类是否是加解密类。

因APP开发者多会使用一些公开的加密库来对数据包进行加密,因此通过关键字来对加密方法过滤的成功率比较高,而且即使存在混淆也可以通过其他的关键字进行定位。

常用关键字:

  • RSA、AES、SM、encrypt、decrypt、ypt、DES等等。。

1、静态分析

静态分析主要是在未加固或加固脱完壳后的反编译代码中进行分析。

1.1、脱壳

对于渗透测试人员来说,脱壳是一个薄弱项目,这里分享两个大佬写的脱壳工具。对于使用脱壳工具脱不下的壳,建议使用动态分析来定位加解密方法位置。

https://github.com/hluwa/FRIDA-DEXDump

在手机上打开APP,启动Frida以后直接运行 python main.py即可。

https://github.com/hanbinglengyue/FART

寒冰大佬的脱壳机,有兴趣的大佬可以自行研究下,也有其他大佬开发的脱壳机非常不错,建议感兴趣的大佬自行研究。

使用以上两种手段or一种手段脱不下来壳的APP建议采用动态分析。

1.2、定位位置

我们使用Jadx打开我们APK或脱完壳后的dex文件。使用全局搜索功能对我们上述提到的关键字进行搜索

1处便是全局搜索功能,在2处输入需要过滤的关键字,3处便是对Demo过滤的结果。
此处我们看我们过滤出来的四个类

com.ese.http.encrypt.AesEncryptionHex
com.ese.http.encrypt.Base64Utils
com.ese.http.encrypt.AesEncryptionBase64
com.ese.http.encrypt.MD5Util

1.3、 确定位置

这里我们使用Objection来确定我们要寻找的加解密的方法在上述那个类中。

Objection 提供了一个方法可以对一个类下面所有的方法进行Hook,当APP在运行过程中调用了我们Hook的类中的方法时,便会在终端中打印出来。

android hooking watch class 类名

此时我们在App中点击某些功能点,使APP调用加解密函数。此时我们就可以在终端中看到App调用的加解密函数

这里我们就看到APP在运行过程中调用的app的加解密方法。
接下来我们通过Objection来对这几个方法进行hook,通过获取输入输出值来判断其是否是APK的加解密方法。命令如下:

android hooking watch class_method 类名+方法名 --dump-args --dump-return

在这里我们就看到我们明文传入的值,以后明文返回的值。说明成功定位到加解密函数。

当然以上所有的功能我们也可以使用Frida脚本去实现,只不过相对于Objection来说相对繁琐,再次就不做过多叙述了。

2、动态分析

在APP在运行过程中,app执行了某个类,便会把该类加载在内存中,此时我们在内存中通过关键字对加载进内存中的类进行过滤匹配。也可以定位加解密类。相对于静态分析,动态分析过滤出来的类更加准确。

2.1、Objection

我们使用Objection对内存中类的进行关键词过滤,命令如下:

这里可以看到过滤出来的三个类,然后如何根据过滤出来的类进行定位加解密可以参考上面的1.3小节。

2.2、ddms

在某些Objection不好使的情况下,我们可以使用DDMS。DDMS默认集成在SDK中,一般下载完成SDK中可以在…/tools/目录中找到,或者使用Everything搜索monitor.exe也可找到。

DDMS的“ Start Method Profiling ”功能可以对app运行过程中调用的所有方法进行记录,我们在结果中对关键字进行搜索过滤即可。

使用DDMS首先要开启手机全局可调试,需要手机安装Magisk
然后在cmd中执行以下命令即可:

adb shell //adb进入命令行模式
su //切换至超级用户
magisk resetprop ro.debuggable 1 //设置debuggable
stop;start; //一定要通过该方式重启

然后打开DDMS

在1处会出现所有可调试的APP,我们点击我们需要调试的APP,然后再点击2处。然后再弹出的框中选择OK

然后我们在App中点击某些功能点,使APP调用加解密函数。然后我们在点击一下2处。

此时弹出的框中便显示出来再刚刚两次点击之间APP调用的所有方法。我们在Find处输入关键词,便可实现对类的搜索过滤。对搜索出的方法我们即可采用1.3小节中的方法进行hook确认即可。

2.3 小脚本

此处分享一个Frida小脚本,通过对执行包名关键词和加解密关键词对内存中的类进行过滤和枚举出类的所有方法。

//对加解密函数进行定位,核心原理还是通过关键词对类名进行过滤,
//正常情况下,开发人员会调用Java公开的类对程序进行加解密,调用Java提供的公开类便会存在一些特征
//一半常见的特征比如:crypt/cypt/AESHelper/base64/Sm4Utils/等等等等
//使用方法:将14行修改为包名关键词,将16行修改为尝试的特征值
//不适用于混淆的情况,hook前应保证加密或解密函数已经被加载进内存中。
function hook7(){
console.log("hook7")
var encrypt_function = []
Java.perform(function(){
Java.enumerateLoadedClasses({
onMatch:function(name,handle){
for(var i =0; i< name.length; i++ ){
var Stringname = name.toString()
if(Stringname.indexOf("hrb")>=0){ //修改为函数的包名
// console.log(Stringname)
if(Stringname.indexOf("AES")>=0){ //修改定位关键词
encrypt_function[i] = Stringname
}
}
}
},onComplete:function(){
}
});
})
var function1 = unique(encrypt_function)
console.log(function1.length)
console.log("1234",function1)
Java.perform(function(){
for(var i=0;i < function1.length; i++){
var encrypt_name = function1[i].toString()
var AesEncryptionBase64 = Java.use(encrypt_name)
var all_mothds = AesEncryptionBase64.class.getDeclaredMethods()
console.log("--------------------程序使用的加密类如下------------------------------------")
for(var j = 0;j<= all_mothds.length;j++){
console.log(all_mothds[j],"\r\n")
}
console.log("---------------------遍历类结束---------------------------------")
}
})
console.log("over")

}
function unique (arr) {
return Array.from(new Set(arr))
}

setTimeout(hook7,1000)

修改完两个关键词直接使用Frida注入即可。运气不错的话会直接打印出枚举出来的方法,即可使用上面1.3小节的方法确定即可。

3、图形化工具

基于上面讲到的原理,有很多的大佬开发了图形化工具,在此仅作推荐,不做过多讲述,有兴趣的大佬可以自定百度。

https://www.t00ls.cc/articles-51070.html

https://github.com/hluwa/ZenTracer#

4、To BurpSuit

目前有很多大佬开发了很多优秀的工具在做To Burpsuit这步,因为每个工具的脚本规则以及原理各不相同。在这里我就只做简单的介绍,具体的用法还请各位大佬自行百度。

(1)Brida

https://xz.aliyun.com/t/7562

关于Brida的使用可以看上面那位大佬的文章,Brida的本质还是在Burpsuit插件中执行Frida的js代码。如果熟悉了Frida的话,学习起来不会太难。

(2)Burpy

https://www.anquanke.com/post/id/206430

比较有优秀的一个工具,核心原理是在Burpsuit插件中执行python代码,然后通过python来调用Frida的代码。上手的话需要了解python如何执行frida的代码以及frida-rpc的用法。

(3)Frida

我们也可以使用Frida对数据直接进行修复,好处是上手快。如果app有证书校验之类的防护手段可以直接pass。缺点是测试不够全面。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值