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

Frida+Objection绕过SSL pinning抓包_.net


4.连接adb

adb devices

查看adb连接状态

Frida+Objection绕过SSL pinning抓包_java_02


adb shell

获取手机的一个shell

getprop ro.product.cpu.abi

查看CPU版本,好去下载对应版本的frida-server

Frida+Objection绕过SSL pinning抓包_.net_03


可以看到是arm64架构,去https://github.com/frida/frida/releases

下载frida-server,注意看清楚frida的版本

Frida+Objection绕过SSL pinning抓包_.net_04


找到Android ARM64架构的server

Frida+Objection绕过SSL pinning抓包_java_05


解压后使用adb push到手机/data/local/tmp目录下

adb push frida-server-16.2.1-android-arm64 /data/local/tmp

Frida+Objection绕过SSL pinning抓包_java_06


再次进入adb shell,找到frida-server目录并chmod权限,然后运行

adb shell chmod 777 /data/local/tmp/frida-server

Frida+Objection绕过SSL pinning抓包_.net_07


此时计算机运行frida-ps -U看一下是否正常运行

Frida+Objection绕过SSL pinning抓包_.net_08


到此,frida已经成功启动。

此时,运行需要HOOK抓包的app,运行frida-ps -Ua

即可看到运行app的包名

Frida+Objection绕过SSL pinning抓包_java_09

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"

Frida+Objection绕过SSL pinning抓包_Java_10


成功后,objection就会自动对目标app所有单向认证的地方进行hook


注意:

如果出现APP打不开的情况,记得关闭frida-server ctrl + c

https://book.hacktricks.xyz/mobile-pentesting/android-app-pentesting/install-burp-certificate#android-14-zhi-hou

1. 确定被测APP的进程号,通过确认app包名,adb shell 下执行命令 ps -ef | grep 包名来确认进程号

adb shell

ps -ef | grep com.***

  1. objection -g 进程号 explore,agent injected and responds ok 就是成功了
  2. 再执行一条命令 android sslpinning disable 
  3. 切记;在测试其他关联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

Frida+Objection绕过SSL pinning抓包_.net_11