此文章只为学习而生,请勿干违法违禁之事,本公众号只在技术的学习上做以分享,做一个APP渗透测试小技巧的分享,所有行为与本公众号无关。
sdfd
01
前置小絮
平时阿呆做金融项目直接反编译一波加壳直接不看,问就是安全。直到某安信的一个红队大牛需要对某金融机构进行授权的渗透测试,阿呆小小跟着看了一下询问了几个点后,发现APP渗透可以速通。当然阿呆没有内网环境就找了个差不多应用的看看并未进行渗透测试,后发现可以通杀。只能说稳了,又稳了。(阿呆后续只放个脱敏脱的死死的demo,自己去研究自己需要测试的APP把)
02
痛点1:环境检测
过Root检测:阿呆刷的Apatch框架,还有狐狸面具、KSU框架都可以过root检测(这些框架都是白名单放行root,不容易被检测,KSU和Apatch是内核Root)这个自己研究一下。
过Frida检测:阿呆用的hluda,葫芦娃大佬的去部分Frida特征的Server(https://github.com/CrackerCat/strongR-frida-android),有的呢检测Frida监听端口改端口就行,但是要是还是过不了,阿呆只能安全了。
过代理检测:阿呆有PlanA和PlanB,PlanA用SSLUnpinning脚本,PlanB用算法助手Pro,可以组合SSLUnpinning和自己的Hook脚本进行同步抓包和Hook,也可以用算法助手Pro过掉代理检测然后自己启Frida进行操作(不过多次测试应用容易崩溃)。
抓包代理软件:阿呆用的Tun2Socks(谷歌商店直接下),比之前几个不更新的代理APP好用多了,当然直接Wifi代理也可以。
03
痛点2:快速定位加密方法
因为是金融项目,加密方法必然用到国密,就算其他许多加密也会用到一个很关键的方法:String.getBytes()。
所以我们直接HOOK住String.getBytes()即可通杀。
function showStacks(){
var Exception = Java.use("java.lang.Exception");
var ins = Exception.$new("Exception");
var straces = ins.getStackTrace();
if(undefined== straces ||null== straces) {
return;
}
console.log("============================= Stack strat=======================");
console.log("");
for(var i =0; i < straces.length; i++) {
var str =" "+ straces[i].toString();
console.log(str);
}
console.log("");
console.log("============================= Stack end=======================\r\n");
Exception.$dispose();
}
function getBytes(){
Java.perform(function(){
var str = Java.use("java.lang.String");
str.getBytes.overload().implementation =function(){
var result =this.getBytes();
var newStr = str.$new(result);
console.log("str.getBytes result: ", newStr);
showStacks();
return result;
}
str.getBytes.overload('java.lang.String').implementation =function(a){
var result =this.getBytes(a);
var newStr = str.$new(result, a);
console.log("str.getBytes result: ", newStr);
showStacks();
return result;
}
})
}
然后找到我们的原始数据,然后找到调用栈进行尝试性HOOK,多HOOK几个栈即可找到原始加密函数。
第一步:启动Frida Server:
第二步:组合HOOK脚本,将上面的脚本结合过代理检测的SSLUnpinning为一个js,如下:
第三步:开启VPN代理:
这里有个意识性问题不是非得直接代理用脚本过,我们可以正常启动APP之后然后用脚本启动Hook,然后开启代理,这样可以直接-F去HOOK当前启动的无需再从启动开始Hook。
第四步:抓包与Hook:
(这里show的是登录模块手机号收验证码)
然后进入我们记录结果的result.txt里面直接搜索我们输入的手机号13100000000
后续经过验证encryptData就是加密方法,然后RPC就完了。
03
痛点3:脱壳
并不是所有项目都需要脱壳,只需要HOOK到关键的加解密方法进行RPC调用即可,当然脱壳会让我们看起来更快。
这里只针对某梆企业版(城商行特别喜欢用),有一个项目可以直接脱,完全不要脑子:
https://github.com/hluwa/frida-dexdum
上MT管理器,看到这个就知道,欧了。
不过我不是很理解,为什么22年的项目可以脱24年的壳,但是跪拜葫芦娃大佬就完事了。
然后我们需要做什么?
# 先安装
pip install frida-dexdump
# 再点开要脱壳的APP,多点几下功能,有的dex可能不是开启即加载的
frida-dexdump -U -F -o PC本地文件夹路径
然后脱下来的所有dex文件会在你设置的文件夹目录下。
稳了!安服仔们又稳了!
然后把dex全选拖进jadx-gui里面可以直接读,也可以用脚本合并dex并反编译:
import os
import sys
# 使用方法
# python3.7 merge_dex.py ./file/ livedex
if __name__ == "__main__":
if len(sys.argv) < 3:
print("start error")
sys.exit()
print(sys.argv[1], sys.argv[2])
path = sys.argv[1] # #文件夹目录
files = os.listdir(path) # 得到文件夹下的所有文件名称
s = []
for file in files: # #遍历文件夹
if file.find("dex") > 0: # #查找dex 文件
sh = 'jadx -j 1 -r -d ' + sys.argv[2] + " " + path + file
print(sh)
os.system(sh)
目录关系如上,然后进行调用即可:
python batch.py dex文件夹 反编译文件夹
然后进file文件夹里的source文件夹看就行了,这里我就不执行完了,电脑比较垃圾风扇呼呼。