跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

米米卡兹中sekurlsa:wdigest的实现


CHQ1d

推荐的帖子

0x00 前言

米米卡茨中sekurlsa:wdigest是渗透测试中经常会用到的功能,它能够从lsass进程中提取凭据,通常可获得已登录用户的明文口令(Windows Server 2008 R2版版及更高版本的系统默认无法获得,需要修改注册表等待用户再次登录才能获得)

XPN在他的博客中记录了对WDigest的研究心得,开源了一个POC,通过C实现了在Win10_1809 x64下从lsass进程中提取凭据

本文将会对XPN的无线一键通进行扩展,使其支持R2/Windows server 2012/Windows server 2012 R2,记录程序实现的细节与过程

XPN的博客:

https://blog.xpnsec.com/exploring-mimikatz-part-1/

概念验证:

https://gist.github.com/xpn/12a6907a2fce97296428221b3bd3b394

0x02 简介

本文将要介绍以下内容:

实现思路

程序实现细节

0x03 实现思路

提升至调试权限

获得lsass进程句柄

枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置

从lsasrv.dll中获得初始化向量,AES和3DES的值,用于解密

从wdigest.dll中获得每条凭据的信息,判断加密算法,解密获得明文口令

具体说明如下:

1. 提升至Debug权限

代码可直接使用之前的代码:

https://github。com/3g学生/C语言之家/blob/master/checkcritical进程。CPP # L14-L29

2. 获得lsass进程句柄

通过CreateToolhelp32Snapshot快照快照创建进程快照

遍历进程列表

搜索进程lsass.exe,获得pid

获得lsass进程句柄

3. 枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置

通过EnumProcessModules枚举lsass进程中全部模块的句柄

4. 从lsasrv.dll中获得InitializationVector,AES和3DES的值,用于解密

不同系统的偏移位置不同,详细可参考米米卡茨的源码:

https://github。com/gentili kiwi/mimikatz/blob/68ac 65b 426 D1 B9 e 1354 DD 0365676 B1 EAD 15022 de/mimikatz/modules/sekurlsa/crypto/kuhl _ m _ sekurlsa _ nt6。c # L8-L32

偏移不同的位置有以下四个:

lsinitializeprotectedmemory _ KEY

int IV_OFFSET

整数设计偏移量

int AES_OFFSET

不同系统下俄歇电子能谱和3DES的数据结构也不同:

Win7:

typedef struct _KIWI_BCRYPT_KEY {

乌龙大小;

乌龙标签;//'MSSK '

乌龙型;

ULONG unk0

ULONG unk1

乌龙位;

奇异果_硬键硬键;

} KIWI_BCRYPT_KEY,* PKIWI _ BCRYPT _ KEY

注:

来源于:

https://github。com/gentili kiwi/mimikatz/blob/master/modules/kull _ m _ crypto。h # L56

Win8和Win10:

typedef struct _ KIWI _ BCRYPT _ key 81 {

乌龙大小;

乌龙标签;//'MSSK '

乌龙型;

ULONG unk0

ULONG unk1

ULONG unk2

ULONG unk3

ULONG unk4

PVOID unk5//之前,以x64对齐

ULONG unk6

ULONG unk7

ULONG unk8

ULONG unk9

奇异果_硬键硬键;

} KIWI_BCRYPT_KEY81,* PKIWI _ BCRYPT _ KEY81

注:

来源于:

https://github。com/gentili kiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/crypto/kuhl _ m _ sekurlsa _ nt6。h # L22

其中,KIWI_BCRYPT_KEY和KIWI_BCRYPT_KEY81中的奇异果_硬键存储俄歇电子能谱和3DES的数据,结构如下:

typedef struct _KIWI_HARD_KEY {

ULONG cbSecret

字节数据[任意大小_数组];//等等.

} KIWI_HARD_KEY,* PKIWI _ HARD _ KEY

注:

来源于:

https://github。com/gentili kiwi/mimikatz/blob/master/modules/kull _ m _ crypto。h # L51

ULONG cbSecret表示长度,字节数据[任意大小_数组]为实际加密内容

5. 从wdigest.dll中获得每条凭据的信息,解密出明文口令

凭据信息位于固定偏移位置,可通过搜索固定结构(BYTE PTRN _ win 6 _ PasswdSet[]={0x 48,0x3b,0xd9,0x 74 };)定位

注:

来源于:

https://github。com/gentil kiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/packages/kuhl _ m _ sekurlsa _ wdigest。c # L14

每条凭据以双链表的格式存储,格式如下:

typedef struct _ KIWI _ WDIGEST _ LIST _ ENTRY {

struct _ KIWI _ WDIGEST _ LIST _ ENTRY * Flink;

struct _ KIWI _ WDIGEST _ LIST _ ENTRY * Blink;

ULONGUsageCount

struct _ KIWI _ WDIGEST _ LIST _ ENTRY * This;

LUID本地唯一标识符;

} KIWI_WDIGEST_LIST_ENTRY,* PKIWI _ WDIGEST _ LIST _ ENTRY

注:

来源于:

https://github。com/gentil kiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/packages/kuhl _ m _ sekurlsa _ wdigest。h # L14

每个节点偏移48的位置存储凭据信息,格式如下:

typedef struct _ KIWI _ GENERIC _ PRIMARY _ credental

{

LSA UNICODE字符串用户名;

LSA _ UNICODE _字符串域名;

LSA _ UNICODE _字符串密码;

} KIWI _ GENERIC _ PRIMARY _ CREDENTIAL,* PK iwi _ GENERIC _ PRIMARY _ CREDENTIAL;

注:

来源于:

https://github。com/gentil kiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/globals _ sekurlsa。h # L36

每条凭据会根据加密数据的长度选择算法:

如果加密后的数据长度为8的倍数,那么在中心纤维体模式下使用俄歇电子能谱

否则,在加拿大广播公司模式下使用3DES

0x04 程序实现细节

XPN的无线一键通支持在Win10_1809 x64下从lsass进程中提取凭据,地址如下:

https://gist.github.com/xpn/12a6907a2fce97296428221b3bd3b394

为了使其支持R2/Windows server 2012/Windows server 2012 R2,需要考虑如下问题:

1. 添加提升至Debug权限的代码

BOOL启用调试权限

{

BOOL fOk=FALSE

处理托肯

if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken))

{

令牌_特权tp

tp .PrivilegeCount=1;

LookupPrivilegeValue(NULL,SE_DEBUG_NAME,tp .权限[0]。luid);

tp .权限[0]。Attributes=fEnable?SE _ private _ ENABLED:0;

AdjustTokenPrivileges(hToken,FALSE,tp,sizeof(tp),NULL,NULL);

fOk=(GetLastError()==ERROR _ SUCCESS);

关闭句柄(hto ken);

}

退货(fOk);

}

2. 判断操作系统版本

这里可以使用之前的代码,地址如下:

https://github。com/3g学生/C语言之家/blob/master/getos版本。卡片打印处理机(Card Print Processor的缩写)

需要注意的是代码对Win10的具体版本没有进行判断,而不同的Win10系统,偏移会有不同,例如Win10_1507和Win10_1903

注:

来源于

https://github。com/gentili kiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/crypto/kuhl _ m _ sekurlsa _ nt6。c # L21-L22

3. 不同操作系统版本对应不同的偏移

影响以下四个参数:

lsinitializeprotectedmemory _ KEY

int IV_OFFSET

整数设计偏移量

int AES_OFFSET

4. 不同操作系统版本对应不同的AES和3DES数据结构

Win7:

KIWI _ BCRYPT _ KEY提取的3d eskey,提取的eskey

Win8和Win10:

KIWI _ BCRYPT _ key 81提取3 des密钥,extractedAesKey

5.对每条凭据中加密数据的长度进行判断

使用不同的解密算法并在输出上进行体现:

如果加密后的数据长度为8的倍数,那么在中心纤维体模式下使用俄歇电子能谱

否则,在加拿大广播公司模式下使用3DES

完整代码已开源,地址如下:

https://github。com/3g student/home-of-C-Language/blob/master/sekurlsa-wdi gest。卡片打印处理机(Card Print Processor的缩写)

代码实现了对64位系统的凭据读取,输出信息同米米卡茨的sekurlsa:wdigest结果相同,支持以下操作系统:

win 7 x64/Windows Server 2008 x64/Windows Server 2008 R2 x64

win 8 x64/Windows Server 2012 x64/Windows Server 2012 R2 x64

Win10_1507(及1903年以前)x64

如果想要支持Win10_1903,可添加对Win10_1903及更高版本的系统进行识别,加上对应的偏移计算即可

如果想要支持32位系统,修改对应变量的偏移即可

0x05 补充

对于Windows Server 2008 R2版版及更高版本的系统,默认配置下无法在凭据中保存明文信息,也就无法导出明文口令,可通过修改注册表启用Wdigest身份验证解决这个问题,方法如下:

cmd:

REG add HKLM \系统\当前控制集\控制\安全提供程序\ WDigest/v使用登录凭据/t REG _ DWORD/d 1/f

或者powershell:

set-item property-Path HKLM:\ SYSTEM \ current Control set \ Control \ security providers \ WDigest-Name use logon credential-Type DWORD-Value 1

等待用户再次登录,就能获得凭据中的明文信息

0x06 小结

本文对XPN的无线一键通进行扩展,使其支持R2/Windows server 2012/Windows server 2012 R2,

实现了米米卡茨中sekurlsa:wdigest的功能,记录程序实现的细节与过程

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...