导语:在这篇文章中,我们将向读者介绍通过Microsoft SQL Server执行SQL和OS命令的相关技术,利用它们向目标系统投递并执行恶意payload。
对于入侵者来说,数据库服务器通常是他们的首要目标。最近,我们开展了一个名为StickyDB的新研究项目,以便了解更多与数据库黑客有关的行为,包括常见的数据库攻击,以及攻击者所使用的工具和技术,等等。
为了开展这项研究,我们创建了一个含有各种流行的SQL/NoSQL数据库(如Microsoft SQL ServerMySQLOracle和MongoDB)的蜜罐网络,并对这些数据库的访问情况实施了长达六个月的监控。
我们将研究成果分为四个部分。在这篇文章中,我们将向读者介绍通过Microsoft SQL Server执行SQL和OS命令的相关技术,利用它们向目标系统投递并执行恶意payload。
数据库服务器的搜索与占领
在过去几个月中,我们调查了中国黑客团体针对MS SQL和MySQL数据库服务器发动的多次攻击活动。这些攻击活动涉及三个主要阶段:扫描、攻击和投递恶意payload。在本文中,我们只讨论这些攻击活动的最后一步,即恶意payload的投递和执行技术。
需要说明的是:这些攻击通常是从扫描子网并创建由运行不同服务(如HTTP Web服务器、MS SQL和MySQL)的计算机组成的列表开始。扫描过程结束后,攻击者通常会试图通过暴力破解用户名和密码的方式,来攻破数据库服务器的第一道防线。初步攻击一旦得手,就可以使用自动化工具运行SQL命令,来获得目标服务器的完全控制权了。
通常情况下,攻击者会从临时FTP或HTTP服务器向目标系统传送恶意payload,以实现对这些服务器的全面接管。我们从攻击中收集到的payload种类繁多,包括加密货币挖矿软件、DDoS僵尸程序和各种远程访问木马(RAT)等。
图1:数据库接管过程
向目标系统投递并执行恶意可执行文件
通常,恶意payload主要通过两种方式植入数据库服务器:直接在目标系统上创建,或者通过SQL命令从远程服务器下载。在下一节中,我们将讨论在目标系统上创建和运行可执行文件的各种方法。
通过SQL命令直接在目标系统上创建可执行文件
SQL Server允许在T-SQL中使用OLE存储过程处理COM [1]对象。同时,OLE过程还可以实例化COM对象并使用该实例的方法和属性。
某些攻击者会利用这个功能在磁盘上创建和存储可执行文件。在下面的示例中,攻击者就使用了OLE自动化[2]过程(sp_OA)和ADODB.Stream对象[3],该对象的类标识符为“00000566-0000-0010-8000-00AA006D2EA4”。
此外,攻击者也可以使用sp_OAMethod过程执行ADODB.Stream对象的方法(Open、Write、SaveToFile和Close),从而将打开的Stream对象的二进制内容(HEX编码的可执行文件)存储到本地文件中。
下图给出了攻击的完整流程:
图2:通过OLE过程和ADODB.Stream对象将文件保存到本地的技术
通过SQL命令将可执行文件下载到目标服务器
根据我们的SQL服务器攻击分析结果来看,我们发现攻击者在下载恶意可执行文件时用到了下列对象和功能。
COM对象和OLE存储过程
攻击者利用了如下事实:SQL Server可以借助COM对象,通过OLE存储过程将恶意可执行文件下载到目标系统中。后面的攻击就是基于以下COM对象的:FileSystemObject、ADODB.Stream、WshShell和XMLHTTP [4]。
攻击者可以使用File System对象来创建并填充VB脚本(c:\401.vbs)。而该脚本的作用,就是调用XMLHTTP和ADODB.Stream对象的方法来下载恶意可执行文件(c:\cz.exe)。然后,会通过WshShell对象来执行这个VB脚本。
下面给出用于创建和执行VB下载器脚本的命令。
下图总结了攻击的完整流程:
图3:如何创建和执行HTTP下载器脚本
Ad Hoc分布式查询和Microsoft Jet的Microsoft OLE DB Provider
AD Hoc分布式查询功能允许从多个异构数据源(如多个SQL Server实例)访问数据。这些数据源可以存储在相同或不同的计算机上。启用ad-hoc访问功能时,任何登录到该实例的用户都可以通过OPENROWSET [5]或OPENDATASOURCE [6]函数,使用OLE DB Provider执行那些通过网络引用任意数据源的SQL语句。
攻击者可以利用Ad Hoc分布式查询和Microsoft Jet的Microsoft OLE DB Provider[7]来创建和执行FTP脚本,而该脚可以用来在从远程服务器下载恶意可执行文件。
下面是这种攻击的一个例子:
下图给出了攻击的完整流程:
图4:如何使用Ad Hoc分布式查询和Microsoft Jet的Microsoft OLE DB Provider创建和执行FTP下载器脚本
SQL代理作业
SQL Server代理[8]作业有时候会被攻击者用来创建恶意的自动任务。攻击者经常利用SQL代理作业来在受感染的系统上实现持久性,这方面的内容将在后续文章中详述。
在下面的示例中,攻击者使用了SQL代理作业和SQL Server作业系统存储过程来调用cmd.exe,并创建了一个FTP脚本来下载恶意可执行文件。这个FTP脚本与我们在前面例子中看到的脚本功能非常相似。
下图总结了攻击的完整流程:
图5:使用SQL代理作业下载和执行可执行文件的方法
XP_CMDSHELL——扩展存储过程
将恶意可执行文件上传到目标服务器的另一种方法,是借助xp_cmdshell扩展存储过程[9]。xp_cmdshell提供了一种从SQL Server实例的上下文中执行主机Windows系统命令的方法。
下面的示例为读者演示如何使用xp_cmdshell命令执行cmd.exe并创建FTP脚本的方法,该脚本将从远程服务器下载恶意可执行文件。
小结
在本文中,我们为读者详细介绍了通过MS SQL数据库执行SQL和OS命令的各种方法,以便向目标系统传递和执行恶意payload。在本系列的下一篇文章中,我们将为读者介绍通过MySQL数据库执行SQL和OS命令的方法。
[1] COM是一种允许对象进行跨进程和跨机器通信的技术,并且能够让这种通信如同在单个进程中那样简单。COM是通过规定对象的关联数据只能通过对象的接口进行处理来实现这一点的。
[2] OLE自动化是由微软提出的一种进程间通信机制。
[3] ADODB.Stream对象用于读写和管理二进制数据流。
[4] XMLHTTP对象是微软XML DOM(文档对象模型)套件的一部分。该对象最初设计用于通过HTTP协议为远程服务器上的XML文档提供客户端访问。它提供了一个简单的API,通过该API可以发送请求并获得生成的XML、HTML或二进制数据。
[5] OPENROWSET函数可用于从OLEDB数据源导入数据。它是访问链接服务器中的数据表的替代方法,同时也是一种通过OLE DB连接和访问远程数据的一次性临时方法。
[[6] OPENDATASOURCE可以在不使用链接服务器名称的情况下,提供ad hoc连接信息用于对象名称中的一部分,而对象名称通常由四部分组成。
[7]Microsoft Jet的OLE DB Provider允许通过ADO访问Microsoft Jet数据库。JET向开发人员提供了在本地文件系统或共享网络文件夹上创建和操作关系数据库的功能。
[8] SQL Server代理是执行预定管理任务(作业)的Microsoft Windows服务。SQL Server代理使用SQL Server来存储作业信息。其中,一个作业可以包含一个或多个作业步骤。而每个步骤都有自己的相应任务,例如备份数据库等。
[9]扩展存储过程是可以供SQL Server动态加载和运行的DLL。