在Android应用程序进行安全评估时,通常会进行两方面的评估:移动前端和后端API。为了检查API的安全性,你将需要大量的文档,例如Swagger或Postman文件,或者可以让移动应用程序为你生成所有流量,并简单地通过代理(MitM攻击)拦截和修改流量。
有时候设置代理确实很容易,在本文中,我将使用PortSwigger的Burp 套件代理,但是相同的步骤当然可以用于任何HTTP代理。在所有示例中,代理将托管在端口8080上的192.168.1.100。检查从最基本的开始,越到后来越复杂。
设置设备
首先,我们需要确保设备上的所有设置都是正确的。无论你尝试使用MitM的应用程序如何,这些步骤均适用。
1) 是否在设备上配置了代理?
很明显,第一步是在设备上配置代理。使用者介面会因你的Android版本而有所不同,但找起来并不难。
2) 完整性检查
进入“设置”>“连接”>“Wi-Fi”,选择你所使用Wi-Fi网络,点击“高级”>“代理”>“手动”,然后输入你的代理详细信息:
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的流量:
你可以代理HTTP流量吗?
HTTP流量的步骤通常比HTTPS流量容易得多,因此此处的快速状态检查可确保你的代理正确设置且可被设备访问。
1) 完整性检查
导航到http://neverssl.com并确保你在Burp中看到了该请求。 Neverssl.com是一个不使用HSTS的网站,并且永远不会将你发送到HTTPS版本,从而使其成为测试纯文本流量的理想选择。
2) 解决方案
设备上是否已安装Burp证书?
为了拦截HTTPS流量,需要在设备上安装代理的证书。
1) 完整性检查
进入设置>安全性>受信任的凭据>用户,并确保列出了你的证书。另外,你可以尝试拦截来自设备浏览器的HTTPS流量。
2) 解决方案
许多地方都有记录,但是这里有一个简短的摘要:
你的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作为根目录:
或者,你可以:
你的Burp证书有适当的有效期吗?
Google以及Android正在积极缩短leaf证书的最长接受期限,如果你的leaf证书的有效日期过长,Android / Chrome将不会接受它。
1) 完整性检查
使用浏览器连接到你的代理,并调查根CA和leaf证书的证书有效期。如果短于1年,那就好了。如果证书的有效期较长,我喜欢安全一点,创建一个新的CA,你也可以使用Android上最新版本的Chrome浏览器来验证证书的有效期。如果有错误,Chrome将显示以下错误:ERR_CERT_VALIDITY_TOO_LONG
2) 解决方案
这里有两种可能的解决方案:
设置应用程序
现在设备可以使用了,现在该看看应用程序的详细信息了。
应用程序代理可以识别吗?
许多应用程序简单地忽略了系统的代理设置,使用标准库的应用程序通常会使用系统代理设置,但是依赖于解释语言的应用程序(例如Xamarin和Unity)或本地编译的应用程序(例如Flutter)通常要求开发人员将代理支持明确地编程到应用程序中。
1) 完整性检查
在运行应用程序时,你应该在Burp的Proxy选项卡中看到你的HTTPS数据,或者应该在仪表板面板上Burp的事件日志中看到HTTPS连接错误。由于整个设备都是代理的,你会看到许多来自使用SSL锁定的应用程序的被阻止的请求(例如谷歌Play),所以看看你是否能找到一个与应用程序相关的域。如果你没有看到任何相关的失败连接, 则说明你的应用程序很可能没有代理。
作为额外的完整性检查,你可以查看应用程序是否使用了第三方框架。如果应用程序是用Flutter编写的,它肯定没有代理意识,而如果它是用Xamarin或Unity编写的,它很有可能会忽略系统的代理设置。
用apktool反编译:apktool d myapp.apk;
通过已知的位置:
2) 解决方案
有几件事可以尝试:
在这两种情况下,你都已从“代理意识”设置转换为“透明代理”设置。你必须做两件事:
再次执行完整性检查,现在希望能在Burp的事件日志中看到SSL错误。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删