内网渗透之Windows认证(二)

打印 上一主题 下一主题

主题 781|帖子 781|积分 2343


  • 为什么有这篇文章呢,因为我们知道平常的Web系统有注册、登录是依赖数据库和后端的加密解密算法。那么Windows系统登录的时候是如何进行身份验证的呢,是否也有一个类似数据库的东西,或者就是一个单纯的文本呢?


  • 参考--Windows内网协议学习NTLM篇之NTLM基础介绍
  • Windows也有一个类似于数据的东西,存放在%SystemRoot%\system32\config\sam,里面存放着用户的凭证信息,当然这肯定不是明文,不然Windows这么写也太不安全了。这里的加密算法不同于常见的MD5,加密后的数据有两种分别为LM Hash和NTLM Hash。
LM Hash


  • LM Hash全称LAN Manager Hash,由IBM设计一般用于Windows XP、Windows 2000、Windows 2003 这一类系统中。加密算法如下。
  • 密码长度不能超过14个字符。
  • 密码转换为大写,再转换成16进制的字符串,没有28位长度的,在右边加0。
  • 再将十六进制的字符串分为两组14位的字符串。
  • 再将这两组14位的字符串进行十六进制转二进制,转换完成后不满足56位的在左边加0。
  • 两部分分别划分为每组七位,在其末尾加0,再分别转换为十六进制。
  • 最后将这两组数据作为DES加密所需的Key,KGS!@#$%作为需加密的字符,将DES加密后的数据依次拼接。
  • 这里借用zjun的脚本。
  1. import binascii
  2. import codecs
  3. from pyDes import *
  4. def DesEncrypt(str, Key):
  5.     k = des(Key, ECB, pad=None)
  6.     EncryptStr = k.encrypt(str)
  7.     return binascii.b2a_hex(EncryptStr)
  8. def ZeroPadding(str):
  9.     b = []
  10.     l = len(str)
  11.     num = 0
  12.     for n in range(l):
  13.         if (num < 8) and n % 7 == 0:
  14.             b.append(str[n:n + 7] + '0')
  15.             num = num + 1
  16.     return ''.join(b)
  17. if __name__ == "__main__":
  18.     passwd = sys.argv[1]
  19.     print('你的输入是:', passwd)
  20.     print('转化为大写:', passwd.upper())
  21.     # 用户的密码转换为大写,并转换为 16 进制字符串
  22.     passwd = codecs.encode(passwd.upper().encode(), 'hex_codec')
  23.     print('转为 hex:', passwd.decode())
  24.     # 密码不足 28 位,用 0 在右边补全
  25.     passwd_len = len(passwd)
  26.     if passwd_len < 28:
  27.         passwd = passwd.decode().ljust(28, '0')
  28.     print('补齐 28 位:', passwd)
  29.     # 28 位的密码被分成两个 14 位部分
  30.     PartOne = passwd[0:14]
  31.     PartTwo = passwd[14:]
  32.     print('两组 14 位的部分:', PartOne, PartTwo)
  33.     # 每部分分别转换成比特流,并且长度为 56 位,长度不足用 0 在左边补齐长度
  34.     PartOne = bin(int(PartOne, 16)).lstrip('0b').rjust(56, '0')
  35.     PartTwo = bin(int(PartTwo, 16)).lstrip('0b').rjust(56, '0')
  36.     print('两组 56 位比特流:', PartOne, PartTwo)
  37.     # 两组分别再分为 7 位一组末尾加 0,再分别组合成新的字符
  38.     PartOne = ZeroPadding(PartOne)
  39.     PartTwo = ZeroPadding(PartTwo)
  40.     print('两组再 7 位一组末尾加 0:', PartOne, PartTwo)
  41.     # 两组数据转 hex
  42.     PartOne = hex(int(PartOne, 2))[2:]
  43.     PartTwo = hex(int(PartTwo, 2))[2:]
  44.     if '0' == PartTwo:
  45.         PartTwo = "0000000000000000"
  46.     print('两组转为 hex:', PartOne, PartTwo)
  47.     # 16 位的二组数据,分别作为 DES key 为"KGS!@#$%"进行加密。
  48.     LMOne = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartOne)).decode()
  49.     LMTwo = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartTwo)).decode()
  50.     print('两组 DES 加密结果:', LMOne, LMTwo)
  51.     # 将二组 DES 加密后的编码拼接,得到 LM HASH 值。
  52.     LM = LMOne + LMTwo
  53.     print('LM hash:', LM)
复制代码


  • 可以看出密码长度小于7时,后面加密的数据是固定的,均为aad3b435b51404ee,因此其加密是不安全的。
NTML Hash


  • NTML Hash全称NT LAN Manager , 目前 Windows 基本都使用 NTLM hash ,一个32位长度的字符串。支持Net NTLM认证协议及本地认证过程中的关键凭据。加密算法如下:
  • 密码转换为十六进制
  • Unicode编码
  • MD4加密
  • Python脚本如下:
  1. import hashlib
  2. import binascii
  3. import sys
  4. print(binascii.hexlify(hashlib.new("md4", sys.argv[1].encode("utf-16le")).digest()).decode())
复制代码


  • 123456经过加密后则为32ed87bdb5fdc5e9cba88547376818d4。
Windows本地认证


  • winlogon.exe -> 接收用户密码 -> lsass.exe -> 比对sam表。
  • winlogon就是登陆界面,接受用户密码之后会发送明文到lsass.exe,lsass.exe会存储一份明文,然后加密明文和sam表的hash做比对,判断是否可以登陆。
  • Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。
  • 这里注意如果打了补丁KB2871997,或者机器是win2012之后,则不会保存明文密码了。
NTLM认证协议


  • 什么是NTLM认证协议呢?和NTLM Hash又有什么区别呢?NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。NTLM 网络认证协议是以 NTLM Hash 作为根本凭证进行认证的协议。
  • 在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式, 没有信托机构。
  • 假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。
  • 早期SMB协议在网络上传输明文口令。后来出现LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解,现在又有了NTLM以及Kerberos。
  • 认证流程分为三部分,分别是:协商、质询、身份验证。

协商


  • 客户端向服务器发送协商请求,包含用户名、密码、认证协议版本等信息。
质询


  • 服务器接收到客户端发送到协商信息,这时服务器会生成一个随机数,叫做challenge,这里的不同的协议随机数长度不同,NTLM V1是8位,NTLM V2是16位。
  • 服务器将登陆的用户对应的NTLM Hash加密challenge,得到Net NTLM Hash,和生成的challenge一起发送给客户端。
验证


  • 客户端收到challenge后,将用户的hash与challenge进行加密运算得到resposne,将username、response、challenge发送给服务器,最后服务器进行校验返回认证结果。
WireShark


  • 知道了基本原理自己实战试试

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表