您如何捕获来自 Android 应用程序的所有流量?

信息安全 Web应用程序 应用安全 渗透测试 安卓
2021-08-29 21:02:03

我想捕获 Android 应用程序的所有流量以进行渗透测试。我怎么做?

这是我已经尝试过的:

http-proxy我在模拟器上安装了应用程序,并通过指向本地端口启动了模拟器。本地端口上运行了 ZAP。我能够拦截来自浏览器的流量,但不能拦截来自应用程序的流量。

好吧,可能是我的应用程序使用了 https,我认为我遇到了一些证书问题。所以我导出了 OWASP ZAP 的证书并push在 android 模拟器上编辑它。当然,Android >= ICS 版本的证书名称使用 OpenSSL 进行哈希处理。所以我在这里按照一些说明操作,并设法在我的设备上获得了我的 ZAP 证书。尽管如此,我还是无法拦截流量。

我的下一个想法是:可能是这个应用程序损坏了。因此,我将应用商店中的 Facebook、Pocket 和 Guardian(新闻)应用程序安装到模拟器中,并尝试拦截它们的流量。我可以拦截来自 Guardian 的流量,但 Pocket 和 Facebook 无法连接到互联网(我的应用程序也是如此)。但是,我可以从模拟器上的浏览器浏览互联网。

老实说,我已经束手无策了。我不明白为什么会这样。我之前没有做过很多笔测试,所以我想我缺乏经验。谁能帮助这个可怜的灵魂?

(当然,我总是可以使用 Wireshark,但它不能像 ZAP 或 Burp 那样 MiTM 请求和响应。)

编辑:

在像疯子一样“Google-ing”之后,我终于发现 Android 不支持全局代理(适用于浏览器和应用程序)。更多信息可以在这里找到。

4个回答

您无法拦截 Facebook 流量,因为它使用 SSL 固定。

在对 android 应用程序进行渗透测试时,您可能会遇到四种不同的情况。我将在下面简明扼要地列出它们。可以在这里找到更详细的文章 >>我的博客该文章还包含您可以参考的视频。

  1. 非 SSL 应用程序

这是您可能遇到的最简单的 Android 应用程序。游戏就是例子。大部分流量通过http。要拦截流量,您只需将设备/模拟器的 wifi 代理设置指向运行 Burp/Zap 代理的笔记本电脑。

  1. 使用 HTTPS 流量并依赖设备可信凭证的应用程序

Instagram 等应用程序使用 HTTPS 与服务器通信,但它们依赖于设备的可信凭据。要拦截此流量,您可以将代理证书添加到设备的受信任凭据中,方法是从Settings > Security > Trusted credentials

  1. 使用 SSL 固定的应用程序

某些应用程序可能会使用 SSL pinning 来确保应用程序的安全,即使在受信任的凭证被泄露的情况下也是如此。Cydia 基板模块 Android Trust Killer 或 Xposed Module JustTrustMe 可用于绕过 SSL pinning 控制。

  1. 使用自己的凭据存储的应用程序

Facebook Android 应用程序使用它的 pwn 凭证存储,这就是您无法正常拦截流量的原因。要绕过这一点,您必须将应用程序反汇编为 smali 代码。将所需格式的证书添加到代码中,重新编译,签名并再次安装。该过程在此处详细介绍 >> DewHurst Security 的博客

以下是我建议采取的步骤。第 6 步是最直接的答案,但我建议您完成其他步骤。请注意,此答案与其他答案相似,但在许多步骤中更简单。

1)配置代理- 在透明模式下配置 Burp Suite,监听应用程序使用的任何端口的所有接口,例如 443。

2)安装证书颁发机构- 在桌面上导出证书然后执行adb push file.der /sdcard/<file>.cer(注意我们将 .der 重命名为 .cer)然后转到Settings -> Security -> Install from Device Storage并安装您的证书。

3)系统代理- 尝试通过修改您的 Android 代理设置(在您的 wifi 设置中)来代理流量。如果这不起作用,有时打开和关闭适配器(打开飞行模式一秒钟)可以在这里提供帮助。

4)调试证书问题- 观察 Burp Suite 中的警报选项卡是否存在任何 SSL/TLS 问题。您的应用程序可能正在使用硬编码证书、证书固定或公钥固定来阻止您使用 CA。您可以尝试在代理选项选项卡上启用 SSL 直通,以查看这是否是您的部分或全部目标域的问题。如果证书固定是一个问题,您将需要绕过证书固定保护。

5)欺骗 DNS - 设置 /etc/dnsspoof.conf 以包含您的域的条目和/或通配符条目(以下示例):

192.168.1.101 example.com
192.168.1.101 *.com

将您的 DNS 服务器设置为您控制的主机并运行以下命令(Kali 上已经安装了 dnsspoof):

dnsspoof -i eth0 -f /etc/dnsspoof.conf host 192.168.1.201

如果您的应用程序不遵守系统代理设置或 DNS,我建议在继续之前使用 Wireshark 观察行为以获取洞察力。您的应用程序可能正在使用非 HTTP 协议。

6)调试网络流量- 在 Genymotion 等模拟器中运行您的应用程序,最好以桥接模式运行,然后在您的主界面上监听并仅在您的设备上使用显示过滤器ip.addr eq 192.168.1.201

7)反编译应用程序- 使用 dex2jar 反编译应用程序并查看产生网络流量的代码以获得洞察力。

d2j-dex2jar.bat "/path/to/the.apk" -o "/path/to/the/new.jar"

使用 JD-GUI 打开 jar 文件。

8) MITM - 使用像 ettercap 这样的工具在交通中间人考虑使用https://github.com/summitt/Burp-Non-HTTP-Extension或其他通用 TCP 代理(这是我喜欢的一个:dummyproxy.py)来管理流量,尽管这不会绕过任何加密,例如 TLS。

有几种方法可以可靠地拦截 Android 应用程序,除非使用 Android SDK 模拟器的 --tcpdump 和 --http-proxy 命令行指令(也可以在 Eclipse 模拟器设置中访问)。

我对所有移动应用程序最喜欢的是利用DNS blackhole,它可以通过 Android SDK 模拟器进一步自动化:

emulator -dns-server 192.168.0.2 -avd <avdname>

通过在 DNS 通配符主机上运行 Burp(可能作为 root)可以轻松拦截 HTTP/TLS 等流量——尽管 Burp 需要配置为在不可见模式下侦听适当的端口(通常是 80 和 443)。此外,通过将 Burp 配置为使用顶级域(例如 *.google.com)的通配符执行每个主机名 CA 签名的证书,可以绕过某些证书固定检查。

Burp 还可以配置为捕获服务器响应,这在故障排除时非常有用。

如果您想查看文件处理程序以及网络协议处理程序,那么我建议通过 ADB 使用 strace 工具。strace 包含在 Android SDK 模拟器中,可以使用 ADB 或其他方式复制到设备。

尝试使用mitmproxy它允许您跟踪 HTTP 和 HTTPS 流量。您可以查看请求和响应以及捕获/编辑它们。