原文链接:http://bbs.ichunqiu.com/thread-8295-1-1.html%EF%BC%9Ffrom=jiuge
前言
写本文是在学习“三好学生”在乌云drops上关于后渗透的系列文章时总结的,原本是自己总结的小记,先分享给大家,不足之处请批评,本人小白。
Windows认证协议有两种NTLM(NT LAN Manager)和Kerberos,前者主要应用于用于Windows NT 和 Windows 2000 Server(or Later) 工作组环境,而后者则主要应用于Windows 2000 Server(or Later) 域(Domain)环境。
一、NTLM认证
NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中(Kerberos用在域模式下)。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。NTLM主要是一种基于挑战(challenge)/响应(response)消息交互模式的认证过程。
使用域用户身份进行认证主要是分七步:
1、用户登录时输入的user name、password和domain name,然后Client端计算password的hash值并保存在本地;
2、客户端将user name的明文发送给DC;
3、DC生成一个16-byte的随机数,叫做challenge,传输给client;
4、client收到challenge以后,在复制一份拷贝,然后将其中一个challenge用password hash加密,这个叫做response,然后将challenge,response以及user name传送给server;
5、server端在收到client传送过来的三份内容以后将它们转发给DC;
6、DC在收到user name,response,challenge以后,根据user name在account database中找到其对应的password hash,然后用这个password hash加密challenge;
7、DC将response跟加密后的challenge进行比较,如果相同则NTLM验证成功。DC将验证结果发给Server,并最终返回给Client。
如果是使用本地用户身份进行认证,则有Server本身完成认证过程。
一、Kerberos认证
Kerberos提供了一个集中式的认证服务器结构,认证服务器的功能是实现用户与其访问的服务器间的相互鉴别。Kerberos是一个三头怪兽,之所以用它来命名一种完全认证协议,是因为整个认证过程涉及到三方:客户端、服务端和KDC(Key Distribution Center)。在Windows域环境中,KDC的角色由DC(Domain Controller)来担当。
Kerberos是一种基于“票据”的认证方式。票据(Ticket)用来安全的在认证服务器和用户请求的服务之间传递用户的身份,同时也传递附加信息。用来保证使用Ticket的用户必须是Ticket中指定的用户。Ticket一旦生成,在生存时间内可以被Client多次使用来申请同一个Server的服务。
客户端要访问服务器的资源,需要首先购买服务端认可的票据。也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场。在这之前,客户端需要先买票,但是这张票不能直接购买,需要一张认购权证。客户端在买票之前需要预先获得一张认购权证。这张认购权证和进入服务器的入场券均有KDC发售。图1基本揭示了Kerberos整个认证的过程。
图1
C(Client)将域用户口令作HASH并保存,此Hash值作为C、KDC之间的长期共享秘钥Kc(Long Time Key,域控同样保存该Hash值)。
1、as_request:C利用Kc加密时间戳、Client ID、TGS ID等信息发送给AS(Authentication Server)进行身份认证;
2、as_reply:AS收到as_request后,利用Kc进行解密,若解密成功表示Client身份认证通过,会随机产生Session Key K(c,tgs),并返回以下两个Ticket给C:
① 加密的K(c,tgs)(用于C向KDC发起的后续请求)、TGS Name/ID、时间戳等,该票据由Kc加密
② 票据授予票据(Ticket Granting Ticket,简称TGT),该票据是给TGS的,票据的内容包括K(c,tgs)、Client身份信息、域名、时间戳等,该票据由TGS的秘钥加密,只有TGS能够解密
3、tgs_request:C利用Kc解密获取K(c,tgs),并利用该秘钥加密生成一个Authenticator,内容包括:lifetime、时间戳、Client身份信息等,连同从AS获取的TGT一并发送给TGS;
4、tgs_reply:TGS利用自身秘钥解密TGT,获取K(c,tgs),并利用K(c,tgs)解密C发送的Authenticator,对Client进行认证。如果Client通过了认证(如何认证,见文章后),TGS随机生成一个Session Key K(c,s),并产生两个票据:
① 服务票据Ts:这是给服务器的服务票据,由Server秘钥Ks加密,内容包括:K(c,s)、Client身份信息、Service ID、时间戳、lifetime等
② 客户端票据Tc:该票据由K(c,tgs)加密,内容包括:K(c,s)、Server身份信息等
5、s_request:Client收到tgs_reply后,利用K(c,tgs)解密Tc,获取K(c,s)、Server身份信息等,并利用K(c,s)加密生成一个Authenticator发送给Server,内容包括:时间戳、Client ID等信息,连同Ts一并发送给Server;
6、s_reply:Server收到Client的请求后,利用自身秘钥Ks解密Ts,得到K(c,s),利用K(c,s)解密Authenticator对Client进行认证。如果认证通过,则表示KDC已经允许了此次通信,此时Sever无需与KDC通信,因为Ks为KDC和Sever之间的长期共享秘钥,如果在有效时间内,则此次请求有效。
总的来说,kerberos可概括为以下几个特点:
1. 它是一种认证协议;
2. 使用Ticket(票据)进行认证;
3. 有效避免本地存储用户口令及传输口令;
4. 引入了可信的第三方;
5. 其实现采用的是对称秘钥加密技术。
二、如何利用
(一)NTLM的利用方式
1、Pass the hash
如果内网主机中本地管理员账户密码相同,那么可以通过pass the hash远程登录任意一台主机。利用pass the hash的渗透方式如下:
1) 获取某一台主机管理员权限
2) Dump获取用户hash
3) 通过pass the hash尝试登录其他主机
4) 重复1-3直到获取域管理员账户hash,达成全域控守
2、Pass the key
随着大家对Pass the Hash的认识越来越高,防御方法也越来越多,微软在2014年发布了更新补丁kb2871997禁止本地管理员账户用于远程连接。同样,禁用NTLM使得p**ec无法利用获得的ntlm hash进行远程连接。
国外安全研究人员开发的mimikatz实现了在禁用ntlm的环境下仍然可以远程连接,通过利用用户账户的aes key进行远程连接,即利用pass the key。
后话:
1、Windows vista以后,本地管理员administrator默认是禁用状态,而用户添加的本地管理员是受限管理员,pass the hash远程连接后权限为普通用户权限;
2、Pass the key时需要确保系统安装了补丁kb2871997
(二)Kerberos的利用方式 Pass The Ticket
1、黄金票据(Golden Ticket)
该票据的利用条件是原先已成功取得域用户的HASH,尤其是krbtgt这个用户的。由于某些原因导致在控域网络失控,失去域管理员权限。现在你还有一个普通域用户权限,管理员在加固时没有重置krbtgt密码(非常常见),在此条件下,我们还能利用该票据重新获得域管理员权限。
利用krbtgt的HASH值可以伪造生成任意的TGT,能够绕过对任意用户的账号策略,能够让用户成为任意组的成员,可用于Kerberos认证的任何服务,如图2所示。
图2
2、白银票据(Silver Ticket)
通过分析Kerberos协议的认证过程不难发现,如果我们获取了Server秘钥Ks(服务器口令散列值),就可以跳过KDC的认证,直接伪造票据与Server通信,如图3所示。
图3
黄金票据和白银票据的区别:
1) 访问权限不同:
Golden Ticket:伪造TGT,可以获取任何Kerberos服务权限
Silver Ticket:伪造TGS,只能访问指定的服务
2) 加密方式不同:
Golden Ticket由Kerberos的Hash加密
Silver Ticket由服务账号(通常为计算机账户)Hash加密
3) 认证流程不同:
Golden Ticket的利用过程需要访问域控,而Silver Ticket不需要
参考:
http://www.cnblogs.com/xwdreamer/archive/2012/08/23/2652541.html
http://drops.wooyun.org/tips/11631
http://drops.wooyun.org/tips/12159