WeChall - Choose your Path II
Challenge
This is the level11 mini challenge found in
/home/level/11_choose_your_path2/on the warchall box.
Choose your Path 续集。同样是一个 C 程序 charp2,用
popen() 执行 wc 统计文件行数和字符数。
与 level10 charp 的区别:
| 特性 | charp (level10) | charp2 (level11) |
|---|---|---|
| wc 路径 | 硬编码 /usr/bin/wc |
直接用 wc(依赖 PATH) |
| 参数包裹 | 直接拼接 | 单引号包裹 '%s' |
| 引号转义 | 无 | escape_single_quotes() 将 ' →
'\'' |
Level 10 是靠 command injection(popen() 不处理 shell
metachar),而 level 11 加上了单引号包裹和转义函数,所以 command
injection 被堵了。
但新的漏洞是:wc
没有指定绝对路径,可以通过 PATH 环境变量劫持。
Solution
charp2 是 setgid level11 的程序:
1 | $ ls -la /home/level/11_choose_your_path2/ |
solution.txt 只允许 level11 group 读取,但
charp2 执行时有效 GID 变成 level11,所以可以读取。
攻击步骤:
- 创建一个 fake
wc脚本 - 把它的目录加到
PATH最前面 - 运行
charp2,它通过popen("wc -l '...'")执行时,会找到我们的 fakewc - fake
wc继承charp2的 setgid 权限(popen→/bin/sh -c→exec,dash 不会丢弃 setgid),能读取solution.txt
1 | # 创建 fake wc |
原理:
popen("wc -l 'solution.txt'", "r")→/bin/sh -c "wc -l 'solution.txt'"/bin/shis dash(不是 bash),dash 不会丢弃继承的 setgid- dash 通过 PATH 找到我们的
~/mypayload/wc,执行时仍保有charp2的 EGID=level11 - 所以 fake
wc可以cat solution.txt