frida是一款基于python + java 的hook框架,可运行在android、ios、linux、win、osx等各平台,主要使用动态二进制插桩技术。frida官方地址https://frida.re/。有的APP会做一些奇怪的反代理检测,导致直接代理是抓不到APP的包的
frida环境配置
1、安装frida
pip install frida
2、安装frida-tools
pip install frida-tools
3、查看frida版本
frida --version
4.连接adb
adb devices
查看adb连接状态
adb shell
获取手机的一个shell
getprop ro.product.cpu.abi
查看CPU版本,好去下载对应版本的frida-server
可以看到是arm64架构,去https://github.com/frida/frida/releases
下载frida-server,注意看清楚frida的版本
找到Android ARM64架构的server
解压后使用adb push到手机/data/local/tmp目录下
adb push frida-server-16.2.1-android-arm64 /data/local/tmp
再次进入adb shell,找到frida-server目录并chmod权限,然后运行
adb shell chmod 777 /data/local/tmp/frida-server
此时计算机运行frida-ps -U
看一下是否正常运行
到此,frida已经成功启动。
此时,运行需要HOOK抓包的app,运行frida-ps -Ua
即可看到运行app的包名
adb reverse tcp:10086 tcp:10086,手机的wifi长按,进入高级选项,配置手动代理,127.0.0.1,端口10086,
burpsuite抓取端口也配置为127.0.0.1:10086,重启手机,可以看到burpsuite能够抓到http包,但是没有https。
需要安装证书到系统的信任根目录。
Android14 之前 将 下面的 .0 文件 移动到 手机的 /system/etc/security/cacerts 目录下,能够在手机的受信任安全凭据中
看到证书就OK,重启手机,可以看到抓到https,如果有sslpinning 的话,需要使用以下方法去简单关闭sslpinning;
objection
Objection是一款移动设备运行时漏-洞利用工具,该工具由Frida驱动,可以帮助研究人员访问移动端应用程序,并在无需越狱或root操作的情况下对移动端应用程序的安全进行评估检查。
安装objection
pip3 install objection
进行hook
objection -g 包名 explore -s "android sslpinning disable"
成功后,objection就会自动对目标app所有单向认证的地方进行hook
注意:
如果出现APP打不开的情况,记得关闭frida-server ctrl + c
1. 确定被测APP的进程号,通过确认app包名,adb shell 下执行命令 ps -ef | grep 包名来确认进程号
adb shell
ps -ef | grep com.***
- objection -g 进程号 explore,agent injected and responds ok 就是成功了
- 再执行一条命令 android sslpinning disable
- 切记;在测试其他关联app的时候,先把账号进行hook 关闭 sslpinning,也就是抓包需要知晓这个应用可能会跟其他应用的关联,继续关闭相关应用的sslpinning就可以了
脚本注入绕过SSL pinning
我们需要从下面下载注入脚本,我们将把这个脚本注入目标应用程序的设备
或者你可以将此代码保存为与adb相同的文件夹中的fridascript.js。
/*
Android SSL Re-pinning frida script v0.2 030417-pier
$ adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt
$ frida -U -f it.app.mobile -l frida-android-repinning.js --no-pause
https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/
UPDATE 20191605: Fixed undeclared var. Thanks to @oleavr and @ehsanpc9999 !
*/
setTimeout(function(){
Java.perform(function (){
console.log("");
console.log("[.] Cert Pinning Bypass/Re-Pinning");
var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
var FileInputStream = Java.use("java.io.FileInputStream");
var BufferedInputStream = Java.use("java.io.BufferedInputStream");
var X509Certificate = Java.use("java.security.cert.X509Certificate");
var KeyStore = Java.use("java.security.KeyStore");
var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
var SSLContext = Java.use("javax.net.ssl.SSLContext");
// Load CAs from an InputStream
console.log("[+] Loading our CA...")
var cf = CertificateFactory.getInstance("X.509");
try {
var fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");
}
catch(err) {
console.log("[o] " + err);
}
var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();
var certInfo = Java.cast(ca, X509Certificate);
console.log("[o] Our CA Info: " + certInfo.getSubjectDN());
// Create a KeyStore containing our trusted CAs
console.log("[+] Creating a KeyStore for our CA...");
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log("[+] Our TrustManager is ready...");
console.log("[+] Hijacking SSLContext methods now...")
console.log("[-] Waiting for the app to invoke SSLContext.init()...")
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {
console.log("[o] App invoked javax.net.ssl.SSLContext.init...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);
console.log("[+] SSLContext initialized with our custom TrustManager!");
}
});
},0);
我们将'fridascript.js'注入目标应用程序.
https://xz.aliyun.com/t/6102?time__1311=n4%2BxnD0DRDBDgiiDkCD%2Fia4BKP%2BYODaGQeD
I.将fridascript.js推入设备:
将fridascript.js复制到adb文件夹并运行以下命令将fridascript.js推送到设备中。
//adb push <path_to_fridascript.js_folder> /data/local/tmp
adb push C:\ADB\fridascript.js /data/local/tmp
II.检查并运行设备中的frida服务器
adb shell /data/local/tmp/frida-server &
这将把frida-server运行到设备中。也许你不会在终端获得这个命令的任何输出。
III.列出设备上的所有正在运行的服务
现在,我们需要找出目标应用程序的ID。我们将列出设备上所有正在运行的服务,包括您的申请流程
打开新终端并输入以下命令:frida-ps -U
将fridascript.js注入到目标应用程序中:
最后,我们将使用以下命令将fridascript.js注入到本机应用程序中:
//frida -U -f <your_application_package_name> <path_to_fridascript.js_on_your_computer> --no-paus
frida -U -f com.twitter.com D:\ADB\fridascript.js --no-paus