ToB企服应用市场:ToB评测及商务社交产业平台

标题: 内网安全之-NTLM协议详解 [打印本页]

作者: 欢乐狗    时间: 2024-7-17 11:32
标题: 内网安全之-NTLM协议详解
SSP和SSPI概念

1、SSPI

SSPI(Security Service Provider Interface 或 Security Support Provider Interface,安全服务提供接口) 是Windows界说的一套接口,该接口界说了与安全有关的功能函数,包括但不限于:

SSPI接口界说了与安全有关的功能函数,用来获取验证、信息完整性、信息隐私等安全功能,该接口知识界说了一套接口函数,但是并没有实现具体的内容。
2、SSP

SSP(Security Service Provider,安全服务提供者) 是SSPI的实现者,微软自己实现了如下的SSP,用于提供安全功能,包括但不限于:

因为SSPI中界说了与Session Security有关的API。所以上层应用使用任何SSP与远程的服务举行了身份验证后,此SSP都会为本次毗连天生一个随机Key。这个随机Key被称为Session Key。上层应用颠末身份验证后,可以选择性的使用这个Key对之后发往客户端或接受自服务端的数据举行签名或加密。在系统层面,SSP就是一个dll,用来实现身份验证登安全功能。不同的SSP,实现的身份验证机制是不一样的。好比NTLM SSP实现的就是一种基于质询/相应身份验证机制,而Kerberos SSP实现的就是基于Ticket票据的身份验证机制。可以自界说编写SSP,然后注册到操作系统中,让操作系统支持自界说的身份验证方法。
LM Hash加密算法

LM(LAN Manager)身份认证是微软推出的一个身份认证协议,其使用的机密算法是LM Hash加密算法。LM Hash本质是DES加密,尽管LM Hash较容易被破解,但为了包管系统的兼容性,Windows只是将LM Hash禁用了(Windows Vista和Windows Server 2008开始,Windows默认禁用了LM Hash)。LM Hash明文暗码被限定在14位以内,也就是说,如果要克制使用LM Hash,将用户的暗码设为14位以上即可。
LM Hash的值为:aad3b435b51404eeaad3b435b51404ee,阐明LM Hash为空值或者被禁用了。
LM Hash加密流程:
加密实现代码:
  1. # coding=utf-8
  2. import base64
  3. import binascii
  4. from pyDes import *
  5. import hashlib,binascii
  6. import md5
  7. def DesEncrypt(str, Des_Key):
  8.     k = des(Des_Key, ECB, pad=None)
  9.     EncryptStr = k.encrypt(str)
  10.     return binascii.b2a_hex(EncryptStr)
  11. def Zero_padding(str):
  12.     b = []
  13.     l = len(str)
  14.     num = 0
  15.     for n in range(l):
  16.         if (num < 8) and n % 7 == 0:
  17.             b.append(str[n:n + 7] + '0')
  18.             num = num + 1
  19.     return ''.join(b)
  20. if __name__ == "__main__":
  21.     test_str = raw_input("please input a string: ")
  22.     # 用户的密码转换为大写
  23.     test_str = test_str.upper()
  24.     print('\033[91m'+"转换为大写:"+'\033[0m')
  25.     print(test_str)
  26.     #转换为16进制字符串
  27.     test_str = test_str.encode('hex')
  28.     print('\033[91m'+"转换为16进制字符串:"+'\033[0m')
  29.     print(test_str)
  30.     str_len = len(test_str)
  31.     # 密码不足14字节将会用0来补全
  32.     if str_len < 28:
  33.         test_str = test_str.ljust(28, '0')
  34.         print('\033[91m'+"不足14字节(长度28),用0来补全:"+'\033[0m')
  35.         print(test_str)
  36.     # 固定长度的密码被分成两个7byte部分
  37.     t_1 = test_str[0:len(test_str) / 2]
  38.     t_2 = test_str[len(test_str) / 2:]
  39.     print('\033[91m'+"将14字节分为两组,每组7字节"+'\033[0m')
  40.     print(t_1)
  41.     print(t_2)
  42.     # 每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
  43.     t_1 = bin(int(t_1, 16)).lstrip('0b').rjust(56, '0')
  44.     t_2 = bin(int(t_2, 16)).lstrip('0b').rjust(56, '0')
  45.     print('\033[91m'+"转换为二进制数据,每组二进制数据长度为56比特位"+'\033[0m')
  46.     print(t_1)
  47.     print(t_2)
  48.     # 再分7bit为一组末尾加0,组成新的编码
  49.     t_1 = Zero_padding(t_1)
  50.     t_2 = Zero_padding(t_2)
  51.     print('\033[91m'+"将每组二进制数据按7比特位为一组,分为8组,每组末尾加0"+'\033[0m')
  52.     print(t_1)
  53.     print(t_2)
  54.     # print t_1
  55.     t_1 = hex(int(t_1, 2))
  56.     t_2 = hex(int(t_2, 2))
  57.     t_1 = t_1[2:].rstrip('L')
  58.     t_2 = t_2[2:].rstrip('L')
  59.     print('\033[91m'+"两组分别转换为16进制字符串"+'\033[0m')
  60.     print(t_1)
  61.     print(t_2)
  62.     if '0' == t_2:
  63.         t_2 = "0000000000000000"
  64.     t_1 = binascii.a2b_hex(t_1)
  65.     t_2 = binascii.a2b_hex(t_2)
  66.     # 上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密。
  67.     LM_1 = DesEncrypt("KGS!@#$%", t_1)
  68.     LM_2 = DesEncrypt("KGS!@#$%", t_2)
  69.     print('\033[91m'+"上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密"+'\033[0m')
  70.     print("LM_1:"+LM_1)
  71.     print("LM_1:"+LM_2)
  72.     # 将二组DES加密后的编码拼接,得到最终LM HASH值。
  73.     print('\033[91m'+"将二组DES加密后的编码拼接,得到最终LM HASH值"+'\033[0m')
  74.     LM_Hash = LM_1 + LM_2
  75.     print ("LM_Hash:"+LM_Hash)
复制代码

NTLM Hash加密算法

为相识决LM Hash加密和身份验证方案中的安全缺点,微软与1993年在Windows NT 3.1中首次引入了NTLM Hash。微软从Windows Vista和Windows 2008开始,默认禁用了LM Hash,只存储NTLM Hash,而LM Hash的位置则为空。
NTLM Hash算法是微软为了在进步安全性的同时包管兼容性而设计的散列加密算法。NTLM Hash是基于MD4加密算法举行加密的。
1、NTLM加密流程

NTLM Hash是由明文暗码颠末三步加密而成:
NTLM Hash =md4(unicode(hex(password)))
NTLM Hash的加密流程分为三步,具体如下:
实现代码:
  1. # coding=utf-8
  2. from Cryptodome.Hash import MD4
  3. import binascii
  4. from cprint import cprint
  5. #转为16进制格式
  6. def str_to_hex(string):
  7.   return ' '.join([hex(ord(t)).replace('0x', '') for t in string])
  8. #再将16进制格式的字符串进行ASCII转Unicode编码
  9. def hex_to_unicode(string):
  10.   return string.replace(" ","00")+"00"
  11. #最后对Unicode编码的16进制字符串进行标准MD4单向哈希加密
  12. def unicode_to_md4(string):
  13.   m = MD4.new()
  14.   m.update(binascii.a2b_hex(string))
  15.   return m.hexdigest()
  16. if __name__ == "__main__":
  17.     string = input("please input a string: ")
  18.     HEX = str_to_hex(string)
  19.     cprint.err("HEX编码:")
  20.     print(HEX)
  21.     Unicode = hex_to_unicode(HEX)
  22.     cprint.err("ASCII转Unicode编码")
  23.     print(Unicode)
  24.     NTLm_Hash = unicode_to_md4(Unicode)
  25.     cprint.err("对Unicode编码的16进制字符串进行标准MD4单向哈希加密得到NTLM Hash")
  26.     print(NTLm_Hash)
复制代码

或者使用Python下令举行加密
  1. python3 -c 'import hashlib,binascii; print("NTLM_Hash:"+binascii.hexlify(hashlib.new
  2. ("md4", "123456".encode("utf-16le")).digest()).decode("utf-8"))'
复制代码

2、Windows系统存储的NTLM Hash

用户暗码颠末NTLM Hash机密后存储在 %SystemRoot%\system32\config\SAM 文件里。
当用户输入暗码举行当地认证的过程中,全部的操作都是在当地举行的。系统将用户输入的暗码转换为NTLM Hash,然后与SAM文件中的NTLM Hash举行比力,类似阐明暗码正确,反之错误。当用户注销、重启、锁屏后,操作系统会让winlogon.exe显示登录界面,也就是输入框。当winlogon.exe接收收入后,将暗码交给lsass.exe进程,lsass.exe进程中会存一份明文暗码,将明文暗码加密成NTLM Hash,与SAM数据库举行比力认证。使用mimikatz就是从lsass.exe进程中抓取明文暗码或暗码Hash。
一般抓取到的暗码格式第一部分是用户名,第二部分是用户的SID值,第三部分是LM Hash,第四部分是NTLM Hash,别的部分为空。
NTLM协议认证

NTLM身份认证协议是一种基于Challenge/Response质询相应验证机制,由三种范例消息组成。

NTLM身份认证协议有NTLM v1和NTLM v2两个版本,现在使用最多的是NTLM v2版本。他们之间最显著的区别就是Challenge质询值与加密算法不同,共同之处就是都是使用NTLM Hash举行加密。
1、工作组环境下的NTLM认证

工作组环境下NTLM认证流程可以分为4个步调
2、域环境下的NTLM认证

域环境下的NTLM认证流程可以分为6个步调:
3、NTLM v1和NTLM v2的区别

NTLM v1 身份认证协媾和 NTLM v2 身份认证协议是 NTLM 身份认证协议的不同版本。现在使用最多的是 NTLM v2 版本。NTLM v1 与 NTLM v2 最显著的区别就 是 Challenge 质询值与加密算法不同,共同之处就是都是使用的 NTLM Hash 进 行加密。
Challenge质询值

Net-NTLM Hash使用的加密算法

4、LmCompatibilityLevel

LmCompatibilityLevel 值用来确定网络登录使用的质询/相应身份验证协议。此选 项会影响客户端使用的身份验证协议的等级、协商的会话安全的等级以及服务器接 受的身份验证的等级,如下是 LmCompatibilityLevel 为不同值的寄义:
值寄义0客户端使用 LM 和 NTLM 身份验证,但从不使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2身份验证。1客户端使用 LM 和 NTLM 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。2客户端仅使用 NTLM 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。3客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器接受 LM、NTLM 和 NTLM v2 身份验证。4客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器拒绝 LM 身份验证,但接受 NTLM 和 NTLM v2 身份验证。5客户端仅使用 NTLM v2 身份验证,如果服务器支持 NTLM v2 会话安全性,则使用 NTLM v2 会话安全性。域控制器拒绝 LM 和 NTLM 身份验证,但接受 NTLM v2 身份验证。 如何手动举行修改?
打开当地安全战略–》安全设置–》当地战略–》安全选项–》网络安全AN管理器身份验证级别,默认其值是没有界说的,使用默认值
NTLM协议的安全标题

从上面 NTLM 认证的流程中我们可以看到,在 Type 3 Auth 认证消息中是使用用户暗码的 Hash 计算的。因此当我们没有拿到用户暗码的明文而只拿到 Hash 的情况下,我们可以举行 **Pass The Hash(PTH)攻击,也就是哈希通报攻击。同样,还是在 Type3 消息中,存在 Net-NTLM Hash,当攻击者获得了 Net- NTLM Hash 后,可以举行中间人攻击,重放 Net-NTLM Hash,这种攻击手法也就是NTLM Relay(NTLM 中继)**攻击。而且由于 NTLM v1 版本协议加 密过程存在天然缺陷,可以对 Net-NTLM v1 Hash 举行爆破,得到 NTLM Hash。拿到 NTLM Hash 后即可举行横向移动。
1、Pass The Hash

Pass The Hash(PTH)哈希通报攻击是内网横向移动的一种方式。重要原因是 NTLM 认证过程中使用的是用户暗码的 NTLM Hash 来举行加密。因此当我们获取到了用户暗码的 NTLM Hash 而没有解出明文时,我们可以使用该 NTLM Hash 举行哈希通报攻击,对内网其他机器举行 Hash 碰撞,碰撞到使用类似暗码的机器。然后通过 135 或 445 端口横向移动到使用该暗码的其他机器。
2、NTML Relay

NTLM Relay 其实严酷意义上并不能叫 NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在 NTLM 认证的第三步,在 Response 消息中存在 Net-NTLM Hash,当攻击者获得了 Net-NTLM Hash 后,可以举行中间人攻击,重放 Net- NTLM Hash,这种攻击手法也就是 NTLM Relay(NTLM 中继)攻击。
3、Net-NTLM v1 Hash破解

由于 NTLM v1 身份认证协议加密过程存在天然缺陷,只要获取到 Net-NTLM v1 Hash,都能破解为 NTLM hash,这与暗码强度无关。在域环境中这更有用,因为域中使用 hash 即可远程毗连目标机器。如果域控允许发送 NTLM v1 相应的话, 我们就可以通过与域控机器举行 NTLM 认证,然后抓取域控的 Net-NTLM v1 Hash,破解为 NTLM Hash。使用域控的机器账号和哈希即可导出域内全部效户哈希。

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4