在Android应用程序进行安全评估时,通常会进行两方面的评估:移动前端和后端API。为了检查API你需要大量的文档来安全,比如Swagger或Postman文件或移动应用程序可以为您生成所有流量,并简单地通过 *** (MitM拦截和修改流量。
有时候设置 *** 真的很容易。我将在本文中使用它PortSwigger的Burp 套件 *** ,但同样的步骤当然可以用于任何一个HTTP *** 。在所有示例中, *** 将托管8080端口192.168.1.100。从最基本的开始,检查越复杂。
设置设备
首先,我们需要确保设备上的所有设置都是正确的。无论你试图使用它MitM这些步骤适用于应用程序。
(1) 设备上有 *** 吗?
很明显,之一步是在设备上配置 *** 。使用者介面会因你的Android版本不同,但不难找到。
(2) 完整性检查
进入“设置”>“连接”>“Wi-Fi”,选择你使用的Wi-Fi *** ,点击“高级”>“ *** ”>“手动”,然后输入您的 *** 详细信息:
- *** 主机名:192.168.1.100;
- *** 端口:8080;
Burp是否监控所有接口?
默认情况下,Burp只监控本地接口(127.0.0.1),但由于我们想从不同的设备连接,Burp监控已经加入Wi-Fi *** 的特定接口。您可以监控所有接口或特定接口(如果您知道需要哪个接口)。作为完整性检查,我通常使用它“监控所有接口”。请注意,Burp有一个API,它允许其他使用相同Wi-Fi *** 人员查询您的 *** 并从中搜索信息。
(1) 完整性检查
导航到你的主机http://192.168.1.100:8080,欢迎界面应该出现。
(2) 解决方案
在Burp中,进入“ *** ”>“选项”>在“ *** 监听器”单击窗口中的 *** ,然后在窗口中“绑定到地址”配置上选中“所有接口”。
您的设备能连接到 *** 吗?
有些 *** 被主机/客户端隔离,客户端不允许相互通信。在这种情况下,由于路由器不允许,您的设备将无法连接到 *** 。
(1) 完整性检查
打开浏览器,导航到设备http://192.168.1.100:8080。你应该看到Burp欢迎屏幕。如果您在之前的检查中配备了 *** ,您也应该能够导航到http://burp。
(2) 解决方案
这里有一些选择:
a.自定义无线 *** 设置禁用主机/客户端隔离;
b. *** 托管在可访问设备上,如AWS ec2实例;
c.执行一个ARP欺骗攻击,欺骗移动设备,让它相信你是路由器;
d.使用adb反向 *** 通过USB的流量:
- 将设备上的 *** 配置转移到端口8080127.0.0.1;
- 通过USB并保证连接设备adb设备显示您的设备;
- 执行adb reverse tcp:8080 tcp:8080,它将
- 现在,你应该能够浏览它http://127.0.0.1:8080并看到Burp欢迎屏;
你可以 *** HTTP流量吗?
HTTP通常比较流量步骤HTTPS流量要容易得多,所以这里的快速状态检查可以保证您的 *** 正确设置,并且可以被设备访问。
(1) 完整性检查
导航到http://neverssl.com并确保你在Burp看到了这个请求Neverssl.com一个不用HSTS网站,永远不会发送你HTTPS版本使其成为测试纯文本流量的理想选择。
(2) 解决方案
- 再次检查以前的检查,可能有些地方不对;
- Burp拦截已启用,请求正在等待您的批准;
是否已安装在设备上Burp证书?
为了拦截HTTPS *** 证书需要安装在设备上。
(1) 完整性检查
进入设置>安全性>信任的证据>用户,并确保列出您的证书。此外,您还可以尝试拦截设备浏览器HTTPS流量。
(2) 解决方案
许多地方都有记录,但这里有一个简短的摘要:
- 导航到浏览器http://burp;
- 点击右上角“CA证书”,将开始下载;
- 使用adb或者文件管理器将扩展名从der更改为crt:adb shell mv /sdcard/Download/cacert.der /sdcard/Download/cacert.crt;
- 将文件管理器导航到文件并打开文件开始安装;
你的Burp证书已安装为证书吗?
Android默认情况下,最新版本的应用程序不相信用户证书。请指出具体原因https://blog.nviso.eu/2017/12/22/intercepting-https-traffic-from-apps-on-android-7-using-magisk-burp/。或者,您可以重新打包应用程序并添加相关控件network_security_policy.xml但是把根放在文件里CA保存在系统CA其他步骤(如第三方框架)的麻烦可以在存储中避免,所以这是我的首选。
(1) 完整性检查
进入设置>安全性>信任的证据>系统,并确保列出您的证书。
(2) 解决方案
为了将您的证书列为根证书,需要使用您的设备Magisk根目录:
- 正常安装客户端证书(请参考以前的检查);
- 安装MagiskTrustUser模块;
- 启用模块重新启动设备;
- 再次重启以触发文件复制;
或者,你可以:
- 确保证书格式正确,然后复制/粘贴到/ system / etc / security / cacerts但是,让它正常工作,你的/ system分区需要写。有些根法允许这样做,但是很复杂,而且Magisk获得正确格式的证书有点复杂。
- 修改networkSecurityConfig,将用户证书包括为信任锚(请参见下文)。但是,更好把你的证书作为系统证书,所以我很少使用这种 *** 。
你的Burp证书有适当的有效期吗?
Google以及Android正在积极缩短leaf如果你的证书的最长接受期leaf证书有效期过长,Android / Chrome不接受。
(1) 完整性检查
将浏览器连接到您的 *** ,并调查根CA和leaf证书有效期。如果不到一年,那就好了。如果证书有效期长,我喜欢更安全,创造新的CA,也可以用Android最新版本Chrome浏览器验证证书的有效性。如有错误,Chrome以下错误将显示:ERR_CERT_VALIDITY_TOO_LONG
(2) 解决方案
有两种可能的解决方案:
- 确保你安装了最新版本的Burp,这将减少生成leaf证书有效期;
- 创造自己的根CA,它的有效期只有365天。CA生成的证书也将少于365天。这是我的首选,因为证书可以与团队成员共享,并可以安装在约定期限内使用的所有设备上。
设置应用程序
现在设备可以使用了,现在该看应用程序的详细信息了。
能识别应用程序 *** 吗?
许多应用程序只是忽略了系统的 *** 设置。使用标准库的应用程序通常使用系统 *** 设置,但依赖于语言解释(例如Xamarin和Unity)或本地编译的应用程序(例如Flutter)开发人员通常需要在应用程序中明确编程 *** 支持。
(1) 完整性检查
在操作应用程序时,你应该Burp的Proxy在选项卡中看到你的HTTPS数据或应在仪表板面板上Burp在事件日志中看到HTTPS连接错误。因为整个设备都是 *** 商,你会看到很多来自使用SSL阻止锁定应用程序的请求(例如谷歌Play),所以看看你是否能找到一个与应用程序相关的域。如果你没有看到任何相关的失败连接, 表明你的应用程序可能没有 *** 。
作为额外的完整性检查,您可以检查应用程序是否使用第三方框架。如果使用应用程序Flutter如果是用来写的,肯定没有 *** 意识,Xamarin或Unity它很可能会忽略系统的 *** 设置。
用apktool反编译:apktool d myapp.apk;
通过已知的位置:
- Flutter: myapp/lib/arm64-v8a/libflutter.so
- Xamarin: myapp/unknown/assemblies/Mono.Android.dll
- Unity: myapp/lib/arm64-v8a/libunity.so
(2) 解决方案
有几件事可以尝试:
- 使用ProxyDroid(仅限root用户),虽然是旧应用,但仍能很好地运行。ProxyDroid使用iptables强制将流量重定向您的 *** ;
- 自定义热点是通过第二个无线接口设置的iptables重定向流量。mitmproxy在文档中找到设置是另一个有用的HTTP同样的设置也适用于 *** Burp。
在这两种情况下,你已经从“ *** 意识”设置转换为“透明 *** ”设置。你必须做两件事:
- 禁止 *** 设备。如果你不这样做,那么Burp同时收到 *** 请求和透明请求,两者不兼容;
- 配置Burp通过 *** 支持透明 *** >选项>活动 *** >编辑>请求处理>支持无形 *** ;
现在希望再次进行完整性检查Burp在事件日志中看到SSL错误。
下一篇文章我会详细介绍“自定义端口是否用于应用程序?”,“是否使用应用程序SSL锁定?”等问题。
本文翻译自:https://blog.nviso.eu/2020/11/19/proxying-android-app-traffic-common-issues-checklist/