本篇博客旨在记录学习过程,不可用于商用等其它途径
app逆向抓包技巧:noProxy、vpn与sslpinning检测绕过
noProxy检测
场景
在WIFI
网络下设置Charles
代理
这个时候手机访问百度网址是可以抓到包的
访问猿人学2020
app却抓不到包
检测原理
⽤代理⽅式抓包容易被检测到,
System.getProperty("http.proxyHost")
,
System.getProperty("http.proxyPort")
这个app没有使用代理请求,所以使用代理模式无法抓到包
new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();
绕过方式
使⽤vpn
⽅式抓包,这里使用的是工具Postern
,vpn
抓包运⾏在⽹络层,相对代理抓包更加底层,意味着可以捕获更多的上层流量。
vpn检测
场景
打开目标app后发现提示网络不给力
且Charles无法抓到包
检测原理
- 判断网络接口名字包含
ppp0
或tun0
- 获取当前网络
Transpoart
字样
绕过方式
其实也是根据检测原理来绕过,使用Frida Hook
执行下面代码实现绕过
function hook_vpn(){
Java.perform(function (){
var String = Java.use("java.lang.String");
var NetworkInterface = Java.use("java.net.NetworkInterface");
NetworkInterface.getName.implementation = function (){
var result = this.getName();
console.log("find getName:", result);
if (result && (result.indexOf("ppp0") > -1 || result.indexOf("tun0") > -1)){
result = String.$new("rmnet_data0");
}
return result;
}
var ConnectivityManager = Java.use("android.net.ConnectivityManager");
ConnectivityManager.getNetworkCapabilities.implementation = function (arg){
var result = this.getNetworkCapabilities(arg);
console.log("find getNetworkCapabilities:", result);
return null;
}
Java.use("android.net.NetworkCapabilities").hasTransport.implementation = function(v){
console.log(v)
var res = this.hasTransport(v)
console.log("res hasTransport ==> ", res)
return false;
}
})
}
setImmediate(hook_vpn);
需要先运行好Frida
环境,然后执行frida -UF -l 代码脚本.js
,就能hook到运行中的app
这里刷新页面,重新加载就能绕过检测了
证书单向校验(sslpinning)检测
场景
在charles
抓包下,某斑马app在注册时发现点击登录毫无反应,看抓包结果提示SSL handshake with client failed
,确定是触发了SSL/TLS Pinning(证书锁定)
关闭charles
抓包后,再次点击登录可以看到有请求成功
检测原理
SSL/TLS Pinning(证书锁定)
,也叫作单向认证,其将服务器提供的SSL/TLS证书内置到移动端开发的App客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性。
Android7.0以上的系统版本,应用不再信任用户自己安装的用户证书,一般应用只信任系统预装证书或者是自身的内置证书,导致SSL/TLS Pinning(证书锁定)
,用charles或者fiddler无法抓取数据包。这种情况下,App会返回网络出错,且无法获取数据的信息
,也就出现了上面出现的情况了。
不过在需要查看发包情况时,就需要解决SSL/TLS Pinning了
绕过方式
降低系统版本
使用Android7.0以下的系统版本
将服务器证书添加到系统证书
这个需要能拿到服务器证书(比较麻烦),且要添加进系统级证书中(参考:Windows与Android实现Charles证书设置)。
采用Xposed框架和JustTrustMe模块或者sslunpining模块
这两个模块可以通过Xposed仓库下载或者GITHUB下载导入
GITHUB:JustTrustMe、sslunpining
以sslunpining
模块为例,开启之后需要重新打开app就能绕过检测了。
Frida Objection绕过
Objection
是基于 Frida
框架开发的一个工具,它提供了一组便捷的功能和脚本,以简化在移动应用程序中使用 Frida
进行动态分析和漏洞利用的过程。
安装:pip install objection
由于Objection
依赖Frida
,在运行Objection
前需要先运行Frida
启动命令:objection -g 包名 explore
题外话:如果不知道报名,可以打印当前activity
的信息查看包名adb shell dumpsys activity | grep packageName
使用Objection
控制app后,输入android sslpinning disable
后就可以绕过了。
hooker工具包
hooker是一个基于frida实现的逆向工具包。为逆向开发人员提供统一化的脚本包管理方式、通杀脚本、自动化生成hook脚本、内存漫游探测activity和service、firda版JustTrustMe、disable ssl pinning
下载地址:github
虽然项目不支持windows,我们只拿disable ssl pinning相关的脚本
使用js/just_trust_me.js
脚本hook也能绕过检测
HTTPS 修改为 HTTP
sslpinning是针对SSL证书校验,如果把https请求改为http就不会有这个问题了
- 替换 app 中 https 的 url 为 http,hook到net的url包修改请求请求url,这样charles就能抓到包了
- 但是改成http请求容易被服务后台检测到,所以需要使用charles map remote 建⽴映射规则,将 http 映射为 https 发包
题外场景
有些app进入后也会提示网络失败
或者内容更新失败
,比如某咨询app进去后提示以下信息
这个时候不能直接定位为被SSL/TLS Pinning
检测,需要结合抓包情况分析。根据抓包结果可以确定实际能法宝成功,只是响应结果failed了,实际原因是没有登录服务器没有返回数据,登录后就可以成功拿到数据了。
而像某新闻app进去页面便是以下情况
实际上也不是被SSL/TLS Pinning
检测了,根据抓包结果分析应该是进入页面前的请求返回的数据拦截了后续的发包请求,这种用上面的绕过方式是解决不了的,需要看它返回的内容根据情况做反检测处理。
证书双向校验
证书双向校验是指APP除了校验服务端的证书,服务端还会校验APP的证书。
双向认证需要完成两个环节:
让客户端认为Charles是服务端
这一步其实就是破解Certificate Pinning,方法和“APP自己校验证”书过程完全相同。
让服务端认为Charles是客户端
这一步需要导入客户端的证书到Charles,客户端的证书一定会存在本地代码中,而且还可能会有密码,这种情况下需要逆向客户端app,找到证书和密码,并转为pkcs12格式导入到Charles。
这篇博客讲解很详细,我就不再献丑了
扯一扯HTTPS单向认证、双向认证、抓包原理、反抓包策略