从0到1认识内网渗透4-Windows网络认证
从0到1认识内网渗透4-Windows网络认证
Windows操作系统中进行网络通信和资源访问时,验证用户身份和授权权限的过程,确保只有经过验证的用户才能访问网络资源,并根据其权限级别进行授权操作,Windows中的网络认证大致分为
- 用户名密码认证:提供用户名和密码进行认证(常见本地计算机或域账户)
- Kerberos认证:通过使用票据和票据授予票据来验证用户身份,并生成会话密钥用于加密通信(Windows域环境广泛使用)
- NTLM认证:早期的Windows网络认证协议,使用基于挑战-响应的方式进行身份认证(常用于旧版Windows系统或非Windows系统进行互操作时)
- 密钥身份认证:使用预先共享的密钥对用户进行身份验证(常用于特定场景和应用)
- 远程桌面认证:远程访问Windows计算机的功能,用户需要提供目标机器的凭据进行认证
NTLM认证
一种早期的Windows网络身份验证协议,在Windows系统中用于验证用户的身份,并提供对网络资源的访问控制
NTLM协议
一种基于挑战(Challenge)-响应(Response)的认证机制,分为NTLM V1协议和NTLM V2协议
认证流程
协商
客户端会向服务端发起请求连接用于协商
解决兼容性问题(不同版本之间的向下兼容)双方先确定一下传输协议的版本等各种信息
质询
关键流程,在本地生成一个(16位或8位)随机字符即challenge值保存,并将该challenge值发给客户端
当客户端接收到Challenge值时,将需认证服务端的username所对应的NTLM-Hash对Challenge进行加密合并上本地用户名、域名、机器名等相关信息生成Response,并Response发送给服务端(客户端发给服务端,用于校验身份)
Response生成
由NTProofStr+blob两部分拼接而成,可通过工具(Inveigh)进行攻击抓取Net-NTLM Hash,进而推导出Response
1 | 导入powershell模块,建立监听 |
建立IPC连接,用于生成对应challenge和response(IPC连接利用NTLM认证)
1 | net use \\192.168.108.159 /u:administrator Admin@123 |
成功抓取Net-NTLM Hash
- username:administrator
- 机器名:WIN-DEK1MT75VM9
- challenge:01F04B08FC3C0172
- NTProofStr:1A0BDAA3BAC238BF206B4C0E5FA75F13
- blob:0101000000000000F973F5E98EF9D9013E77AC0A7EFF1ED80000000002001E00570049004E002D004A00510049005000320043004D004A0031005600340001001E00570049004E002D004A00510049005000320043004D004A0031005600340004001E00570049004E002D004A00510049005000320043004D004A0031005600340003001E00570049004E002D004A00510049005000320043004D004A0031005600340007000800F973F5E98EF9D901060004000200000008003000300000000000000000000000003000008A6C6F94B53B5DD8EDF2E065DF724837C65998C524C615CD42F724BCF043B3610A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100300038002E00310035003900000000000000000000000000
通过NTProofStr+blob两部分拼接,得到最终结果
1 | 1a0bdaa3bac238bf206b4c0e5fa75f130101000000000000F973F5E98EF9D9013E77AC0A7EFF1ED80000000002001E00570049004E002D004A00510049005000320043004D004A0031005600340001001E00570049004E002D004A00510049005000320043004D004A0031005600340004001E00570049004E002D004A00510049005000320043004D004A0031005600340003001E00570049004E002D004A00510049005000320043004D004A0031005600340007000800F973F5E98EF9D901060004000200000008003000300000000000000000000000003000008A6C6F94B53B5DD8EDF2E065DF724837C65998C524C615CD42F724BCF043B3610A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100300038002E00310035003900000000000000000000000000 |
NTLM-v2-Hash
大写的用户名+域名(若处于工作组则为机器名)先转为16进制后编码成Unicode格式,然后和密码的NTLM-Hash值进行HMAC-MD5加密,首先服务端用户名转化为大写
1 | administrator-->ADMINISTRATOR |
将其和客户端的域名或机器名进行拼接
1 | ADMINISTRATOR-->ADMINISTRATORWIN-DEK1MT75VM9 |
转换为16进制格式(在线转换:https://tool.hiofd.com/hex-convert-string-online)
1 | ADMINISTRATORWIN-DEK1MT75VM9-->41444D494E4953545241544F5257494E2D44454B314D543735564D39 |
转换成Unicode格式(即在每个字节之后添加0x00)
1 | 41444D494E4953545241544F5257494E2D44454B314D543735564D39-->410044004D0049004E004900530054005200410054004F005200570049004E002D00440045004B0031004D0054003700350056004D003900 |
使用服务端密码的NTLM-Hash值作为key和Unicode进行HMAC-MD5加密
NTProofStr
由NTLM-v2-Hash和challenge+blob进行HMAC-MD5加密,首先challenge和blob进行拼接
1 | 01F04B08FC3C01720101000000000000F973F5E98EF9D9013E77AC0A7EFF1ED80000000002001E00570049004E002D004A00510049005000320043004D004A0031005600340001001E00570049004E002D004A00510049005000320043004D004A0031005600340004001E00570049004E002D004A00510049005000320043004D004A0031005600340003001E00570049004E002D004A00510049005000320043004D004A0031005600340007000800F973F5E98EF9D901060004000200000008003000300000000000000000000000003000008A6C6F94B53B5DD8EDF2E065DF724837C65998C524C615CD42F724BCF043B3610A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100300038002E00310035003900000000000000000000000000 |
NTLM-v2-Hash作为key和拼接值进行HMAC-MD5加密
结果与抓取的NTProofStr:1A0BDAA3BAC238BF206B4C0E5FA75F13一致
blob
由时间、目标信息、随机填充字符等组成(同challenge值无法预估)
Net-NTLM Hash
Net-NTLM Hash 是基于用户密码的NTLM Hash计算出来的,用于在网络环境下 NTLM 认证的 Hash,其组成格式为
1 | username::domain:challenge:NTProofStr:blob(若处于工作组domain则为机器名) |
验证
服务端在收到Response后,将其和相同的方式进行加密生成的另一个Response进行对比,如果相同则验证成功,否则验证失败
认证流量
通过wireshark进行抓包,其中实验环境包括Windows server 2019(客户端192.168.108.164)和Windows server 2008(服务端192.168.108.159),Windows server 2019(客户端)向服务端建立IPC连接
1 | net use \\192.168.108.159 /u:administrator Admin@123 |
协商过程
筛选smb2流量分析,前四个数据包,用于协商传输协议的版本等各种信息
第五个数据包,用于用户启动身份的验证包和一些规则
其中规则内容在negotiate flag中
质询过程
第六个数据包,用于发送challenge值还包含一些同意的列表
第七个数据包,用于发送Response还包含账户名的相关信息
验证过程
第八个数据包,用于返回验证结果
认证缺陷
- NTLM认证过程中使用到用户的NTLM-Hash(非明文密码),可以直接通过NTLM-Hash进行PTH攻击(哈希传递攻击)
- NTLM中继攻击,获得Net-NTLM可以进行重放,直接认证
- Net-NTLM破解,v1使用DES加密容易破解,v2使用MD5可以使用碰撞或暴力破解方式
kerberos认证
网络认证协议,kerberos作为一种可信任的第三方认证服务,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务,其中正常程序kerberos请求由lsass.exe发出,恶意程序则直接发出kerberos请求
kerberos协议组成
- 客户端(client):发送请求方
- 服务端(Server):接收请求方(机器名后面加一个$)
- 密钥分发中心(key distribution center/KDC):整个认证过程的票据生成管理服务(域环境中代表域控)
AS服务(Authentication Service):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT
TGS服务(Ticket Granting Service):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据
- AD( Account Database):存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT(Ticket Granting Ticket,票据授予票据)
- DC(Domain Controller):域控 KRBTGT,每个域控制器都有一个krbtgt账户,是KDC的服务账户,用来创建TGS加密的密钥
认证流程
客户端利用身份信息(用户名、 ip、当前时间),去AS认证(客户端向AS发送AS-REQ),AS认证通过返回TGT(AS向客户端发送AS-REP),利用TGT才可以访问TGS,才可进行下一步
客户端收到AS的TGT,对TGT进行解密并重新封装
客户端利用封装后的新TGT去访问TGS(客户端向TGS发送TGS-REQ),TGS收到后解密新TGT两部分检查是否存在伪造,无伪造,TGS为客户端提供服务授予票据(ST)(TGS向客户端发送TGS-REP)
客户端收到TGS的ST,对ST进行解密并重新封装
客户端利用封装后的新ST去访问服务端,服务端收到后解密新ST
- 使用服务端本地的机器用户Hash值解密新ST的第二部分,获得CS_SK
- 利用解密的CS_SK继续解密第一部分得到相关信息
- 进行对比验证,选择是否建立信任
认证流量
AS-requests
客户端提供身份信息,向AS发送AS-REQ数据包(AS-requests)
数据包中包含一些客户端的身份信息
PA-DATA pA-ENC-TIMESTAMP
使用客户端的Hash(PTH、密码喷洒)或者AES key(PTK)加密时间戳,生成value,这里是唯一的使用加密处
PA-DATA pA-PAC-REQUEST
用于表示是否包含了PAC
kdc-options
用于协商的字段
cname
请求的用户名(可导致用户枚举攻击,通过返回包判断用户是否存在)
realm
记录了域名信息
sname
请求的服务名(第一步由于是访问AS服务即krbtgt)
AS-response
当AS收到AS-REQ后,解密PA-DATA pA-ENC-TIMESTAMP,如果成功则发送AS-REP数据包(AS-response)
数据包包含TGT的加密内容
ticket/enc-part
由krbtgt的Hash值加密,可破解(获得krbtgt密码可伪造成黄金票据)可能存在的攻击:黄金票据、Roasting
enc-part
由客户端的Hash值加密
TGS-requests
客户端利用封装后的新TGT去访问TGS,客户端向TGS发送TGS-REQ数据包(TGS-requests)
数据包包含新TGT的加密内容
authenticator
使用CT_SK加密的内容
ticket
原始TGT的第二部分(原封不动)
cname
请求的用户名
sname
请求的服务名
TGS-response
TGS为客户端提供ST,TGS向客户端发送TGS-REP数据包(TGS-response)
数据包包含ST的加密内容
ticket/enc-part
由server的Hash值(目标机器用户的Hash值)加密(可能存在的攻击:白银票据、kerberoasting)
enc-part
由CT_SK进行加密
AP-requests
客户端提供ST到服务端,客户端向服务端发送AP-REQ数据包(AP-requests)
访问目录服务走的是SMB协议(前四个数据包用于协商)
数据包包含ST加密内容
Kerberos/enc-part
原始ST的第二部分(原封不动)
authenticator
由CS_SK进行加密
AP-response
服务端向客户端发送AP-REP数据包(AP-response)(可选,不一定存在的回包)
数据包包含客户端验证服务端的相关内容
enc-part
由服务端加密
声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。