移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

栏目: 编程工具 · 发布时间: 6年前

内容简介:MobSF 一款智能化、一体化的开源移动应用(Android / iOS/Windows Phone)自动测试框架(详见:需要事先安装好JDK1.7。

*本文原创作者:ForrestX386,本文属于FreeBuf原创奖励计划,未经允许禁止转载

0×00. 引言

MobSF 一款智能化、一体化的开源移动应用(Android / iOS/Windows Phone)自动测试框架(详见: http://www.freebuf.com/terminal/141439.html ),通过框架自带的Web接口上传待分析的移动应用包,就可以自动有效、快速地对应用APK 和IPA文件 及压缩的源代码进行审计分析, 并给出分析报告。在研究MobSF 框架使用的过程中,发现github的问题列表上有人曝出0.9.4.2 以下的版本web 上传接口对上传的apk包zip解压的时候存在漏洞可导致任意文件写入,引发潜在的代码执行漏洞,本文以0.9.3.7 Beta版本为例进行复现与分析,详文如下。

0×01. 复现

1.安装MobSF 0.9.3.7

需要事先安装好JDK1.7。

然后下载MobSF 0.9.3.7,解压,在其目录下执行pip install -r requirements.txt。

最后运行:python manage.py runserver 0.0.0.0:8080。

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

2.漏洞测试

打开MobSF的web接口(基于Django开发):

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

选择事先准备好的漏洞测试验证压缩包,上传分析:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

上图表示任意文件写入成功,因为系统处于开发模式下运行,故会自动重载,然后执行__init__.py中的命令(任意文件写入成功,下图,导致代码执行,上图)

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

查看/root/MobSF/StaticAnalyzer/__init__.py 确实被写入了内容:print ‘Webcome to FreeBuf!

0×02. 分析

先来了解一下MobSF的系统代码结构:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

上传功能对应的接口/upload:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

/upload接口对应的视图函数:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

跟进MobSF.views.upload ,如下:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

上传接口的主要功能就是校验文件,然后计算上传文件的MD5值,在响应包中指明即将跳转至静态扫描接口的完整路径,也即如下图所示接口:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

开始分析/StaticAnalyzer/ 接口:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

静态分析接口位于StaticAnalyzer 模块的android.static_analyzer.static_analyzer视图函数中,跟进:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

最终回调用Unzip函数对上传的apk文件进行解压缩,问题就出在这个函数中,这函数位于MobSF安装路径/StaticAnalyzer/views目录下的shared_func.py 模块中(这个路径对于构造漏洞验证压缩包有用), 核心代码如下:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

看到这里就知道为啥能任意文件写入了,虽然Django 框架中的request.FILES对象会对上传文件的文件名进行过滤处理,使得形如../../../的目录穿越失效(详见: http://www.freebuf.com/articles/web/183125.html ),导致无法任意目录写入文件,但是request.FILES 不会对压缩包内的文件进行过滤,业务代码逻辑中也未对压缩包内的文件名进行过滤,从而导致漏洞的发生。

因为漏洞验证环境中,MobSF系统处于开发模式下,因为代码文件有变动,导致系统会自动重载,执行写入到StaticAnalyzer模块__init__.py文件的代码,也即执行:print ‘Webcome to FreeBuf!

如果写入到__init__.py中的代码是一段反弹 shell 代码,那么就存在任意代码执行导致获取系统shell的可能。

0×03. 不足与突破之策

0×02节中最终分析的结果是:导致任意代码执行的前提是:系统处理开发模式,写入代码后会导致系统重载触发代码执行。

不过在正式环境中,系统一般不会处于开发模式,所以被写入的代码不会被执行。

怎么提高恶意代码被执行的概率呢?

换个思路,不一定非要写入MobSF系统文件中,也可以写入到 python 安装包中,比如pip中。

则会将恶意代码写入到pip工具的__init__.py 中,下次执行pip 安装模块的时候就会触发恶意代码执行。

如果MobSF系统运行的权限是root,直接写入/root/.ssh/authorized_keys 获取root shell 也是完全可能的。

0×04. 如何修复

看下官方是怎么修复的,看些bug fix 的commit:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

直接用z.extract函数将zip压缩包中的文件解压缩保存至指定目录,为啥extract 就是安全的呢?看下官方文档说明:

移动安全自动化测试框架MobSF多个版本静态分析接口存在的任意文件写入漏洞复现与分析

注意红框中内容,其意思是说extract函数会自动将目录穿越符和UNC符号过滤掉,所以就没有任意文件写入啥事了。

0×05. 参考

https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.extract

https://ajinabraham.com/blog/exploiting-insecure-file-extraction-in-python-for-code-execution

*本文原创作者:ForrestX386,本文属于FreeBuf原创奖励计划,未经允许禁止转载


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户体验的要素

用户体验的要素

Jesse James Garrett / 范晓燕 / 机械工业出版社 / 2007年10月 / 25.00

这不是一本关于“怎样做(How-to)”的书。有很多很多讨论如何建设网站的书,这本不是。 这不是一本关于技术的书。在这里你找不到一行代码。 这不是一本有答案的书。相反,这本书说的是“如何提出正确的问题”。 这本书将告诉你,在你阅读其他书籍的之前,你需要提前了解什么。如果你需要一个大的概念,如果你需要了解用户体验设计师所做出的决策的环境,这本书很适合你。 这本书经过精心设计,......一起来看看 《用户体验的要素》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换