一:Windows本地认证
***基础知识***
- Windows内部是不保存明文密码的,只保存密码的hash。
- 本机用户的密码hash是放在本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件里面。
- SAM文件位置:%SystemRoot%\system32\config\sam
- 当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行对比,如果相同,则认证成功。
***密码格式***
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
其中AAD3B435B51404EEAAD3B435B51404EE是LM Hash而31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash。
1.1:LM HASH
全称是:LAN Manager Hash, windows最早用的加密算法,由IBM设计。
***LM Hash计算***
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
- 再分7bit为一组,每组末尾加0,再组成一组。
- 上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。
如果空密码或者不储蓄LM Hash的话,一般抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE
(win7)这里的LM Hash并没有价值。
1.2:NTLM HASH
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。
***系统版本对LM和NTLM的支持***
2000 | XP | 2003 | Vista | Win7 | 2008 | Win8 | 2012 | |
LM | X | X | X | |||||
NTLM | X | X | X | X | X | X | X | X |
注:X:当密码超过14位时使用的加密方式 X:系统默认使用的加密方式
- 将加密后的两组拼接在一起,得到最终LM HASH值。
#coding=utf-8 import re import binascii from pyDes import * def DesEncrypt(str, Des_Key): k = des(binascii.a2b_hex(Des_Key), ECB, pad=None) EncryptStr = k.encrypt(str) return binascii.b2a_hex(EncryptStr) def group_just(length,text): # text 00110001001100100011001100110100001101010011011000000000 text_area = re.findall(r'.{%d}' % int(length), text) # ['0011000', '1001100', '1000110', '0110011', '0100001', '1010100', '1101100', '0000000'] text_area_padding = [i + '0' for i in text_area] #['00110000', '10011000', '10001100', '01100110', '01000010', '10101000', '11011000', '00000000'] hex_str = ''.join(text_area_padding) # 0011000010011000100011000110011001000010101010001101100000000000 hex_int = hex(int(hex_str, 2))[2:].rstrip("L") #30988c6642a8d800 if hex_int == '0': hex_int = '0000000000000000' return hex_int def lm_hash(password): # 1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。 pass_hex = password.upper().encode("hex").ljust(28,'0') #3132333435360000000000000000 print(pass_hex) # 2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度 left_str = pass_hex[:14] #31323334353600 right_str = pass_hex[14:] #00000000000000 left_stream = bin(int(left_str, 16)).lstrip('0b').rjust(56, '0') # 00110001001100100011001100110100001101010011011000000000 right_stream = bin(int(right_str, 16)).lstrip('0b').rjust(56, '0') # 00000000000000000000000000000000000000000000000000000000 # 3. 再分7bit为一组,每组末尾加0,再组成一组 left_stream = group_just(7,left_stream) # 30988c6642a8d800 right_stream = group_just(7,right_stream) # 0000000000000000 # 4. 上步骤得到的二组,分别作为key 为 "KGS!@#$%"进行DES加密。 left_lm = DesEncrypt('KGS!@#$%',left_stream) #44efce164ab921ca right_lm = DesEncrypt('KGS!@#$%',right_stream) # aad3b435b51404ee # 5. 将加密后的两组拼接在一起,得到最终LM HASH值。 return left_lm + right_lm if __name__ == '__main__': hash = lm_hash("123456")
***加密算法漏洞***
- 首先,密码长度最大只能为14个字符
- 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
- 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
- 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于14个字符的密码的理论强度。
- Des密码强度不高
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。
如果空密码或者不储蓄LM Hash的话,一般抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE
(win7)这里的LM Hash并没有价值。
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
laosec:1000:aad3b435b51404eeaad3b435b51404ee:4ed9fa78b52edf56286dc7fac36d5742:::
***抓取Win7 NTLM HASH***
mimikatz
privilege::debug
sekurlsa::logonpasswords
***NTML HASH计算***
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
二:Windows网络认证
- 使用MD4摘要算法对Unicode编码数据进行Hash计算。
admin -> hex(16进制编码) = 61646d696e 61646d696e -> Unicode = 610064006d0069006e00 610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
1.3:本地认证流程
Windows Logon Process
即 winlogon.exe,是Windows NT 用户登陆程序,用于管理用户登录和退出。
LSASS
本地安全认证子系统服务,用于微软Windows系统的安全机制。负责用户在本地验证或远程登陆时验证用户身份,管理用户密码变更,并产生访问日志。
***整体流程***
- 开机
- winlogon.exe显示输入用户名密码的图形化页面
- 用户输入用户名密码,winlogon.exe进程将输入信息交付给lsass.exe进程
- lsass.exe将密码加密为NTLM Hash,并与本地SAM数据库中的NTLM Hash进行比较
- 如果相同,则认证通过 logonpasswords
2.1:实验1:MSF进行PTH攻击
步骤一:在已经获取的Meterpreter shell下抓取NTML HASH
步骤二:调用psexec模块,设置好选项进行登录
实验结果:
***实验问题***
1:靶机Win7
1)共享服务不允许远程访问
将注册表中LocalAccountTokenFilterPolicy
的值更改为1,如果没有该文件,直接新建一个(DWORD32位)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
2:靶机Winxp
1)连接拒绝
开启Windows XP 的445端口和Server服务
2)登陆失败
检测SMBPass
的值是否正确.依次打开本地计算机策略 - >计算机配置 - > Windows设置 - >安全设置 - >本地策略 - >安全选项
修改网络访问:本地帐户的共享和安全模式
为经典 - 本地用户身份验证
***疑问解决***
SMB协议是Windows网络中用来存取远程文件的通讯协议