某银行抓包通杀脚本
原理
如图:App启动后在本地开了个代理,代理连接VPN,然后访问内网服务。
劫持原理
大概就是这么个图,懂的都懂。
Hook脚本与需要替换的文件
- 解包APK,替换libs文件
/lib/armeabi-v7a/libmintunnel.so(见附件)或者hook jni中的upstram_add方法,使其监听地址为0.0.0.0。替换文件的话,如果lib文件夹中有arm64-v8a文件夹,记得删除,因为这边给出的替换文件是32位的,没有修改64位的,在64位的机器上会优先使用64位的so。

- frida hook脚本如下,自己修改一下1-2行即可
var burp_host = "192.168.6.35" #替换成自己的局域网IPvar burp_port = 8080 # 替换成自己的端口function main() { if (Java.available) { Java.perform(function () { send("*********** hook start ************"); //启用日志 Java.use("your.app.package.helper.LogHelper").loggable.implementation = function () { return Java.use("java.lang.Boolean").$new(true); } //打印日志 Java.use("your.app.package.helper.LogHelper").debug.overload('java.lang.String', 'java.lang.String', 'java.lang.Throwable').implementation = function (str, str2, th) { Java.use("android.util.Log").d(str, str2); } //开启调试模式 Java.use("your.app.package.internal.common.preference.cipher.MXSharePreferenceEngine").isDebugEnable.implementation = function (context) { return true; } //过VPN检查 Java.use("your.app.vpn.MXAppTunnel").proxyEnable.implementation = function () { return true; } Java.use("your.app.package.MXKitConfiguration").isVpnEnable.implementation = function (context) { return true; } //http代理重定向到burp Java.use("your.app.vpn.utils.JVMProxyUtils").setProxyKitKat.implementation = function (context, str2, i) { send(["JVMProxyUtils setProxyKitKat", str2, i]) return this.setProxyKitKat(context, burp_host, burp_port) } // Webview代理重定向到burp Java.use("your.app.package.internal.core.proxy.WebViewProxy").setProxyKitKat.overload('android.content.Context', 'android.webkit.WebView', 'java.lang.String', 'int').implementation = function (context, webview, str2, i) { send(["WebViewProxy.setProxyKitKat", str2, i]) return this.setProxyKitKat(context, webview, burp_host, burp_port) } }); }}setImmediate(main);- 最后配置一下burp的上级代理为手机即可
快速排查
可以使用如下命令快速验证这个银行的app是否采用这种方案进行通信
adb shell curl baidu.com -x 127.0.0.1:10001成功返回百度页面就是采用该方案,端口不是绝对的,可以多去翻翻这个app的日志,可能会有端口信息。
其他
除了使用文件替换的方式,还可以在手机端使用TCP中继的方式直接将Burp的流量转发到127.0.0.1:1