利用 Burp Suite 劫持 Android App 的流量(二)
2021-03-04 10:40:00 Author: www.4hou.com(查看原文) 阅读量:311 收藏

上一篇文章中,我详细介绍了设置设备、是否在设备上配置了代理?、Burp是否监听所有接口?等问题,这篇文章,我会接着介绍其他一些方法。

应用程序是否使用自定义端口?

这仅在应用程序不支持代理时才真正适用,在这种情况下,你或ProxyDroid将使用iptables拦截流量,但是这些iptables规则只针对特定的端口。在ProxyDroid源代码中,你可以看到仅针对端口80 (HTTP)和443 (HTTPS)。如果应用程序使用非标准端口(例如8443或8080),它将不会被拦截。

完整性检查

这个有点棘手,我们需要找到离开应用程序而不前往端口80或443的流量。最好的方法是监听所有离开应用程序的流量,我们可以在设备上使用tcpdump或者在使用第二个Wi-Fi热点的主机上使用tcpdump。

在具有root权限的adb shell上运行以下命令:

tcpdump -i wlan0 -n -s0 -v

你会看到许多不同的联系,理想情况下,你应该启动命令、打开应用程序并在知道应用程序发出了一些请求后立即停止tcpdump。一段时间后,你将看到使用非默认端口连接到远程主机。在下面的例子中,在端口8088上有多个到192.168.2.70的连接:

5.png

或者,你可以使用 tcpdump -i wlan0 -n -s0 -w /sdcard/output.pcap将tcpdump的输出发送到pcap。从设备检索到output.pcap文件后,可以使用WireShark打开它并进行检查:

6.png

解决方案

如果你的应用程序确实不了解代理并且无法通过自定义端口进行通信,则ProxyDroid将无法为你提供帮助。 ProxyDroid不允许你添加自定义端口,尽管它是一个开源项目,这意味着你必须手动使用iptables。

1.你可以在主机上充当路由器的地方设置第二个热点,这样就可以执行MitM;

2.你使用ARP欺骗在路由器和设备之间执行活动MitM;

3.你可以自己使用iptables并将所有流量转发到Burp,由于Burp在单独的主机上监听,所以最好的解决方案是使用adb reverse将设备上的端口映射到Burp实例。这样,你无需设置单独的热点,只需通过USB连接设备即可。

3.1在主机上:adb reverse tcp:8080 tcp:8080;

3.2在设备上,以root用户身份:iptables -t nat -A OUTPUT -p tcp -m tcp --dport 8088 -j REDIRECT --to-ports 8080。

应用程序是否使用SSL锁定?

此时,你应该在Burp的事件日志仪表板中看到HTTPS连接失败。下一步是验证是否使用SSL锁定,并禁用它。尽管许多Frida脚本都声称是通用的root权限绕过,但没有一个脚本可以接近。 Android应用程序可以使用许多不同的技术编写,并且通常仅支持其中一些技术。你可以在下面找到实现SSL锁定的各种方法以及解决方法。

注意,有些应用程序有多种锁定特定域的方法,为了禁用所有的SSL锁定,你可能必须组合脚本。

通过android:networkSecurityConfig 锁定

Android允许应用程序通过使用network_security_config.xml文件来执行SSL锁定,这个文件在AndroidManifext.xml中被引用,并且位于res/xml/中。名称通常是network_security_config.xml,但它不必是这样。作为一个示例应用程序,Microsoft Authenticator应用程序定义了以下两个引脚:

7.png

解决方案

使用任何常用的通用绕过脚本:

1.运行Objection并执行android sslpinning disable命令;

2.使用Frida代码共享:frida -U --codeshare akabe1/frida-multiple-unpinning -f be.nviso.app;

3.使用apktool d和apktool b删除AndroidManifest中的networkSecurityConfig设置。通常通过Frida会更快,而且很少需要。

通过OkHttp锁定

另一种流行的固定域的方法是通过OkHttp库,你可以通过grepping OkHttp或sha256来进行grep,你将很有可能找到与OkHttp相关的引用(甚至哈希) 以及所锁定的内容:

8.png

解决方案

使用任何常用的通用绕过脚本:

1.运行Objection并执行android sslpinning disable命令;

2.使用Frida代码共享:frida -U --codeshare akabe1 / frida-multiple-unpinning -f be.nviso.app;

3.使用apktool反编译apk,并修改锁定的域。默认情况下,OkHttp将允许未专门锁定的连接。因此,如果你可以查找和修改锁定的域名,则锁定将被禁用。但是,使用Frida的速度要快得多,所以这种方法很少被采用。

通过OkHttp在混淆的应用程序中进行锁定

通用的锁定脚本可以在混淆的应用程序上工作,因为它们挂接在无法混淆的Android库上。但是,如果应用程序使用的不是默认的Android库,那么类将被混淆,脚本将无法找到正确的类,OkHttp就是一个很好的例子。当应用程序使用OkHttp并已被混淆时,你必须找出CertificatePinner.Builder类的混淆名称。你可以在下面看到通过搜索相同的sha256字符串使用模糊的OkHttp的情况。这次,你将不会看到很好的OkHttp类引用,但通常仍会找到字符串引用以及一些程序包名称。当然,这取决于混淆的程度。

9.png

解决方案

你必须编写自己的Frida脚本,才能挂接CertificatePinner.Builder类的混淆版本。在这篇文章中,我已经详细介绍了轻松找到正确方法的步骤,并创建了一个自定义的Frida脚本。

锁定各种库

除了使用networkSecurityConfig或OkHttp,开发人员还可以使用许多不同的标准Java类或导入的库执行SSL锁定。此外,一些基于Java的第三方应用程序(例如PhoneGap或AppCelerator框架)为开发人员提供了特定功能,以向应用程序添加锁定。

有很多方法可以通过编程方式进行,所以最好的选择是尝试各种反锁定脚本,至少要弄清楚触发了哪种方法,以便你可以在应用程序上获取信息,之后你便可以进一步对该应用程序进行逆向工程,以弄清拦截为何仍不起作用。

解决方案

尽可能多地尝试找到的SSL锁定脚本,并监视它们的输出。如果你能够识别所使用的某些类或框架,这将帮助你创建针对应用程序的自定义SSL锁定绕过。

1.运行Objection并执行android sslpinning disable命令;

2.使用Frida脚本,其中许多具有重叠的功能,但你永远不会知道。请注意其中有多少声称是通用的:

https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/
https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/
https://codeshare.frida.re/@sowdust/universal-android-ssl-pinning-bypass-2/
https://codeshare.frida.re/@masbog/frida-android-unpinning-ssl/
https://codeshare.frida.re/@segura2010/android-certificate-pinning-bypass/
https://codeshare.frida.re/@akabe1/frida-universal-pinning-bypasser/

在第三方应用框架锁定

第三方应用程序框架将有自己的针对TLS和HTTP的底层实现,默认的锁定绕过脚本将无法工作。如果应用程序是用Flutter, Xamarin或Unity编写的,你需要做一些手工逆向工程。

查明是否使用了第三方应用程序框架

如上所述,以下文件是Flutter,Xamarin或Unity编写的:

Flutter: myapp/lib/arm64-v8a/libflutter.so

Xamarin: myapp/unknown/assemblies/Mono.Android.dll

Unity: myapp/lib/arm64-v8a/libunity.so

在Flutter应用程序中锁定

Flutter不支持代理,也不使用系统的CA存储。每个Flutter应用程序都包含一个完整的可信CA,用于验证连接。因此,虽然它很可能不执行SSL锁定,但它仍然不信任你设备上的根CA,因此不可能被拦截。

解决方案

关注我关于ARMv7(x86)https://blog.nviso.eu/2019/08/13/intercepting-traffic-from-android-flutter-applications/或ARMv64(x64)https://blog.nviso.eu/2020/05/20/intercepting-flutter-traffic-on-android-x64/的文章。

在Xamarin和Unity应用程序中锁定

Xamarin/Unity应用程序通常并不太难,但它们确实需要手工逆向工程和补丁。Xamarin/Unity应用程序在程序集/文件夹中包含.dll文件,这些文件可以用.NET反编译器打开。我最喜欢的工具是DNSpy,它也允许你修改dll文件。

解决方案

步骤如下:

1.使用apktool提取apk并找到.dll文件;

2.使用DNSpy打开.dll文件并找到HTTP锁定逻辑;

3.通过修改C#代码或IL修改逻辑;

4.保存修改后的模块;

5.用修改后的版本覆盖.dll文件;

6.重新打包并退出应用程序;

7.重新安装应用程序并运行。

如果你仍然无法拦截流量怎么办?

很有可能在所有这些步骤之后,你仍然无法拦截所有流量,原因如下:

1.非HTTP协议(我们只使用HTTP代理,所以非HTTP协议不会被拦截);

2.很复杂的混淆;

3.防止篡改。

你通常会在手机游戏或金融应用程序中看到这些特性,此时,你必须对应用程序进行逆向工程,并编写自己的Frida脚本,这可能是一个非常困难和耗时的过程。

本文翻译自:https://blog.nviso.eu/2020/11/19/proxying-android-app-traffic-common-issues-checklist/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/OqVY
如有侵权请联系:admin#unsafe.sh