设备登记APP趣味破解

VSole2023-04-12 10:03:40

公司强推一款设备登记APP,要求每个人进行安装并每日使用APP进行登记。如果名下只有一两台设备操作起来不算麻烦,但对于测试相关工作而言,无论是考虑系统版本的兼容性测试,还是需要依赖各种系统环境的安全测试。

相关测试人员名下都有多台测试设备,这就需要我们每天手动对所有设备进行开机、启动APP、登记、关机等一系列的操作。苦不堪言,所以我只能选择搞TA。

首先对这款设备登记APP进行简单的介绍,这款APP比较简单主要包含三部分功能:扫码登陆、设备登记和记录查询。

其中,扫码登陆主要是采集与用户身份相关的信息,比如用户名、用户ID及所在部室等信息;设备登记则是将用户信息、设备信息(资源编号、设备IMEI、设备ID等)、地理位置信息等组装成报文后解密上传至服务器;记录查询则是查询当前用户所有设备的登记记录。

根据上图设备登记APP的首页,大致可确定设备登记网络请求报文所涉及的字段内容,看到首页我的脑海中也立马想到了3种实现方案:

1、遍历设备列表依次修改对应EditText组件的文本内容,主动触发“提交”按钮的点击事件;

2、二次打包设备登记APP,添加设备列表维护、批量设备登记等功能相关代码;

3、逆向分析设备登记APP,将核心逻辑抽取后自实现一个新的APP用于批量自动化设备登记。

简单分析下上述3种实现方案的利弊:

对于方案一而言,实现起来相对比较简单,甚至无需逆向分析目标APP,对类似需求的通用性也比较高,但是比较难管理,一方面涉及UI组件较多,另一方面也很难确定某一具体设备是否登记成功(至于如何快速定位界面重的UI组件以及主动触发组件的点击、长按等事件,后续可能会通过其他文章介绍一个好玩的案例);

对于方案二而言,无需解释,理论可行但是限制性因素太多,比如目标APP可能会存在签名校验等防篡改策略,当然本人倒不是因为这个,由于太久没接触smali,实现成本就变得比较高了;

对于方案三而言,可能唯一的弊端就是需要实现一个新的APP,但是这种实现所带来的收益也是巨大的,比如高度定制化,我们可以有更多、更灵活的玩法,本文后面也会介绍两种趣味破解方式。

抓包是移动APP逆向的常规手段,与大家一样我也是先尝试抓包分析一下报文,但让我感到“惊喜”的是这种内部使用的APP竟然还用上了证书钢钉。

目前已经公开的破解证书钢钉的方案有很多,所以呢也不慌,甚至我还悠闲的打开了Android Studio,没想到却发现一个新的惊喜。

客户端日志泄露是一个很常见但极容易被忽视的安全问题,对于这种内部使用,又在“赶鸭子上架”的情况下开发的APP,极容易因为开发者的大意而出现,而对于泄露的日志只要静下心来分析,总会找到一些有用的信息。

从日志信息基本可确定目标APP会将用户ID、用户名及设备相关信息等组装成JSON字符串并加密后进行网络请求,因此也没太大必要破解证书钢钉进行抓包分析了。

需要注意的是该APP分别用原生开发和flutter进行Android和IOS端的开发,逆向flutter的成本无疑要比Android逆向麻烦一下,所以本人选择从Android端下手。

后续的逆向分析过程大致包含6步:

1、导出应用安装包

使用“adb shell pm path 包名”定位apk所在路径后,直接用“adb pull”命令将apk文件导出到电脑本地。

2、应用脱壳及反编译

拿到apk文件后一股脑安装到脱壳机进行脱壳,之后使用jadx进行反编译。

3、定位当前Activity

使用“adb shell dumpsys activity top”可查询当前界面对应的Activity类,可确定首页对应“MainActivity”,使用jadx搜索类名定位并双击跳转。


4、点击事件逻辑分析

分析点击事件,需要先定位对应的组件。这里简单分享几种定位思路:

一种思路是从当前Activity对应的布局文件xml中进行定位后,根据组件的id,根据View的findViewById函数定位;

第二种思路是根据setOnClickListener函数搜索,然后判断处理逻辑是否符合预期进行定位;

第三种思路就是肉眼观察当前Activity类定义的属性,根据字段名进行判断,但是这种思路可能因为混淆而失效。

很幸运目标APP在MainActivity中定义了一个“btnConmit”属性,从名字看应该就是对应的“提交”按钮,后面就可以快速找到对应的事件处理逻辑相关代码,部分核心逻辑如下图所示:

5、加密逻辑分析

目标APP的加密逻辑还是比较简单的,与加密相关的代码就三张,如下图所示:

其中涉及的密码算法包括AES和RSA两种,其实有经验的朋友看到这俩密码算法,大致就可以猜出加密逻辑了。

AES是一种对称密钥加密算法,而RSA是一种非对称密钥加密算法,对称密钥加密算法最大的优势是加密速度快,适合对大数据进行加密,但是密钥管理困难,而非对称密钥使用成对的密钥进行加解密,安全性较高一些,但是加解密速度要比对称密钥算法慢得多,因此二者经常被组合起来使用。

现在再分析目标APP的加密逻辑就比较简单了,大致就是如下三步:

第一步,调用AesUtils类的getAESSecureKey函数,动态生成一个AES密钥aESSecureKey。

第二步,使用AES密钥对网络请求内容(日志泄露中的JSON串)进行加密,生成密文encrypt。

第三步,使用RSA的公钥对AES密钥进行加密保护,生成加密后的ASE密钥encryptByPublicKey。

6、网络请求分析

继续分析代码可确定目标APP使用了OkHttp框架实现网络通信,并且封装了一个请求函数如下图所示:

其中三个参数分别对应网络请求的url、使用AES密钥加密后的密文、使用RSA公钥加密后的AES密钥,继续跟踪相关参数是如何被使用的。

从上图可看出最终是生成一个FormBody,而message和key则分别对应使用AES密钥加密后的密文和使用RSA公钥加密后的AES密钥。当服务端接收到网络请求后,只需要取出key并使用RSA的私钥进行解密获取到明文的AES密钥,然后使用AES密钥对message进行解密即可获取到明文的请求内容。

现在目标APP网络请求所包含的信息(用户信息、设备信息、地理位置信息等)、加密算法、网络请求等核心逻辑均已分析完成,我们便可以通过伪造网络请求数据来实现设备登记了,接下来分享两种好玩的破解方式。

所谓借鸡下蛋,其实就是通过Hook技术将目标APP变成一个加密机,由其完成请求内容的加密,我们只需要自实现一个新的APP来进行网络请求即可。

根据前面的网络请求分析可确定,我们只需要取到任一设备对应的message和key即可实现设备登记,接下来便借助目标APP自身来为我们提供需要的数据:

第一步,定位Hook函数。理论上只要AesUtils和RSAUtils两个类被加载了,我们可以Hook任何APP启动过程中会执行的函数,在这我们可以对Activity类的onResume函数进行Hook。

第二步,基于反射机制实现主动调用。之前在分析加密算法逻辑的时候提及到目标APP仅需要三行代码即可生成message及key,那么我们仅需要依赖反射机制对这三行代码进行翻译即可,相关代码如下图:

接下来只需要批量将测试设备对应的明文请求内容进行加密,将每台设备对应的message和key进行记录。

新建一个新的APP用于发起网络请求,直接将目标APP封装的网络请求相关函数copy过来就可以,自己封装一个NetUtil类用于发起网络请求,如下图所示:

如何批量登记呢?这就用到了前面所记录的每台设备对应的message和key,我么在新APP中通过HashMap对设备列表进行维护:

接下来,只需要封装一个函数doRegister,该函数负责遍历设备列表并发起网络请求,同时对响应报文进行解析,记录成功登记的设备数量,当所有设备登记完成后整理结果。

目前基本功能已经完成,我们可以通过一个按钮的点击来实现doRegister函数的调用,从而完成所有设备的登记。如果能够自动化进行设备的登记,是不是很香?

我们只需要启一个定时任务就可以自动进行登记,Android中的定时任务一般有两种实现方式:

一种是使用Java API提供的Timer类,另一种就是Android的Alarm机制。但是呢,既然我们前面用到了Hook技术,这里就分享一种好玩的方式实现定时任务——基于系统闹钟的定时任务。

所谓基于系统闹钟的定时任务,本质就是系统闹钟到达设定的时间后会启动一个新的Activity,我们就可以对该Activity进行Hook,从而跳转至前面自己实现的用于设备登记的APP,之后自动执行doRegister函数完成设备登记,核心Hook代码如下:

所谓杀鸡取卵,其实就是通过逆向分析目标APP,梳理其核心逻辑,将相关的代码(或者dex、jar等)复制到自己的项目中为己所用,前面提到的破解方式一还需要依赖目标APP自身来获取所需的部分数据。

借鸡下蛋只是将网络请求相关的代码进行抽取,而加密相关逻辑还是由目标APP自身来完成。而这种方式则是将加密算法、网络请求等近乎所有的核心逻辑进行抽取,从而可以独立于目标APP而实现设备登记。

前面已经对核心逻辑进行分析,只需要将相关代码复制到新建的APP即可,另外完全可以进行功能增强,比如补充设备列表的维护功能,允许自己手动录入新的设备。

除此之外,这种破解方式还有不少的优点:可在免ROOT设备运行(理论上可在任意Android设备);易于分发(可分发给其他同事,由其自己维护自己的设备列表);开发更加灵活等等。

这种方式比较暴力,当然也有一定的局限性。首先,自动化实现起来就不像前面直接Hook系统闹钟那么简单,另外在实现过程中我也忽略了一个小问题。

那就是目标APP所用的加密算法高度依赖OkHttp库的版本,不同版本的实现细节稍有不同,这就导致服务端无法正确解密获取到明文内容,从而导致设备登记失败。

针对前面提到的问题,固然可以通过修改版本来解决,但是这比较依赖个人的运气了,其实我们可以考虑dex的动态加载,动态加载目标APP的dex文件,从而实现需要的功能即可。至此,大功告成。

文章接近尾声,回顾一下其实文章提及的设备登记APP本身并不复杂,也没有很强的防护,破解成本并不算太高,但是整个破解过程还是蛮好玩的。目标APP采取了证书钢钉策略来防止抓包,并且报文还进行了加密,却忽略了客户端自身的安全防护。

另外由于客户端自身防护较弱,可以较低成本梳理清晰加密算法、网络请求等核心逻辑,从而以多种方式实施破解。为应对攻击者反编译、抓包、hook等常规手段,APP至少应该形成一种“加固+环境检测+防抓包”的体系化防护策略,从而提升攻击成本。

最后联想到前段时间爆出来某互联网巨头APP利用系统漏洞提权后伪造DAU、窃取用户信息、攻击竞争对手APP等行为的事件,还是想补充一下:技术本无罪,但是科技向善应该是每一个人都需要遵守的原则,一个人所掌握的专业知识、技能以及工具等应该用来合情合理合法地改善生活、提升幸福感。

aes相关性分析
本作品采用《CC 协议》,转载必须注明作者和本文链接
Detector提供一个完整的测评框架,支持测评人员将待分析的原始波形及分析结果导出到Word文档中,以快速生成测试报告。测试报告内容包括测试信息、测试波形图及相应的测试结果。以TVLA测试为例,生成报告对话框界面如图1所示,生成的测试报告如图2所示。图1 生成报告功能界面图2 生成TVLA测试报告结果02新增标准计时分析功能旧版本Detector支持两种计时分析功能,分别是计时分析-IO、计时分析-明密文相关性
非入侵式攻击测试利用了隐藏在密码模块中或周围的物理量的有偏性,这种依赖于秘密信息的有偏量被称为泄露,测试泄露是否存在的测试即为泄露分析
我们以Detector标配的AES算法训练卡为例进行计时分析的泄露分析。经过计算得知此差值超过了待测设备的一个时钟周期,因此存在与密钥相关的时间信息泄露,测试不通过。计时分析结果加密时间与明文之间的依赖性测试该依赖性测试的操作方法与加密时间与密钥之间依赖性测试基本相同。报告内标题与测试结果会自动生成,并支持手动修改。图7是我们采集到的某型号芯片实现的SM2解密的波形。
新方法和旧方法会如何发生碰撞?
给出了一种产生认证标签的方法,使得该工作模式可提供数据加密和报文完整性检验功能。有些轻量级分组密码算法的分组长度只有 32 比特,当数据量较大时,数据中容易存在密文组重复。不过,若出现了密文组碰撞,有可能会暴露明文格式特征,甚至导致分明文泄露。因此,当明密文空间较小时,尤其选用了保留格式加密算法时,使用 CBC 或者 ECB 工作模式可能存在安全缺陷。常见的不满组加密处理方法包括协议填充和密文偷垒等多种方法。
通过考虑 TLS 协议中的证书,利用证书内容对恶意流量进行识别,但是此方法对无证书传递的加密会话恶意性检测无效。图 2 展示了恶意会话和正常会话的服务器对 TLS 加密套件的选择对比和客户端支持的曲线对比。
概述近年来,智能手机已成为越来越重要的存储设备,若损害其安全性和数据保护机制会极大地影响用户的隐私。上图为t检验结果曲线,大于4.5的位置表示存在泄露。AES解密区间范围内t检验结果曲线。上述电磁攻击实验,使用了共三周时间得以完成,其中采波时间为两周,执行CPA攻击时间为一周。其中,论文使用GPU高度并行计算,大大缩短了暴力搜索的时间。
例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。该fuzzer发现了可用于获得根访问权限,目前大疆已修复所有错误。鉴于大疆的实际重要性,本研究的工作重点关注该供应商在 200 克到 1 千克之间的消费级无人机。逆向工程结果证实了这些发现。
Lockbit Ransomware 团伙,也称为 Bitwise Spider,是流行的 Lockbit Ransomware-as-a-service 背后的网络犯罪策划者。他们是最活跃的勒索病毒团伙之一,通常每天有多个受害者,有时甚至更高。2022 年 3 月 16 日,他们开始在其暗网网站上不断宣布新的受害者,比任何勒索病毒组织都要快得多。
看雪论坛作者ID:roadicing
VSole
网络安全专家