域渗透学习(一)Windows认证机制
windows认证机制
何谓域渗透,域渗透就是基于windows域环境的渗透,而域渗透涉及到的技术,如哈希传递(PTH)票抵传递(PTT)委派攻击等,都是基于域环境下的认证机制来实现的,这也是为什么要了解windows认证机制的原因之一。
windows的认证包括三个部分,用户直接操作计算机登录账号(本地认证),远程连接到工作组(网络认证),登录到域环境中(域认证)
本地认证
用户输入密码,系统收到密码后将用户输入的密码计算成NTLM Hash,然后与sam数据库(%SystemRoot%\system32\config\sam)中该用户的哈希对比,匹配则登陆成功,不匹配则登录失败
这里提到的NTLM哈希,是一种单向哈希算法,windows将用户的密码计算成NTLM哈希之后才存储在电脑中
大致的流程为:
用户密码 -> HEX编码 -> Unicode编码 -> MD4
NTLM Hash的前身是LM Hash,由于存在安全缺陷已经被淘汰了
本地认证中用来处理用户输入密码的进程即lsass.exe,密码会在这个进程中明文保存,供该进程将密码计算成NTLM Hash与sam进行对比
我们使用mimikatz来获取的明文密码,便是在这个进程中读取到的
网络认证
NTLM协议的认证过程分为三不,也叫做挑战相应机制:
- 协商
- 质询
- 验证
协商:双方确定使用的协议版本,NTLM存在V1和V2两个版本,具体区别就是加密方式不同。
质询:挑战(Chalenge)/响应(Response)认证机制的核心
- 客户端向服务器端发送用户信息[用户名]请求
- 服务器接受到请求后,判断本地用户列表是否存在客户端的用户名,如果没有返回认证失败,如果有,生成一个16位的随机数,被称为"Challenge",然后使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符),生成Challenge1保存在内存中。同时,生成Challenge1后,将Challenge发送给客户端。
- 客户端接受到Challenge后,使用自己提供的账号的密码转换对应的NTLM Hash,然后使用这个NTLM Hash加密Changllenge生成Response,然后将Response发送至服务端。
验证:在质询完成后,验证结果,是认证的最后一步。
服务端收到客户端发送的Response后,与之前保存在内存中的Channelge1比较,如果相等认证通过
简单的来说:客户端向服务器请求使用某个用户进行验证,服务端判断该用户是否存在,存在的话使用这个用户密码的哈希值来加密一个随机字符串,并且将这个随机字符串返回给客户端,客户端再把自己提供的密码进行哈希处理后也来加密这串随机字符串,然后再把结果发送给服务器,服务器把从客户端发送的加密结果与自己本地的加密结果进行比较,相同的话便通过认证
工作组环境和域环境下Net NTLM认证过程因为有DC(域控制器)的参与流程略有差异,不过不影响我们进行哈希传递攻击
域认证(Kerberos)
参与域认证的三个角色:
Client
Server
KDC(Key Distribution Center) = DC(Domain Controller) = AD(Account Database) + AS(Authenication Service) + TGS(Ticket Granting Service)
AD,全称叫account database,存储域中所有用户名和对应的NTLM Hash,可以理解为域中的SAM数据库,KDC可以从AD中提取域中所有用户的NTLM Hash,这是Kerberos协议能够成功实现的基础。
Kerbroes认证流程:
Client向KDC发起服务请求,希望获取访问Server的权限。KDC得到了这个消息,首先得判断Client是否是可信赖的, 也就是从AD数据库中寻找该用户是否可用来登录。这就是AS服务完成的工作,成功后,AS返回TGT给Client。
Client得到了TGT后,继续向KDC请求,希望获取访问Server的权限。KDC又得到了这个消息,这时候通过Client 消息中的TGT,判断出了Client拥有了这个权限,给了Client访问Server的权限Ticket。(TGS服务的任务)
Client得到Ticket后便可以使用这个Ticket成功访问Server。但是这个Ticket只能用来访问这个Server,如果要访问其他Server需要向KDC重新申请。