Windows域环境是基于微软的活动目录服务的(Microsoft Active Directory),它将物理位置分散,所属部门不同的用户在网络系统环境中进行分组,集中统一资源,有效对资源访问控制权限细粒化分配,提高了网络环境的安全性和对网络中资源统一分配管理的便利性。域环境中运行着大量应用包含多种资源,为了方便对资源的合理分组分类再分配给用户使用,微软对域内的每种资源分配了不同的服务主体名称(Service Principal Name)简称SPN。
在使用Kerberos身份验证的网络中,必须在内置计算机帐户(如NetworkService或LocalSystem)或用户帐户下为服务器注册SPN。对于内置帐户,SPN将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户手动注册SPN。因为域环境中每台服务器都需要在Kerberos身份验证服务注册SPN,所以我们可以直接向域控制器进行查询我们需要的服务的SPN,就可以找到我们需要使用的服务资源在哪台机器上。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。如果在整个域中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定的服务实例可以具有多个SPN。例如,SPN总是包含运行服务实例的主机名称,所以服务实例可以为其主机的每个名称或别名注册一个SPN。
在Kerberos的协议中,当用户输入自己的账号密码登录Active Directory中时,域控制器会对账号密码进行身份验证,当身份验证通过后KDC会将服务授权的票据(TGT)颁发给用户作为用户访问资源时验证身份的凭证。
当用户需要访问例如MSSQL服务时,系统会以当前用户身份向域控制器查询SPN为MSSQL的记录。找到该SPN的记录后,用户会再次于KDC通信,将KDC颁发的TGT发送给KDC作为身份验证凭据,还会将需要访问资源的SPN发送给KDC,KDC中的身份验证服务(AS)对TGT解密校验无误后,TGS将一张允许访问该SPN对应的服务的Ticket和该SPN对应服务地址发送给用户,用户使用该Ticket成功访问到MSSQL服务资源。
我们可以使用以下但不限于这些方法:如使用Windows自带的setspn.exe获取SPN信息、Linux跨Windows的python场景使用Impacket获取SPN信息、通过LDAP获取SPN信息、高版本Windows的Powershell获取SPN信息、低版本Windows可以使用第三方VBS脚本获取SPN信息,利用常用的C2 Empire自带的模块进行获取SPN信息。
1)SetSPN.exe是一个本地Windows二进制文件,可用于检索用户帐户和服务之间的映射。该应用程序可以添加、删除或查看SPN注册信息,输入“setspn -t dm.org -q */*”命令获取该域中所有SPN信息。也可以输入setspn.exe –l dm1命令获取指定用户账户的所有SPN信息。
2)可以在Windows中导入AD模块GET-SPN.psm1,利用Powershell获取SPN信息。
import-module .\Microsoft.ActiveDirectory.Management.dll
Import-Module.\Get-SPN.psm1
Get-SPN -type service -search "MSSQLSvc*" -List yes| Format-Table
Get-SPN -type group -search "Domain Admins" -List yes -DomainController 192.168.3.23 -Credential dm1 | Format-Table –Autosize
如果当前环境在域内,并且需要将工具落地在目标环境的情况下,常见的渗透自动化利用工具可能会被终端安全软件检测到或因为固有的流量特征被流量分析工具检测到,我们可以使用如adfind等工具,进行手动查询指定SPN信息,输入以下命令。使用"Adfind.exe -f "ServicePrincipalName=MSSQLSvc*""命令获取所有MSSQL服务绑定的账号。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。