当前位置: 首页 > 科技观察

使用BurpSuite劫持AndroidApp的流量(一)

时间:2023-03-13 13:46:15 科技观察

Android应用在评估安全性时,通常评估两个方面:移动前端和后端API。为了检查API的安全性,您将需要大量文档,例如Swagger或Postman文件,或者您可以让移动应用程序为您生成所有流量,并通过代理简单地拦截和修改流量(MitM攻击).有时设置代理非常简单,在本文中我将使用PortSwigger的Burp套件代理,但同样的步骤当然可以用于任何HTTP代理。在所有示例中,代理将托管在192.168.1.100的8080端口上。检查从最基本的开始,然后变得更复杂。设置设备首先,我们需要确保设备上的所有设置都是正确的。无论您尝试使用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.将代理托管在可访问的设备上,例如AWSec2实例;C。执行ARP欺骗攻击,诱使移动设备相信您是路由器;d.使用adb通过USB反向代理流量:将设备上的代理配置为转到端口8080上的127.0.0.1;通过USB连接设备,并确保adbdevice显示您的设备;做adbreversetcp:8080tcp: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:adbshellmv/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)解决方案为了将您的证书列为root,您的设备需要使用Magisk作为root:正常安装客户端证书(见前面的检查);安装MagiskTrustUser模块;重启设备以启用模块;再次重启以触发文件复制;或者,您可以:确保证书格式正确,然后将其复制/粘贴到/system/etc/security/cacerts目录中。但是,要使其工作,您的/system分区需要是可写的。一些root方法允许这样做,但是它非常复杂,而且Magisk更好,并且以正确的格式获取证书有点复杂。修改networkSecurityConfig以包含用户证书作为信任锚(见下文)。不过,最好将您的证书作为系统证书,所以我很少采用这种方法。您的Burp证书是否有适当的到期日期?Google和Android都在积极缩短叶证书的最长接受期限,如果您的叶证书的有效期过长,Android/Chrome将不会接受。(1)健全性检查使用浏览器连接到您的代理并调查根CA和叶证书的证书到期日期。如果少于1年,没关系。如果证书的有效期较长,我喜欢保险起见,创建一个新的CA,你也可以在Android上使用最新版本的Chrome来验证证书的有效期。如果出现错误,Chrome会显示以下错误:ERR_CERT_VALIDITY_TOO_LONG(2)解决方案这里有两种可能的解决方案:确保安装了最新版本的Burp,这会缩短生成的叶证书的有效期;创建自己的根CA,有效期仅为365天。此根CA生成的证书也将少于365天。这是我的首选选项,因为证书可以与团队成员共享并安装在约会期间使用的所有设备上。设置应用程序现在设备已准备就绪,可以查看应用程序的详细信息了。应用程序代理是否知道?很多应用简单的忽略了系统的代理设置,使用标准库的应用往往会使用系统代理设置,但是依赖解释型语言(如Xamarin和Unity)的应用或者Flutter等原生编译的应用往往需要开发者将代理支持显式编程到应用程序中。(1)完整性检查运行应用程序时,您应该在Burp的代理选项卡中看到您的HTTPS数据,或者您应该在Dashboard面板上的Burp事件日志中看到HTTPS连接错误。由于整个设备都被代理,您会看到许多来自使用SSL锁定的应用程序(例如GooglePlay)的请求被阻止,所以看看您是否可以找到与该应用程序关联的域。如果您没有看到任何相关的失败连接,您的应用程序很可能没有被代理。作为额外的健全性检查,您可以检查您的应用程序是否使用第三方框架。如果应用程序是用Flutter编写的,它肯定是不支持代理的,而如果它是用Xamarin或Unity编写的,它很可能会忽略系统的代理设置。使用apktool反编译:apktooldmyapp.apk;通过已知位置:Flutter:myapp/lib/arm64-v8a/libflutter.soXamarin:myapp/unknown/assemblies/Mono.Android.dllUnity:myapp/lib/arm64-v8a/libunity.so(2)解决方案有一个有几件事可以尝试:使用ProxyDroid(仅限root),虽然它是一个旧应用程序,但它仍然可以正常工作。ProxyDroid使用iptables强制将流量重定向到您的代理;通过第二个无线接口设置自定义热点,并使用iptables自行重定向流量。您可以在mitmproxy的文档中找到设置,这是另一个有用的HTTP代理,同样的设置也适用于Burp。在这两种情况下,您都已从“代理感知”设置转换为“透明代理”设置。您必须做两件事:禁用设备上的代理。如果你不这样做,那么Burp将同时收到代理请求和透明请求,这两者是不兼容的;通过Proxy>Options>ActiveProxies>Edit>RequestHandling>SupportInvisibleProxies配置Burp以支持透明代理;再次执行完整性检查,现在希望在Burp的事件日志中看到SSL错误。在下一篇文章中,我还将详细说明“应用程序是否使用自定义端口?”、“应用程序是否使用SSL锁定?”等问题。等等。本文翻译自:https://blog.nviso.eu/2020/11/19/proxying-android-app-traffic-common-issues-checklist/