SPN(ServicePrincipal Names,服务主体名称)是服务实例的唯一标识符,当域内存在大量的服务器,管理员为了方便管理会对服务器进行标识,那么管理员标识所使用的方法就是SPN。
SPN分为以下两种类型,如图1-1所示,一种为注册在活动目录的“机器账户computer”下,另一种为注册在活动目录的“域账号Users”下。
1)注册在活动目录的机器账户(CN=Computer)下。当某一个服务的权限为Local System或者Network service时,SPN会注册在机器账户下,同时所加入域的每台机器都会自动注册两个SPN:“Host/主机名”和“Host/主机名.DC名”,如图1-2所示。
2)注册在活动目录的域账号(CN=Users)下。当某一个服务的权限为一个域用户时,SPN会注册在活动目录的域账号下,如图1-3所示。
如下为SPN格式定义,其中<serviceclass> 服务类和<host>主机名为必要参数,<port>、<servername>、<Domain user>为可选参数。
serviceclass/host:port/servername/Domain user
1)<service class> :服务的名称,例如:LDAP、MSsql等。
2)<host>:系统的名称,可以是FQDNNetBIOS名这两种形式任意一种。
3)<port>:服务的端口号,如果使用的是默认端口可以省略。
4)<servername>:服务的专有名称、主机名、FQDN。
5)<Domain user>:域中的用户。
如表1-1所示,例举出一些常见的SPN实例名称。
表 1-1 SPN实例名称
常见服务 | SPN服务实例名称 |
---|---|
SQL Server | MSSQLSvc/adsmsSQLAP01.adsecurity.org:1433 |
Hyper-V Host | Microsoft Virtual Console Service/adsmsHV01.adsecurity.org |
Exchange | ExchangeMDB/adsmsEXCAS01.adsecurity.org |
VMWareVCenter | STS/adsmsVC01.adsecurity.org |
RDP | TERMSERV/adsmsEXCAS01.adsecurity.org |
WSMan | WSMAN/adsmsEXCAS01.adsecurity.org |
前面讲过关于Kerberos协议关于PC1请求server1的某种服务,假设我们需要请求server1的http服务并且我们还想经过Kerberos协议的认证,那么就需要给server1注册一个SPN,给server1注册SPN之后Kerberos就会将服务器实例和服务登录账号关联,在SPN服务注册方面我们使用本地Windows自带的一个二进制的文件—Set SPN进行注册。操作流程如下。
1)以域管理员的身份登录到域控制器,如图1-4所示。
2)打开Powershell管理命令行,如图1-5所示。
3)以z3用户的身份进行SPN服务的注册(假设z3是一个HTTP服务的登录账号)如图1-6所示。
setspn -A http/httptest.testfirest.com:80 z3
4)通过Setspn - T命令进行查看验证注册状态
setspn -T testfirest.com -q */* //查看当前域内所有的SPN,如果指定域不存在,默认切换查找本域的SPN或本域重复的SPN
5)注意:以普通域用户注册SPN服务主体时,需要域管理员的权限,以普通的域账户进行SPN注册会提示权限不够,如图1-7所示。
一般情况下,我们都是通过Set SPN的方式对SPN进行手动注册,但手动注册的SPN存在一定的丢失问题,解决SPN丢失最好的办法是让一些“服务”的启动域账号拥有自动注册SPN的权限,那么我们就需要在域控制器上对其开放读写“ServicePrincipalName”的权限。操作流程如下。
1)在域控制器上打开“Active Directory 用户和计算机”,通过“开始—所有程序—管理工具—Active Directory用户和计算机”,如图1-8所示。
2)在Computers中找到一个计算机账户,右击并选择“属性”。如图1-9所示。
3)在属性中选择“安全”这一个选项卡,并点击“高级”按钮,如图1-10所示。
4)选择要添加的网络控制器计算账户或组,单击“编辑”,在“属性”中选择如下两项,如图1-11所示。
读取 servicePrincipalName 写入 servicePrincipalName
5)点击确认即可确定权限,如图1-12所示。
我们在内网域环境中进行信息收集的最好方式就行通过“SPN扫描”,对于红队来讲,通过“SPN扫描”进行信息收集的方式比通过“端口扫描”的方式更加隐蔽,因为SPN扫描查询实际上就是对LDAP中存储的内容进行查询,并不会对网络上的每个IP进行服务进行端口扫描,而对域控制器发起的LDAP查询也是正常Kerberos票据行为中的一部分,其查询操作很难被检测出来,由此以来可以规避因端口扫描而带来的“风险”,提高红队自身的隐蔽性,如下列举了通过Setspn进行信息收集的常见用法。操作流程如下。
1)查看当前域内的所有SPN。
setspn.exe -q */* //查询当前域内所有的SPN
2)查看指定用户或者主机名注册的SPN。
setspn -L <username>/<hostname>
3)查找本域内重复的SPN。
setspn -X
4)删除指定用户或者主机名。
setspn -L username/hostname
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。