【域信息搜集】-spn扫描
SPN简介
Windows域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的服务主体名称(Service Principal Name, SPN)。
在使用Kerberos协议进行身份验证的网络中,必须在内置账号(NetworkService、LocalSystem)或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。但是,如果在域用户下运行服务,则必须为要使用的账号手动注册SPN。因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。
总之,若想使用Kerberos协议来认证服务,则必须正确配置SPN。
SPN分类
SPN分为两种:一种注册在AD上机器帐户(Computers)下,也就是上面提到的内置账号,另一种注册在域用户帐户(Users)下
- 当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下。
- 当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下。
利用SPN扫描发现域内服务的好处是,利用SPN扫描不需要连接到网络中的每个IP来检查服务端口,与服务所在的机器没有直接联系,隐蔽性高。SPN扫描通过域控制器的LDAP进行服务查询,由于这是Kerberos票据行为的一部分,所以很难被检测到。
SPN格式
SPN格式如下:
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
serviceclass:服务组件的名称
hostname:以”/”与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机名和域名)。
port:以冒号分隔,后面的内容为该服务监听的端口号。
servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名。
常见的SPN服务
MSSQL服务
MSSQLSvc/computer1.pentest.com:1443
其内涵:
- MSSQLSvc:服务组件的名称,此处为MSSQL服务。
computer1.pentest.com
:主机名为computer1,域名为pentest.com
。- 1433:监听的端口为1433。
Exchange服务
exchangeMDB/EXCAS01.pentest.com
RDP服务
TERMSERV/EXCAS01.pentest.com
WSMan/WinRM/PSRemoting服务
WSMAN/EXCAS01.pentest.com
SPN查询
我们可以使用Windows自带的工具SetSPN.
SetSPN是一个本地windows二进制文件,可用于检索用户帐户和服务之间的映射。该实用程序可以添加,删除或查看SPN注册。(Win2k3版本下没有)
查看当前域内所有的SPN:
setspn -q */*
查找指定域的SPN:
setspn -T hackergu.lab -q */*
SPN扫描
当计算机加入域时,主SPN会自动添加到域的计算机账号的ServicePrincipalName属性中。在安装新的服务后,SPN也会被记录在计算机账号的相应属性中。
SPN扫描也称为”扫描Kerberos服务实例名称”。在活动目录中发现服务的最佳方法就是SPN扫描。SPN扫描通过请求特定SPN类型的服务主体名称来查找服务。与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因为触发内网中的IPS、IDS等设备的规则而产生大量的警告日志)。因为SPN查询是Kerberos票据行为的一部分,所以检测难度很大。
由于SPN扫描是基于LDAP协议向域控制器进行查询的,所以,攻击者只需要获得一个普通的域用户权限,就可以进行SPN扫描。
在域环境中,发现服务的最好办法就是通过”SPN扫描”。通过请求特定SPN类型服务主体名称来查找服务。
扫描工具
SetSPN
此Windows自带的工具已在上一标题进行了功能阐述。
PowerShell-AD-Recon
PowerShell-AD-Recon 工具包提供了一系列服务与服务登录账号和运行服务的主机之间的对应关系,这些服务包括但不限于MSSQL、Exchange、RDP、WinRM。
工具下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon
如果仅查询域内的MSSQL服务,我们可以使用工具提供的Discover-PSMSSQLServers脚本。
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
从结果中可以看出并未查出相关的SPN信息,所以该域中不存在MSSQL服务。
如果查询域内所有的SPN信息,我们可以使用Discover-PSInterestingServices脚本。
Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices
虽然有警告,但是并不影响执行的效果。
GetUserSPNs
该工具旨在获取域内的SPN信息,其存在样式包含powershell和vbs脚本两种形式。
工具下载地址:https://github.com/nidem/kerberoast
如下是测试结果:
无论是域控机器上运行,还是在域用户上运行,都只扫描出了krbtgt的SPN信息。(个人环境的原因)
PowerShellery
工具下载地址:https://github.com/nullbind/Powershellery/blob/master/Stable-ish/Get-SPN/Get-SPN.psm1
此脚本介绍:
通过LDAP查询基于SPN服务名称、域帐户或域组显示域帐户的服务主体名称(SPN)。此信息可用于标识运行特定服务的系统以及运行这些服务的域帐户。
例如,此脚本可用于定位安装了SQL Server的域系统。如果用于在域上运行服务的帐户(非常常见),它还可用于帮助查找域管理员组成员可能登录的系统。因此,这对系统管理员和渗透测试人员都应该很方便。脚本当前支持受信任的连接和提供的凭据。
用法:
Import-Module .\Get-SPN.psm1
Get-SPN -type service -search "*"
同样,也可以使用命令将输出结果转换为列表形式,便于查看:
Get-SPN -type service -search "*" -List yes | Format-Table
查看更多其他SPN查询的用法请看,文档Powershellery – Get-SPN
此外,该工具包还含有脚本Get-DomainSpn.psm1,可获取UserSID、服务和实际用户等信息。
使用命令:
Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn
PowerView
PowerView是由Will Schroeder开发的Powershell脚本,默认被集成在Empire和Powersploit框架中。
它根据不同用户的objectsid来返回结果。相比GetUserSPNs,查询的信息更加详细。
工具下载地址:https://github.com/PowerShellEmpire/PowerTools
使用命令:
Import-module .\powerview.ps1
Get-NetUser -SPN
Impacket
该工具是一款用于处理网络协议的Python类脚本集合,其中的GetUserSPNs.py可用于SPN扫描,即使当前没有拿到域用户机器的shell,但是我们知道域控机器的IP以及某域内用户的账号和密码也同样可以进行扫描。
工具包下载地址:Impacket
使用命令:
python GetUserSPNs.py -dc-ip 192.168.1.2 hackergu.lab/testuser
从结果看出,并未发现SPN信息。(不清楚是哪里出了点小问题,有明白的表哥,还望表哥指点)
Empire
Empire中也含有内置的模块。
使用命令:
usemodule situational_awareness/network/get_spn
总结
在实战中,我们可以通过SPN扫描,避免内网中的某些防火墙的检测。至于,扫描工具这么多,还是需要结合实战环境和自己的偏好进行使用。
参考文章:
https://www.freebuf.com/articles/system/174229.html
http://test666.me/archives/320/