文章目录
一、本地认证
windows本地认证流程大致可以抽象为以下三个阶段:
- 由
winlogon.exe
进程接受用户输入的密码; - 调用
lsass.exe
进程队用户输入的密码进行加密,将其转换为NTLM Hash
; - 将有密码转换成的
NTLM Hash
与SAM文件中存储的NTLM Hash
进行比较,如相同,将groupsid
和usersid
发送给winlogon.exe
准备登录,如不同则登陆失败。
winlogon.exe
即windows logon process
,是windows NT用户登录程序,用于管理用户登录和退出。lsass.exe
即local security authority service
,是windows系统的安全机制,用于本地安全和登录策略。用到的mimikatz.exe
就是劫持该进程,来获取明文密码。SAM
,是指securtiy account manager
,windows对用户账户的安全管理使用的安全账号管理器,SAM文件即账号密码数据库文件。存储在%SystemRoot%\system32\config\sam
。
在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。
NTLM Hash
大致运算流程:
用户密码->HEX编码->Unicode编码->MD4
admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
此外,NTLM hash的前身是LM Hash,但是由于存在安全缺陷已经被淘汰。
二、网络认证
网络认证即远程登陆另一台电脑所采用的认证机制。工作组环境下,一般采用NTLM协议进行网络认证;域环境下,一般采用Kerberos协议进行网络认证。
NTLM Hash与NTLM
在Windows中,密码Hash目前称之为NTLM Hash
,其全称为NT LAN Manager
。而NTLM
则是指NTLM协议,其与NTLM Hash
的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。
2.1 NTLM协议
NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。这个协议只支持Windows。
栗子:假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。远程桌面RDP就是默认采用NTLM协议进行网络认证。
2.1.1 Chalenge/Response
NTLM协议的认证过程分为三步:
- 协商:双方确定使用的协议版本,NTLM存在V1和V2两个版本,具体区别就是加密方式不同。
- 质询:挑战(Chalenge)/响应(Response)认证机制的核心。
- 验证:在质询完成后,验证结果,是认证的最后一步。
1、质询的完整过程
- 客户端向服务器端发送用户信息(用户名)请求
- 服务器接受到请求,生成一个16位的随机数,被称之为“Challenge”, 使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1。同时,生成Challenge1后,将Challenge(16位随机 字符)发送给客户端。
- 客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为
Net NTLM Hash
。
2、验证
服务器端收到客户端的Response后,比对Chanllenge1与Response是否相等,若相等,则认证通过。
注意:
1.Chanllenge
是Server产生的一个16字节的随机数,每次认证都不同;
2.Response
的表现形式是Net-NTLM Hash
,它是由客户端提供的密码Hash加密Server返回的Chanllenge产生的结果。
2.1.2 总结
整个NTLM协议的流程图如下(工作组环境):
域环境下的NTLM认证又有所不同:
域环境下,使用域用户登录远程主机,因为域用户的用户名密码保存在域控上,所有验证阶段是由域控进行
response
的对比。
2.1.3 Pass the Hash
哈希传递(PTH)是能够在不需要账户明文密码的情况下完成认证的一个技术。哈希传递解决了我们渗透中获取不到明文密码、破解不了NTLM Hash而又 想扩大战果的问题。以下是哈希传递的必要条件:
- 哈希传递需要被认证的主机能够访问到服务器(废话)
- 哈希传递需要被传递认证的用户名
- 哈希传递需要被传递认证用户的NTLM Hash
要完成一个NTLM认证,第一步需要客户端将自己要参与认证的 用户名发送至服务器端,等待服务器端给出的Challenge⋯⋯
哈希传递实质:就是使用用户名对应的NTLM Hash将服务器给出的Chanllenge加密,生成一个Response,来完成认证。
2.2 Kerberos认证
域内认证即采用了Kerberos协议的认证机制,与NTLM认证相比最大的区别是有一个可信的第三方机构KDC的参与。
参与域认证的三个角色(三只狗):
- Client
- Server
- KDC(Key Distribution Center) = DC(Domain Controller) = AD(Account Database)+ AS(Authenication Service)+ TGS(Ticket Granting Service)
2.2.1 Kerberos认证协议的基础概念
-
KDC
负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由以下服务组成:- Authentication Service(AS): 身份认证服务,专门用来认证客户端的身份并发放客户用于访问TGS的TGT黄金票据)。
- Ticket Granting Service(TGS): 票据授予服务,为客户端生成某个服务的ST(白银票据)。
-
AD
,全称叫account database
,存储域中所有用户的用户名和对应的NTLM Hash,可以理解为域中的SAM数据库。KDC可以从AD中提取域中所有用户的NTLM Hash,这是Kerberos协议能够成功实现的基础。 -
TGT:黄金票据,由身份认证服务(AS)授予的票据,用于身份认证,存储在内存,默认有效期为10小时。
-
ST:白银票据,由票据授予服务为client生成的用于某个服务的票据(ticket)。
从物理层面看,AD与AS,TGS,KDC均为域控制器(Domain Controller)。
2.2.2 域认证粗略流程
-
Client向KDC发起服务请求,希望获取访问Server的权限。KDC得到了这个消息,首先得判断Client是否是可信赖的, 也就是从AD数据库中寻找该用户是否可用来登录。这就是AS服务完成的工作,成功后,AS返回TGT给Client。TGT就是黄金票据。
-
Client得到了TGT后,继续向KDC请求,希望获取访问Server的权限。KDC通过Client 消息中的TGT,判断出了Client拥有了这个权限,KDC中的TGS给Client访问Server的ST。ST就是白银票据。
-
Client得到ST后便可以使用这个Ticket成功访问Server。但是这个ST只能用来访问这个Server,如果要访问其他Server需要向KDC重新申请。
三、Windows Access Token
Access Token
(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, windows都会通过lsass.exe
生成一个Access Token
。这个用户开启的所有进程都会从explorer.exe
复制一份Access Token给进程自己。这也是为啥有时候 A 用户的进程 B 用户没有权限去使用,因为 A 、B 用户的 access token 不同,而且该进程的代码中写了令牌校验的机制。
Access Token种类:
- 主令牌:用于交互会话登录(例如本地直接登录、rdp login 、psexec )
- 模拟令牌:用于非交互登录(利用net use访问共享文件夹,或者wmi、winrm等等)
两种令牌都是在登录时产生创建的,两种token只在系统重启后清除;具有主令牌的用户在注销后,该Token将变成模拟令牌,依旧有效。
关于SID
安全标识符(Security identifiers),简称为SID,分为 OwnerSid
和 GroupSid
。所谓SID就是每次当我们创建一个用户或一个组的时候,系统会分配给该用户或组一个唯一SID,当你重新安装系统后,也会得到一个唯一的SID。SID是唯一的,不随用户的删除而分配到另外的用户使用。请记住,SID永远都是唯一的。SID是由计算机名、当前时间、当前用户态线程的CPU耗费时间的总和三个参数决定以保证它的唯一性。
SID的表现形式:
- 域SID-用户ID
- 计算机SID-用户ID
- SID列表都会存储在域控的AD或者计算机本地账户数据库中
主令牌产生细节
用户使用凭据(用户密码)进行认证;登录session创建;windows 返回用户的 sid 和用户所在组的 sid ;LSA 创建一个 Access token; 使用凭据成功认证;登录 session;token ;进程、线程
关于令牌方面的攻击,后面在叙述。