开篇

在大家挖掘漏洞过程中,可能有很多种方式,比如:纯白盒的代码审计、纯黑盒的渗透测试、对比补丁包寻找漏洞点等方式。这里我想为大家分享一种思路,灰盒(黑白盒结合)的代码审计。这种方式相较于传统的纯白盒代码审计而言,具有更高的效率。

通常来讲 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点结合的思维、黑白盒结合的方式进行漏洞挖掘,可以适当提高漏洞挖掘的效率哟。

本文作者:承影战队, 转自FreeBuf