Apktool任意文件写入漏洞分析 CVE-2024-21633

前置知识

在复现该漏洞前,有必要了解Apktool和resources.arsc相关的基础知识,方便理解后续POC的构造。

Apktool是一款流行的开源逆向工程软件,用于反编译和编译Android应用,因此,Apktool被许多其他逆向工程软件集成。

官网地址:

https://apktool.org/

项目地址:

https://github.com/iBotPeaches/Apktool

该工具可以将Android应用的apk文件反编译为可编辑的项目结构,同时也可以将编辑后的文件重新打包成apk文件,反编译和重打包操作分别对应工具的d、b两个参数。

图片

resource.arsc文件是apk打包过程产生的一个资源索引文件,该文件内容是Android项目的资源和资源索引信息,/res目录中除了values外的资源文件路径都会记录在resources.arsc中。

图片

漏洞介绍

CVE-2024-21633漏洞Apktool在2.9.1版本及之前的版本中存在漏洞。Apktool根据资源名称判断资源文件的输出路径,攻击者可以利用这一特点将文件放置在系统上指定位置。因而,攻击者可以写入或覆盖用户具有写入权限的任何文件,甚至是在知晓用户名的情况下写入文件到当前工作目录在用户目录下。

例如,名称为foo,路径为res/raw/bar的资源会被提取到res/raw/foo。但资源名称没有经过校验,因此将资源名称从foo更改为../../../../../../../../../../.. /../tmp/poc,最终会将res/raw/bar文件放置到Linux系统中的/tmp/poc中,同理Windows系统中也存在漏洞。

漏洞复现

该漏洞的复现参考了漏洞发现者在GitHub发布的文章,但作者没有说明POC如何构造,像jadx、AndroidStudio只能反编译apk,但无法直接编辑apk资源。最终选择使用MT管理器构造了apk,具体过程如下:

在安卓模拟器安装MT管理器,这是一款多功能的APK逆向工程软件,同时兼具文件管理器功能,可以用于汉化应用、替换资源、修改布局、修改逻辑代码、资源混淆、去除签名校验等等。

图片

将我们要构造POC的apk包也安装到模拟器,而后使用MT管理器提取apk包。

图片

点击提取后的apk包,选择查看。

图片

选中resources.arsc,并使用ARSC编辑器打开。

图片

找到raw目录下的type-info。

图片

在该文件中增加属性是realName,数值是路径穿越的POC,该文件中所见的id、name即为开头提到的resource.arsc文件中列出的资源名称和资源索引。

图片

之后保存修改,继续保存为工程,并进行编译。

图片

图片

在项目编译过程中漏洞实际上会被触发,因此上述过程只是对resource.arsc进行编译,接着将修改好的resources.arsc文件通过共享文件夹提取到电脑。

图片

使用压缩软件打开原始的apk包,删除其中的resources.arsc文件,再将修改好的resources.arsc替换进去。

图片

我们以集成了Apktool工具的移动安全检测框架MobSF为例复现该漏洞,在MobSF中上传构造好POC的apk文件。

图片

上传完成后查看tmp目录,发现POC构建的poc文件被上传到了系统tmp目录。

图片

但上传后的文件没有执行权限,此时仅仅是任意文件覆盖的漏洞。不过,漏洞作者在研究后发现MobSF使用jadx(另一款流行的软件逆向工程软件)作为其静态分析的一部分,它通过子进程调用jadx,但在此之前它会将jadx的权限更改为可执行文件。

因此,可以使用文件名为jadx的POC作为apk的res资源文件名,在其中写入任意脚本,再通过路径穿越覆盖jadx文件实现命令执行。

MobSF中上传的apk包位于/.MobSF/uploads/文件名MD5/apktool_out/res/raw,jadx的路径是/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/,需要六级目录的穿越。

图片

按上述步骤重新使用MT管理器构造POC如下。

图片

再保存重新编译打包,并上传到MobSF,上传后查看jadx文件是已经被成功覆盖为写入的命令。

图片

漏洞修复

该漏洞的修复方式很简单,新版的Apktool新增了路径穿越符号的检测代码。

图片

图片

参考资料

https://github.com/0x33c0unt/CVE-2024-21633

https://github.com/iBotPeaches/Apktool/security/advisories/GHSA-2hqv-2xv4-5h5w

作者:RoShine

2024年2月8日 

洞源实验室

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/460499.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间序列之周期性

什么是序列相关? 针对时间序列的趋势和季节性,我们可以很容易地利用“时间相关”的属性进行建模,即直接从时间索引中得出特征。但是有些情况下,一些时间序列只能利用“序列相关”属性,即使用序列的历史值作为特征。如…

父母老了,耳朵听不清怎么办?

你有没有发现,随着年纪的增长,父母的耳朵好像越来越不好使了: 家里的电视声越放越大; 和他们说话常常讲到一半就被打岔; 一件事情要重复说好几遍才能听清; …… 也许父母没意识到问题的严重性&#xff0…

flutter开发实战-可扩展popup弹窗template模版样式

flutter开发实战-可扩展popup弹窗template模版样式 最近在看到一个flutter_beautiful_popup,可以美化弹窗窗口样式。该插件通过一个template模版的类BeautifulPopupTemplate作为抽象的base类。 一、基类BeautifulPopupTemplate 在BeautifulPopupTemplate中&…

C语言:分支与循环

创造不易,友友们给个三连吧!! C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分…

单片机——ISP下载、ICP下载、IAP下载

文章目录 ISPICPIAP ISP 在线系统编程,使用引导程序加上外围UART/SPI接口烧录 其本质是将程序的hex文件烧录到板子里的过程 可以使用flymcu这个软件 System memory是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说…

字节3面真题,LeetCode上hard难度,极具启发性题解

文章目录 🚀前言🚀LeetCode:41. 缺失的第一个正整数🚀思路🚀整个代码思路串一下🚀Code 🚀前言 铁子们好啊!阿辉来讲道题,这道题据说是23年字节3面真题,LeetC…

RabbitMQ高可用架构涉及常用功能整理

RabbitMQ高可用架构涉及常用功能整理 1. rabbitmq的集群模式2. 镜像模式高可用系统架构和相关组件3. rabbitmq的核心参数3.1 镜像策略3.2 新镜像同步策略3.3 从节点晋升策略3.4 主队列选择策略 4. rabbitmq常用命令4.1 常用基础命令4.1.1 服务管理4.1.2 用户管理4.1.3 角色管理…

微软.NET6开发的C#特性——运算符、表达式和命名空间

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性,然后比较其他各种语言进行认识。 C#经历了多年发展…

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar,0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹,在cc-myTabbar文件夹创建components文件夹,在components文件夹创建cc-myTabbar.vue组件…

NAT——网络地址转换、NAPT

网络地址转换 NAT (Network Address Translation) 1994 年提出。 需要在专用网连接到互联网的路由器上安装 NAT 软件。 装有 NAT 软件的路由器叫做 NAT路由器,它至少有一个有效的外部全球 IP 地址。 所有使用本地地址的主机在和外界通信时,都要在 NA…

MPLS VPN功能组件

VPN实例 VPN实例即为VPN路由转发表VRF,不同VPN之间的路由隔离通过VPN实例实现,PE上存在多个路由转发表,包括一个公网路由转发表,以及一个或多个VPN路由转发表。 PE为每个直接相连的Site建立并维护专门的VPN实例,VPN实…

构造 蓝桥OJ小蓝的无限集

样例输入 4 1 4 7 2 5 8 3 6 8 12 11 81 样例输出 No Yes No No #include<bits/stdc.h> using namespace std;using ll long long;bool rnk(ll a, ll b, ll n) {if((n-1) % b 0) return true;else if (a 1) return false;ll res 1;while(res < n){res * a;if (r…