相关文章推荐
乐观的西瓜  ·  Central Nervous ...·  1 年前    · 
讲道义的匕首  ·  excel vba 数据分析 - ...·  1 年前    · 
慈祥的针织衫  ·  DataGrip入坑记 - 掘金·  1 年前    · 

为什么我的APP数据包总是扒不到

1 年前

前几天我们给客户的APP集成了变现通道,但是谷歌怎么都不能抓到数据包,于是去网上搜索做了一些笔记整理给到了我们的工程师,并从中受益和获得启发。也发在这里供大家参考

在开发的过程中,http协议是主流的交互协议,抓包是必不可少的调试方式,如果你想抓取pc端或者app的http协议包, 提示网络异常或者 死活不走代理。接下来,我们来探讨下,同样都是http请求,app的包,为什么抓不到。

一、抓包原理

1.1、抓包方式

1.1.1、代理抓包

代理抓包的工具,这种方式思路相对简单,就是将http协议通过代理服务器进行转发,这样流量会经过代理服务器,因此在代理服务器中可以看到经过的流量包。常用的代理抓包工具有fiddler、Charles。

代理抓包是相对简单的一种抓包方式,这种方式非常容易绕过,很多app在设置代理服务器之后,会提示断网或者数据不经过代理服务器。这样可以使用VPN的方式进行抓包。

1.1.2、VPN抓包

了解VPN抓包时可以温故一下网络7模型。代理抓包是应用层的抓包,这样很容易绕过。但是VPN的方式是一个网络层的抓包。理论上来说VPN这种方式可以抓到更多的数据包。

1.2、为什么能抓取https的包?

不知道有没有想过,https不是加密的吗?为啥还能抓取到https的数据呢?事实上,没有绝对的安全。https同样可以绕过。之前写过一个https攻击的思路,有兴趣的小伙伴可以看一看。在抓包工具抓取https数据包时,用到的就是证书伪造攻击思路。

如上图,fiddler抓取https数据包大概的流程图。一般情况来说,在通过fiddler抓取https协议的时候必须要安装fiddler的根证书。安装成功之后可在证书列表中查看到如下信息。

在第6步时,fiddler会下发一个伪造的证书。因此在谷歌页面加载完成之后,点击谷歌的小锁子。可以看到证书的颁发者为fiddler。

上面的流程图有点复杂,它可以简化为下图:

  1. fiddler中间人伪造证书。将自己的公钥下发给浏览器。

2. 浏览器加密提交的数据fiddler就可以查看到明文数据。

3. fiddler再讲明文信息通过谷歌的公钥加密。

4. 这样谷歌就会误认为是浏览器提交上来的数据。

这里只展示了fiddler抓取https的原理,其实HttpCanary等市面上大部分抓取https都是这一个思路。

二、抓包工具介绍

2.1、PC端抓包工具

2.1.1、HTTP_Analyzer_V7

HTTP_Analyzer_V7是一个可以抓取进程包的工具。比如java进程如果在发送http请求的时候,fiddler是无法抓到的,这个时候可以通过这个工具进行抓取。

2.1.2、fiddler

fiddler是一个通过代理的方式抓取http协议包。这种方式经常用于抓取PC浏览器的数据包。可以认为是谷歌浏览器调试工具的加强版。

在app设置代理之后,也可以抓取app的包,不过现在很多app都设置了默认不走代理,因此这种方式非常容易漏包。这个稍后详细说明。

2.1.3、Charles

Charles 是一个 HTTP 代理/HTTP 监视器/反向代理,它使开发人员能够查看他们的机器和 Internet 之间的所有 HTTP 和 SSL/HTTPS 流量。这包括请求、响应和 HTTP 标头(其中包含 cookie 和缓存信息)。fiddler和Charles都是PC端的抓包工具,功能类似,但是Charles+postern有特殊的功能,这个下面有说明。

2.2、手机端抓包工具

2.2.1、HttpCanary

HttpCanary 是一个基于VPN的抓包工具,这是一款功能非常强大的手机抓包软件,可以帮你快速抓取你想要的包,一键快速抓包,轻松简单。

2.2.2、Charles+postern

Charles是一个PC的抓包工具,Postern是Android系统里一款非常流行的代理/ 虚拟专用网络管理程序,是一个Android下的全局代理工具,可以说是安卓版surge,它可以添加规则,屏蔽广告。通过这两个工具的结合,可以让Charles以VPN的方式抓包。

三、为什么有的app抓不到包?

3.1、不走代理型

在安卓开发时,发送一个http请求强制不走代理。此时没有安卓环境,我以java环境为例子。

public static void main (String[] args) throws IOException

{

// System.setProperty("http.proxyHost", "localhost");

// System.setProperty("http.proxyPort", "8888");

// // set https proxy

// System.setProperty("https.proxyHost", "localhost");

// System.setProperty("https.proxyPort", "8888");

try {

URL url = new URL(" baidu.com/ ");

// 创建代理服务器

Proxy p = new Proxy (Proxy.Type.HTTP,new InetSocketAddress ("localhost",8888));

HttpURLConnection conn = (HttpURLConnection)url.openConnection(Proxy.NO_PROXY);

conn.connect ();

InputStream in = conn.getInputStream();

String result = new BufferedReader(new InputStreamReader(in))

.lines().collect(Collectors.joining("\n"));

System.out.println(result);

} catch (Exception e) {

e.printStackTrace();

}

}

在一个HttpURLConnection对象创建时,可以设置这个请求强制走哪个代理或者强制不走代理。

如果在openConnection方法中设置Proxy.NO_PROXY,那么不管系统如何设置,这段代码都不走代理。

Proxy p = new Proxy (Proxy.Type.HTTP,new InetSocketAddress ("localhost",8888));

设置上面代码,则认为这个请求需要localhost的8888为代理。

如果app只设置了不走代理,那么想抓到这种包很简单,只需要通过一个VPN的抓包工具即可。HttpCanary即可轻松抓取。

3.2、证书锁定

证书锁定(SSL/TLS Pinning)提供了两种锁定方式:

l Certificate Pinning 证书锁定

l Public Key Pinning 公钥锁定

证书锁定

l 具体操作:将APP代码内置仅接受指定域名的证书,而不接受操作系统或者浏览器内置的CA根证书对应的任何证书。通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此移动端APP与服务端(例如API网关)之间的通信可以保证绝对的安全。

l 缺点:CA签发证书存在有效期问题,在证书续期后需要将证书重新内置到APP内。

公钥锁定

l 具体做法:公钥锁定是提前证书中的公钥并内置到移动端APP内,通过与服务器对比公钥值来验证连接的合法性。

l 优点:在制作证书密钥时,公钥在证书续期前后可以保持不变(即密钥对不变),所以可以避免证书有效期问题。

世界上没有绝对的安全,不管是证书锁定和是公钥锁定,只要对对应的锁定方法进行hook即可绕过。

但是要找到对应的方法非常的困难,而且还有一些加固型app、混淆型app、双向验证型app使得更加难以hook

4. 其他分析内容

(1)首先确认其他app包是否能够正常抓取,如果其他app能过正常抓包,请继续往下看。

(2)回顾一下手机抓包的流程,手机抓包是需要手机使用fiddle,charles,mitmproxy,packageCapture这些作为代理的app不能抓包的原因之一就是http客户端(也就是不能抓包的app)在检测使用了系统代理的时候,可以不使用系统代理,也就是请求不经过代理,自然而然你就在抓包工具上看不到请求等信息。

(3)针对(2)中的问题的解决方法就是在http客户端(也就是不能抓包的app)不使用系统代理的前提下,还能让请求经过抓包工具。可以使用drony或者proxydroid 或者是等vpn转发流量,也就是说请求在流量转发以后又经过了fiddle,charles这些代理,从而能过抓到数据,使用这两个软件需要手机root权限

(4)我在(3)中的问题搞定之后,如果发现仍旧不能看到抓包信息,请确定你的android版本,android7.0及以上,http客户端(也就是不能抓包的app)是可以指定只信任系统证书的,而charles,fiddle这类抓包工具的证书都是默认安装在用户证书下的,也就是无效的,这样的话charles,fiddle这类抓包工具就无法解密https,也就看不到报文,所以解决的方法就是将证书安装在系统目录下,需要通过ssl 命令对证书重新命名,然后将证书放在系统目录下,所以这一步是需要手机拥有root权限的,配合adb,贴几篇我参考的文章。

(5)如果(4)中的方法还不可以,那么原因可能在于ssl panning,大致意思是客户端只接受自己定义的证书,而不信任系统证书,建议搜索ssl panning了解一下,解决方法就是通过hook住系统函数来绕过证书验证。例如 xposed + JustTrustMe , JustTrustMe是xposed中的一个模块,他几乎hook了所以用于系统证书校验的函数,通过这种方法绕过证书验证。还有github上的objection,他是python的一个库,他的口号就是轻松绕过ssl panning,或者自己使用frida实现hook操作,当然这需要一定的时间成本。

(6)如果你的android 版本是7.0及其以上, 你安装的证书都是默认安装在用户目录下,而不是安装在系统目录下, 系统不信任你安装的证书,证书无效,导致charls, fiddle这类抓包工具无法抓包。解决方法是将charls证书移动到系统路径下,这个过程需要手机root, 我个人是通过Magisk的插件Move Certificates , 该插件每次开机会将用户证书移动到系统证书下. 或通过adb命令手动将证书放置在系统证书目录下

(7)还有就是一类SSL Panning的问题, 客户端会对证书进行校验, 简单粗暴的解决方法是 xposed 插件 JustTrustMe , JustTrustMe这个插件hook住了客户端校验证书的函数, 使得我们安装的证书被app所信任,从而能够正常抓包.

5. 生命中最美丽的样子的分析文章

(1)首先按照网上的配置修改手机的代理IP和端口

(2)修改fiddler/option下的各个选项(按照网上的设置即可)

(3)一切设置好了之后,一定要记得重启fiddler,否则就有可能出现各项设置都是正确的但就是抓不到包的情况

(4)重启之后,发现可以手机浏览器的访问可以在fiddler抓到数据了,说明配置正常运行,但是会发现app应用基本上抓不到数据,这是因为缺少证书

(5)证书的获取方法: 手机浏览器输入代理IP地址和端口(在输入地址前,fiddler上面需要在options/https/Decrypt HTTPS Traffic 进行勾选,否则无法下载到证书,另外也可以解决手机应用走https请求的时候fiddler上看到的是tunel to的现象)

6. spinchao的分析文章

(1)之前用fiddler能抓到一些软件的http请求,但是还是有一些软件确定是http还是抓不到。。设置肯定没有问题,网上各种说设置有问题。我也是检查好长时间,真是坑人。。最可恨的的应用明确 确定是http的, 明可以抓到一些应用,还说设置有问题。真是服了。换用charles照样,照样抓不到。。。。

(2)后来发现是由于一些app使用第三方的网络库,像retrofit okhttp,asychttpclint等等根本就是wifi直连,不走系系统的wifi设置,所以你设置代理,毛用没用,自然fiddler是抓不到的。知道了以后就好办了,电脑开一个热点,然后,抓网卡包,抓网卡包,抓网卡包就行了。。。用Wireshark来抓取网卡包就ok了,什么请求都丢不了了。。。。

(3)选择自己的网卡进行抓包,然后简历筛选,如指定 ip的请求。 ip.dst == xxx.xxx.xxx.xxx and http

发布于 2022-08-15 14:28