|
| 1 | +# 一文读懂Kerberos认证流程 |
| 2 | + |
| 3 | +原创 松神 [ 红队防线 ](javascript:void\(0\);) |
| 4 | + |
| 5 | +**红队防线** ![]() |
| 6 | + |
| 7 | +微信号 klionsec |
| 8 | + |
| 9 | +功能介绍 没有章法,便是最好的章法 |
| 10 | + |
| 11 | +____ |
| 12 | + |
| 13 | +__ |
| 14 | + |
| 15 | +收录于话题 |
| 16 | + |
| 17 | +**Windows 如何判断域登陆OR本地登陆** |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +当用户开机启动后或者按下“Ctrl + Alt + |
| 22 | +Del”之后,Winlogon服务将会被调起,同时向大家展示需要输入登录用户名密码(由Gina.dll定义),当用户输入相关信息之后,Windows应该如何判断是域用户登录呢还是本地用户登录? |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | +如果是本地用户登录的话将会使用本地数据库进行认证,如果是域渗透的话将会丢给Kerberos |
| 27 | +SSP去认证。当用户按下键盘Crt+Alt+Del后,Winlogon读取完用户的身份凭据后,把它交给本地安全机构(LSA),LSA会对凭证做一系列安全加密编码操作如MD4加密,加密结束后会通过SSPI(安全支持提供者接口,该接口负责与Kerberos和NTLM服务沟通)来判断是应该交给Ntlm处理,还是Kerberos |
| 28 | +SSPI进行处理。LSA首先根据用户输入UPN等信息会事先把身份认证请求传递到Kerberos SSP。 |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +Kerberos |
| 33 | +SSP验证用户登入目标是本地计算机还是域,如果是域则继续向下处理,如果是本地计算机则会向SSPI返回一条错误消息,SSPi将它将这个任务交回给GINA处理。 |
| 34 | + |
| 35 | +SSPI现在发送请求到下一个安全提供程序——NTLM。NTLM SSP会将请求交给Netlogon服务针对LSAM (Local Security |
| 36 | +Account Manager,本地安全账户管理器)数据库进行身份认证。使用NTLM SSP的身份认证过程与Windows NT系统的身份认证方法是相同的。 |
| 37 | + |
| 38 | + |
| 39 | + |
| 40 | + **基础概述 |
| 41 | +** |
| 42 | + |
| 43 | +一个思想:Kerberos协议只认证,不鉴权,鉴权是服务账户所做。 |
| 44 | + |
| 45 | +注意事项: |
| 46 | + |
| 47 | + * 问:在客户端与Application Server访问阶段,用户对Application Server认证是否有权限访问时,是否会把PAC整个数据包交给KDC去做权限验证? |
| 48 | + |
| 49 | + * 答案:不会。Application Server仅仅会发送PAC结构中KERB_VERIFY_PAC 信息交给KDC以验证签名,将会发送以下4个字段内容。一般情况是不会去主动发送以下4个字段去询问KDC。 |
| 50 | + |
| 51 | + * |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | + MessageType ,ChecksumLength,SignatureType,SignatureLength,ChecksumAndSignature |
| 56 | + |
| 57 | + |
| 58 | + |
| 59 | + **什么是 PAC?** |
| 60 | + |
| 61 | +答:KDC在向Kerberos客户端颁发TGT时,会向本地LSA请求生成一个特殊的数据结构,名为“特权访问证书”(Privilege Access |
| 62 | +Certificate,PAC),这个PAC包含为Kerberos客户端构建一个本地访问令牌所需的用户信息,他同时使用域控制器服务器的私钥和KDC服务器的私钥来进行数字签署。以防假的伪造PAC。 |
| 63 | + |
| 64 | +PAC包含了用户登陆时间,用户登录名,用户RID,用户所属信息,PAC认证次数等。【注意:签名不是加密,只是一个特征标识】 |
| 65 | + |
| 66 | + |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | + ** **Kerberos 认证过程**** |
| 71 | + |
| 72 | + ** ** |
| 73 | +**** |
| 74 | + |
| 75 | +如图演示,在认证过程中共有8个步骤,其中6,7,8这三个步骤使用虚线表示,也就代表这些是可选步骤。 |
| 76 | + |
| 77 | +Kerberos协议意义在于,需要A 和 B |
| 78 | +两个不同的一方可以向对方证明他们知道相同的密钥,而不会将密钥泄露给另一方,同时证明每一方是谁说他们是正确的,后续引入了第三方C。A和B都信任C,所以C可以作为双方的中间人。 |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | + |
| 83 | + |
| 84 | + ** ****** |
| 85 | + |
| 86 | + **1.KRB_AS_REQ** |
| 87 | + |
| 88 | + * * * * |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | + User hash(timestamp):用户密码hash加密当前的时间戳Username :用户名SPN krbtgt :服务账户SPNUser Nonce :用户随机数 |
| 93 | + |
| 94 | +其中User hash(timestamp)是因为默认KDC为每一个认证都开启了Pre- |
| 95 | +Authentication,使用当前时间戳和用户Hash加密,以防任何人都过来请求TGT。 |
| 96 | + |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | + |
| 102 | + |
| 103 | + **2.KRB_AS_REP** |
| 104 | + |
| 105 | +KDC收到请求包之后,KDC(DC)拥有所有人的Hash信息, |
| 106 | +它将KRB_AS_REQ中的用户名到数据库中查找,查找到之后使用该用户名所对应的Hash解密出时间戳,并且解开User Nonce等。 |
| 107 | + |
| 108 | +* * * |
| 109 | + |
| 110 | + |
| 111 | + |
| 112 | +KDC在验证用户身份没有问题后会给用户颁发2个信息,一个使用当前User用户的hash加密的基础信息,此信息包含了一个Session |
| 113 | +key,用户随机数,以及TGT过期时间。 |
| 114 | + |
| 115 | +另外一个是TGT票据,整个TGT都是用krbtgt hash进行加密。其他人无法解密TGT,仅仅KDC自己。其中包含了用户名,Session |
| 116 | +key,TGT过期时间,以及PAC特权。 |
| 117 | + |
| 118 | + |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | +PAC除了包含用户,RID,用户信息,密码情况,登录时间等基础之外,还有两个签名KDC签名和服务签名。 |
| 123 | + |
| 124 | + * * * |
| 125 | + |
| 126 | + |
| 127 | + |
| 128 | + PAC签名:KDC签名:使用DC的krbtgt 签名服务签名:谁提供服务谁就是自己的服务hash签名(这里跟AS认证,所以服务是krbtgt) |
| 129 | + |
| 130 | +当前User请求的服务对象是都是KDC,则两个签名都是有krbtgt签发。但加密算法不同 |
| 131 | + |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | + **KRB_TGS_REQ** |
| 139 | + |
| 140 | +用户收到KDC发来的两个信息之后,其中第一个用user hash加密的内容,用户自己可以解密出相关内容,提取出 Session key,TGT |
| 141 | +过期时间,用户随机数。但是TGT中的内容 用户没有办法解密,因为他没有krbtgt的密钥。 |
| 142 | + |
| 143 | +* * * |
| 144 | + |
| 145 | + |
| 146 | + |
| 147 | + |
| 148 | + |
| 149 | +用户解开数据包确认TGT过期时间以及随机数等信息正常后,想要去访问某一个服务(在域环境中,某个服务需要以Kerberos身份进行认证,需要注册一个SPN)需要指定该服务SPN,这一次请求需要指定SPN,用户随机数,TGT(用krbtgt加密),以及使用Session |
| 150 | +key加密的用户名以及时间戳。 |
| 151 | + |
| 152 | + |
| 153 | + |
| 154 | + |
| 155 | + |
| 156 | + **KRB_TGS_REP** |
| 157 | + |
| 158 | +KDC收到User信息之后使用Session key解密出用户名与时间戳确认了身份。 |
| 159 | + |
| 160 | +* * * |
| 161 | + |
| 162 | + |
| 163 | + |
| 164 | +1.把上述请求中的SPN字段SPN账户以及该服务账户所对应的Hash找出来并对相关内容进行加密形成一个TGS。 |
| 165 | + |
| 166 | +注意:TGS中包含了一个新的Service Session key,整个TGS是使用服务账户Hash进行加密。 |
| 167 | + |
| 168 | + |
| 169 | + |
| 170 | +2.KDC使用User与KDC之间前面使用过的Session key继续加密一部分内容,用户随机数,TGT过期时间,Service Session |
| 171 | +key等相关内容 |
| 172 | + |
| 173 | +将第一步与第二步一起发送给User。其中Service owner hash加密的TGS 用户无法打开,仅应用服务本身可以打开。 |
| 174 | + |
| 175 | +3.TGS中包含的PAC签名有所变动,还是使用两个签名,一个签名为krbtgt签名,另外一个使用服务签名,这里服务签名也就是SPN指定的服务hash。 |
| 176 | + |
| 177 | + * * * |
| 178 | + |
| 179 | + |
| 180 | + |
| 181 | + NEW PAC签名KDC签名:使用DC的krbtgt 签名服务签名:Service hash 签名 |
| 182 | + |
| 183 | + |
| 184 | + |
| 185 | + |
| 186 | + |
| 187 | + |
| 188 | + |
| 189 | + **KRB_AP-REQ** |
| 190 | + |
| 191 | +User收到信息后,使用自己前面与KDC通讯用的Session key解密出用户随机数,TGS过期时间以及Service Session |
| 192 | +key之后。将TGS原封不动的发送给Application Server(AP) |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | +User将使用Session key解密出Service Session key之后再使用Service Session |
| 197 | +key加密自己的用户名以及时间戳发送给AP。 |
| 198 | + |
| 199 | + |
| 200 | + |
| 201 | +AP收到后,使用自己的服务hash解密出TGS中的内容,PAC,username ,TGT过期时间,Service session |
| 202 | +key等内容。随之把解开Service session |
| 203 | +key解密上述用户的username以及timestamp(时间戳),同时验证PAC中签名是否被篡改。 |
| 204 | + |
| 205 | + |
| 206 | + |
| 207 | +与此同时AP(application |
| 208 | +server)会把PAC缓存到本地操作系统中,解析PAC中的信息然后对比ALC来决定用户是否可以访问某些资源,同时也方便下一次该此用户来访问服务时,重新请求TGT。 |
| 209 | + |
| 210 | + |
| 211 | + |
| 212 | + |
| 213 | + |
| 214 | + |
| 215 | + |
| 216 | +到这一步基本认证就完成了。后续动作都是可选的。 |
| 217 | + |
| 218 | + |
| 219 | +AP(application |
| 220 | +server)是不会主动把PAC整个数据包发送给KDC做认证,如果有场景需要仅仅也会发送PAC中的签名,也就是KERB_VERIFY_PAC |
| 221 | +结构字段。如下图所示 |
| 222 | + |
| 223 | + |
| 224 | + |
| 225 | + |
| 226 | + |
| 227 | + |
| 228 | + |
| 229 | + |
| 230 | + |
| 231 | +KDC验证结束签名内容正常后会给Server返回一个RPC Code 以通知Server,但是一般情况下是不会去主动请求KDC来认证的。 |
| 232 | + |
| 233 | + |
| 234 | + |
| 235 | + * * * |
| 236 | + |
| 237 | + |
| 238 | + |
| 239 | + Tips1:User在与AS第一次认证的时候有效票据只有5分钟有效,防止爆破。所以活动目录中的机器时间需要与域控制器同步。这也是使用net time /do命令定位域控制器的一个手段。 |
| 240 | + |
| 241 | + |
| 242 | + |
| 243 | + |
| 244 | + |
| 245 | +参考链接:[MS-APDS]: Kerberos PAC Validation |
| 246 | + |
| 247 | +参考链接:https://docs.microsoft.com/zh-cn/openspecs/windows_protocols/ms- |
| 248 | +apds/88aacb11-6c8d-40f0-b0c3-049f1ad08447 |
| 249 | + |
| 250 | +参考链接:MS_APDS中KERB_VERIFY_PAC_message |
| 251 | + |
| 252 | + |
| 253 | + |
| 254 | +预览时标签不可点 |
| 255 | + |
| 256 | +收录于话题 # |
| 257 | + |
| 258 | + 个 |
| 259 | + |
| 260 | +上一篇 下一篇 |
| 261 | + |
| 262 | +阅读 |
| 263 | + |
| 264 | +分享 收藏 |
| 265 | + |
| 266 | +赞 在看 |
| 267 | + |
| 268 | +____已同步到看一看[写下你的想法](javascript:;) |
| 269 | + |
| 270 | +前往“发现”-“看一看”浏览“朋友在看” |
| 271 | + |
| 272 | + |
| 273 | + |
| 274 | +前往看一看 |
| 275 | + |
| 276 | +**看一看入口已关闭** |
| 277 | + |
| 278 | +在“设置”-“通用”-“发现页管理”打开“看一看”入口 |
| 279 | + |
| 280 | +[我知道了](javascript:;) |
| 281 | + |
| 282 | +__ |
| 283 | + |
| 284 | +已发送 |
| 285 | + |
| 286 | +取消 __ |
| 287 | + |
| 288 | +#### 发送到看一看 |
| 289 | + |
| 290 | +发送 |
| 291 | + |
| 292 | +一文读懂Kerberos认证流程 |
| 293 | + |
| 294 | +最多200字,当前共字 |
| 295 | + |
| 296 | +__ |
| 297 | + |
| 298 | +发送中 |
| 299 | + |
| 300 | +微信扫一扫 |
| 301 | +关注该公众号 |
| 302 | + |
| 303 | +[知道了](javascript:;) |
| 304 | + |
| 305 | +微信扫一扫 |
| 306 | +使用小程序 |
| 307 | + |
| 308 | +**** |
| 309 | + |
| 310 | +[取消](javascript:void\(0\);) [允许](javascript:void\(0\);) |
| 311 | + |
| 312 | +**** |
| 313 | + |
| 314 | +[取消](javascript:void\(0\);) [允许](javascript:void\(0\);) |
| 315 | + |
| 316 | +: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看 |
| 317 | + |
0 commit comments