渗透测试:数据库UDF提权(linux)
目录
开头:
1.UDF提权简介:
1.1共享库文件(UDF文件)指定目录:
版本特征:
操作系统版本:
2.靶场UDF提权复现
提权前提
1.要有一个高权限的MySQL的账号
编辑 2.MySQL的权限配置secure_file_priv为空
3.必须有存放UDF文件的目录
提权过程
1.重命名UDF文件:
2.目标主机上编译UDF文件:
3.进入mysql利用:
3.总结:
开头:
学习的视频是哔哩哔哩红队笔记:
红队打靶:pWnOS2.0打靶思路详解(vulnhub)-CSDN博客
打靶时参考文章和本文借鉴文章:
渗透测试:MySQL数据库UDF提权详解-CSDN博客
靶机下载链接见:
http://pwnos.com/files/pWnOS_v2.0.7z
本篇文章,主要讲解UDF提权,也是上篇靶场的第二种提权方法红队笔记10:pWnOS2.0打靶流程-whatweb指纹识别-searchsploit搜索漏洞利用getshell(vulnhub)-CSDN博客
1.UDF提权简介:
UDF:User Defined Function 用户自定义函数,MySQL数据库的初衷是用于方便用户进行自定义函数,方便查询一些复杂的数据,同时也有可能被攻击者利用,使用udf进行提权。
提权原理:攻击者通过编写,能调用cmd或者shell的共享库文件(window为.dll,linux为.so),并且导入到一个指定的文件夹目录下,在数据库中通过导入的共享库文件创建自定义函数,该自定义函数功能依照于共享库文件的功能,从而在数据库中调用该自定义函数能够使用系统命令(就像使用version()函数可以查看数据库版本,自定义函数就可以执行系统命令)
执行过程:本质上还是利用了MySQL能够执行系统命令的特点。具体过程如下
(1)攻击者编写,可以调用用cmd或者shel的共享库文件(window为.dll,linux为.so),将共享库导入指定的函数目录中。
(2)在MySQL中创建自定义函数其功能有共享库文件提权。(类似于python中的写了一个函数,其函数主要功能是python内置库中所提供的)
(3)通过创建的函数执行系统命令,实现提权。
1.1共享库文件(UDF文件)指定目录:
版本特征:
mysql版本不同UDF文件指定存放目录也不同;
操作系统版本:
操作系统版本不同UDF文件指定存放目录也不同;
2.靶场UDF提权复现
本文靶场复现UDF提权的环境 linux mysql >5.1
提权前提
1.要有一个高权限的MySQL的账号
具有增删改查的权限以创建自定义函数,最好是root账号。
查看当前登录用户(以下两行均可):
select user();
select current_user;
我们这里登录的用户是root,最高权限;如果不是root,可以用以下命令查看特定用户的权限,可以将root修改为任意用户,\G每个字段打印到单独的行,也有’;’的作用:
SELECT * FROM mysql.user WHERE user='root'\G
Y :代表用户该权限 ,还可以用如下的命令查看数据库的所有用户:
SELECT user,host FROM mysql.user;
2.MySQL的权限配置secure_file_priv为空
secure_file_priv为空表示 load_data,into outfile,load_flie() 文件操作类函数都没有目录的限制,可以使用如下命令查看secure_file_priv参数的值:
show variables like '%secure_file_priv%';
secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。
1.secure_file_priv的值为null表示限制mysql不允许导入/导出,
2.secure_file_priv的值为/tmp/ 表示限制mysql的导入/导出只能发生在/tmp/目录下。
3.secure_file_priv的值没有具体值时表示不对mysql 的导入/导出做限制。
3.必须有存放UDF文件的目录
这个目录与MySQL的版本和操作系统有关,对于linux MySQL>=5.1的版本,创建函数的目录是plugin,可以用如下的命令查看:
show variables like '%plugin%';
只有存在这个目录才有可能进行UDF提权,不存在就要去创建。
提权过程
可以知道UDF提权需要有个可以执行系统命令的UDF文件,所有我们使用searchsploit 搜索mysql UDF 获得UDF文件.
searchsploit mysql udf
此处我们可以根据MySQL的版本进行选择,这里选择比较通用的第二条1518.c,把1518.c下载下来:
searchsploit mysql udf -m 1518
cat 1518.c
1518.c中的内容有很多,我们重点看用法Usage中的内容,读者如果单纯想进行提权,只要一步一步copy下图中的命令即可,注意修改路径即可。
1.重命名UDF文件:
用法中首先使用gcc编译,编译的文件名为raptor_udf2.c,因此我们可以先将这个1518.c改名为raptor_udf2.c,方便后续操作,命令如下:
mv 1518.c raptor_udf2.c
2.目标主机上编译UDF文件:
进行gcc编译,这里最好在靶机中编译(而不是kali),因为不同环境的编译结果可能不一样,既然要对靶机提权,那就在靶机中进行编译。
怎么将UDF文件上传到目标靶嘞?
1.都在内网-获得初步shell:本地开启有个web服务,目标靶机wget下载
2.目标靶机外网-自己在内网:将UDF文件上传到自己服务器开启web服务,目标wget下载
3.根据目标靶机web的功能,如本篇靶机web存在图片上传功能且不存在过滤,就可以将udf上传到目标主机
gcc -g -c raptor_udf2.c -fPIC
该命令是使用gcc编译器来编译名为"raptor_udf2.c"的源代码文件,并生成一个目标文件(object file)。
-g:这个参数告诉编译器在目标文件中包含调试信息。这将使得在调试程序时可以获得更多的信息,例如变量的值和源代码的行号。
-c:这个参数告诉编译器只进行编译而不进行链接。它将源代码文件编译成一个目标文件,而不是生成可执行文件。这在构建大型程序时通常是一个常用的步骤。通常会生成.o文件。
-fPIC:虽然Usage中没有提到这个参数,但还是建议加上。这个参数指定编译为位置独立代码(Position Independent Code)。位置独立代码是一种可执行代码的格式,它可以在内存中的任何位置加载和执行,而不依赖于特定的内存布局。这在生成共享库(shared library)时非常有用,因为共享库可以加载到进程的任何地址空间中。
接着按照1518.c中注释的Usage一步一步执行命令即可,下一条命令是:
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
该命令是使用gcc编译器将名为"raptor_udf2.o"的目标文件链接为一个共享库(shared library)文件,并命名为"raptor_udf2.so"。下面是每个选项的解释:
-g:这个选项告诉编译器在生成的共享库文件中包含调试信息。
-shared:这个选项指定编译器生成一个共享库文件,而不是可执行文件。共享库是一种可被多个程序共享和重用的代码库。
-Wl,-soname,raptor_udf2.so:这个选项将"-soname"参数传递给链接器(ld)。"-soname"用于指定生成的共享库文件的名字,这里是"raptor_udf2.so"。
-o raptor_udf2.so:这个选项指定生成的共享库文件的输出文件名,这里是"raptor_udf2.so"。
raptor_udf2.o:这是要链接的目标文件的名称。
-lc:这个选项告诉链接器使用C标准库(libc)。
这样.so 的UDF文件通过编译获得。
3.进入mysql利用:
总结利用过程:
1.创建foo表:
2.将UDF文件内容写入foo表
3.将foo表中的UDF文件内容,导出到指定目录中并以UDF文件名命名(2,3实现了将UDF表导入指定目录)
4.通过指定目录下的UDF文件提供的功能创建自定义函数
然后我们登录靶机上的MySQL,需要有一个高权限的用户,对于靶机pWnOS2.0,我已经搞到了数据库root账号的密码,登录即可:
mysql -u root -p
输入密码
use mysql;
create table foo(line blob);
use mysql;
语句用于切换当前数据库为"mysql"。
CREATE TABLE foo(line blob);
。表示在当前数据库中创建一个名为"foo"的表。该表只有一个列名为"line",并且该列的数据类型是BLOB(二进制大对象)。BLOB类型用于存储二进制数据,如图像、音频、视频等。
insert into foo values(load_file('/var/www/blog/images/raptor_udf2.so'));
该SQL语句将加载'/var/www/blog/images/raptor_udf2.so'文件的内容,并将其作为二进制数据插入到"foo"表的"line"列中。(将我们创建的UDF文件,以二进制数据写入foo表中)
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
该SQL语句用于导出"foo"表中所有行的数据,并将其以文本形式写入到'/usr/lib/mysql/plugin/raptor_udf2.so'文件中。特别注意,这里的写入路径是plugin目录的路径,在“提权前提”小节中已经提到,如果你不知道plugin目录的路径,可以用show variables like '%plugin%';进行查看。
create function do_system returns integer soname 'raptor_udf2.so';
这个SQL语句用于在MySQL中创建一个名为"do_system"的函数,该函数返回一个整数值。该函数的实现由外部库"raptor_udf2.so"提供。
select * from mysql.func;
查看我们是否成功创建了函数。
此时我们应该可以使用do_system函数执行任意系统命令了。那么我们可以do_system函数进行提权。命令如下:
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
do_system中的这条Linux命令是将/bin/bash(Bash shell可执行文件)复制到/tmp目录下,并将复制后的文件命名为rootbash。接着,使用chmod命令给/tmp/rootbash设置权限,使用+xs参数将其设为可执行文件,并将其所有者的权限设置为具有特殊权限。接下来我们只要在www-data的shell中执行rootbash即可,先退出MySQL,然后运行rootbash:
/tmp/rootbash -p
提权成功!
3.总结:
本文虽然是在linux环境下,使用UDF提权成功了,但是在真实环境中linux很难存在UDF提权,因为UDF提权需要一个plugin文件,并且我们要有能够写入的权限,在Linux严格的系统权限下,mysql用户或web用户无plugin目录的写入权限。
使用UDF提权主要是在windows系统上进行提权,但是不同操作系统UDF文件导入目录不同,所有要根据具体环境来进行微调操作
相关文章:

渗透测试:数据库UDF提权(linux)
目录 开头: 1.UDF提权简介: 1.1共享库文件(UDF文件)指定目录: 版本特征: 操作系统版本: 2.靶场UDF提权复现 提权前提 1.要有一个高权限的MySQL的账号 编辑 2.MySQL的权限配置secure_file_priv为空 3.必须有存放UDF文件的…...

java算法day45 | 动态规划part07 ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数
70. 爬楼梯 (进阶) 题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入…...

HuggingFace踩坑记录-连不上,根本连不上
学习 transformers 的第一步,往往是几句简单的代码 from transformers import pipelineclassifier pipeline("sentiment-analysis") classifier("We are very happy to show you the 🤗 Transformers library.") ""&quo…...
面试题:Spring Boot Starter的功能与使用场景
Spring Boot Starter 是 Spring Boot 框架为了简化项目的初始化和配置工作而设计的一种模块化依赖管理方式。它主要具有以下几个关键功能和使用场景: 功能: 1. 依赖管理每个 Starter 都是一组相关的依赖项集合,这些依赖项都是为了实现特定功能…...

上位机图像处理和嵌入式模块部署(qmacvisual之n点标定)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 工业场景中,很多时候图像是用来做测量的。虽然我们很希望载台是平的,摄像头是正对着拍摄物体的,但是运行时间长…...

Francek Chen 的128天创作纪念日
目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了,最初我第一次接触CSDN技术社区是在2022年4月的时候,通过学长给我们推荐了几个IT社区平台&a…...
PyTorch之Torch Script的简单使用
一、参考资料 TorchScript 简介 Torch Script Loading a TorchScript Model in C TorchScript 解读(一):初识 TorchScript libtorch教程(一)开发环境搭建:VSlibtorch和Qtlibtorch 二、Torch Script模型格…...

vscode 连接远程服务器 服务器无法上网 离线配置 .vscode-server
离线配置 vscode 连接远程服务器 .vscode-server 1. .vscode-server下载 使用vscode连接远程服务器时会自动下载配置.vscode-server文件夹,如果远程服务器无法联网,则需要手动下载 1)网址:https://update.code.visualstudio.com…...

arm开发板移植工具mkfs.ext4
文章目录 一、前言二、手动安装e2fsprogs1、下载源码包2、解压源码3、配置4、编译5、安装 三、移植四、验证五、总结 一、前言 在buildroot菜单中,可以通过勾选e2fsprogs工具来安装mkfs.ext4工具: Target packages -> Filesystem and flash utilit…...

某盾滑块拼图验证码增强版
介绍 提示:文章仅供交流学习,严禁用于非法用途,如有不当可联系本人删除 最近某盾新推出了,滑块拼图验证码,如下图所示,这篇文章介绍怎么识别滑块距离相关。 参数attrs 通过GET请求获取的参数attrs, 决…...
这个世界万物存在只有一种关系:博弈
$上证指数(SH000001)$ 我能给各位最大的帮助可能就是第一个从红警游戏引入了情绪周期视角的概念,而这个概念可以帮助很多人理解市场成为一种可能性,如果不理解可以重新回归游戏进行反复体验,你体验的足够多,思考的足够多ÿ…...
c#让不同的工厂生产不同的“鸭肉”
任务目标 实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。 分析任务 我们需要有武汉工厂、南京工厂、长沙工厂的类,类中需要实现生产鸭…...

大数据分析与内存计算——Spark安装以及Hadoop操作——注意事项
一、Spark安装 1.相关链接 Spark安装和编程实践(Spark3.4.0)_厦大数据库实验室博客 (xmu.edu.cn) 2.安装Spark(Local模式) 按照文章中的步骤安装即可 遇到问题:xshell以及xftp不能使用 解决办法: 在…...

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection
文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文:https://arxiv.org/pdf/2103.10039.pdf 代码&…...

3D模型格式转换工具HOOPS Exchange如何将3D文件加载到PRC数据结构中?
HOOPS Exchange是一款高效的数据访问工具,专为开发人员设计,用于在不同的CAD(计算机辅助设计)系统之间进行高保真的数据转换和交换。由Tech Soft 3D公司开发,它支持广泛的CAD文件格式,包括但不限于AutoCAD的…...

c# wpf Template ContentTemplate
1.概要 1.1 定义内容的外观 2.2 要点分析 2.代码 <Window x:Class"WpfApp2.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…...
空和null是两回事
文章目录 前言 StringUtils1. 空(empty):字符串:集合: 2. null:引用类型变量:基本类型变量: 3. isBlank总结: 前言 StringUtils 提示:这里可以添加本文要记录…...

UNIAPP(小程序)每十个文章中间一个广告
三十秒刷新一次广告 ad-intervals"30" <template><view style"margin: 30rpx;"><view class"" v-for"(item,index) in 100"><!-- 广告 --><view style"margin-bottom: 20rpx;" v-if"(inde…...
pip包安装用国内镜像源
一:临时用国内源 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple 例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider,这样就会从清华这边的镜像去安装pyspider库 清华:https://py…...

uniapp:小程序腾讯地图程序文件qqmap-wx-jssdk.js 文件一直找不到无法导入
先看问题: 在使用腾讯地图api时无法导入到qqmap-wx-jssdk.js文件 解决方法:1、打开qqmap-wx-jssdk.js最后一行 然后导入:这里是我的路径位置,可以根据自己的路径位置进行更改导入 最后在生命周期函数中输出: 运行效果…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...