前言
在实战渗透中,常常存在把windows主机作为跳板以此进行横向移动的情况,其实际原理并不难。本篇来谈windows系统的认证原理,并演示抓取密码相关场景。
本地认证
在 Windows 系统中本机用户的密码 Hash 是放在本地的 SAM
文件里面,域内用户的密码 Hash 是存在于域控的 NTDS.DIT
文件里。
sam 的简称是Security Account Manager,安全账户管理器。
Windows XP、Windows Vista、Windows 7、Win 8.1 Win 10 的用户密码以 hash 形式存储在 %SystemRoot%system32configsam
数据库文件中。被保存的 hash 分为 LM Hash
和 NTLM hash
;微软在 Windows NT 4.0 中引入 SYSKEY 对 SAM
文件加密。
所谓哈希(hash),就是使用一种加密函数进行计算后的结果。这个加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,再返回一个固定长度的字符串。现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。Windows 加密过的密码口令,我们称之为 hash. Windows 的系统密码 hash 默认情况下一般由两部分组成:LM-hash和 NTLM-hash。
登录系统的时候,系统会自动对比 SAM
文件中的密码与键入的密码。若相同,则认证成功。
操作系统启动之后,SAM
文件将被锁定。这意味着操作系统运行之时,用户无法打开或复制 SAM
文件。除了锁定,整个 SAM
文件加密,且不可见。
LM Hash
LAN Manager(LM)哈希是 Windows 系统所用的第一种密码哈希算法,是一种较古老的 Hash。在 LAN Manager 协议中使用,非常容易通过暴力破解获取明文凭据。它只有唯一一个版本且一直用到了 NT LAN Manager(NTLM)哈希的出现,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,LM 哈希算法是默认关闭的,LM 算法是在 DES 基础上实现的,不区分字母大小写。
- 生成原理
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个 7byte 部分。每部分转换成比特流,并且长度位 56bit,长度不足用0在左边补齐长度
- 再分 7bit 为一组,每组末尾加 0,再组成一组
- 上步骤得到的二组,分别作为 key 为 KGS!@#$% 进行 DES 加密。
- 将加密后的两组拼接在一起,得到最终 LM HASH 值。
NTLM Hash
NT LAN Manager(NTLM)哈希是 Windows 系统认可的另一种算法,用于替代古老的 LM-Hash,一般指 Windows 系统下 Security Account Manager(SAM)中保存的用户密码 hash,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,NTLM 哈希算法是默认启用的。
当用户登录时,将用户输入的明文密码加密成 NTLM Hash
,与 SAM
数据库文件中的 NTLM Hash
进行比较。
在渗透测试中,通常可从 Windows 系统中的 SAM
文件和域控的 NTDS.dit
文件中获得所有用户的 hash,通过 Mimikatz 读取 lsass.exe
进程能获得已登录用户的 NTLM hash
。
- 生成原理
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行 Unicode 编码。
- 使用 MD4 摘要算法对 Unicode 编码数据进行 Hash 计算
下面是使用python快速生成ntlm hash的代码
代码语言:txt复制python2 -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "P@ssw0rd".encode("utf-16le")).digest())'
本地认证流程
winlogon.exe -> 接收用户输入 -> lsass.exe -> 认证
- 当刚开机、注销等操作后,winlogon.exe 进程会显示一个登录界面要求输入用户名和密码。
- 输入用户名和密码后,会被 winlogon.exe 获取,然后将其发送给 lsass.exe 进程。
- lsass.exe 将明文密码计算得到 NT Hash(不考虑LM)。
- 之后会将用户名和计算得到的 NT Hash 拿到 SAM 数据库去查找比对。
- Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。
- LSASS 用于微软 Windows 系统的安全机制。用于本地安全和登陆策略。
网络认证
在内网渗透中,经常遇到工作组环境。工作组环境是一种逻辑上的网络环境(工作区),隶属于工作组的机器之间,无法互相建立完美的信任机制且只能点对点,没有信托机构,是比较落后的认证方式。
假设 A 主机与 B 主机属于同一个工作组环境,A 若想访问 B 的资料,需要将存在于 B 主机上的账户凭证发送至 B 主机,经过认证后方能访问 B 主机上的相关资料。
这是我们接触比较多的 SMB 共享文件的案例,SMB 的默认端口是 445。
早期 SMB 协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称 LM,它很容易被破解,就又有了 NTLM 以及 Kerberos。
Net-NTLM hash
NTLM 是一种网络认证协议,以 NTLM Hash 作为凭证进行认证。NTLM Hash 长度为32位,由数字和字母组成,采用挑战/响应(Challenge/Response)的消息交换模式,流程如下:
- 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码 hash
- 服务器接收到请求后,生成一个16位的随机数(这个随机数被称为 Challenge),明文发送回客户端。使用存储登录用户密码 hash 加密 Challenge,获得 Challenge1
- 客户端接收到 Challenge 后,使用登录用户的密码 hash 对 Challenge 加密,获得 Challenge2(这个结果被称 response),将 response 发送给服务器
- 服务器接收客户端加密后的 response,比较 Challenge1 和 response,如果相同,验证成功
在以上流程中,登录用户的密码 hash 即 NTLM hash,response 中包含 Net-NTLM hash
在 NTLM 认证中,NTLM 响应分为 NTLM v1,NTLMv2,NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法
所以也就存在不同协议的 Net-NTLM hash,即 Net-NTLM v1 hash,Net-NTLM v2 hash
NTLMv2 协议
NTLMv1 和 NTLMv2 的加密因素都是 NTLM Hash,而最显著的区别就是 Challenge 和加密算法不同:
- Challage: NTLMv1 的 Challenge 有8位,NTLMv2 的 Challenge 为16位。
- Net-NTLM Hash:NTLMv1 的主要加密算法是 DES,NTLMv2 的主要加密算法是 HMAC-MD5。
抓取密码
下面使用mimikatz进行抓取密码的测试,目标机器为win2008
先提权
代码语言:txt复制privilege::debug
抓取密码
代码语言:txt复制sekurlsa::logonpasswords
可以看到直接抓取出了明文密码,但是,同意存在无法抓取明文密码的情况
下面使用mimikatz进行win7抓取密码的测试,如图
可以看到,并没有抓取到明文的密码,这是因为在 KB2871997 之前, Mimikatz 可以直接抓取明文密码。但微软在 win7 之后就打了补丁 kb2871997,当服务器安装 KB2871997 补丁后,系统默认禁用 Wdigest Auth ,内存(lsass 进程)不再保存明文口令。Mimikatz 将读不到密码明文。
但由于一些系统服务需要用到 Wdigest Auth,所以该选项是可以手动开启的。(开启后,需要用户重新登录才能生效)
代码语言:txt复制reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
由于mimikatz被使用的过于频繁,所以免杀是必须要做的。这里就不再多谈。
总结
本文解释了windows的认证机制,包括本地认证和网络认证,并且演示了使用mimikatz抓取系统认证的场景。受篇幅限制,Kerberos,pth、ptt、ptk这些内容需下次介绍。
本文作者 r0fus0d