开篇
在大家挖掘漏洞过程中,可能有很多种方式,比如:纯白盒的代码审计、纯黑盒的渗透测试、对比补丁包寻找漏洞点等方式。这里我想为大家分享一种思路,灰盒(黑白盒结合)的代码审计。这种方式相较于传统的纯白盒代码审计而言,具有更高的效率。
通常来讲 source+sink = BUG。我们可以利用黑盒来快速寻找source点(外部传入参数),利用白盒来寻找sink点(风险函数),从而快速定位漏洞点。最近刚好有个以前的挖掘的漏洞被修复了,这里带大家来体验下这种思路的漏洞挖掘。
系统简介
O2OA企业应用开发平台是一款开源产品,是使用JavaEE技术栈,分布式架构设计的一款真正全代码开源的企业应用定制化开发平台。适用于企业OA、协同办公类信息化系统的建设和开发。
** 下载地址**
l 开源主页 : https://www.oschina.net/p/o2oa
l 影响范围:<=7.1.3
l 漏洞版本下载 :
https://download.o2oa.net/download/o2server-7.1.3-windows-x64.zip(win)
https://download.o2oa.net/download/o2server-7.1.3-linux-x64.zip(linux)
黑盒-任意文件上传
首先我们看看该系统后台存在的任意文件上传漏洞,一个比较经典的漏洞
漏洞位置:系统设置> 系统部署> 资源部署
功能点截图:
测试经过:
点击上传文件,请求数据包如下
上传后的文件位置在:o2server/servers/webServer/test.bat
这里的上传点未限制任何后缀,并且上传后的文件也未进行重命名文件名的操作。
那么我们尝试是否可进行路径遍历,上传该文件到其他目录下
这里修改数据包入上图所示,进入相应目录下进行查看
可以看到成功上传。
这里的路径遍历、未进行文件重命名隐患给了我们很大的操作空间,为后续的RCE提供了基础。
黑盒-任意文件读取与写入
任意文件读取
前言:
在整个漏洞挖掘过程中,需要注意推断哪些地方可能出现漏洞。就好比我们打游戏时,中单需要推断打野是红开还是蓝开,从而推断打野从上野区来还是下野区来。那么对应到漏洞中就是:与数据库交互的地方可能出现SQL注入、文件操作的地方可能出现任意读取和写入。下面我们来看下这里的任意读取和写入。
漏洞位置:
** 系统设置 > 基础配置 > 平台配置**
功能点截图:
测试经过:
看到这个功能点时,我们首先看到它是用来读取、编辑配置文件的。那么我们需要验证下,它是将通过读写数据库还是读写的本地文件。这里有一种方法,可以通过观察数据包进行验证,如果数据包中有文件相关的操作,那么大概率为读写配置文件;如果数据包多为json格式,那么大概率为读写数据库操作。
我们看下这里的数据包:
请求包中为fileName字段,那么基本可以确认为读写配置文件操作。
要达到任意读写,只需要路径遍历即可。构造数据包如下:
成功读取上级目录下的文件。
任意文件写入
漏洞位置:
系统设置 > 基础配置 > 平台配置
功能点截图:
测试经过:
同样,这里的功能点相应的是保存配置文件,那么通过上面的方法,进行路径遍历,是否可以进行任意文件写入呢?下面我们来看一下。
点击保存进行抓包,并对文件名称进行更改,尝试进行任意文件写入
上图为保存配置文件时抓取到的数据包,对数据包构造如下图
这时发现响应包响应为非法json格式,看来此处的任意文件写入的内容需要符合json格式
构造数据包如下尝试进行路径遍历写入
查看文件写入情况
成功写入
灰盒-RCE
前言:
我们目前挖掘到了两个高危漏洞,任意上传、任意读写,那没有RCE怎么行呢!
漏洞位置:
日志查看器>SystemLog
功能点截图:
测试经过:
在进行功能点浏览的时候,一个日志查看器的功能引起了我的注意
在输入help后,发现其存在start、stop等功能点
这时候我一直在想,它的start、stop所有服务功能点是如何实现的呢
直接写死在代码里的吗还是存在相应的脚本进行控制?
这里有一个可控的source点,那么只需要找到相应功能点的sink点,就可以达到RCE
我根据代码所处的接口位置找到如下代码:
source点:可从外部输入restart命令
sink点:getRuntime执行启动脚本
这段代码大概的逻辑是这样:
收到restart指令 - > 识别操作系统 -> 判断是否存在相应的启动脚本 -> 若存在则getRuntime执行对应脚本
既然它这里的逻辑是执行相应的脚本文件,那么我们岂不是可以通过任意文件写入漏洞 或者 上面的任意文件上传漏洞进行覆盖重写该脚本文件,再通过restart指令执行被重写后的脚本,从而任意命令执行。
下面对每种RCE方式进行实现
RCE一:覆盖/etc/passwd添加用户
利用条件:Linux系统
1、首先,我们利用任意文件读取漏洞,读取/etc/passwd文件内容
2、添加将原文件内容处理后,在尾部添加一条自定义密码的用户
v1ct0ry:$1$ljH.AvaV$Q3uVym4pFYs2J4Mk7z9v9.:0:0:root:/root:/bin/bash
这里添加的是,用户密码为v1ct0ry/123456的用户,处理后的文件内容如下图所示
3、利用任意文件上传漏洞覆盖/etc/passwd文件
利用任意文件上传漏洞覆盖服务器当中的/etc/passwd文件
在服务器上验证是否上传成功
成功写入
这里由于是直接修改/etc/passwd文件,/etc/shadow文件不会同步加入v1ct0ry2用户,从而不能使用v1ct0ry2用户登录ssh
需要再次写入/etc/shadow文件,文件内容为:
v1ct0ry2:$1$ljH.AvaV$Q3uVym4pFYs2J4Mk7z9v9.:19209:0:99999:7:::
4、利用ssh远程登录服务器(前提是ssh映射在公网)
通过添加的账户密码远程连接服务器
成功连接。
RCE二:任意文件上传覆盖启动脚本
利用条件:Windows
因为该RCE需要重启服务,为了不影响应用本身运行情况,我们需要在原启动脚本后添加一条命令执行语句
首先通过任意文件读取漏洞读取原启动脚本内容
准备好一个在尾部添加自定义命令的bat脚本,以start_windows.bat进行文件上传
在日志控制台输入restart进行命令执行
总结
我们在这里再大概梳理一下整个过程,任意文件上传 -> 路径遍历 -> 任意文件读取 -> 任意文件写入 -> RCE 在我们日常进行漏洞挖掘时,大家可以参考这种方式,以source点和sink点结合的思维、黑白盒结合的方式进行漏洞挖掘,可以适当提高漏洞挖掘的效率哟。