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

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

作者: 尚未崩坏    时间: 2024-12-23 06:03
标题: 内网安全之-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)
复制代码
![image.png](https://img-
blog.csdnimg.cn/img_convert/3c40dabe0d0ed5ede1d8e9629a62dd3e.png)
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)
复制代码
![image.png](https://img-
blog.csdnimg.cn/img_convert/c9bf9ccc5a35d38454c9966b98d2f884.png)
或者使用Python命令举行加密
  1. python3 -c 'import hashlib,binascii; print("NTLM_Hash:"+binascii.hexlify(hashlib.new
  2. ("md4", "123456".encode("utf-16le")).digest()).decode("utf-8"))'
复制代码
![image.png](https://img-
blog.csdnimg.cn/img_convert/e351eb6251cf634f84014af81f08c6b6.png)
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。使用域控的机器账号和哈希即可导出域内所有用户哈希。
最后

从期间发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同砚们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门水平而已,本领越强机会才越多。
由于入门学习阶段知识点比较杂,所以我讲得比较笼统,大家假如有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相干资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技能文档(最全中文版)
③项目源码(四五十个风趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗出测试方面的视频(得当小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗出测试工具镜像文件大全
⑦ 2023暗码学/隐身术/PWN技能手册大全
假如你对网络安全入门感兴趣,那么你需要的话可以点击这里




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