手把手教你测试基于安卓的物联网APP

可能比较标题党,哈哈。
本文的主旨是以笔者自身经历出发,告诉读者如何对运行于特定物联网设备上且基于HTTP协议通讯的APP进行测试。
出于项目保密性,大多数内容由笔者口述。

. . . * . * ☄️. * . * . 🔆 .* . * . 🧶 * . * . . .

事件背景

客户要求对一个APP进行测试,并给了我一台奇怪的平板,大概长这样:
手把手教你测试基于安卓的物联网APP
我:不是要测APP吗,怎么搬根柱子过来?
客户:这个APP比较特殊的,只能在我们自己的设备上跑。
我:原来如此,但你还是先把APP给我吧。
客户:好的。

第一次测试

拿到APP的第一反应就是反编译看API,毕竟没人想在柱子上点点点,能不上真机情况下还是尽量不上真机测试。但经过一番抓包构造之后发现APP请求中的很大一部分参数未知且不易构造,要获取参数格式等数据还得真正抓个包来看看。于是挪开JADX,打开我的虚拟机。
一开始我想的是:物联网设备也无所谓,总而言之就是安卓变体嘛。但在测试环境中打开APP后总是卡在白屏画面。再次返回JADX查看代码,才发现人家获取了一些普通Android环境中没有的变量和API,而在获取不到API的情况下APP会拒绝进行下一步操作。
虽说也可以通过修改SMALI重新打包绕过这些校验,但没有数据的情况下是否能发出包实在让人疑惑,并且客户给的是高贵的proGuard混淆版本,看着头疼。所以我只能放弃手中现成的测试虚拟机,而试图在这根“柱子”上抓包
我:这台设备是Android改版吗?
客户:是的。
我:可以root和adb吗?我想装点工具。
客户:可以root,你自己弄吧。
由于高版本Android安装根证书需要root权限,所以对于高版本而言,抓SSL包的先遣条件就是root。而既然设备已经可以root,那问题就不大了。
而adb,由于设备拥有WIFI功能(不知为何我觉得一台拥有WIFI功能的柱子也很奇怪),令设备和电脑处在同一网络内然后设置远程调试即可。
由于需要对系统进行读写,设置为root之后需要重启系统并使用adb重新挂载系统:
adb rebootadb rootadb remount
然后就是准备适合Android的根证书。我们知道burpsuite的证书导出是.der格式,需要经过转换为.0(.pem)格式。
再将转换完的.0证书push到Android根证书路径/system/etc/security/cacerts/:
 adb push ..w4ert.0 /system/etc/security/cacerts/
然后使用adb挂个代理(因为我在这台设备上没有找到设置wifi代理的功能,这到底是个什么发行版):
adb shell settings put global http_proxy IP:8899
挂到bp之后顺利抓包,开始测试,也是顺利发现两个高危收工。

复测

过了两天,客户的产品要上线,摇我来做个复测。
客户:我们修好了喔,你测试一下。
我:好的。

抓包发现所有包被加了个sign,本来看代码是经典参数拼接+MD5,但算出来的参数始终对不上。静态看实在是看烦了,于是frida走起。

对于仅仅进行proGuard混淆的APP来说frida还是轻松无压力的,找找函数直接写钩子就行。
定位函数的过程省略,方便对照我的数据+调用结果,同时写了钩子和主动调用:
'use stricts'
Java.perform(function() { var AESP = Java.use("b.d.a.g.o"); var HashMap = Java.use('java.util.HashMap'); var hashMap = HashMap.$new(); function enc(){ var HashMap = Java.use('java.util.HashMap'); var hashMap = HashMap.$new(); hashMap.put.overload('java.lang.Object', 'java.lang.Object').call(hashMap, 'ids', '1'); return AESP.y(hashMap); }

AESP.y.implementation = function (hashMap) { var entrySet = hashMap.entrySet(); var iterator = entrySet.iterator(); while (iterator.hasNext()) { var entry = iterator.next(); console.log(entry); } //打印hashmap let rmm=this.x(hashMap); console.log(rmm); console.log("结束。"); return rmm; };
AESP.j.implementation = function (strr) { console.log("MD5"); console.log(strr); console.log("原始参数:"); let rmm=this.j(strr); console.log(rmm); return rmm; }
enc();});
安装frida的过程省略(跟拖证书一样push一下然后运行即可,远端使用pip安装)。
命令行attach模式启动:
frida -H 192.168.3.25:65000 --no-pause -l .1.js [APP名]
操作APP查看输出,成功找到构造方式,继续复现。

. . . * . *  🌟  * . * . . .

由于很多人问我微信群的事情,所以我建了一个小微信群。现在可以在公众号菜单里选择合作交流->交流群获取交流群二维码,希望大家和谐交流,为更好更友善的行业环境贡献自己的力量。

原文始发于微信公众号(重生之成为赛博女保安):手把手教你测试基于安卓的物联网APP

版权声明:admin 发表于 2024年5月23日 下午6:01。
转载请注明:手把手教你测试基于安卓的物联网APP | CTF导航

相关文章