抓包是流量分析的基础,也是安全研究重要的一环。抓包软件有很多种,如 Burpsuite、mitmproxy 以及 Fiddle,抓包方式常见的有设置系统代理、AP 热点抓包、透明代理等。不同方式有不同优缺点,也有不同的应用场景。相信很多安全研究者一定会遇到各种无法抓取流量的问题,本次就来简单总结一下 Android 环境中常用的抓包技术,包括一些应用常用的 SSLpinning、不走系统代理等对抗逆向技术。

这里不会重复搬运大部分博客已经总结过的抓包原理和经验,主要是想总结一下如何抓取任意应用的流量包,按照常规思路,假设现在我们想抓取某个应用的流量。

本文总结了如下 4 种抓包方案:

  1. 设置系统代理,即传统中间人代理方法
  2. 利用 iptables 三层网络流量路由
  3. r0capture HOOK 抓包
  4. eCapture ,基于 eBPF 技术实现的抓包软件

1 设置系统代理

设置系统代理是最为常见的一种方法,Android 提供了相应的设置功能,将系统代理指向 Burpsuite 所在的 IP 地址,即可使用 Burpsuite 抓取流量。抓包步骤如下:

  • 将 Burpsuite 证书导入 Android 设备
  • 在 Android 设备上设置系统代理
  • Burpsuite 设置本机代理,进行抓包
  • 绕过 SSL Pinning (如果需要的化)

这种方式可以解决部分应用的抓包问题,但是如今很多应用使用了 SSL Pinning,即证书绑定,应用只会信任自己本地绑定的证书,并不会信任系统根证书,也就是即使导入了 CA,仍然可能无法抓包。

OWASP 安全验证标准中,将对抗逆向称之为韧性要求,属于额外的管控方法,根据应用敏感性,开发者选择需不需要添加。而 SSL Pinning 就属于对抗逆向的一种手段。

2 利用 iptables 设置透明代理

尽管绕过了 SSL pinning,仍然有可能无法抓到 App 的流量,这是因为应用开发者完全可以不使用系统或其他的 HTTP 库,不理睬系统变量如 HTTP_PROXY,也就是应用不会理会我们设置的系统代理。这个时候就可以使用终极方法了,iptables + Burpsuite 透明代理,步骤如下:

  • 将 Burpsuite 证书导入 Android 设备
  • 使用 iptables 进行流量转发
  • 设置 Burpsuite 透明代理
  • 绕过 SSL Pinning (如果需要的化)

iptables 是一个在应用层实现内核框架 Netfilter 的工具,常见于防火墙配置,而 Netfilter 是内核处理网络数据包的模块。

通过如下命令,即可将内核 OUTPUT 数据转发到我们的目标设备上。

D:\> adb shell iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination 127.0.0.1:8080

此时再利用 adb 反向代理功能,将 Android 手机某个网卡流量通过 adb 的方式转发到我们使用的 PC 上。

D:\> adb reverse tcp:8080 tcp:8080

设置 Burpsuite 透明代理即可抓包。

当然,也可以指定抓包特定应用,加入如下 iptables 参数即可

-m owner --uid-owner 4000

参数简介

iptables [-t table] {-A|-C|-D} chain rule-specification
-t nat,设置iptables表为网络地址地址转发
-A Append,附加后续规则到相应的表上
chain, PREROUTING/INPUT/OUTPUT/POSTROUTING,来源于内核中的Netfilter模块,OUTPUT表示所有从本地发往远端的数据包
rule-specification, -j DNAT, 修改数据包的目标地址

adb reverseadb forward 的区别就是,前者是反向代理,后者是正向代理,前者是将所有手机流量导入到 PC,后者是将所有 PC 流量导入到手机。

关于 iptables 的原理以及更多配置,透明代理入门,iptables在Android抓包中的妙用 等文章已经给了很好的解释,不再赘述。frida-skeleton 就是一个典型的使用 iptables 抓包的工具,但是如果只是抓包,可能用不到 skeleton,且此工具在不同环境下兼容性一般,可能会出现一些奇怪的问题。

3 r0capture hook 抓包

r0capture 是一个典型的通过 hook SSL 类库实现抓包的工具。既然是 hook,离不开 Frida。

下载脚本

git clone https://github.com/r0ysue/r0capture.git

Attach 模式

python3 r0capture.py -U com.qiyi.video -v -p iqiyi.pcap

Spawn 模式

python3 r0capture.py -U -f com.qiyi.video -v

经过实际测试,虽然工具声称是安卓应用层抓包通杀脚本,无需考虑证书,但是还是有很多厂商的应用数据包无法解密。

4 基于 eBPF 技术实现的 eCapture

同样,eCapture 也是一个无需 CA 证书抓 https网络明文通讯的工具。直接下载编译好的二进制,放到 Android 设备上,即可使用。

./ecapture tls -i eth0 -w pcapng -p 443

由于 eCapture 基于 eBPF,需要内核支持该特性,依赖系统内核是否支持 eBPF。目前支持在操作系统上,支持了 X86_64\ARM64 的 Linux kernel 4.18以 上内核,支持了 ARM64 Android(Linux) kernel 5.4 以上版本。

绕过 SSL Pinning

在设置系统代理抓包无果后,需要继续尝试 SSL Pinning 绕过。绕过证书绑定并不难,但是需要有系统 root 权限,使用 Frida 对相应校验证书的函数进行 Hook。已有多个现成的 Frida 脚本 可以解决此问题,以下是一个简单示例。

// $ frida --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida -f YOUR_BINARY
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 InputStreamconsole.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 CAsconsole.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 KeyStoreconsole.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);

当然,笔者正常使用的方法是在 Linux 环境中,直接使用 objection,已经集成了绕过 SSL pinning 等多个有用的 Frida 脚本,两行脚本搞定 SSL Pinning。

objection -g com.android.phone explore
Using USB device `Android Emulator 5554`
Agent injected and responds ok!_   _         _   ____| |_|_|___ ___| |_|_|___ ___
| . | . | | -_|  _|  _| | . |   |
|___|___| |___|___|_| |_|___|_|_||___|(object)inject(ion) v1.11.0Runtime Mobile Explorationby: @leonjza from @sensepost[tab] for command suggestions
com.android.phone on (Android: 11) [usb] # android sslpinning disable

总结

不同抓包方案各有利弊,如果你只是想抓所有应用的 HTTPS 报文,使用 iptables 路由转发可以解决绝大多数 HTTPS 抓包问题,且没有环境依赖;如果你拥有最新版本 Android,内核大于 5.4,那么可以直接使用 eCapture;如果你还想抓其他应用层协议报文,例如 Smtp,那么可以使用 r0capture。方案对比如下

抓包方案 HTTPS 其他应用层协议 上手难度 依赖工具 缺点
设置系统代理 部分 不支持 容易 Burpsuite 某些应用不使用系统代理,无法抓包
iptables 路由转发 全部 不支持 容易 Burpsuite
r0capture hook 抓包 部分 支持 容易 Wireshark 数据包部分混乱,缺失
基于 eBPF 技术实现的 eCapture 全部 不支持 容易 Wireshark 需要高版本内核支持

撰写本文最大目的在于,让我们快速掌握任意 Android 应用的抓包,因为现实场景中,往往会遇到常规方法无法抓包的问题。而只需要通过 iptables 即可解决绝大多数问题。除了设置系统代理、iptables路由转发,还可以通过 tcpdump + keylog 以及 SSL read/write 的方式,但是这两种都需要 Hook,因此,对于大多数安全研究者来说,掌握 iptables 设置透明代理的方式就足够了。

参考文献

  1. 终端应用安全之网络流量分析
  2. 快应用调试器研究1:前置知识
  3. 透明代理入门
  4. iptables在Android抓包中的妙用
  5. android手机安装burp证书
  6. 从原理到实战,全面总结 Android HTTPS 抓包
  7. Frida CodeShare

快速掌握任意 Android 应用的抓包相关推荐

  1. 关于fi dd ler 手机抓包 网卡地址地址_ApkCrack 一键生成支持 Android 7.0 抓包的 apk...

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:星星y 链接:https://www.jianshu.com/p/44923e658f47 声明:本文已获星星y ...

  2. 如何使用charles对Android Https进行抓包

    2019独角兽企业重金招聘Python工程师标准>>> 如何使用charles对Android Https进行抓包 博客分类: 搜索引擎,爬虫 原理 man-in-the-middl ...

  3. Fiddler学习之——对Android应用进行抓包

    Fiddler做为实用的http抓包工具,它的原理是在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应,因此,它比一般的firebug或者是chrome自带的抓包工具要好用的多 ...

  4. Android 免 root 抓包简易教程

    目录 概述 不同版本 Android 的策略 抓包局限 手机虚拟机简介 信任证书 导出证书 计算证书哈希值 .pem 等格式 .crt/.cer 等格式 将证书放入到 system 的对应路径下 抓包 ...

  5. Android App无法抓包的解决方案总结

    原文链接 干货|Android App无法抓包的解决方案总结 如果对文章感兴趣,可以扫一扫微信二维码关注作者的微信公众号,后续会推送更多干货文章,感谢您的支持.

  6. Android 过反抓包总结入门篇

    Android 过反抓包总结入门篇 做协议分析少不了抓包,但是对于新入门我们来说,这是一大难题,网上各种各样的工具不少.但是如果遇到反抓包,那就芭比Q了.但是一些简单的反抓包机制还是很好过的. 1.要 ...

  7. Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary

    市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...

  8. android 抓包 okhttp,Android端App抓包小工具[okhttp_poker]

    Android端App抓包小工具[okhttp_poker] Android端App抓包小工具[okhttp_poker] OkHttpLogger-Frida Frida 实现拦截okhttp的脚本 ...

  9. android指定app抓包 无需root

    实现原理 windows开启代理服务器. 手机使用全局代理(所有协议都能抓取)app对指定目标app进行代理, 连接到同网段下的windows主机. windows使用抓包软件通过IP过滤或软件过滤实 ...

最新文章

  1. java jdk下载过慢 解决方案
  2. 计算机组成原理随笔(一)
  3. matplotlib的优点_超详细matplotlib基础介绍!!!
  4. python分词_Python 结巴分词实现关键词抽取分析
  5. 关注电子商务网站中的消费信赖和消费安全感
  6. 线程wait和notify方法的demo详解
  7. NoSQL 数据库的使用场景
  8. 【优化预测】基于matlab鲸鱼算法优化LSSVM预测【含Matlab源码 104期】
  9. 【读书笔记】--SQL基础概念复习
  10. 总结过去10年的程序员生涯
  11. GJB-150砂尘试验,国军标沙尘试验机构
  12. 学会了 C 语言真的可以开发出很多东西吗?
  13. matlab做叠加定理仿真,实验一 仿真软件的使用与叠加原理的验证
  14. maya python window_安装了Anaconda之后,Maya运行报错,Python 找不到 Maya 的 Python 模块...
  15. DRM in Android详解
  16. mysql安装步骤及报错处理(windows)
  17. Python:实现gnome sortt侏儒排序算法(附完整源码)
  18. Spring MVC原理解析
  19. 《把时间当作朋友》第0章读后感
  20. 算法 时间复杂度概念及案例

热门文章

  1. java 接口定义超时时间,超时抛出异常,并且任务继续触发
  2. PYTHON二维数组
  3. oracle数据库ORA-00918: 未明确定义列
  4. electron+elementui
  5. 揭秘!刷百度权重的那些事,新手站长必看...
  6. Android telephone
  7. C# 字符串正则替换
  8. 手机浏览器服务器重置怎么办,怎么能把手机重置路由器? | 192.168.1.1手机登陆...
  9. 大纲笔记软件 Workflowy 综合评测:优点、缺点和评价
  10. 按住Alt键再输入ASCII码数字,放开Alt之后会输入对应的字符