FortiGuard实验室最近发现了一封假装来自匈牙利政府的电子邮件。它通知用户,他们的政府门户的新凭证已经附加。然而,附件是一个压缩的可执行文件,在执行时,它将把Warzone RAT提取到内存中并运行它。在我们最初发现的几天后,匈牙利国家网络安全中心也发布了关于这次攻击的警告。

受影响的平台:Microsoft Windows;

受影响方:Microsoft Windows用户;

影响:为攻击者提供远程访问;

严重级别:高;

感染载体

最初的感染是通过模仿匈牙利政府门户网站的仿冒电子邮件(图1)发生的。该门户用于在线开展公务,如提交文件、订购ID等。

1.png

含有Warzone RAT恶意软件附件的恶意邮件

电子邮件告诉受害者,他们的凭据已更改,并附上了新的凭据。完整的翻译是:

2.png

从语言上看,这封邮件是由母语为英语的人写的,然而这封邮件并没有使用官方通信应有的语法。

附件是一个zip文件,其中包含一个伪装为PDF的可执行文件。如上图所示,该文件包含一个模仿Adobe PDF Reader图标的图。文件名以pdf结尾,但扩展名为.exe。然而,在默认的Windows安装中,文件扩展名是隐藏的,它看起来像一个实际的PDF文件。用户唯一的警告是文件资源管理器将文件类型显示为“应用程序”,这意味着它是可执行文件而不是文档。但这对普通用户来说可能并不明显。

3.png

伪装成PDF的可执行文件

俄罗斯套娃式的混淆

当我们开始分析“Uj bejelentkezEsi adatai·pdf.exe”时,我们很快意识到它就像一个俄罗斯套娃混淆,但不是每次打开一个娃娃都会得到一个更小的娃娃,而是得到越来越多的混淆的.NET二进制文件,这就是我们将在本节中看到的。

“Uj bejelentkezEsi adatai·pdf.exe”是一个32位的.NET可执行文件。一旦在dnspy(一个著名的.NET反编译程序)中进行了反编译,我们就会发现源代码很简单,同时也很容易混淆。代码的一般结构如下图所示。原始二进制文件可能在重命名为“Uj bejelentkezEsi adatai·pdf.exe”之前被称为iANO。

4.png

“Uj bejelentkezEsi adatai·pdf.exe”的程序结构

代码显示了BattleShipLiteLibrary和一个计算器的混合体,这看起来像是桌面游戏Battleship的实现。下图显示了实现计算器的实际代码。

5.png

计算器的实现

有时它看起来像一个计算器,行为也像一个计算器,但它仍然不是一个真正计算器。在本例中,为计算器设置用户界面的InitializeComponent()函数也会在最后调用PerformLayout()函数。然后该函数继续调用ResourceTemplateDefine()函数。

6.png

从资源加载代码

ResourceTemplateDefine()函数加载名为“Web”的资源。起初,它似乎将其解释为位图,但最后,它将其转换为程序集。如果我们在十六进制编辑器中查看这个资源,我们会看到它有一个位图标头。但是当我们进一步观察时,它还包括MZ字符,这是可移植可执行文件(PE)的神奇值。在底部,我们甚至可以看到臭名昭著的“此程序不能在DOS模式下运行”字符串,这是PE文件的另一个标志。

7.png

检查“Web”资源发现它隐藏了一个PE文件

该PE文件从资源中加载。下图显示了使用GetMethod()加载它的方法,并调用其中一个方法。另一个图显示了在调试器中调用的方法是' sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY() '。

8.png

从PE文件加载并调用特定的方法

9.png

显示被调用方法名称的调试器

KeyNormalize.dll

“Web”资源中的PE文件的原始名称是KeyNormalize.dll。从被调用函数的名称中,我们已经可以预期它是混淆的。由于它是另一个.NET可执行文件,我们可以在dnspy中打开它并轻松检测,并使用SmartAssembly确认它已被混淆。

10.png

使用SmartAssembly混淆器

De4Dot是一个去混淆器工具,在消除二进制文件的混淆方面很有效率。但是,它不能解析混淆的字符串。为此,我们编写了一个可以解析字符串的定制程序。

在静态分析KeyNormalize.dll之后,我们看到它从资源加载另一个二进制文件并执行函数调用,如前面所示。

11.png

从资源加载程序集并调用它的一个函数

我们可以恢复二进制文件,并再次使用调试器调用哪个函数。下图显示了变量'text6 '中的base64编码数据,在解码之后,我们看到它是另一个PE文件。这个PE文件也是一个.NET可执行文件,最初称为Metall.dll。

12.png

变量' text6 '中的Base64编码数据

13.png

' text6 '中的数据是另一个PE文件

在调试器中,我们还可以看到在这个新恢复的PE文件中调用了' OwbdG5aNVQQYu6X20i.o9pVsMvoTr75y5TrkE.V4j9c6YCwC() '函数。

Metall.dll

在开始分析这个二进制文件之后,我的第一反应如下图所示。

14.png

metal .dll为游戏添加了另一层混淆

不用说,metal .dll通过向二进制文件添加控制流扁平化等特性,增加了混淆的程度。当我们谈到混淆器时,我们说他们的目标是减缓逆向进程。这在某种程度上是有效的。然而,在本例中,我们可以简单地采取一个快捷方式,让二进制文件运行并将其最终有效载荷加载到内存中。这样,我们可以将其转储到一个文件中,以便进一步分析。

Warzone RAT

最终由metal .dll加载到内存中的有效负载是Warzone远程访问木马(RAT)的一个版本。这是一个众所周知的恶意软件操作作为恶意软件服务(MaaS)。它在互联网上是公开的,任何人都可以通过订阅模式访问它。当前的定价如下图所示。

15.png

Warzone RAT的当前定价

它为其订户提供以下功能:

Native, independent stub
Cookies Recovery
Remote Desktop
Hidden Remote Desktop - HRDP
Privilege Escalation - UAC Bypass
Remote WebCam
Password Recovery
File Manager
Download & Execute
Live Keylogger
Offline Keylogger
Remote Shell
Process Manager
Reverse Proxy
Automatic Tasks
Mass Execute
Smart Updater
HRDP WAN Direct Connection
Persistence
Windows Defender Bypass

WarzoneRAT通常也被称为“Ave_Maria Stealer”,因为下图所示的字符串出现在二进制文件中。

16.png

Ave_Maria Stealer名称来自于二进制文件中的这个误导性字符串

嵌入到GitHub的链接没有提供任何有用的东西,这可能只是误导逆向的另一种方式。

Warzone根据Windows版本提供多种升级权限的方法。其中一个是在同一个二进制文件中实现的,另一个作为WM_DSP资源添加到二进制文件中。如果需要,这将在运行时加载并执行。

17.png

可以在资源中找到一个特权升级漏洞

为了躲避防病毒软件,Warzone试图将自己添加到Windows Defender的排除列表中,如下图所示。

18.png

Warzone将自己添加到防病毒排除列表中

为了建立持久性,它还将自身复制到以下路径:

C:\Users\Admin\Documents\ Adobe5151.exe

Warzone还使用与其指挥控制服务器的加密通信。过去,加密的密码/密钥是字符串' warzone160\x00 '。在此示例中,它已更改为字符串“nevergonnagiveyouup”。所以,受害者在不知不觉的情况下被人用人力推倒。

19.png

使用新密码进行加密

通过动态分析,C2服务器的地址为171.22.30.72:5151。在我们的内部系统中查找这个IP和端口号,如下图所示。从这张图中我们可以看到,这场特别的攻击活动早在2022年6月20日就开始了。

20.png

访问地址171.22.30.72:5151

可以看出,攻击者用一封写得很好的虚假政府邮件作为诱饵,执行所附的恶意软件。这种诱惑是经过深思熟虑的,因为它与匈牙利所有使用在线管理门户的人都相关。

嵌入式.NET二进制文件的russian yoshka doll具有越来越复杂的混淆功能,支持攻击者越来越依赖现代混淆技术的趋势。这将导致逆向工程师不得不投入更多的时间来清除和分析恶意软件。使用Warzone RAT作为最终有效载荷也支持了攻击者对MaaS服务日益增长的依赖。我们在勒索软件样本中看到了类似的趋势,勒索软件即服务提供商越来越受欢迎。

如上所述,该活动的最后一个有效载荷Warzone RAT是通过一系列混淆的.NET二进制文件部署的。每个阶段都从二进制文件中的某个位置加载下一个阶段,对其进行解码,将其加载到内存中,并调用一个函数将控制流传递给下一个阶段。这样的多阶段加载程序可能会使动态分析变得困难,因为每次重新启动恶意软件样本时,在不同的阶段进行导航都会很困难。为了避免这个问题,我们从各个阶段创建了独立的可执行文件,以实现更高效的调试。这就是我们将在下面讨论的。

下图显示了Warzone RAT在这一特定攻击中的部署链。钓鱼电子邮件包含一个zip文件。该zip文件包含下图所示的二进制文件。

2.1.png

拆封过程

一旦上一步被执行,它就加载下一步,KeysNormalize.dll一个解压缩到内存中的.NET动态链接库(DLL)。它通过调用它的一个函数(sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY())来运行。这篇文章讨论了如何使用调试恢复。一种方法是使用dnspy作为调试器从内存中转储KeysNormalize.dll。它被一种叫做SmartAssembly的混淆工具混淆了。

要了解第三阶段是什么(Metal.dll)并将其转储到文件中,我们需要能够调试KeysNormalize.dll。但在此之前,我们还面临以下挑战:

我们如何独立于最初解包并在内存中运行它的可执行文件运行KeysNormalize.dll ?

我们如何为KeysNormalize.dll创建一个环境,让它可以释放下一个阶段,就像在原始恶意软件中那样?

方案1:独立运行KeysNormalize.dll

因为这不是一个.exe文件,我们不能直接双击它来运行。此外,原始的.exe文件调用来自KeysNormalize.dll的特定函数,因此我们还必须确保在运行该DLL时调用相同的函数。

有多种方法可以做到这一点。在这种情况下,对我有用的是用c#创建一个包装器程序,我在其中导入keysnormize . DLL作为一个正常的DLL,并简单地调用sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY()函数。如果你是一个.NET/C#开发人员,这是非常容易的,而我不是,但如果你不经常这样做,这可能会很有挑战性。

设置Visual Studio

首先,让我们启动Visual Studio并创建一个新的C#控制台应用程序(.NET Framework)项目,然后选择.NET 4.7.2版本。我们可以调用这个项目dll_wrapper。默认情况下,它加载一个空类。但我们可以将其更改为下图所示的代码。

2.2.png

等待击键的基本程序

此代码将无限期等待按键,然后不执行任何操作。将此添加到代码中的原因是我们无法在调试器中提前添加断点。这样,我们可以在程序等待按键时中断执行,然后在需要时添加断点。

导入KeysNormalize.dll

下一步是在项目中包含KeysNormalize.dll。首先,我们将DLL复制到项目文件夹中。

2.3.png

将KeysNormalize.dll复制到项目文件夹中

我们还需要添加对KeysNormalize.dll的引用,这可以在Project->Add Project Reference->Browse->Choose the KeysNormalize.dll下完成。KeysNormalize现在应该出现在SolutionExplorer的References下,如下图所示。

2.4.png

将对DLL的引用添加到项目中

现在我们应该可以开始在项目中使用KeysNormalize.dll了。我们需要调用以下函数(我们从对原始二进制文件的分析中了解到这一点,这里不讨论):

sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY("4F515364", "746771", "BattleshipLiteLibrary");

为此,我们首先需要导入sk41Ua2AFu5PANMKit,这是Program.cs中KeysNormalize中的命名空间。接下来,我们将上面的函数调用添加到按键循环之后的代码中,如下图所示。

2.5.png

导入库并调用目标函数

如果运行此程序,则表示正在执行恶意负载,因此只能在隔离的安全系统上运行。

我们现在可以构建一个x86版本的二进制文件。如果我们运行该程序,无论是在Visual Studio中还是单独运行,它都会崩溃并抛出异常,如下图所示。

2.6.png

未找到资源,导致异常

从错误消息中,我们看到没有找到BattleshipLiteLibrary.Properties.Resources.resources。该资源存在于第一阶段二进制文件“Uj bejelentkezEsi adatai·pdf.exe”或“iANO”中。

2.7.png

iANO二进制文件中的资源

这很有趣,因为这意味着尽管KeysNormalize是一个独立的DLL,但它不能单独工作。

方案2:创建BattleshipLiteLibrary.Properties.Resources.resources

为了克服资源问题,我们需要满足KeysNormalize.dll的需求,并创建一个名为BattleshipLiteLibrary.Properties.Resources.resources的资源。这并不像看上去那么简单。资源名的构建方式如下:

加图.png

我们需要创建一个名为BattleshipLiteLibrary.Property.Resources.Resources的资源。因此名称空间必须是BattleshipLiteLibrary。它还需要位于Properties文件夹中,并且必须名为Resources.Resources。

要获取资源内容,我们转到dnspy,右键点击资源,然后选择Raw Save battleshiplitelibrary .Properties. Resources.resources。我们需要将其保存在dll_wrapper的Properties文件夹下的Resources.Resources。

2.8.png

从dnspy保存资源

要将此文件添加到项目中,请右键点击SolutionExplorer中的Properties,然后选择 Add/Existing Item 。选择Resources.resources 文件然后点击“确定”。

2.9.png

向项目添加资源文件

最后一步是将项目的名称空间更改为BattleshipLiteLibrary,以便在KeysNormalize查找资源名称时资源名称是正确的。这可以分两步完成:

1. 双击解决方案资源管理器中的属性,并将默认名称空间更改为BattleshipLiteLibrary,如下图所示。

2.10.png

更改默认命名空间

2. 右键单击Program.cs中的名称空间,选择Rename,并将其更改为BattleshipLiteLibrary,如下图所示。

2.11.png

更改命名空间

这两个步骤应该会更改项目中的所有名称空间。有了这个资源,我们可以构建一个新的x86发行版二进制文件。

转储下一阶段

使KeysNormalize.dll运行的原因是为了有效地调试它并转储下一阶段。

这可以在dnspy中完成。因此,让我们在dnspy中加载dll_wrapper.exe,并在对abiJPmfBfTL6iLfmaW.Y5tFvU8EY()函数的调用中放置一个断点,如下图所示。

2.12.png

向KeysNormalize调用中添加断点

在启动调试器并按下请求时的一个键之后,我们碰到了断点。这样,我们可以点击“Step into”,这也将使dnspy反编译KeysNormalize.dll,允许我们调试二进制文件。

2.13.png

KeysNormalize从资源加载数据、转换数据并调用函数

查看下图的代码后,我们可以看到以下内容:

第76行调用以位图形式加载资源的函数;

该位图被加载到数组中,并执行一些转换;

第83行调用将array作为Assembly对象加载的函数,这意味着数组可能包含下一个阶段;

第84行调用将调用加载的Assembly对象中的一个函数的函数,并通过该函数将执行传递到第93行中的下一个阶段;

现在我们知道可以在第83行转储数组,并找出在第93行调用了哪个函数。

下图显示了内存中的数组变量。它包含一个PE文件。这将是Metal.dll,这是攻击的下一个阶段。

2.14.png

array包含一个PE文件

下图显示了包含在加载的Assembly对象中调用的函数名称的ethodInfo变量。函数名为“OwbdG5aNVQQYu6X20i.o9pVsMvoTr75y5TrkE.V4j9c6YCwC()”

2.15.png

MethodInfo包含被调用函数的名称

现在,为了继续分析,我们需要查看转储的Metal.dll中的这个函数,但这不在本文讨论的范围。

总结

本文介绍了如何创建自定义.NET程序来帮助调试直接在内存中加载和调用的DLL。我们还研究了如何向程序中添加资源以满足调试二进制文件的要求。最后,我们调试了目标DLL以转储下一阶段的二进制文件,并找出哪个函数是它的攻击开始处。

FortiGuard实验室最近发现了一封假装来自匈牙利政府的电子邮件。它通知用户,他们的政府门户的新凭证已经附加。然而,附件是一个压缩的可执行文件,在执行时,它将把Warzone RAT提取到内存中并运行它。在我们最初发现的几天后,匈牙利国家网络安全中心也发布了关于这次攻击的警告。

受影响的平台:Microsoft Windows;

受影响方:Microsoft Windows用户;

影响:为攻击者提供远程访问;

严重级别:高;

感染载体

最初的感染是通过模仿匈牙利政府门户网站的仿冒电子邮件(图1)发生的。该门户用于在线开展公务,如提交文件、订购ID等。

1.png

含有Warzone RAT恶意软件附件的恶意邮件

电子邮件告诉受害者,他们的凭据已更改,并附上了新的凭据。完整的翻译是:

2.png

从语言上看,这封邮件是由母语为英语的人写的,然而这封邮件并没有使用官方通信应有的语法。

附件是一个zip文件,其中包含一个伪装为PDF的可执行文件。如上图所示,该文件包含一个模仿Adobe PDF Reader图标的图。文件名以pdf结尾,但扩展名为.exe。然而,在默认的Windows安装中,文件扩展名是隐藏的,它看起来像一个实际的PDF文件。用户唯一的警告是文件资源管理器将文件类型显示为“应用程序”,这意味着它是可执行文件而不是文档。但这对普通用户来说可能并不明显。

3.png

伪装成PDF的可执行文件

俄罗斯套娃式的混淆

当我们开始分析“Uj bejelentkezEsi adatai·pdf.exe”时,我们很快意识到它就像一个俄罗斯套娃混淆,但不是每次打开一个娃娃都会得到一个更小的娃娃,而是得到越来越多的混淆的.NET二进制文件,这就是我们将在本节中看到的。

“Uj bejelentkezEsi adatai·pdf.exe”是一个32位的.NET可执行文件。一旦在dnspy(一个著名的.NET反编译程序)中进行了反编译,我们就会发现源代码很简单,同时也很容易混淆。代码的一般结构如下图所示。原始二进制文件可能在重命名为“Uj bejelentkezEsi adatai·pdf.exe”之前被称为iANO。

4.png

“Uj bejelentkezEsi adatai·pdf.exe”的程序结构

代码显示了BattleShipLiteLibrary和一个计算器的混合体,这看起来像是桌面游戏Battleship的实现。下图显示了实现计算器的实际代码。

5.png

计算器的实现

有时它看起来像一个计算器,行为也像一个计算器,但它仍然不是一个真正计算器。在本例中,为计算器设置用户界面的InitializeComponent()函数也会在最后调用PerformLayout()函数。然后该函数继续调用ResourceTemplateDefine()函数。

6.png

从资源加载代码

ResourceTemplateDefine()函数加载名为“Web”的资源。起初,它似乎将其解释为位图,但最后,它将其转换为程序集。如果我们在十六进制编辑器中查看这个资源,我们会看到它有一个位图标头。但是当我们进一步观察时,它还包括MZ字符,这是可移植可执行文件(PE)的神奇值。在底部,我们甚至可以看到臭名昭著的“此程序不能在DOS模式下运行”字符串,这是PE文件的另一个标志。

7.png

检查“Web”资源发现它隐藏了一个PE文件

该PE文件从资源中加载。下图显示了使用GetMethod()加载它的方法,并调用其中一个方法。另一个图显示了在调试器中调用的方法是' sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY() '。

8.png

从PE文件加载并调用特定的方法

9.png

显示被调用方法名称的调试器

KeyNormalize.dll

“Web”资源中的PE文件的原始名称是KeyNormalize.dll。从被调用函数的名称中,我们已经可以预期它是混淆的。由于它是另一个.NET可执行文件,我们可以在dnspy中打开它并轻松检测,并使用SmartAssembly确认它已被混淆。

10.png

使用SmartAssembly混淆器

De4Dot是一个去混淆器工具,在消除二进制文件的混淆方面很有效率。但是,它不能解析混淆的字符串。为此,我们编写了一个可以解析字符串的定制程序。

在静态分析KeyNormalize.dll之后,我们看到它从资源加载另一个二进制文件并执行函数调用,如前面所示。

11.png

从资源加载程序集并调用它的一个函数

我们可以恢复二进制文件,并再次使用调试器调用哪个函数。下图显示了变量'text6 '中的base64编码数据,在解码之后,我们看到它是另一个PE文件。这个PE文件也是一个.NET可执行文件,最初称为Metall.dll。

12.png

变量' text6 '中的Base64编码数据

13.png

' text6 '中的数据是另一个PE文件

在调试器中,我们还可以看到在这个新恢复的PE文件中调用了' OwbdG5aNVQQYu6X20i.o9pVsMvoTr75y5TrkE.V4j9c6YCwC() '函数。

Metall.dll

在开始分析这个二进制文件之后,我的第一反应如下图所示。

14.png

metal .dll为游戏添加了另一层混淆

不用说,metal .dll通过向二进制文件添加控制流扁平化等特性,增加了混淆的程度。当我们谈到混淆器时,我们说他们的目标是减缓逆向进程。这在某种程度上是有效的。然而,在本例中,我们可以简单地采取一个快捷方式,让二进制文件运行并将其最终有效载荷加载到内存中。这样,我们可以将其转储到一个文件中,以便进一步分析。

Warzone RAT

最终由metal .dll加载到内存中的有效负载是Warzone远程访问木马(RAT)的一个版本。这是一个众所周知的恶意软件操作作为恶意软件服务(MaaS)。它在互联网上是公开的,任何人都可以通过订阅模式访问它。当前的定价如下图所示。

15.png

Warzone RAT的当前定价

它为其订户提供以下功能:

Native, independent stub
Cookies Recovery
Remote Desktop
Hidden Remote Desktop - HRDP
Privilege Escalation - UAC Bypass
Remote WebCam
Password Recovery
File Manager
Download & Execute
Live Keylogger
Offline Keylogger
Remote Shell
Process Manager
Reverse Proxy
Automatic Tasks
Mass Execute
Smart Updater
HRDP WAN Direct Connection
Persistence
Windows Defender Bypass

WarzoneRAT通常也被称为“Ave_Maria Stealer”,因为下图所示的字符串出现在二进制文件中。

16.png

Ave_Maria Stealer名称来自于二进制文件中的这个误导性字符串

嵌入到GitHub的链接没有提供任何有用的东西,这可能只是误导逆向的另一种方式。

Warzone根据Windows版本提供多种升级权限的方法。其中一个是在同一个二进制文件中实现的,另一个作为WM_DSP资源添加到二进制文件中。如果需要,这将在运行时加载并执行。

17.png

可以在资源中找到一个特权升级漏洞

为了躲避防病毒软件,Warzone试图将自己添加到Windows Defender的排除列表中,如下图所示。

18.png

Warzone将自己添加到防病毒排除列表中

为了建立持久性,它还将自身复制到以下路径:

C:\Users\Admin\Documents\ Adobe5151.exe

Warzone还使用与其指挥控制服务器的加密通信。过去,加密的密码/密钥是字符串' warzone160\x00 '。在此示例中,它已更改为字符串“nevergonnagiveyouup”。所以,受害者在不知不觉的情况下被人用人力推倒。

19.png

使用新密码进行加密

通过动态分析,C2服务器的地址为171.22.30.72:5151。在我们的内部系统中查找这个IP和端口号,如下图所示。从这张图中我们可以看到,这场特别的攻击活动早在2022年6月20日就开始了。

20.png

访问地址171.22.30.72:5151

可以看出,攻击者用一封写得很好的虚假政府邮件作为诱饵,执行所附的恶意软件。这种诱惑是经过深思熟虑的,因为它与匈牙利所有使用在线管理门户的人都相关。

嵌入式.NET二进制文件的russian yoshka doll具有越来越复杂的混淆功能,支持攻击者越来越依赖现代混淆技术的趋势。这将导致逆向工程师不得不投入更多的时间来清除和分析恶意软件。使用Warzone RAT作为最终有效载荷也支持了攻击者对MaaS服务日益增长的依赖。我们在勒索软件样本中看到了类似的趋势,勒索软件即服务提供商越来越受欢迎。

如上所述,该活动的最后一个有效载荷Warzone RAT是通过一系列混淆的.NET二进制文件部署的。每个阶段都从二进制文件中的某个位置加载下一个阶段,对其进行解码,将其加载到内存中,并调用一个函数将控制流传递给下一个阶段。这样的多阶段加载程序可能会使动态分析变得困难,因为每次重新启动恶意软件样本时,在不同的阶段进行导航都会很困难。为了避免这个问题,我们从各个阶段创建了独立的可执行文件,以实现更高效的调试。这就是我们将在下面讨论的。

下图显示了Warzone RAT在这一特定攻击中的部署链。钓鱼电子邮件包含一个zip文件。该zip文件包含下图所示的二进制文件。

2.1.png

拆封过程

一旦上一步被执行,它就加载下一步,KeysNormalize.dll一个解压缩到内存中的.NET动态链接库(DLL)。它通过调用它的一个函数(sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY())来运行。这篇文章讨论了如何使用调试恢复。一种方法是使用dnspy作为调试器从内存中转储KeysNormalize.dll。它被一种叫做SmartAssembly的混淆工具混淆了。

要了解第三阶段是什么(Metal.dll)并将其转储到文件中,我们需要能够调试KeysNormalize.dll。但在此之前,我们还面临以下挑战:

我们如何独立于最初解包并在内存中运行它的可执行文件运行KeysNormalize.dll ?

我们如何为KeysNormalize.dll创建一个环境,让它可以释放下一个阶段,就像在原始恶意软件中那样?

方案1:独立运行KeysNormalize.dll

因为这不是一个.exe文件,我们不能直接双击它来运行。此外,原始的.exe文件调用来自KeysNormalize.dll的特定函数,因此我们还必须确保在运行该DLL时调用相同的函数。

有多种方法可以做到这一点。在这种情况下,对我有用的是用c#创建一个包装器程序,我在其中导入keysnormize . DLL作为一个正常的DLL,并简单地调用sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY()函数。如果你是一个.NET/C#开发人员,这是非常容易的,而我不是,但如果你不经常这样做,这可能会很有挑战性。

设置Visual Studio

首先,让我们启动Visual Studio并创建一个新的C#控制台应用程序(.NET Framework)项目,然后选择.NET 4.7.2版本。我们可以调用这个项目dll_wrapper。默认情况下,它加载一个空类。但我们可以将其更改为下图所示的代码。

2.2.png

等待击键的基本程序

此代码将无限期等待按键,然后不执行任何操作。将此添加到代码中的原因是我们无法在调试器中提前添加断点。这样,我们可以在程序等待按键时中断执行,然后在需要时添加断点。

导入KeysNormalize.dll

下一步是在项目中包含KeysNormalize.dll。首先,我们将DLL复制到项目文件夹中。

2.3.png

将KeysNormalize.dll复制到项目文件夹中

我们还需要添加对KeysNormalize.dll的引用,这可以在Project->Add Project Reference->Browse->Choose the KeysNormalize.dll下完成。KeysNormalize现在应该出现在SolutionExplorer的References下,如下图所示。

2.4.png

将对DLL的引用添加到项目中

现在我们应该可以开始在项目中使用KeysNormalize.dll了。我们需要调用以下函数(我们从对原始二进制文件的分析中了解到这一点,这里不讨论):

sk41Ua2AFu5PANMKit.abiJPmfBfTL6iLfmaW.Y5tFvU8EY("4F515364", "746771", "BattleshipLiteLibrary");

为此,我们首先需要导入sk41Ua2AFu5PANMKit,这是Program.cs中KeysNormalize中的命名空间。接下来,我们将上面的函数调用添加到按键循环之后的代码中,如下图所示。

2.5.png

导入库并调用目标函数

如果运行此程序,则表示正在执行恶意负载,因此只能在隔离的安全系统上运行。

我们现在可以构建一个x86版本的二进制文件。如果我们运行该程序,无论是在Visual Studio中还是单独运行,它都会崩溃并抛出异常,如下图所示。

2.6.png

未找到资源,导致异常

从错误消息中,我们看到没有找到BattleshipLiteLibrary.Properties.Resources.resources。该资源存在于第一阶段二进制文件“Uj bejelentkezEsi adatai·pdf.exe”或“iANO”中。

2.7.png

iANO二进制文件中的资源

这很有趣,因为这意味着尽管KeysNormalize是一个独立的DLL,但它不能单独工作。

方案2:创建BattleshipLiteLibrary.Properties.Resources.resources

为了克服资源问题,我们需要满足KeysNormalize.dll的需求,并创建一个名为BattleshipLiteLibrary.Properties.Resources.resources的资源。这并不像看上去那么简单。资源名的构建方式如下:

加图.png

我们需要创建一个名为BattleshipLiteLibrary.Property.Resources.Resources的资源。因此名称空间必须是BattleshipLiteLibrary。它还需要位于Properties文件夹中,并且必须名为Resources.Resources。

要获取资源内容,我们转到dnspy,右键点击资源,然后选择Raw Save battleshiplitelibrary .Properties. Resources.resources。我们需要将其保存在dll_wrapper的Properties文件夹下的Resources.Resources。

2.8.png

从dnspy保存资源

要将此文件添加到项目中,请右键点击SolutionExplorer中的Properties,然后选择 Add/Existing Item 。选择Resources.resources 文件然后点击“确定”。

2.9.png

向项目添加资源文件

最后一步是将项目的名称空间更改为BattleshipLiteLibrary,以便在KeysNormalize查找资源名称时资源名称是正确的。这可以分两步完成:

1. 双击解决方案资源管理器中的属性,并将默认名称空间更改为BattleshipLiteLibrary,如下图所示。

2.10.png

更改默认命名空间

2. 右键单击Program.cs中的名称空间,选择Rename,并将其更改为BattleshipLiteLibrary,如下图所示。

2.11.png

更改命名空间

这两个步骤应该会更改项目中的所有名称空间。有了这个资源,我们可以构建一个新的x86发行版二进制文件。

转储下一阶段

使KeysNormalize.dll运行的原因是为了有效地调试它并转储下一阶段。

这可以在dnspy中完成。因此,让我们在dnspy中加载dll_wrapper.exe,并在对abiJPmfBfTL6iLfmaW.Y5tFvU8EY()函数的调用中放置一个断点,如下图所示。

2.12.png

向KeysNormalize调用中添加断点

在启动调试器并按下请求时的一个键之后,我们碰到了断点。这样,我们可以点击“Step into”,这也将使dnspy反编译KeysNormalize.dll,允许我们调试二进制文件。

2.13.png

KeysNormalize从资源加载数据、转换数据并调用函数

查看下图的代码后,我们可以看到以下内容:

第76行调用以位图形式加载资源的函数;

该位图被加载到数组中,并执行一些转换;

第83行调用将array作为Assembly对象加载的函数,这意味着数组可能包含下一个阶段;

第84行调用将调用加载的Assembly对象中的一个函数的函数,并通过该函数将执行传递到第93行中的下一个阶段;

现在我们知道可以在第83行转储数组,并找出在第93行调用了哪个函数。

下图显示了内存中的数组变量。它包含一个PE文件。这将是Metal.dll,这是攻击的下一个阶段。

2.14.png

array包含一个PE文件

下图显示了包含在加载的Assembly对象中调用的函数名称的ethodInfo变量。函数名为“OwbdG5aNVQQYu6X20i.o9pVsMvoTr75y5TrkE.V4j9c6YCwC()”

2.15.png

MethodInfo包含被调用函数的名称

现在,为了继续分析,我们需要查看转储的Metal.dll中的这个函数,但这不在本文讨论的范围。

总结

本文介绍了如何创建自定义.NET程序来帮助调试直接在内存中加载和调用的DLL。我们还研究了如何向程序中添加资源以满足调试二进制文件的要求。最后,我们调试了目标DLL以转储下一阶段的二进制文件,并找出哪个函数是它的攻击开始处。

针对恶意包的新型混淆技术可以在图像中隐藏代码。

Check Point 研究团队最近在PyPI上检测到一个新的、从未见过的恶意包,PyPI是Python编程语言的软件库。恶意包被设计用来隐藏图像中的代码(基于图像的代码混淆——隐写术),并通过Github上的开源项目感染PyPI用户。这些发现反映了攻击者严密的攻击计划,证明了PyPi上的混淆技术已经进化。

常见恶意软件包结构

开源域上的恶意软件包通常包括3个主要组件:

恶意代码:负责下载和运行病毒可执行文件,向攻击者打开远程shell,或者只是收集并发布它能找到的所有PII。

运营商代码:负责注入恶意代码。通常,它将是一个合法的包,其中包含作为安装代码一部分的恶意代码段(如PyPI中的setup.py或NPM中的安装后脚本)。运营商代码通过混淆处理被隐藏,或者可以在安装过程中从诸如pastebin.com之类的源动态下载。

感染软件包:首先吸引受害者安装恶意软件包,一种常见的技巧是与普通合法名称相似的包名。

攻击者通常会仔细命名包名称。选择过于普通的包名可能会导致恶意应用程序被快速检测到(对PyPI用户具有很高的可见性)。选择一个小众名称可导致包的下载量较少,这将降低成功感染的潜在数量,需要开发商通过积极与潜在用户接触,让他们安装受感染的包来填补这一空白。在大多数情况下,攻击者似乎喜欢规模化攻击,即模仿常见的包名,假设高下载量将保证至少发生一些感染,即使潜在的软件包寿命更短。有些情况包括更独特和更重要的恶意代码设计选择。Apicolor似乎使用的就是该方法,它有一个小众且不受欢迎的软件包,但会积极尝试让GitHub用户安装该应用程序。

Apicolor

Check Point 研究团队检测到的恶意包名为“apicolor”。乍一看,它似乎是PyPI上许多开发包中的一个。它是相当新的,最初发布于今年10月31号,有一个大致的描述和一个混淆的标题,说明这是一个“REST API的核心库”。普通恶意包的观察者几乎不会注意到这些。

1.png

在深入研究了包安装脚本之后,研究人员注意到开头有一个奇怪的、重要的代码部分。它首先手动安装额外的需求(不是通过更常见的需求部分),然后从web下载一张图片,使用新安装的包处理图片,并使用exec命令触发处理生成的输出。代码片段与我们通常在一般setup.py安装脚本中看到的代码片段有很大不同。

2.webp.jpg

手动安装的两个包是request(API使用中非常流行的帮助包)和judyb。judib包的细节最初看起来像一个“正在进行中”的包,有一个空的描述和一个混淆的标头,说明这是“一个纯Python judyb模块”。深入研究发现,judyb与apicolor首次发布的时间大致相同。

3.webp.jpg

judyb代码原来是一个隐写术模块,负责隐藏和揭示隐藏在图片中的信息。研究人员怀疑在apicolor安装过程中下载的图像可能包含其内部的隐藏部分。

4.webp.jpg

4.2.webp.jpg

4.3.webp.jpg

现在回到apicolor安装代码,第一步是观察从网上下载的图片。这似乎是合法的,没有什么异常。

将judyb的“揭示”方法应用于这张图片,显示了一条隐藏的信息,从该图像中发现。该消息似乎包含一个base64混淆的Python代码,这是恶意软件包隐藏其恶意代码的常用做法。

6.webp.jpg

使用base64对该代码段进行去混淆处理揭示了我们非常熟悉的常见恶意代码模式;从web下载恶意exe并在本地运行。

7.webp.jpg

在发现apicolor软件包的恶意和载体部分后,接下来就应该介绍如何安装这些软件包以及这些感染是如何被引发的?

主动感染

研究人员搜索使用这些包的代码项目,使团队能够进一步了解它们的感染技术及进程。通过这一搜索,很明显apicolor和judib非常小众,在GitHub项目上有少量使用。

8.webp.jpg

只有三个GitHub用户似乎在他们的代码中包含了这些包。将它们作为(超级冗余的)需求添加到其公开可访问的GitHub项目中。不出所料,这三个用户都是GitHub的新用户。

9.webp.jpg

9.2.webp.jpg

9.3.webp.jpg

隐性感染

感染过程如下:

当用户在网上搜索合法的项目时,会遇到这些GitHub开源项目,并在本地安装它们,他们并不知道其中含有恶意的包。需要注意的是,代码似乎有效。在某些情况下,存在空的恶意包。从安装程序的角度来看,他们正在尝试一个来自GitHub的开源项目,并不知道其中隐藏了恶意木马程序部分。

10.webp.jpg

细心的用户只会考虑热门的开源项目,而上述项目似乎符合这一标准。

11.webp.jpg

11.2.webp.jpg

向PyPI披露

一旦这些包被识别出来,Check Point Research就会提醒PyPI它们的存在,之后PyPI就会进行删除。

供应链攻击 旨在利用组织和外部方之间的信任关系。这些关系可能包括合作伙伴关系、供应商关系或使用第三方软件。攻击者会破坏一个组织,然后向供应链的上游移动,利用这些受信任的关系来访问其他组织的环境。近年来,这类攻击越来越频繁,影响也越来越大,因此开发人员必须确保自己的操作安全,反复检查正在使用的每个软件成分,特别是从不同存储库下载的软件,尤其是那些不是自己创建的软件。

研究人员发现了一种新型的有组织的攻击,他们不仅会模仿一个常见的包,隐藏其恶意代码,还会直接针对特定类型的用户组织发起攻击,将感染阶段从高度关注的PyPI平台转移到GitHub,这使得检测此类恶意包变得更加困难。

针对恶意包的新型混淆技术可以在图像中隐藏代码。

Check Point 研究团队最近在PyPI上检测到一个新的、从未见过的恶意包,PyPI是Python编程语言的软件库。恶意包被设计用来隐藏图像中的代码(基于图像的代码混淆——隐写术),并通过Github上的开源项目感染PyPI用户。这些发现反映了攻击者严密的攻击计划,证明了PyPi上的混淆技术已经进化。

常见恶意软件包结构

开源域上的恶意软件包通常包括3个主要组件:

恶意代码:负责下载和运行病毒可执行文件,向攻击者打开远程shell,或者只是收集并发布它能找到的所有PII。

运营商代码:负责注入恶意代码。通常,它将是一个合法的包,其中包含作为安装代码一部分的恶意代码段(如PyPI中的setup.py或NPM中的安装后脚本)。运营商代码通过混淆处理被隐藏,或者可以在安装过程中从诸如pastebin.com之类的源动态下载。

感染软件包:首先吸引受害者安装恶意软件包,一种常见的技巧是与普通合法名称相似的包名。

攻击者通常会仔细命名包名称。选择过于普通的包名可能会导致恶意应用程序被快速检测到(对PyPI用户具有很高的可见性)。选择一个小众名称可导致包的下载量较少,这将降低成功感染的潜在数量,需要开发商通过积极与潜在用户接触,让他们安装受感染的包来填补这一空白。在大多数情况下,攻击者似乎喜欢规模化攻击,即模仿常见的包名,假设高下载量将保证至少发生一些感染,即使潜在的软件包寿命更短。有些情况包括更独特和更重要的恶意代码设计选择。Apicolor似乎使用的就是该方法,它有一个小众且不受欢迎的软件包,但会积极尝试让GitHub用户安装该应用程序。

Apicolor

Check Point 研究团队检测到的恶意包名为“apicolor”。乍一看,它似乎是PyPI上许多开发包中的一个。它是相当新的,最初发布于今年10月31号,有一个大致的描述和一个混淆的标题,说明这是一个“REST API的核心库”。普通恶意包的观察者几乎不会注意到这些。

1.png

在深入研究了包安装脚本之后,研究人员注意到开头有一个奇怪的、重要的代码部分。它首先手动安装额外的需求(不是通过更常见的需求部分),然后从web下载一张图片,使用新安装的包处理图片,并使用exec命令触发处理生成的输出。代码片段与我们通常在一般setup.py安装脚本中看到的代码片段有很大不同。

2.webp.jpg

手动安装的两个包是request(API使用中非常流行的帮助包)和judyb。judib包的细节最初看起来像一个“正在进行中”的包,有一个空的描述和一个混淆的标头,说明这是“一个纯Python judyb模块”。深入研究发现,judyb与apicolor首次发布的时间大致相同。

3.webp.jpg

judyb代码原来是一个隐写术模块,负责隐藏和揭示隐藏在图片中的信息。研究人员怀疑在apicolor安装过程中下载的图像可能包含其内部的隐藏部分。

4.webp.jpg

4.2.webp.jpg

4.3.webp.jpg

现在回到apicolor安装代码,第一步是观察从网上下载的图片。这似乎是合法的,没有什么异常。

将judyb的“揭示”方法应用于这张图片,显示了一条隐藏的信息,从该图像中发现。该消息似乎包含一个base64混淆的Python代码,这是恶意软件包隐藏其恶意代码的常用做法。

6.webp.jpg

使用base64对该代码段进行去混淆处理揭示了我们非常熟悉的常见恶意代码模式;从web下载恶意exe并在本地运行。

7.webp.jpg

在发现apicolor软件包的恶意和载体部分后,接下来就应该介绍如何安装这些软件包以及这些感染是如何被引发的?

主动感染

研究人员搜索使用这些包的代码项目,使团队能够进一步了解它们的感染技术及进程。通过这一搜索,很明显apicolor和judib非常小众,在GitHub项目上有少量使用。

8.webp.jpg

只有三个GitHub用户似乎在他们的代码中包含了这些包。将它们作为(超级冗余的)需求添加到其公开可访问的GitHub项目中。不出所料,这三个用户都是GitHub的新用户。

9.webp.jpg

9.2.webp.jpg

9.3.webp.jpg

隐性感染

感染过程如下:

当用户在网上搜索合法的项目时,会遇到这些GitHub开源项目,并在本地安装它们,他们并不知道其中含有恶意的包。需要注意的是,代码似乎有效。在某些情况下,存在空的恶意包。从安装程序的角度来看,他们正在尝试一个来自GitHub的开源项目,并不知道其中隐藏了恶意木马程序部分。

10.webp.jpg

细心的用户只会考虑热门的开源项目,而上述项目似乎符合这一标准。

11.webp.jpg

11.2.webp.jpg

向PyPI披露

一旦这些包被识别出来,Check Point Research就会提醒PyPI它们的存在,之后PyPI就会进行删除。

供应链攻击 旨在利用组织和外部方之间的信任关系。这些关系可能包括合作伙伴关系、供应商关系或使用第三方软件。攻击者会破坏一个组织,然后向供应链的上游移动,利用这些受信任的关系来访问其他组织的环境。近年来,这类攻击越来越频繁,影响也越来越大,因此开发人员必须确保自己的操作安全,反复检查正在使用的每个软件成分,特别是从不同存储库下载的软件,尤其是那些不是自己创建的软件。

研究人员发现了一种新型的有组织的攻击,他们不仅会模仿一个常见的包,隐藏其恶意代码,还会直接针对特定类型的用户组织发起攻击,将感染阶段从高度关注的PyPI平台转移到GitHub,这使得检测此类恶意包变得更加困难。

随着网络防御者对Cobalt Strike的关注度上升,攻击者一直在寻找替代的命令与控制(C&C)框架,DeimosC2就是一个替代工具。

C&C系统对于渗透测试人员和安全人员来说是非常有用的协作工具。它们为所有受害设备提供了一个公共的位置,以便与之联系、进行控制,并允许多个用户与相同的受害设备进行交互。当执行授权测试时,这是非常重要的,因为日志保存在一个单独的地方,以帮助报告。然而,越来越多的这些工具被攻击者利用,包括开源工具和商业工具。它们的易用性和稳定性让它们能够长时间运行而没有任何问题,这也是为什么攻击者也开始转向这些C&C平台而不是建立自己的平台的原因之一。

由于大多数注意力都集中在像Cobalt Strike这样的成熟的商业工具上,攻击者一直在寻找能够提供许多相同功能的其他替代品。对于防御者来说,这意味着随着攻击者转向开源C&C软件,个人和组织都更难抵御网络攻击了。

开源C&C软件

与其他一些开源C&C框架(如Ares C2、PoshC2和TrevorC2)一样,DeimosC2提供了经典的C&C框架特性,但也提供了一个感觉和行为非常像Cobalt Strike或Metasploit Pro等商业工具的用户界面。

到目前为止,在地下犯罪组织中,将DeimosC2作为替代方案的讨论还不多,但攻击者可能会在不久的将来将DeimosC2作为首选工具。虽然DeimosC2不是攻击者目前寻找其他C&C平台使用的最受欢迎的选择,但研究DeimosC2,可以更好地了解是什么原因使攻击者想要使用这个平台作为C&C框架?

什么是DeimosC2?

DeimosC2是一个开源的C&C框架,于2020年6月发布。它是一个功能齐全的框架,允许多个攻击者访问受害计算机,为其创建有效负载并与之交互。作为一个利用后的C&C框架,DeimosC2将生成需要在计算机服务器上手动执行的有效负载,这些有效负载已经通过其他手段(如社会工程、利用或暴力攻击)被破坏。一旦部署有效负载,攻击者将获得与执行有效负载的用户帐户(管理员或普通用户)相同的系统访问权。注意,DeimosC2不执行任何类型的活动升级或特权升级。

利用后C&C服务器很受安全人员欢迎,因为它们提供了一种方便的方法,可以与多个受害设备交互,收集记录,并存储对每台设备所做的事情的证据。

DeimosC2的特点

DeimosC2有两种在系统上安装的选项:一种是不依赖于安装Go的预构建二进制文件,另一种是可以在任何安装了Go的系统上编译和运行的源代码。在这项研究中,使用了Debian虚拟机(VM)中预先构建的二进制文件,因此与使用直接从GitHub项目下载的源代码相比,某些行为可能有所不同。

3.png

GitHub上的DeimosC2服务器二进制文件

DeimosC2结合了许多与其他c&c软件平台相同的特性。像DeimosC2这样的C&C系统的主要目的之一是帮助安全人员和渗透测试人员整合他们的基础设施,在研究期间通过共享被破坏的主机与他人协作。考虑到这一点,DeimosC2具有多个用户支持,为用户提供两种角色:管理员和用户。下图显示了DeimosC2测试中的两个用户设置。

4.png

DeimosC2中的用户配置截图

因为DeimosC2也是针对安全研究人员的,所以它支持多因素身份验证(MFA)、API、备份和恢复特性,以及将系统标记为开发系统或生产系统的能力。

设置了用户之后,下一步是设置侦听器,侦听器是受害设备将接触到的套接字和协议。DeimosC2有五种类型的侦听器,用户可以为其有效负载配置这些侦听器,到目前为止我们看到的最常见的是HTTPS和TCP。我们预计,随着这些工具的普及,我们很可能会看到攻击者使用DNS over HTTPS DNS over HTTPS (DoH)选项。

5.png

显示侦听器设置类型的截图

一旦做出选择(在本例中是HTTPS),就会通过输入强制设置和某些可选设置所需的数据来配置侦听器。用户需要设置域名和IP地址,而密钥和大多数高级设置是可选的。

6.png

显示HTTPS侦听器设置的截图

在高级设置中,有一些C&C服务器工作方式的可配置选项。在这里,你可以找到更改受害者将通过HTTP POST使用到C&C服务器的默认路径的设置。默认情况下,这些路径是/login、/index、/settings和/profile,但可以在创建侦听器期间更改这些路径。它们也可以在以后更改。然而,需要创建新的二进制文件。

配置完所有设置后,将根据设置的“编译选项”部分中的选项创建二进制文件。这些设置决定了要创建哪些二进制文件以及是否应该对它们进行模糊处理。

创建二进制文件后,通过从侦听器选项中选择“interactive”,即可通过界面下载它们。

7.png

为HTTPS侦听器创建的侦听器的截图

一旦下载,这些软件就可以部署到通过其他方式(如网络钓鱼或漏洞攻击)受到威胁的设备上。易于使用,为C&C通信创建开发后二进制文件。

DeimosC2代理分析

虽然许多DeimosC2示例都使用了gobfuscate(一种用于混淆Go语言编写的程序的开源工具),但我们也发现了未混淆的示例。这使我们能够识别出DeimosC2包的名称,我们发现这是一个开源的后开发C2框架。也可以手动消除gobfuscate等工具实现的更改的模糊化,但这太耗时。

在DeimosC2术语中,用于感染受害者的客户机二进制文件称为代理。DeimosC2利用Go语言的多平台特性为不同的体系结构(如Windows、Linux、macOS和Android)编译代理。

代理很简单:当执行时,它会立即尝试联系硬编码C&C域或IP地址中的侦听器,除非设置了执行时间范围。

DeimosC2代理使用三个不同的秘钥与侦听器交换消息。

代理秘钥

这是标识代理的唯一秘钥。秘钥最初被设置为"000000000000000000000000000000000000",但是来自侦听器的第一个响应将它更新为一个新版本,4 UUID。

AES密钥

这个256位AES密钥是每次代理与C&C侦听器对话时随机生成的,这用于加密与C&C侦听器交换的消息。

RSA密钥

除了AES加密之外,DeimosC2还使用RSA-2048对代理和前面解释的AES密钥进行加密。代理使用硬编码的公钥加密其他密钥,而C&C侦听器使用其私钥解密数据。

下图从代理的角度说明了加密过程。

8.png

DeimosC2代理加密方案

发送到C&C侦听器的第一条消息以JSON格式包含有关受感染设备的信息,如下图所示。

9.png

首次发送到C&C侦听器的JSON数据示例

发送的数据包括有关操作系统、已安装的防病毒产品、主机名、登录的用户名、内部IP地址、文件系统上的代理路径、可用的shell程序、进程ID (PID)和用户特权的信息。

命令

C2侦听器响应可以包括一个或多个命令(在DeimosC2术语中称为“jobs”)。

DeimosC2命令及其描述如下:

Shell:执行shell命令;

下载:将文件下载到C&C服务器;

上传:将文件上传到受感染的计算机;

选项:抖动和延迟选项设置C&C通信的休眠时间。eol(我们假设它意味着生命结束)选项设置代理退出的日期,而hours选项配置通信的时间范围;

文件浏览器:要求代理列出给定路径上的所有文件和目录;

shellInject:在代理进程中注入并运行自定义shell代码;

模块:执行一个模块;

Reinit:重新连接代理,这会使代理获得一个新的代理密钥;

pivotTCP:启动受感染设备中的TCP服务器,以便其他代理可以将其用作侦听器,用于感染无法访问互联网的设备;

pivotJob:处理数据透视作业;

pivotKill:重置透视侦听器列表;

Kill:卸载代理;

模块

DeimosC2通过可以在受害者的设备中执行的模块扩展其功能, DeimosC2信息如下:

Screengrab:在受感染的设备上截屏;

Minidump:生成给定进程的用户模式小型转储;

Lsadump:下载SECURITY和SYSTEM注册表配置单元以窃取凭据;

Ntdsdump:下载Ntds.dit并且SYSTEM文件用于凭证窃取;

Samdump;下载SECURITY、SYSTEM和SAM注册表配置单元以窃取凭据;

Shadowdump:从Linux设备下载/etc/shadow文件;

DeimosC2的模块接口允许C&C侦听器推送新模块并从磁盘或内存(使用代码注入)执行它们。

网络分析

正如我们前面提到的,在使用DeimosC2时,用户可以选择几种侦听器类型,包括HTTPS、TCP和DoH。这些可能是最常见的选项,因为它们在其他C&C平台上很受欢迎。由于DeimosC2的开源特性,我们能够详细研究这些侦听器是如何工作的。

HTTPS侦听器

当监听器运行HTTPS时,我们发现有一个默认的网页被配置。通过查看GitHub页面,我们确认它是Apache的默认Ubuntu页面。

11.png

显示标题的默认Apache Ubuntu页面的Nmap结果

根据安装过程中侦听器的配置,我们知道该工具使用了一些路径。查看代理源代码的.go版本,我们可以看到已经设置并正在使用的进程。

12.png

代理使用的路径的Go变量

变量“firsttime”用于与服务器的初始通信。从那时起,变量“checkin”将被使用。

基于此,我们可以对C&C服务器是否为默认配置以及是否启用了HTTPS检测进行指纹识别。代理将向/login发送HTTP POST,然后定期向/index发送。HTTPS侦听器使用的默认端口为4443。但是,在任何其他端口上创建侦听器时,都可以轻松更改此端口。在/profile上,变量“moduleloc”用于将数据从代理发送回服务器。最后,使用“piviotloc”变量通过当前受害者传递数据,作为前面描述的代理piviotloc功能的一部分。

13.png

HTTPS_agent中的sendMsg函数

下图显示了由配置为使用HTTPS侦听器的代理发送的加密POST请求。默认情况下,它使用/login发送第一条消息,之后,代理默认情况下向/checkin发送请求。

14.png

由配置为使用HTTPS侦听器的代理发送的加密POST请求

TCP侦听器

TCP侦听器利用Go语言函数创建数据包并将其发送到已创建的套接字。加密流程的工作原理与HTTPS加密相同。在这种情况下,唯一的区别是,整个消息的长度有助于数据的解密。为了实现这一点,它在加密数据的前面加上已加密和要发送的数据的长度。这将发送到套接字,然后发送到C&C服务器。

15.png

来自TCP侦听器Go代码的sendMsg函数

根据我们对从TCP代理发送到侦听器的数据包的分析,这部分具有可预测的行为。由于uint64调用,创建的长度将是64位或8字节长的无符号整数。分组的数据部分的开始将有8个字节,用于随后的分组长度。我们在与C&C服务器的通信中观察到的大多数信息都是这样。每个数据包总共350字节,包含296字节的数据。

16.png

与C&C服务器通信的TCP代理的数据包的数据部分(突出显示部分)

由于我们知道数据包的数据部分前面有数据包大小,并且它是一个8字节的无符号整数,因此我们可以得出结论,数据的前8字节是处理数据包时将遵循的大小。

在本例中,有一个296字节的数据字段,如果我们去掉长度字段的8个字节,就会为来自C&C服务器的命令留下288个字节。如果我们取288字节并将其转换为十六进制系统,这很容易计算出来,结果是0x120或01 20,这就是我们在所看到的示例中0的前6个字节后发现的结果。

17.png

DeimosC2 TCP数据包结构

检测这种行为的一种可能方法是使用snort规则来查找通信流量。下面是一个Snort规则的示例,它将检测我们的示例数据包:

18.png

基于Snort中仅启用此规则的测试,我们确认它将检测来自TCP代理的通信。请注意,此规则可能需要基于特定设置进行调整,以消除误报并提高传感器性能。

19.png

来自Snort规则的示例警报的截图

DoH侦听器

DoH或DNS over HTTPS侦听器使用DNS查询与C&C服务器通信。使用DoH的优点之一是不需要与C&C服务器直接通信。但是,通信会出现延迟。因此,如果需要秘密进行,通常使用DoH。DeimosC2使用谷歌的HTTPS JSON API进行DNS。这与谷歌也支持的符合RFC 8484的DoH请求不同。这是一种更容易编程的解决方案,攻击者很容易使用。

20.png

显示dns.google.com/resolve用法的Go代码截图

在侦听器配置中,有两个名称可以更改:第一次变量和签入变量。在设置侦听器时,它们的默认名称分别是getname和checkin。当代理第一次接触到侦听器时,它将首先使用firsttime变量,之后将使用checkin变量进行心跳通信。与HTTPS和TCP不同,代理不会直接与侦听器通信,但它将与前面提到的DNS谷歌服务通信。

21.png

用于与DoH侦听器的初始通信的变量

在初始设置中,可以观察到的一个查询如下所示:

https://dns.google.com/resolve?name=0000000000.6765746e616d65.ftr.trendmicro.com

当你查看这个查询时,有一些东西非常突出,其中一个是6765746e616d65子域,它是在签入过程中从代码生成的。在本例中,该值第一次接受变量,并根据其ASCII值(在我们的例子中为getname)将其内容转换为十六进制系统。然后将其用作发送到dns.google.com的第一个子域。要对此进行解码,需要来自代理或C&C服务器本身的AES密钥。

22.png

初始签入过程的DoH代理代码

我们讨论过的所有这些方法都基于配置中设置为默认值的路径和变量,在构建监听器时很容易更改。更改默认设置有利于安全研究人员使用,帮助在网络日志中查找流量。然而,当攻击者更改这些设置时,在未来的活动中发现他们将变得更加困难,因为他们会改变他们的变量来改变他们的TTP,以避免被发现或根据活动修改配置。我们提供这些信息是为了帮助防御者了解在攻击中遇到非默认行为时DeimosC2的幕后情况。

更改默认侦听器设置

在DeimosC2用户界面中很容易实现路径的更改,以/login、/index、/settings和/profile的HTTPS侦听器的默认路径为例。要改变这一点,攻击者只需在构建侦听器时展开“高级选项”。

23.png

构建HTTPS侦听器时高级选项的屏幕截图

改变路径很可能是攻击者要做的事情,这将导致我们之前讨论的二进制文件和通信模式中的一些内容发生改变。例如,如果DOH代理中的getname被更改,它将不再转到6765746e616d65,而是重定向到它被更改为的子域,转换为十六进制系统(例如“trendmicroftr”,它在DOH查询中看起来像7472656e646d6963726f667472)。这也是寻找这些工具变得越来越困难的原因之一,因为规避技术是内置在选项中。

每个侦听器都可以更新特定的信息,这些信息将更改所使用的一些路径和子域。TCP侦听器具有最少的选项,在编写本文时,它可能是最容易通过网络监控方法检测到的侦听器之一。

针对DeimosC2防御网络的建议

探测C&C流量对于全球的网络防御者来说都是一个头疼的话题。幸运的是,在对DeimosC2进行研究期间,我们发现了一些可以用于检测与服务器通信的代理的存在的技术。

虽然有些网络活动是动态的,例如对URL路径的检查(因为在设置侦听器时,攻击者可以更改这些路径),但其他活动是可预测的。例如,TCP侦听器通信的前8个字节可以用于在入侵检测系统(IDS)中使用提供的Snort规则进行检测。

在DoH示例中,如果防御者在正常业务操作中没有使用利用DoH的JSON版本的服务,建议阻止或至少记录HTTPS到dns[.]google。目前大多数利用DoH的DeimosC2示例都使用Google提供的DoH的JSON版本,这将使该代理无法完全工作。

然而,重要的是要记住DeimosC2是一个利用后的C&C框架,如果你在你的网络上看到它的流量,那么你已经被攻击了,这只是攻击者设置持久性。如果你在系统中检测到DeimosC2,你应该意识到可能还部署了其他你可能不知道的攻击工具。假设你已经被攻击了,这也提供了额外的防御选择:

防御者应该定期监测出站通信,特别是,它们应该标记任何发送的数据量比正常监控期间大得多的主机。

寻找新的但又突然频繁发生的通信是网络防御的重要组成部分,不仅有助于发现DeimosC2通信,还有助于及早发现其他恶意软件恶意的通信。

尽管这些工具不是被设计为防御措施,但有时也可以为防御者提供意想不到的优势。正如我们所提到的,C&C框架旨在通过各种功能使渗透测试人员和安全研究人员检测更加容易,例如记录他们运行的每个命令,默认情况下是否打开取决于不同的框架。

总结

本文介绍了攻击者正在使用的几个C&C框架之一,DeimosC2便是其中之一。我们预计这些替代C&C框架的使用会有所增加,攻击者已经开始使用DeimosC2代替Cobalt Strike了。

随着网络防御者对Cobalt Strike的关注度上升,攻击者一直在寻找替代的命令与控制(C&C)框架,DeimosC2就是一个替代工具。

C&C系统对于渗透测试人员和安全人员来说是非常有用的协作工具。它们为所有受害设备提供了一个公共的位置,以便与之联系、进行控制,并允许多个用户与相同的受害设备进行交互。当执行授权测试时,这是非常重要的,因为日志保存在一个单独的地方,以帮助报告。然而,越来越多的这些工具被攻击者利用,包括开源工具和商业工具。它们的易用性和稳定性让它们能够长时间运行而没有任何问题,这也是为什么攻击者也开始转向这些C&C平台而不是建立自己的平台的原因之一。

由于大多数注意力都集中在像Cobalt Strike这样的成熟的商业工具上,攻击者一直在寻找能够提供许多相同功能的其他替代品。对于防御者来说,这意味着随着攻击者转向开源C&C软件,个人和组织都更难抵御网络攻击了。

开源C&C软件

与其他一些开源C&C框架(如Ares C2、PoshC2和TrevorC2)一样,DeimosC2提供了经典的C&C框架特性,但也提供了一个感觉和行为非常像Cobalt Strike或Metasploit Pro等商业工具的用户界面。

到目前为止,在地下犯罪组织中,将DeimosC2作为替代方案的讨论还不多,但攻击者可能会在不久的将来将DeimosC2作为首选工具。虽然DeimosC2不是攻击者目前寻找其他C&C平台使用的最受欢迎的选择,但研究DeimosC2,可以更好地了解是什么原因使攻击者想要使用这个平台作为C&C框架?

什么是DeimosC2?

DeimosC2是一个开源的C&C框架,于2020年6月发布。它是一个功能齐全的框架,允许多个攻击者访问受害计算机,为其创建有效负载并与之交互。作为一个利用后的C&C框架,DeimosC2将生成需要在计算机服务器上手动执行的有效负载,这些有效负载已经通过其他手段(如社会工程、利用或暴力攻击)被破坏。一旦部署有效负载,攻击者将获得与执行有效负载的用户帐户(管理员或普通用户)相同的系统访问权。注意,DeimosC2不执行任何类型的活动升级或特权升级。

利用后C&C服务器很受安全人员欢迎,因为它们提供了一种方便的方法,可以与多个受害设备交互,收集记录,并存储对每台设备所做的事情的证据。

DeimosC2的特点

DeimosC2有两种在系统上安装的选项:一种是不依赖于安装Go的预构建二进制文件,另一种是可以在任何安装了Go的系统上编译和运行的源代码。在这项研究中,使用了Debian虚拟机(VM)中预先构建的二进制文件,因此与使用直接从GitHub项目下载的源代码相比,某些行为可能有所不同。

3.png

GitHub上的DeimosC2服务器二进制文件

DeimosC2结合了许多与其他c&c软件平台相同的特性。像DeimosC2这样的C&C系统的主要目的之一是帮助安全人员和渗透测试人员整合他们的基础设施,在研究期间通过共享被破坏的主机与他人协作。考虑到这一点,DeimosC2具有多个用户支持,为用户提供两种角色:管理员和用户。下图显示了DeimosC2测试中的两个用户设置。

4.png

DeimosC2中的用户配置截图

因为DeimosC2也是针对安全研究人员的,所以它支持多因素身份验证(MFA)、API、备份和恢复特性,以及将系统标记为开发系统或生产系统的能力。

设置了用户之后,下一步是设置侦听器,侦听器是受害设备将接触到的套接字和协议。DeimosC2有五种类型的侦听器,用户可以为其有效负载配置这些侦听器,到目前为止我们看到的最常见的是HTTPS和TCP。我们预计,随着这些工具的普及,我们很可能会看到攻击者使用DNS over HTTPS DNS over HTTPS (DoH)选项。

5.png

显示侦听器设置类型的截图

一旦做出选择(在本例中是HTTPS),就会通过输入强制设置和某些可选设置所需的数据来配置侦听器。用户需要设置域名和IP地址,而密钥和大多数高级设置是可选的。

6.png

显示HTTPS侦听器设置的截图

在高级设置中,有一些C&C服务器工作方式的可配置选项。在这里,你可以找到更改受害者将通过HTTP POST使用到C&C服务器的默认路径的设置。默认情况下,这些路径是/login、/index、/settings和/profile,但可以在创建侦听器期间更改这些路径。它们也可以在以后更改。然而,需要创建新的二进制文件。

配置完所有设置后,将根据设置的“编译选项”部分中的选项创建二进制文件。这些设置决定了要创建哪些二进制文件以及是否应该对它们进行模糊处理。

创建二进制文件后,通过从侦听器选项中选择“interactive”,即可通过界面下载它们。

7.png

为HTTPS侦听器创建的侦听器的截图

一旦下载,这些软件就可以部署到通过其他方式(如网络钓鱼或漏洞攻击)受到威胁的设备上。易于使用,为C&C通信创建开发后二进制文件。

DeimosC2代理分析

虽然许多DeimosC2示例都使用了gobfuscate(一种用于混淆Go语言编写的程序的开源工具),但我们也发现了未混淆的示例。这使我们能够识别出DeimosC2包的名称,我们发现这是一个开源的后开发C2框架。也可以手动消除gobfuscate等工具实现的更改的模糊化,但这太耗时。

在DeimosC2术语中,用于感染受害者的客户机二进制文件称为代理。DeimosC2利用Go语言的多平台特性为不同的体系结构(如Windows、Linux、macOS和Android)编译代理。

代理很简单:当执行时,它会立即尝试联系硬编码C&C域或IP地址中的侦听器,除非设置了执行时间范围。

DeimosC2代理使用三个不同的秘钥与侦听器交换消息。

代理秘钥

这是标识代理的唯一秘钥。秘钥最初被设置为"000000000000000000000000000000000000",但是来自侦听器的第一个响应将它更新为一个新版本,4 UUID。

AES密钥

这个256位AES密钥是每次代理与C&C侦听器对话时随机生成的,这用于加密与C&C侦听器交换的消息。

RSA密钥

除了AES加密之外,DeimosC2还使用RSA-2048对代理和前面解释的AES密钥进行加密。代理使用硬编码的公钥加密其他密钥,而C&C侦听器使用其私钥解密数据。

下图从代理的角度说明了加密过程。

8.png

DeimosC2代理加密方案

发送到C&C侦听器的第一条消息以JSON格式包含有关受感染设备的信息,如下图所示。

9.png

首次发送到C&C侦听器的JSON数据示例

发送的数据包括有关操作系统、已安装的防病毒产品、主机名、登录的用户名、内部IP地址、文件系统上的代理路径、可用的shell程序、进程ID (PID)和用户特权的信息。

命令

C2侦听器响应可以包括一个或多个命令(在DeimosC2术语中称为“jobs”)。

DeimosC2命令及其描述如下:

Shell:执行shell命令;

下载:将文件下载到C&C服务器;

上传:将文件上传到受感染的计算机;

选项:抖动和延迟选项设置C&C通信的休眠时间。eol(我们假设它意味着生命结束)选项设置代理退出的日期,而hours选项配置通信的时间范围;

文件浏览器:要求代理列出给定路径上的所有文件和目录;

shellInject:在代理进程中注入并运行自定义shell代码;

模块:执行一个模块;

Reinit:重新连接代理,这会使代理获得一个新的代理密钥;

pivotTCP:启动受感染设备中的TCP服务器,以便其他代理可以将其用作侦听器,用于感染无法访问互联网的设备;

pivotJob:处理数据透视作业;

pivotKill:重置透视侦听器列表;

Kill:卸载代理;

模块

DeimosC2通过可以在受害者的设备中执行的模块扩展其功能, DeimosC2信息如下:

Screengrab:在受感染的设备上截屏;

Minidump:生成给定进程的用户模式小型转储;

Lsadump:下载SECURITY和SYSTEM注册表配置单元以窃取凭据;

Ntdsdump:下载Ntds.dit并且SYSTEM文件用于凭证窃取;

Samdump;下载SECURITY、SYSTEM和SAM注册表配置单元以窃取凭据;

Shadowdump:从Linux设备下载/etc/shadow文件;

DeimosC2的模块接口允许C&C侦听器推送新模块并从磁盘或内存(使用代码注入)执行它们。

网络分析

正如我们前面提到的,在使用DeimosC2时,用户可以选择几种侦听器类型,包括HTTPS、TCP和DoH。这些可能是最常见的选项,因为它们在其他C&C平台上很受欢迎。由于DeimosC2的开源特性,我们能够详细研究这些侦听器是如何工作的。

HTTPS侦听器

当监听器运行HTTPS时,我们发现有一个默认的网页被配置。通过查看GitHub页面,我们确认它是Apache的默认Ubuntu页面。

11.png

显示标题的默认Apache Ubuntu页面的Nmap结果

根据安装过程中侦听器的配置,我们知道该工具使用了一些路径。查看代理源代码的.go版本,我们可以看到已经设置并正在使用的进程。

12.png

代理使用的路径的Go变量

变量“firsttime”用于与服务器的初始通信。从那时起,变量“checkin”将被使用。

基于此,我们可以对C&C服务器是否为默认配置以及是否启用了HTTPS检测进行指纹识别。代理将向/login发送HTTP POST,然后定期向/index发送。HTTPS侦听器使用的默认端口为4443。但是,在任何其他端口上创建侦听器时,都可以轻松更改此端口。在/profile上,变量“moduleloc”用于将数据从代理发送回服务器。最后,使用“piviotloc”变量通过当前受害者传递数据,作为前面描述的代理piviotloc功能的一部分。

13.png

HTTPS_agent中的sendMsg函数

下图显示了由配置为使用HTTPS侦听器的代理发送的加密POST请求。默认情况下,它使用/login发送第一条消息,之后,代理默认情况下向/checkin发送请求。

14.png

由配置为使用HTTPS侦听器的代理发送的加密POST请求

TCP侦听器

TCP侦听器利用Go语言函数创建数据包并将其发送到已创建的套接字。加密流程的工作原理与HTTPS加密相同。在这种情况下,唯一的区别是,整个消息的长度有助于数据的解密。为了实现这一点,它在加密数据的前面加上已加密和要发送的数据的长度。这将发送到套接字,然后发送到C&C服务器。

15.png

来自TCP侦听器Go代码的sendMsg函数

根据我们对从TCP代理发送到侦听器的数据包的分析,这部分具有可预测的行为。由于uint64调用,创建的长度将是64位或8字节长的无符号整数。分组的数据部分的开始将有8个字节,用于随后的分组长度。我们在与C&C服务器的通信中观察到的大多数信息都是这样。每个数据包总共350字节,包含296字节的数据。

16.png

与C&C服务器通信的TCP代理的数据包的数据部分(突出显示部分)

由于我们知道数据包的数据部分前面有数据包大小,并且它是一个8字节的无符号整数,因此我们可以得出结论,数据的前8字节是处理数据包时将遵循的大小。

在本例中,有一个296字节的数据字段,如果我们去掉长度字段的8个字节,就会为来自C&C服务器的命令留下288个字节。如果我们取288字节并将其转换为十六进制系统,这很容易计算出来,结果是0x120或01 20,这就是我们在所看到的示例中0的前6个字节后发现的结果。

17.png

DeimosC2 TCP数据包结构

检测这种行为的一种可能方法是使用snort规则来查找通信流量。下面是一个Snort规则的示例,它将检测我们的示例数据包:

18.png

基于Snort中仅启用此规则的测试,我们确认它将检测来自TCP代理的通信。请注意,此规则可能需要基于特定设置进行调整,以消除误报并提高传感器性能。

19.png

来自Snort规则的示例警报的截图

DoH侦听器

DoH或DNS over HTTPS侦听器使用DNS查询与C&C服务器通信。使用DoH的优点之一是不需要与C&C服务器直接通信。但是,通信会出现延迟。因此,如果需要秘密进行,通常使用DoH。DeimosC2使用谷歌的HTTPS JSON API进行DNS。这与谷歌也支持的符合RFC 8484的DoH请求不同。这是一种更容易编程的解决方案,攻击者很容易使用。

20.png

显示dns.google.com/resolve用法的Go代码截图

在侦听器配置中,有两个名称可以更改:第一次变量和签入变量。在设置侦听器时,它们的默认名称分别是getname和checkin。当代理第一次接触到侦听器时,它将首先使用firsttime变量,之后将使用checkin变量进行心跳通信。与HTTPS和TCP不同,代理不会直接与侦听器通信,但它将与前面提到的DNS谷歌服务通信。

21.png

用于与DoH侦听器的初始通信的变量

在初始设置中,可以观察到的一个查询如下所示:

https://dns.google.com/resolve?name=0000000000.6765746e616d65.ftr.trendmicro.com

当你查看这个查询时,有一些东西非常突出,其中一个是6765746e616d65子域,它是在签入过程中从代码生成的。在本例中,该值第一次接受变量,并根据其ASCII值(在我们的例子中为getname)将其内容转换为十六进制系统。然后将其用作发送到dns.google.com的第一个子域。要对此进行解码,需要来自代理或C&C服务器本身的AES密钥。

22.png

初始签入过程的DoH代理代码

我们讨论过的所有这些方法都基于配置中设置为默认值的路径和变量,在构建监听器时很容易更改。更改默认设置有利于安全研究人员使用,帮助在网络日志中查找流量。然而,当攻击者更改这些设置时,在未来的活动中发现他们将变得更加困难,因为他们会改变他们的变量来改变他们的TTP,以避免被发现或根据活动修改配置。我们提供这些信息是为了帮助防御者了解在攻击中遇到非默认行为时DeimosC2的幕后情况。

更改默认侦听器设置

在DeimosC2用户界面中很容易实现路径的更改,以/login、/index、/settings和/profile的HTTPS侦听器的默认路径为例。要改变这一点,攻击者只需在构建侦听器时展开“高级选项”。

23.png

构建HTTPS侦听器时高级选项的屏幕截图

改变路径很可能是攻击者要做的事情,这将导致我们之前讨论的二进制文件和通信模式中的一些内容发生改变。例如,如果DOH代理中的getname被更改,它将不再转到6765746e616d65,而是重定向到它被更改为的子域,转换为十六进制系统(例如“trendmicroftr”,它在DOH查询中看起来像7472656e646d6963726f667472)。这也是寻找这些工具变得越来越困难的原因之一,因为规避技术是内置在选项中。

每个侦听器都可以更新特定的信息,这些信息将更改所使用的一些路径和子域。TCP侦听器具有最少的选项,在编写本文时,它可能是最容易通过网络监控方法检测到的侦听器之一。

针对DeimosC2防御网络的建议

探测C&C流量对于全球的网络防御者来说都是一个头疼的话题。幸运的是,在对DeimosC2进行研究期间,我们发现了一些可以用于检测与服务器通信的代理的存在的技术。

虽然有些网络活动是动态的,例如对URL路径的检查(因为在设置侦听器时,攻击者可以更改这些路径),但其他活动是可预测的。例如,TCP侦听器通信的前8个字节可以用于在入侵检测系统(IDS)中使用提供的Snort规则进行检测。

在DoH示例中,如果防御者在正常业务操作中没有使用利用DoH的JSON版本的服务,建议阻止或至少记录HTTPS到dns[.]google。目前大多数利用DoH的DeimosC2示例都使用Google提供的DoH的JSON版本,这将使该代理无法完全工作。

然而,重要的是要记住DeimosC2是一个利用后的C&C框架,如果你在你的网络上看到它的流量,那么你已经被攻击了,这只是攻击者设置持久性。如果你在系统中检测到DeimosC2,你应该意识到可能还部署了其他你可能不知道的攻击工具。假设你已经被攻击了,这也提供了额外的防御选择:

防御者应该定期监测出站通信,特别是,它们应该标记任何发送的数据量比正常监控期间大得多的主机。

寻找新的但又突然频繁发生的通信是网络防御的重要组成部分,不仅有助于发现DeimosC2通信,还有助于及早发现其他恶意软件恶意的通信。

尽管这些工具不是被设计为防御措施,但有时也可以为防御者提供意想不到的优势。正如我们所提到的,C&C框架旨在通过各种功能使渗透测试人员和安全研究人员检测更加容易,例如记录他们运行的每个命令,默认情况下是否打开取决于不同的框架。

总结

本文介绍了攻击者正在使用的几个C&C框架之一,DeimosC2便是其中之一。我们预计这些替代C&C框架的使用会有所增加,攻击者已经开始使用DeimosC2代替Cobalt Strike了。

6358304b4951324ae820a732_urlscan_mining_cover-p-1600.png

urlscan.io 网站被发现泄露了大量用户的敏感 URL,通过自动化工具可以挖掘出文档分享、密码重置以及团队邀请等敏感链接。使用这种配置错误的安全编排、自动化和响应(SOAR)工具的用户,其帐户通过手动触发的密码重置被劫持的风险很高。

Github数据泄露

今年2月,GitHub向受影响的客户发送了一封电子邮件,通知他们数据泄露。具体来说,通过Github Pages为私人存储库启用托管的用户的存储库名称以及他们的用户名被泄露。

开发商似乎没有公开承认这一漏洞,我只是通过黑客新闻(Hacker News)的一篇新闻才知道的。

2.png

GitHub从一名GitHuc员工的内部发现中得知,GitHubPages网站从GitHub上的私人存储库发布,并被发送到urlscan.io用于元数据分析,作为自动化过程的一部分。

GitHub对此的回应是“修复自动发送GitHub Pages网站进行元数据分析的流程,以便只有公开的GitHub Pages网站被发送进行分析”,并要求第三方删除数据。

urlscan.io是什么?

urlscan.io是一项免费的网站扫描和分析服务。当一个 URL 被提交到 urlscan.io 时,一个自动化的过程会像普通用户一样浏览到这个 URL 并记录这个页面导航创建的活动。这包括联系的域和 IP、从这些域请求的资源(JavaScript、CSS 等),以及有关页面本身的其他信息。

urlscan.io将自己描述为“网络沙箱”,你可以提交URL,然后通过各种方式对其进行分析和扫描,主要用于检测钓鱼网站等恶意网站。除了分析通过网站提交的URL外,urlscan.io还扫描来自公共数据源的url,并提供一个API将检查集成到其他产品中,这就导致GitHub对私人存储库URL的系统性数据泄漏。

大量的数据扫描

在撰写本文时,登陆页面列出了过去24小时内执行的12万次公开扫描,7万次未公开扫描和43万次私人扫描。它还包括一个“最近扫描”视图,这是典型的安全扫描网站。然而,更令人惊讶的是使用广泛的ElasticSearch Query String语法搜索所有历史数据(作为未经身份验证的用户)的选项。GitHub的通知邮件中也提到了这一点:

urlscan.io在大约30秒内执行分析,或使用将在搜索结果中返回分析的查询进行专门搜索。

对于每个扫描结果,该服务都会提供大量信息:

提交的URL(包含所有GET参数);

重定向时的有效URL;

抓取/扫描URL时执行的任何HTTP请求;

与之通信的IP和域的信息;

扫描时截取的页面截图;

网站的完整HTML响应;

3.png

在urlscan上捕获的OAuth2重定向流和其他加载的资源。提交的URL还包含一个UUID, web应用程序可能不希望这个UUID公开。

大量的集成

urlscan.io的文档页面列出了26个商业安全解决方案,这些解决方案由Palo Alto、Splunk、Rapid7、FireEye和ArcSight等供应商通过其API集成了服务。GitHub直接在内部使用这个API作为其SaaS产品的一部分,但它没有出现在这个列表中,可能还有更多的企业客户。

4.png

urlscan集成在多种商业安全工具中

如果这些 tools/API 用户不小心执行了公共URL扫描,这可能导致系统数据泄漏。由于这些先进的安全工具大多安装在大公司和政府机构,泄露的信息可能特别敏感。

除了商业产品之外,集成页面还列出了22个开源项目,其中一些是信息收集工具,其他是简单的库实现,以便更容易地查询API。

哪些敏感数据可以被泄露?

由于此API的集成类型(例如,通过一个安全工具扫描每个传入的电子邮件并对所有链接执行urlscan),以及数据库中的数据量,匿名用户可以搜索和检索各种敏感数据。

urlscan.io dorks

请在下面找到一组可点击的“urlscan.io dorks”和编辑过的示例结果,请注意,在将我们的发现报告给urlscan.io后,他们为下面的许多dorks添加了删除规则。

密码重置链接

5.png

Instagram密码重置确认页面,请求用户输入两次新密码

帐户创建链接

6.png

Zendesk上NBC新闻账户的初始密码设置页面

API密钥

7.png

包含有效VirusTotal API密钥的链接

Telegram Bot

8.png

Telegram API URL包含一个长的秘密标识符,可用于在机器人上调用不同的API方法。

DocuSign签名请求

9.png

DocuSign签名请求通常包含带有敏感信息的合同文件

共享的Google Drive文档

10.png

Dropbox文件传输

11.png

Sharepoint invite

12.png

由于SharePoint工作区与组织相关联,子域已经给出了邀请的目的。

Discord invite

13.png

搜索查询返回了超过7000个不同社区的Discord邀请代码。

Government Zoom invite

14.png

比Discord邀请更敏感的可能是Zoom邀请,尤其是法庭听证会。

WebEx会议记录

15.png

PayPal invoice

16.png

PayPal托管的发票显然包含有效发票所需的所有(个人)信息,任何知道其ID的人都可以检索到。

Paypal money claim request

17.png

Paypal money claim request“仅”预先填写目标的电子邮件地址(连同金额和收件人),泄露的信息比发票少一点。

包裹跟踪链接

18.png

还可以找到各种邮政服务的包裹跟踪链接。有趣的是,DHL似乎意识到了跟踪代码泄露的风险,在显示收件人的地址之前,会询问收件人的邮政编码。注意:由于在德国只有8000个邮政编码,而且从包裹跟踪可以知道总体区域,因此代码可能是可猜测的。

亚马逊礼品配送链接

19.png

亚马逊礼品配送链接会泄露送礼者的姓名和礼物

退订链接

20.png

HIBP取消订阅链接,允许取消域的违规通知,该域本身没有显示在页面上

21.png

在PayPal退订页面上,用户的电子邮件地址完全显示出来。一些其他服务至少部分编辑了退订页面上的电子邮件地址。

有趣的是,当我在2月份进行首次搜索时,我可以找到很多苹果域名的有趣URL:

22.png

一个允许设置新密码的Apple开发者ID激活页面

23.png

一个允许设置密码的Apple ID最终页面,看起来像是Gamestop账户

24.png

家庭共享邀请,允许使用他人购买的订阅,甚至可以访问家庭的照片和设备的位置

25.png

仅限企业的在线活动邀请

26.png

当然,iCloud也可以创建公共共享链接,这些链接是通过urlscan.io泄露的。

27.png

对于iCloud日历邀请,苹果似乎也创建了一个包含所有信息的链接。

同时,这些信息似乎已从数据库中隐藏或删除:

28.png

搜索apple.com及其子域名现在只返回两个结果

然而,当持续监控上述结果页面时,有时会发现一些新的附加条目,这些条目在大约10分钟内再次消失。

我们后来发现,苹果同时要求从扫描结果中排除他们的域名,这是通过定期删除所有符合特定规则的扫描结果来实现的。

总体而言,urlscan.io服务包含各种类型的敏感信息,黑客、垃圾邮件发送者或攻击者可以利用这些信息接管账户、窃取身份或进行可信的网络钓鱼活动。

数据来自哪里?

我们可以从扫描结果的详细信息中看到扫描是否通过API提交,但我们无法找到哪个应用程序或集成提交了扫描请求。

为此,我们有两个选择:

联系受影响的用户。向泄露电子邮件地址的用户发送邮件,告知他们泄露信息,并询问可能是罪魁祸首的任何安全工具。

联系urlscan.io。发送可疑的自动提交列表,并要求urlscan调查是否有任何集成意外地将扫描选项设置为公开。

我们决定两者都做,并开始联系用户,同时收集扫描结果列表发送到urlscan.io。

联系用户

我们向API启动扫描中电子邮件地址泄露的个人发送了23封邮件(15封来自退订链接,5封来自PayPal发票,2封来自密码重置链接,1封来自Pay Pal索赔)。

29.png

发送的示例邮件带有指向相应urlscan结果页面的链接,底部有一个测试链接。

通知邮件的末尾是带有唯一UUID的“诱饵链接”,用于测试是否有任何URL会自动提交到urlscan.io。如果是这种情况,唯一的令牌将允许我们将扫描请求关联回邮件收件人。

在我们发送的23个测试链接中,9个(约40%)是通过API提交给urlscan.io的(大多数是在相应邮件发送后立即发送的):

30.png

通知邮件中包含的“私人”测试链接的公开结果(请注意,某些URL被多次扫描)

如果不计算PayPal发票(实际上可能是作为欺诈活动的一部分创建的),成功率为50%。第二天,我们又向泄露的hubspot退订阅链接的电子邮件地址发送了24封邮件,其中12封(又是50%)触发了公共扫描。

这些“pingback”向我们展示了几件事:

我们假设存在配置错误的安全工具,将通过邮件接收的任何链接作为公共扫描提交到urlscan.io似乎是正确的。

使用这些配置错误的安全工具的用户极有可能丢失所有在线帐户。

看起来严重程度较低的urlscan.io发现(例如来自退订链接的电子邮件地址)可能产生关键影响。

对于我们发现多个电子邮件地址或系统泄漏的组织,我们还尝试直接联系IT/安全部门。

31.png

当没有答案或正确的报告联系时,我们也尝试通过Twitter联系

不幸的是,我们既没有收到任何发送给受影响个人的数据泄露通知邮件的答复,也没有收到任何来自似乎存在系统性问题的组织的反馈。

除了一个例外,在给一个人发送了一个DocuSign链接到他们的工作合同后,他们的雇主联系了我们,开始了调查,并授予了一笔漏洞赏金。他们发现泄漏的源头是“他们的安全编排、自动化和响应操作手册与urlscan.io集成的错误配置,该操作手册正在积极开发中”。

联系urlscan.io

由于受影响用户的反馈不多,我们也向urlscan.io解释了这种情况。

如果集成开发人员遵循urlscan.io的文档,识别扫描请求的源软件应该很容易,即为库/集成使用自定义HTTP用户代理字符串,包括适用的软件版本。

因此,我们询问他们是否有可能生成一份用户代理的列表,这些用户代理触发了与我们联系的人相关的扫描,以及我们自己的诱饵链接的扫描,他们是否愿意与我们分享这份列表。

一般来说,urlscan.io团队反应非常积极,愿意与我们一起调查和合作,以改善目前的状况。

查看用户代理列表发现,许多API集成都没有遵循上述建议,超过一半的扫描都是由通用的“python requests/2.X.Y”用户代理启动的。

可以通过用户代理轻松识别的两种解决方案是:

PaloAlto的XSOAR ;

Swimlane;

对用于启动“python-requests”用户代理扫描的API项的进一步调查显示,其中许多项也是为PaloAlto的XSOAR生成的。其他生成的目的是:

IBM Resilient(现为“IBM Security QRadar SOAR”);

Splunk Phantom(现为“Splunk-SOAR”);

DimensionData的SOAR;

那么,这些数据究竟是如何出现在那里的呢?

SOAR平台允许组织自定义编写,将不同的数据源与安全工具和服务连接起来。为了简化开发,这些平台提供了与多个第三方服务的集成,例如通过this XSOAR urlscan.io pack安装了这个包后,playbook可以从传入的电子邮件中提取URL,并使用带有例如超时和扫描可见性的可选参数命令!url url=https://example.com using="urlscan.io"。

这种扫描的可见性取决于:

1.作为命令一部分提交的参数,

2.集成范围的配置;

3.关联urlscan.io 的可见性设置帐户/团队。

因此,扫描可能被错误地提交到公共域名:

1.出现编程错误或urlscan.io配置错误的情况下集成或帐户可见性设置,如泄露员工工作合同的公司所发生的情况;

2.如果集成本身有一个不尊重用户选择的可见性的漏洞,如发生在PaloAlto XSOAR urlscan.io pack  的情况。

参数[…]已配置为默认值public,此参数将覆盖与可见性相关的所有其他设置。因此,对于所有没有显式为这个新引入的参数提供值的命令调用,所有扫描都是以可见性public执行的。

响应

根据我们的发现,urlscan.io联系了他们认为提交了大量公共扫描的客户,并开始审查流行的第三方集成,如用于SOAR工具的集成,以确保他们在可见性方面尊重用户的意图。

此外,他们实施了以下更改:

添加了此处显示的傻瓜式删除规则,以定期删除与搜索模式匹配的扫描结果;

突出显示UI中的默认可见性设置;

添加了一个选项以设置团队范围内的最大可见性;

urlscan.io还发布了一篇名为“扫描可见性最佳实践”的博客文章,解释了扫描可见性设置,鼓励用户经常检查他们的提交,并详细介绍了urlscan为防止此类泄露所做的努力。

如果敏感数据仍然泄漏,他们提供以下选项:

受影响的用户可以通过“报告”设置报告带有敏感数据的扫描结果,该设置将立即禁用它们;

希望将其域名或特定URL模式排除在扫描之外(或删除相应的现有结果)的公司可以联系urlscan.io;

发现系统泄漏的安全研究人员也被要求联系urlscan.io;

账户接管

被动搜索历史urlscan.io数据已经发现了大量敏感信息,将其与“主动探测”相结合可以大大增加泄漏的风险。

正如我们前面所看到的,大约50%的用户在urlscan.io中泄露了退订链接,任何收到的电子邮件中的任何链接都将立即作为公共扫描提交给urlscan。

我们可以通过抓取urlscan.io来找到那些配置错误的客户端获取电子邮件地址(例如,在退订页面中或甚至只是在URL本身中),通过邮件向他们发送“诱饵链接”,然后检查urlscan.io链接。

通过在各种网络服务(如社交媒体网站、其他电子邮件提供商或银行)主动触发受影响电子邮件地址的密码重置,然后检查urlscan数据库中相应域的最近扫描结果,我们可以利用这种行为接管这些用户的帐户。搜索其他数据泄漏,例如使用HaveIBeenPropown查找这些电子邮件地址,也可能提供用户注册的服务的提示。

对于公司电子邮件地址、自定义登录门户和流行的企业SaaS,在上查找现有帐户并触发密码重置可能特别有趣。

而且,即使某个特定服务还没有帐户,只要创建一个带有公司电子邮件地址的新帐户,就可以访问存储在该服务上的公司内部数据。

下图说明了执行帐户接管攻击的所有必要步骤:

32.png

将被动搜索与主动探测错误配置的客户端和触发密码重置相结合,可以大大增加任何单个urlscan.io的泄漏影响。

安全建议

作为web服务的所有者,你可以确保你的密码重置和类似的链接尽快失效,并且不会通过可能公开的链接将不必要的信息泄露给未经身份验证的用户。在退订页面,编辑用户的电子邮件地址,并在显示PII之前要求额外的身份验证/信息(就像许多包裹跟踪网站在显示完整地址之前要求邮政编码)。在实现API身份验证时,不要通过GET参数接受API密钥,而是要求使用单独的HTTP标头。

此外,你还可以搜索urlscan.io以及其他服务自己的任何数据泄漏,关于你自己的web服务或组织,请求删除/排除,例如禁用和逆转任何泄漏的API密钥的用户。

urlscan.io集成服务的用户/安全团队应该检查他们的命令、集成和帐户可见性设置,保持他们的集成最新,定期检查他们提交的扫描并检查urlscan.io博客文章获取更多信息。

总结

urlscan.io通常有助于保护用户,不过它还存储了用户的敏感信息,其中一些信息是公开的,可以被攻击者搜索。

垃圾邮件发送者可以利用这些信息收集电子邮件地址和其他个人信息。它可能被攻击者用来接管账户并进行可信的网络钓鱼活动。安全研究人员也可以使用它来发现隐藏的管理门户,获得立足点或发现潜在攻击目标。

urlscan.io 网站被发现泄露了大量用户的敏感 URL,通过自动化工具可以挖掘出文档分享、密码重置以及团队邀请等敏感链接。

与GoogleDorking或通过公共S3桶搜索类似,urlscan.io挖掘揭示了许多本不公开的信息。不同的是,可以通过谷歌找到的信息或公共S3桶中的信息实际上已经公开了,而提交给urlscan的URL。用于公共扫描的io可能包含身份验证令牌,并来自由安全解决方案提交给个人的私人电子邮件。在这种情况下,引入额外的安全工具实际上会降低系统的安全性。

这些文档确实警告了提交的URL中的个人身份信息,但只建议将这些扫描标记为未列出:

1.请小心从URL中删除PII或将这些扫描作为“未列出”提交,例如,当URL中有电子

的扫描至少“在urlscan Pro平台上,经过审查的安全研究人员和安全公司

邮件地址时。

2.这些未列出

PII

仍然可以看到”。此外,此警告没有解决返回页面而不是URL本身的风险。

3.定价和API配额也非常支持使用公共扫描,该服务无法有效地主动防止PII泄露,例如,简单搜索page.url:@gmail.com可返回最多10000个结果。

6358304b4951324ae820a732_urlscan_mining_cover-p-1600.png

urlscan.io 网站被发现泄露了大量用户的敏感 URL,通过自动化工具可以挖掘出文档分享、密码重置以及团队邀请等敏感链接。使用这种配置错误的安全编排、自动化和响应(SOAR)工具的用户,其帐户通过手动触发的密码重置被劫持的风险很高。

Github数据泄露

今年2月,GitHub向受影响的客户发送了一封电子邮件,通知他们数据泄露。具体来说,通过Github Pages为私人存储库启用托管的用户的存储库名称以及他们的用户名被泄露。

开发商似乎没有公开承认这一漏洞,我只是通过黑客新闻(Hacker News)的一篇新闻才知道的。

2.png

GitHub从一名GitHuc员工的内部发现中得知,GitHubPages网站从GitHub上的私人存储库发布,并被发送到urlscan.io用于元数据分析,作为自动化过程的一部分。

GitHub对此的回应是“修复自动发送GitHub Pages网站进行元数据分析的流程,以便只有公开的GitHub Pages网站被发送进行分析”,并要求第三方删除数据。

urlscan.io是什么?

urlscan.io是一项免费的网站扫描和分析服务。当一个 URL 被提交到 urlscan.io 时,一个自动化的过程会像普通用户一样浏览到这个 URL 并记录这个页面导航创建的活动。这包括联系的域和 IP、从这些域请求的资源(JavaScript、CSS 等),以及有关页面本身的其他信息。

urlscan.io将自己描述为“网络沙箱”,你可以提交URL,然后通过各种方式对其进行分析和扫描,主要用于检测钓鱼网站等恶意网站。除了分析通过网站提交的URL外,urlscan.io还扫描来自公共数据源的url,并提供一个API将检查集成到其他产品中,这就导致GitHub对私人存储库URL的系统性数据泄漏。

大量的数据扫描

在撰写本文时,登陆页面列出了过去24小时内执行的12万次公开扫描,7万次未公开扫描和43万次私人扫描。它还包括一个“最近扫描”视图,这是典型的安全扫描网站。然而,更令人惊讶的是使用广泛的ElasticSearch Query String语法搜索所有历史数据(作为未经身份验证的用户)的选项。GitHub的通知邮件中也提到了这一点:

urlscan.io在大约30秒内执行分析,或使用将在搜索结果中返回分析的查询进行专门搜索。

对于每个扫描结果,该服务都会提供大量信息:

提交的URL(包含所有GET参数);

重定向时的有效URL;

抓取/扫描URL时执行的任何HTTP请求;

与之通信的IP和域的信息;

扫描时截取的页面截图;

网站的完整HTML响应;

3.png

在urlscan上捕获的OAuth2重定向流和其他加载的资源。提交的URL还包含一个UUID, web应用程序可能不希望这个UUID公开。

大量的集成

urlscan.io的文档页面列出了26个商业安全解决方案,这些解决方案由Palo Alto、Splunk、Rapid7、FireEye和ArcSight等供应商通过其API集成了服务。GitHub直接在内部使用这个API作为其SaaS产品的一部分,但它没有出现在这个列表中,可能还有更多的企业客户。

4.png

urlscan集成在多种商业安全工具中

如果这些 tools/API 用户不小心执行了公共URL扫描,这可能导致系统数据泄漏。由于这些先进的安全工具大多安装在大公司和政府机构,泄露的信息可能特别敏感。

除了商业产品之外,集成页面还列出了22个开源项目,其中一些是信息收集工具,其他是简单的库实现,以便更容易地查询API。

哪些敏感数据可以被泄露?

由于此API的集成类型(例如,通过一个安全工具扫描每个传入的电子邮件并对所有链接执行urlscan),以及数据库中的数据量,匿名用户可以搜索和检索各种敏感数据。

urlscan.io dorks

请在下面找到一组可点击的“urlscan.io dorks”和编辑过的示例结果,请注意,在将我们的发现报告给urlscan.io后,他们为下面的许多dorks添加了删除规则。

密码重置链接

5.png

Instagram密码重置确认页面,请求用户输入两次新密码

帐户创建链接

6.png

Zendesk上NBC新闻账户的初始密码设置页面

API密钥

7.png

包含有效VirusTotal API密钥的链接

Telegram Bot

8.png

Telegram API URL包含一个长的秘密标识符,可用于在机器人上调用不同的API方法。

DocuSign签名请求

9.png

DocuSign签名请求通常包含带有敏感信息的合同文件

共享的Google Drive文档

10.png

Dropbox文件传输

11.png

Sharepoint invite

12.png

由于SharePoint工作区与组织相关联,子域已经给出了邀请的目的。

Discord invite

13.png

搜索查询返回了超过7000个不同社区的Discord邀请代码。

Government Zoom invite

14.png

比Discord邀请更敏感的可能是Zoom邀请,尤其是法庭听证会。

WebEx会议记录

15.png

PayPal invoice

16.png

PayPal托管的发票显然包含有效发票所需的所有(个人)信息,任何知道其ID的人都可以检索到。

Paypal money claim request

17.png

Paypal money claim request“仅”预先填写目标的电子邮件地址(连同金额和收件人),泄露的信息比发票少一点。

包裹跟踪链接

18.png

还可以找到各种邮政服务的包裹跟踪链接。有趣的是,DHL似乎意识到了跟踪代码泄露的风险,在显示收件人的地址之前,会询问收件人的邮政编码。注意:由于在德国只有8000个邮政编码,而且从包裹跟踪可以知道总体区域,因此代码可能是可猜测的。

亚马逊礼品配送链接

19.png

亚马逊礼品配送链接会泄露送礼者的姓名和礼物

退订链接

20.png

HIBP取消订阅链接,允许取消域的违规通知,该域本身没有显示在页面上

21.png

在PayPal退订页面上,用户的电子邮件地址完全显示出来。一些其他服务至少部分编辑了退订页面上的电子邮件地址。

有趣的是,当我在2月份进行首次搜索时,我可以找到很多苹果域名的有趣URL:

22.png

一个允许设置新密码的Apple开发者ID激活页面

23.png

一个允许设置密码的Apple ID最终页面,看起来像是Gamestop账户

24.png

家庭共享邀请,允许使用他人购买的订阅,甚至可以访问家庭的照片和设备的位置

25.png

仅限企业的在线活动邀请

26.png

当然,iCloud也可以创建公共共享链接,这些链接是通过urlscan.io泄露的。

27.png

对于iCloud日历邀请,苹果似乎也创建了一个包含所有信息的链接。

同时,这些信息似乎已从数据库中隐藏或删除:

28.png

搜索apple.com及其子域名现在只返回两个结果

然而,当持续监控上述结果页面时,有时会发现一些新的附加条目,这些条目在大约10分钟内再次消失。

我们后来发现,苹果同时要求从扫描结果中排除他们的域名,这是通过定期删除所有符合特定规则的扫描结果来实现的。

总体而言,urlscan.io服务包含各种类型的敏感信息,黑客、垃圾邮件发送者或攻击者可以利用这些信息接管账户、窃取身份或进行可信的网络钓鱼活动。

数据来自哪里?

我们可以从扫描结果的详细信息中看到扫描是否通过API提交,但我们无法找到哪个应用程序或集成提交了扫描请求。

为此,我们有两个选择:

联系受影响的用户。向泄露电子邮件地址的用户发送邮件,告知他们泄露信息,并询问可能是罪魁祸首的任何安全工具。

联系urlscan.io。发送可疑的自动提交列表,并要求urlscan调查是否有任何集成意外地将扫描选项设置为公开。

我们决定两者都做,并开始联系用户,同时收集扫描结果列表发送到urlscan.io。

联系用户

我们向API启动扫描中电子邮件地址泄露的个人发送了23封邮件(15封来自退订链接,5封来自PayPal发票,2封来自密码重置链接,1封来自Pay Pal索赔)。

29.png

发送的示例邮件带有指向相应urlscan结果页面的链接,底部有一个测试链接。

通知邮件的末尾是带有唯一UUID的“诱饵链接”,用于测试是否有任何URL会自动提交到urlscan.io。如果是这种情况,唯一的令牌将允许我们将扫描请求关联回邮件收件人。

在我们发送的23个测试链接中,9个(约40%)是通过API提交给urlscan.io的(大多数是在相应邮件发送后立即发送的):

30.png

通知邮件中包含的“私人”测试链接的公开结果(请注意,某些URL被多次扫描)

如果不计算PayPal发票(实际上可能是作为欺诈活动的一部分创建的),成功率为50%。第二天,我们又向泄露的hubspot退订阅链接的电子邮件地址发送了24封邮件,其中12封(又是50%)触发了公共扫描。

这些“pingback”向我们展示了几件事:

我们假设存在配置错误的安全工具,将通过邮件接收的任何链接作为公共扫描提交到urlscan.io似乎是正确的。

使用这些配置错误的安全工具的用户极有可能丢失所有在线帐户。

看起来严重程度较低的urlscan.io发现(例如来自退订链接的电子邮件地址)可能产生关键影响。

对于我们发现多个电子邮件地址或系统泄漏的组织,我们还尝试直接联系IT/安全部门。

31.png

当没有答案或正确的报告联系时,我们也尝试通过Twitter联系

不幸的是,我们既没有收到任何发送给受影响个人的数据泄露通知邮件的答复,也没有收到任何来自似乎存在系统性问题的组织的反馈。

除了一个例外,在给一个人发送了一个DocuSign链接到他们的工作合同后,他们的雇主联系了我们,开始了调查,并授予了一笔漏洞赏金。他们发现泄漏的源头是“他们的安全编排、自动化和响应操作手册与urlscan.io集成的错误配置,该操作手册正在积极开发中”。

联系urlscan.io

由于受影响用户的反馈不多,我们也向urlscan.io解释了这种情况。

如果集成开发人员遵循urlscan.io的文档,识别扫描请求的源软件应该很容易,即为库/集成使用自定义HTTP用户代理字符串,包括适用的软件版本。

因此,我们询问他们是否有可能生成一份用户代理的列表,这些用户代理触发了与我们联系的人相关的扫描,以及我们自己的诱饵链接的扫描,他们是否愿意与我们分享这份列表。

一般来说,urlscan.io团队反应非常积极,愿意与我们一起调查和合作,以改善目前的状况。

查看用户代理列表发现,许多API集成都没有遵循上述建议,超过一半的扫描都是由通用的“python requests/2.X.Y”用户代理启动的。

可以通过用户代理轻松识别的两种解决方案是:

PaloAlto的XSOAR ;

Swimlane;

对用于启动“python-requests”用户代理扫描的API项的进一步调查显示,其中许多项也是为PaloAlto的XSOAR生成的。其他生成的目的是:

IBM Resilient(现为“IBM Security QRadar SOAR”);

Splunk Phantom(现为“Splunk-SOAR”);

DimensionData的SOAR;

那么,这些数据究竟是如何出现在那里的呢?

SOAR平台允许组织自定义编写,将不同的数据源与安全工具和服务连接起来。为了简化开发,这些平台提供了与多个第三方服务的集成,例如通过this XSOAR urlscan.io pack安装了这个包后,playbook可以从传入的电子邮件中提取URL,并使用带有例如超时和扫描可见性的可选参数命令!url url=https://example.com using="urlscan.io"。

这种扫描的可见性取决于:

1.作为命令一部分提交的参数,

2.集成范围的配置;

3.关联urlscan.io 的可见性设置帐户/团队。

因此,扫描可能被错误地提交到公共域名:

1.出现编程错误或urlscan.io配置错误的情况下集成或帐户可见性设置,如泄露员工工作合同的公司所发生的情况;

2.如果集成本身有一个不尊重用户选择的可见性的漏洞,如发生在PaloAlto XSOAR urlscan.io pack  的情况。

参数[…]已配置为默认值public,此参数将覆盖与可见性相关的所有其他设置。因此,对于所有没有显式为这个新引入的参数提供值的命令调用,所有扫描都是以可见性public执行的。

响应

根据我们的发现,urlscan.io联系了他们认为提交了大量公共扫描的客户,并开始审查流行的第三方集成,如用于SOAR工具的集成,以确保他们在可见性方面尊重用户的意图。

此外,他们实施了以下更改:

添加了此处显示的傻瓜式删除规则,以定期删除与搜索模式匹配的扫描结果;

突出显示UI中的默认可见性设置;

添加了一个选项以设置团队范围内的最大可见性;

urlscan.io还发布了一篇名为“扫描可见性最佳实践”的博客文章,解释了扫描可见性设置,鼓励用户经常检查他们的提交,并详细介绍了urlscan为防止此类泄露所做的努力。

如果敏感数据仍然泄漏,他们提供以下选项:

受影响的用户可以通过“报告”设置报告带有敏感数据的扫描结果,该设置将立即禁用它们;

希望将其域名或特定URL模式排除在扫描之外(或删除相应的现有结果)的公司可以联系urlscan.io;

发现系统泄漏的安全研究人员也被要求联系urlscan.io;

账户接管

被动搜索历史urlscan.io数据已经发现了大量敏感信息,将其与“主动探测”相结合可以大大增加泄漏的风险。

正如我们前面所看到的,大约50%的用户在urlscan.io中泄露了退订链接,任何收到的电子邮件中的任何链接都将立即作为公共扫描提交给urlscan。

我们可以通过抓取urlscan.io来找到那些配置错误的客户端获取电子邮件地址(例如,在退订页面中或甚至只是在URL本身中),通过邮件向他们发送“诱饵链接”,然后检查urlscan.io链接。

通过在各种网络服务(如社交媒体网站、其他电子邮件提供商或银行)主动触发受影响电子邮件地址的密码重置,然后检查urlscan数据库中相应域的最近扫描结果,我们可以利用这种行为接管这些用户的帐户。搜索其他数据泄漏,例如使用HaveIBeenPropown查找这些电子邮件地址,也可能提供用户注册的服务的提示。

对于公司电子邮件地址、自定义登录门户和流行的企业SaaS,在上查找现有帐户并触发密码重置可能特别有趣。

而且,即使某个特定服务还没有帐户,只要创建一个带有公司电子邮件地址的新帐户,就可以访问存储在该服务上的公司内部数据。

下图说明了执行帐户接管攻击的所有必要步骤:

32.png

将被动搜索与主动探测错误配置的客户端和触发密码重置相结合,可以大大增加任何单个urlscan.io的泄漏影响。

安全建议

作为web服务的所有者,你可以确保你的密码重置和类似的链接尽快失效,并且不会通过可能公开的链接将不必要的信息泄露给未经身份验证的用户。在退订页面,编辑用户的电子邮件地址,并在显示PII之前要求额外的身份验证/信息(就像许多包裹跟踪网站在显示完整地址之前要求邮政编码)。在实现API身份验证时,不要通过GET参数接受API密钥,而是要求使用单独的HTTP标头。

此外,你还可以搜索urlscan.io以及其他服务自己的任何数据泄漏,关于你自己的web服务或组织,请求删除/排除,例如禁用和逆转任何泄漏的API密钥的用户。

urlscan.io集成服务的用户/安全团队应该检查他们的命令、集成和帐户可见性设置,保持他们的集成最新,定期检查他们提交的扫描并检查urlscan.io博客文章获取更多信息。

总结

urlscan.io通常有助于保护用户,不过它还存储了用户的敏感信息,其中一些信息是公开的,可以被攻击者搜索。

垃圾邮件发送者可以利用这些信息收集电子邮件地址和其他个人信息。它可能被攻击者用来接管账户并进行可信的网络钓鱼活动。安全研究人员也可以使用它来发现隐藏的管理门户,获得立足点或发现潜在攻击目标。

urlscan.io 网站被发现泄露了大量用户的敏感 URL,通过自动化工具可以挖掘出文档分享、密码重置以及团队邀请等敏感链接。

与GoogleDorking或通过公共S3桶搜索类似,urlscan.io挖掘揭示了许多本不公开的信息。不同的是,可以通过谷歌找到的信息或公共S3桶中的信息实际上已经公开了,而提交给urlscan的URL。用于公共扫描的io可能包含身份验证令牌,并来自由安全解决方案提交给个人的私人电子邮件。在这种情况下,引入额外的安全工具实际上会降低系统的安全性。

这些文档确实警告了提交的URL中的个人身份信息,但只建议将这些扫描标记为未列出:

1.请小心从URL中删除PII或将这些扫描作为“未列出”提交,例如,当URL中有电子

的扫描至少“在urlscan Pro平台上,经过审查的安全研究人员和安全公司

邮件地址时。

2.这些未列出

PII

仍然可以看到”。此外,此警告没有解决返回页面而不是URL本身的风险。

3.定价和API配额也非常支持使用公共扫描,该服务无法有效地主动防止PII泄露,例如,简单搜索page.url:@gmail.com可返回最多10000个结果。

我们会在本文中介绍基于签名的检测和基于行为的检测之间的主要区别。此外,还会举例说明了绕过各个检测的示例。

经常会有人有疑问,为什么在有关Packer(封隔器)被发布后,MSF- 或CobaltStrike- (CS)有效负载仍然会被检测到。答案无非有两种:

1.基于签名的检测被绕过了;2.基于行为的检测被触发并终止进程。

使用我们的自定义封隔器将导致反扫描。被封隔的MSF有效负载如下:

1.JPG

但这并不意味着,在运行时执行时,这些杀毒程序不会检测到有效负载。为什么会出现这种情况?

基于签名的检测

基于签名的检测非常简单。最早的杀毒程序有一个带有File-Hashes的签名数据库,他们只是将磁盘上任何可执行文件的哈希与已知的恶意可执行程序哈希进行比较。例如,该数据库包含Mimikatz发布二进制文件的SHA1/MD5哈希。改变一个可执行文件的哈希值就像操纵其中的一个字节一样简单,所以这种检测并不可靠。

基于这一事实,安全供应商转而检测特定的字节模式(Byte Pattern)签名。因此,为了继续使用Mimikatz的示例,具体的字节模式/十六进制值被标记如下:

2.png

可以看到,不仅要为每个已知的恶意二进制文件/有效负载标记一个模式,而且要使用多个常见模式。Mimikatz始终是基于签名的检测的一个很好的示例,因为通常供应商有几十种Mimikatz二进制检测的模式。通过这种方式,稍微修改过的版本也能被检测到。

甚至可以使用yara规则构建更高级的检测。这些规则可以扫描文件或内存内容,并允许更复杂的条件和不同模式的组合。Mimikatz yara规则的一个示例如下:

3.png

在本示例中,如果在文件或内存中找到上述三个字符串,则会触发此规则,AV/EDR程序可以执行警报或终止进程等操作。例如,我们在构建自定义Mimikatz二进制代码的文章中描述的技术就可以绕过这样的检测。

封隔器的内部工作原理

首先要了解封隔器的基本工作原理,了解它能做什么,不可能做什么。最后利用一个程序将一个有效负载封装到另一个程序中,以避免对其进行基于签名的检测。因此,如果像Mimikatz这样的负载包含特定的字符串,那么这些字符串将在生成的二进制文件中不再可见。包装过程可以通过某种编码/混淆或加密来完成。我个人更喜欢加密有效负载,因为这将产生最好的随机性,因此基于签名的检测最少。

4.png

这种经过编码或加密的负载必须在生成的加载器程序中解码/解密,以便可以从内存中执行明文负载。

根据有效负载的不同,封隔器也可以在当前进程或远程进程中删除更多检测:

如果你的封隔器正在打补丁/绕过AMSI,你可以安全地从内存执行不同的已知恶意脚本(PS1,VBA,JS等)或c#程序集。

为了绕过基于ETW的检测,封隔器还可以通过不同的发布技术修补/绕过ETW。

基于挂钩的Win32 API检测可以通过取消挂钩或直接/间接使用Syscall来绕过。

基于熵的检测将检测到许多封隔器,因为有效负载的加密将由于随机性而导致非常高的熵。这可以通过在生成的二进制中添加数千个单词来绕过,因为这再次降低了熵。

但是,即使所有这些技术都得到了应用,仍然存在更多潜在的“问题”:

1.内存扫描;

2.行为检测;

3.攻击者。

一般来说,使用封隔器也可以绕过内存扫描,但这非常有限。

内存扫描和常用的绕过技术

由于基于签名的检测很容易被封隔器技术绕过,越来越多的AV/EDR供应商倾向于使用扫描进行内存分析。这些扫描通常不会在所有进程中一直进行,因为这会消耗太多资源,但可能会由特定条件触发。

例如,内存扫描通常在以下情况下出现:

生成一个新进程,例如运行一个可执行文件;

进程的行为触发内存扫描;

第一个很容易绕过。例如,即使是封隔器也可以在解码/解密真正的有效负载之前休眠一段时间。在这种情况下,将进行内存扫描,但不会发现任何东西,因为负载仍然是加密的。仍然有方法检测Win32基于睡眠的内存扫描绕过,例如这里演示的。作为使用Sleep的替代方案,你也可以在特定的时间内执行伪代码或进行计算。除了使用Sleep,还有许多其他替代方法。

但一般来说,绕过内存扫描有以下三种方法:

更改/修改有效负载的源代码,以避免基于签名的检测;

更改有效负载的行为,以便永远不会触发内存扫描;

内存加密。

我个人更喜欢第一种选择,它在每个程序中都是一次性的,只要新的代码库不公开,它也不应该在未来被检测到。

绕过基于行为的内存扫描是比较困难的,这取决于你的有效负载的行为。试想一下Mimikatz的行为(例如,用OpenProcess打开LSASS的句柄)会触发一次扫描,此时,无法从内存中隐藏Mimikat,因为它需要进行加密才能工作。因此,Mimikatz不会选择内存加密。

对于像Cobalt Strike这样著名的C2框架,最常见的选择是内存加密。但是如果你没有访问源代码的权限,就不可能修改它以避免内存检测。一般来说,C2框架是这项技术的优先选择,因为它们大部分时间都处于休眠状态。如果一个程序什么也不做,它的内存内容可以在这个时间段内被加密,而不会出现任何问题。

基于行为检测的一些示例和绕过

但是,哪些行为会在运行时触发AV/EDR操作或内存扫描呢?基本上全都可以。将内容写入内存,以特定的顺序或时间框架加载特定的库,创建注册表项,执行初始HTTP请求或任何其他操作。

我将在这里举几个例子,介绍相应绕过技术。

根据我的个人经验,AV/EDR在检测到特定行为后极少立即终止进程。这是因为AV/EDR供应商不希望有太多的误报结果。由于误报结果与终止进程的行为会导致生产环境的中断,这是非常糟糕的。所以他们需要几乎100%的确定,一个行为肯定是恶意程序终止相应的进程。这也是为什么许多供应商将行为检测与内存扫描结合起来,以验证他们发现了恶意内容。

Fodhelper UAC绕过示例

基于行为的检测的一个很好的示例是带有Windows Defender的Fodhelper UAC绕过。这个方法非常流行,但也很容易被利用,因为它只需要创建一个注册表项,然后调用fodhelper.exe:

5.png

在启用杀毒软件的情况下执行此操作将导致以下检测:

6.JPG

此警报既不会终止正在执行的进程,也不会终止新生成的进程,但仍会导致任何攻击中的检测。检测本身不能绕过AMSI,修补ETW也无济于事。因为这是触发此警报的特定行为。

我对此处标记的内容进行了一些简单的试错分析,发现杀毒软件不喜欢HKCU:\Software\Classes\ms-settings\Shell\Open\command(Default) 条目以及目录*C:\windows\system32*和*C:\windows \syswow64*中的任何.exe。

因此,触发警报的行为是使用其中一个字符串在上述目录中创建注册表项。

幸运的是,我们不需要指定.exe来执行二进制文件,也不需要两个目录来进行攻击。因此,作为一种替代方案,我们可以直接将e.G. a C2-Stager复制到任何可写目录中,并使用UAC-Bypass执行它,而无需调用扩展名。

7.png

但到2022年,许多OffSec用户将意识到,在安装了AV/EDR的系统上运行任何未签名的可执行文件可能不是一个好主意。因此,作为一种替代方案,我们还可以执行任何经过签名的可信可执行文件,并将相应的Sideloading-DLL放到相同的目录中。还有第三种选择,就是我们可以将rundll32.exe复制到我们的可写目录中并在那里执行它。

8.png

基于Meterpreter行为的检测

切记,不要使用分段有效负载,它们会被杀毒软件捕获。因此,在我们的示例中,我们将生成用于执行的不分段的反向HTTPS Shellcode。这可以通过以下命令来实现:

9.png

我不会在本文介绍执行Shellcode的方式,因为我只想展示行为检测,但通常您需要以下内容:

对Shellcode进行加密并在运行时解密,以避免在磁盘上签名,或者在运行时从远程Web服务器加载它;

使用直接或间接的系统调用执行,否则Shellcode将在执行前被标记;

在这种情况下,无需修补AMSI/ETW即可使Meterpreter运行。

但是,即使你使用系统调用绕过了基于签名的磁盘检测和Shellcode检测,你也应该能够看到一个新的 Meterpreter Session传入:

10.JPG

但这只是意味着,我们的初始有效负载成功地执行了。一秒钟后,进程被终止并出现以下检测:

11.JPG

同样,这是一个基于行为的检测,由附加的DLL文件触发,通过普通Win32 API和反射DLL注入技术加载。在本例中,stdapi-DLL的注入触发了一个警报。

在msfconsole提示符中,你可以通过以下命令禁用stdapi DLL的加载:

12.png

这样,你就应该可以很好地接收Meterpreter Session:

13.JPG

然而,禁用stdapi加载将导致你的Meterpreter-Session中几乎没有命令/模块,只有“内核命令”可用。

等待几分钟后,你可以使用以下命令手动加载stdapi,但仍应没有检测:

14.JPG

这种基于行为的检测是关于什么的?我不能百分之百地肯定,但很可能是以下因素的组合:

1.新生成的进程;

2.在调用用于反射加载DLL的特定Windows API之前,新进程的时间框架x;

3.内存扫描,用于验证恶意内容;

4.内存中Meterpreter的检测和终止进程的操作。

注意:这是绕过Meterpeter防御行为检测的唯一可能方法。

如上所述,绕过内存扫描的一个通用方法是修改源代码以避免内存中的签名。绕过内存扫描的一个通用方法是修改源代码以避免内存中的签名,因此修改源代码是另一种选择,Meterpreter源代码混淆的自动化方法可以点击这里。这样做之后,就能够在启用autostdapi-Loading的情况下避免这种检测。

第三种方法是内存加密,这对于Meterpreter来说并不容易实现,因为在请求命令之前,HTTP/HTTPS源代码不像许多其他c2框架那样在时间框架x上休眠。它只是抛出许多HTTP(S)请求,其间有一些小延迟。所以内存加密会中断这个过程。如果你使用这个方法,那么你需要在源代码中自己集成一个带有内存加密的自定义Sleep-function。

Cobalt Strike检测

Cobalt Strike很可能是最复杂、分析最深入的C2框架。这很可能是因为在过去几年里,它被许多不同的攻击组织在野外使用。不更改默认设置在大多数环境中是不可用的,因为这会立即被检测到。

即使使用自定义的打包器/加载器和系统调用来执行Shellcode,在许多环境中仍然会失败。因此,我会解释作为操作员在使用此框架时需要做的最低要求和修改。

C2服务器/基础设施最低要求:

1.禁用Malleable配置文件中的分段,如果启用了该功能,你的植入程序几乎会立即被终止,因为有许多Internet范围内的自动扫描器下载第二阶段来分析和共享它。

2.你必须使用带有许多不同重要绕过设置的自定义Malleable C2-Profile来绕过一些检测。

3.必须在C2服务器前面使用重定向器。此重定向程序应释放/阻止已知的沙盒分析IP范围,并且仅允许和重定向那些符合Malleable C2配置文件的请求。RedWarden或RedGuard是实现此流程自动化的最佳工具。使用它还可以避免在第一次连接后对Cobalt Strike服务器进行指纹识别和检测。

植入程序的最低要求:

1.使用加密/混淆和运行时解密/反混淆打包Shellcode。如果你不这样做,加载器将在磁盘或内存中被签名标记(取决于加载方式);

2.使用直接或间接的系统调用来执行CS-Shellcode或从内存加载工件。如果不这样做,在大多数环境中都会导致即时检测,因为Shellcode始终具有相同的IoC,并且很容易被AV/EDR挂钩检测到。

3.使用环境键控(environmental keying)绕过潜在的沙盒或自动EDR云提交分析。

4.你必须通过有关工具包修改Cobalt Strike中的默认睡眠掩码模板。如果在Malleable C2 Profile中启用,信标将加密堆和堆栈内存,以在成功执行后从内存扫描程序中隐藏自身。但由于这个默认的睡眠掩码源代码本身也被AV/EDR签名严重攻击,因此也会被内存扫描器标记。你不应该使用任何未修改的公共Github睡眠加密代码,因为这也会被标记。

所有这些(除了睡眠掩码的修改)都可以通过一个完全自定义的打包器/加载器或使用有关工具包(Arsenal Kit)来完成,Arsenal Kit已经提供了很多模板代码。如果你打算使用Arsenal Kit,那么你必须熟悉C/C++,并对模板代码进行大量自定义,以绕过检测。

睡眠掩码的修改也适用于原始的Shellcode输出,所以当你使用自己的自定义加载器时,你甚至可以在Arsenal Kit中对其进行修改。不过通过上述修改,Microsoft Defender for Endpoint 在我的测试中仍然检测到许多恶意行为。

注:即使你应用了上述所有要求,你的植入程序仍然可以在成熟环境中检测到。根据目标环境中使用的EDR,这是不够的。仍然存在一些问题:

如果你收到信标连接,别以为你能够发现什么。在许多环境中,我都能够让Beacon运行,但在发出一个命令/模块后,植入程序立即被检测到并终止。正如我所说,CS很可能是目前最复杂的框架,看看这些yara规则,你会发现,供应商确实为每个命令/模块实现了检测规则。这些基于行为的检测使我个人只能使用Cobalt Strike启动反向Socks Connection,而不能避免本地系统IoC,通过Socks在网络上完成所有事情。因此,在我的许多项目中,Cobalt Strike或多或少成为了一个独立的socks5反向代理程序。

对于自动AV/EDR分析,一个简单的内存加密可能就可以了,但在这种情况下,你需要避免更多的IoC,如RWX/RX内存权限,你不能使用Win32 Sleep,因为这很容易被检测。

在某些环境中,我的Beacon/Process甚至在回调之前就被检测到。说实话,我不知道这些监测是干什么的,说实话,我也不知道如何绕过他们。

一些更有经验的Cobalt Strike用户向我暗示,用户定义的反射加载器(UDRL)几乎有无限的可能性,比如TitanLdr。在成熟的环境中,通过可塑配置文件选项来调整Cobalt Strike行为是不够的。例如,内核将始终使用Win32 API(具有潜在的检测功能),而不是直接使用Syscall。直到有人将系统调用选项与更新集成。但使用UDRL,你还可以使用导入地址表挂钩修改所有Cobalt Strike 内核行为。例如,你可以将内核的Hook VirtualProtect设置为NtProtectVirtualMemory。

因此,由于CS内核本身的局限性,它可能是坚持使用UDRL的最隐蔽的方式,而不是使用自定义打包器/加载器或经过修改的Arsenal Kit。

对我个人来说,这已经不是一个选择了。挂钩IAT修改一个闭源程序的内核,只是为了绕过基于行为的检测。在某种程度上,我决定至少在这一刻不会为了让这个框架的c2连接运行而越来越深入地研究Windows内部。在一年的时间里,我只开发了很少的没有检测的环境和一些有反向Socks代理的环境,我决定使用其他框架。以前没有CS我也很好,将来也会很好。

真的需要这些绕过技巧吗?

我认为不需要,所有这些绕过技术最终只是用来绕过签名。

如果你使用的是自己生成的Shellcode,你可以选择再次坚持使用Win32 API。WriteProcessMemory或CreateThread将导致对输入参数的检测和对Shellcode入口点的分析。但如果没有已知的恶意签名,它将正常运行,不会被阻止。

如果你正在使用内部工具或经过大量修改的开放源代码,AMSI将永远不会发现你,因为它正在搜索已知的签名。

如果你使用的是一个混淆的开源C2框架,或者是一个自己开发的框架,内存扫描不会发现你。

我们会在本文中介绍基于签名的检测和基于行为的检测之间的主要区别。此外,还会举例说明了绕过各个检测的示例。

经常会有人有疑问,为什么在有关Packer(封隔器)被发布后,MSF- 或CobaltStrike- (CS)有效负载仍然会被检测到。答案无非有两种:

1.基于签名的检测被绕过了;2.基于行为的检测被触发并终止进程。

使用我们的自定义封隔器将导致反扫描。被封隔的MSF有效负载如下:

1.JPG

但这并不意味着,在运行时执行时,这些杀毒程序不会检测到有效负载。为什么会出现这种情况?

基于签名的检测

基于签名的检测非常简单。最早的杀毒程序有一个带有File-Hashes的签名数据库,他们只是将磁盘上任何可执行文件的哈希与已知的恶意可执行程序哈希进行比较。例如,该数据库包含Mimikatz发布二进制文件的SHA1/MD5哈希。改变一个可执行文件的哈希值就像操纵其中的一个字节一样简单,所以这种检测并不可靠。

基于这一事实,安全供应商转而检测特定的字节模式(Byte Pattern)签名。因此,为了继续使用Mimikatz的示例,具体的字节模式/十六进制值被标记如下:

2.png

可以看到,不仅要为每个已知的恶意二进制文件/有效负载标记一个模式,而且要使用多个常见模式。Mimikatz始终是基于签名的检测的一个很好的示例,因为通常供应商有几十种Mimikatz二进制检测的模式。通过这种方式,稍微修改过的版本也能被检测到。

甚至可以使用yara规则构建更高级的检测。这些规则可以扫描文件或内存内容,并允许更复杂的条件和不同模式的组合。Mimikatz yara规则的一个示例如下:

3.png

在本示例中,如果在文件或内存中找到上述三个字符串,则会触发此规则,AV/EDR程序可以执行警报或终止进程等操作。例如,我们在构建自定义Mimikatz二进制代码的文章中描述的技术就可以绕过这样的检测。

封隔器的内部工作原理

首先要了解封隔器的基本工作原理,了解它能做什么,不可能做什么。最后利用一个程序将一个有效负载封装到另一个程序中,以避免对其进行基于签名的检测。因此,如果像Mimikatz这样的负载包含特定的字符串,那么这些字符串将在生成的二进制文件中不再可见。包装过程可以通过某种编码/混淆或加密来完成。我个人更喜欢加密有效负载,因为这将产生最好的随机性,因此基于签名的检测最少。

4.png

这种经过编码或加密的负载必须在生成的加载器程序中解码/解密,以便可以从内存中执行明文负载。

根据有效负载的不同,封隔器也可以在当前进程或远程进程中删除更多检测:

如果你的封隔器正在打补丁/绕过AMSI,你可以安全地从内存执行不同的已知恶意脚本(PS1,VBA,JS等)或c#程序集。

为了绕过基于ETW的检测,封隔器还可以通过不同的发布技术修补/绕过ETW。

基于挂钩的Win32 API检测可以通过取消挂钩或直接/间接使用Syscall来绕过。

基于熵的检测将检测到许多封隔器,因为有效负载的加密将由于随机性而导致非常高的熵。这可以通过在生成的二进制中添加数千个单词来绕过,因为这再次降低了熵。

但是,即使所有这些技术都得到了应用,仍然存在更多潜在的“问题”:

1.内存扫描;

2.行为检测;

3.攻击者。

一般来说,使用封隔器也可以绕过内存扫描,但这非常有限。

内存扫描和常用的绕过技术

由于基于签名的检测很容易被封隔器技术绕过,越来越多的AV/EDR供应商倾向于使用扫描进行内存分析。这些扫描通常不会在所有进程中一直进行,因为这会消耗太多资源,但可能会由特定条件触发。

例如,内存扫描通常在以下情况下出现:

生成一个新进程,例如运行一个可执行文件;

进程的行为触发内存扫描;

第一个很容易绕过。例如,即使是封隔器也可以在解码/解密真正的有效负载之前休眠一段时间。在这种情况下,将进行内存扫描,但不会发现任何东西,因为负载仍然是加密的。仍然有方法检测Win32基于睡眠的内存扫描绕过,例如这里演示的。作为使用Sleep的替代方案,你也可以在特定的时间内执行伪代码或进行计算。除了使用Sleep,还有许多其他替代方法。

但一般来说,绕过内存扫描有以下三种方法:

更改/修改有效负载的源代码,以避免基于签名的检测;

更改有效负载的行为,以便永远不会触发内存扫描;

内存加密。

我个人更喜欢第一种选择,它在每个程序中都是一次性的,只要新的代码库不公开,它也不应该在未来被检测到。

绕过基于行为的内存扫描是比较困难的,这取决于你的有效负载的行为。试想一下Mimikatz的行为(例如,用OpenProcess打开LSASS的句柄)会触发一次扫描,此时,无法从内存中隐藏Mimikat,因为它需要进行加密才能工作。因此,Mimikatz不会选择内存加密。

对于像Cobalt Strike这样著名的C2框架,最常见的选择是内存加密。但是如果你没有访问源代码的权限,就不可能修改它以避免内存检测。一般来说,C2框架是这项技术的优先选择,因为它们大部分时间都处于休眠状态。如果一个程序什么也不做,它的内存内容可以在这个时间段内被加密,而不会出现任何问题。

基于行为检测的一些示例和绕过

但是,哪些行为会在运行时触发AV/EDR操作或内存扫描呢?基本上全都可以。将内容写入内存,以特定的顺序或时间框架加载特定的库,创建注册表项,执行初始HTTP请求或任何其他操作。

我将在这里举几个例子,介绍相应绕过技术。

根据我的个人经验,AV/EDR在检测到特定行为后极少立即终止进程。这是因为AV/EDR供应商不希望有太多的误报结果。由于误报结果与终止进程的行为会导致生产环境的中断,这是非常糟糕的。所以他们需要几乎100%的确定,一个行为肯定是恶意程序终止相应的进程。这也是为什么许多供应商将行为检测与内存扫描结合起来,以验证他们发现了恶意内容。

Fodhelper UAC绕过示例

基于行为的检测的一个很好的示例是带有Windows Defender的Fodhelper UAC绕过。这个方法非常流行,但也很容易被利用,因为它只需要创建一个注册表项,然后调用fodhelper.exe:

5.png

在启用杀毒软件的情况下执行此操作将导致以下检测:

6.JPG

此警报既不会终止正在执行的进程,也不会终止新生成的进程,但仍会导致任何攻击中的检测。检测本身不能绕过AMSI,修补ETW也无济于事。因为这是触发此警报的特定行为。

我对此处标记的内容进行了一些简单的试错分析,发现杀毒软件不喜欢HKCU:\Software\Classes\ms-settings\Shell\Open\command(Default) 条目以及目录*C:\windows\system32*和*C:\windows \syswow64*中的任何.exe。

因此,触发警报的行为是使用其中一个字符串在上述目录中创建注册表项。

幸运的是,我们不需要指定.exe来执行二进制文件,也不需要两个目录来进行攻击。因此,作为一种替代方案,我们可以直接将e.G. a C2-Stager复制到任何可写目录中,并使用UAC-Bypass执行它,而无需调用扩展名。

7.png

但到2022年,许多OffSec用户将意识到,在安装了AV/EDR的系统上运行任何未签名的可执行文件可能不是一个好主意。因此,作为一种替代方案,我们还可以执行任何经过签名的可信可执行文件,并将相应的Sideloading-DLL放到相同的目录中。还有第三种选择,就是我们可以将rundll32.exe复制到我们的可写目录中并在那里执行它。

8.png

基于Meterpreter行为的检测

切记,不要使用分段有效负载,它们会被杀毒软件捕获。因此,在我们的示例中,我们将生成用于执行的不分段的反向HTTPS Shellcode。这可以通过以下命令来实现:

9.png

我不会在本文介绍执行Shellcode的方式,因为我只想展示行为检测,但通常您需要以下内容:

对Shellcode进行加密并在运行时解密,以避免在磁盘上签名,或者在运行时从远程Web服务器加载它;

使用直接或间接的系统调用执行,否则Shellcode将在执行前被标记;

在这种情况下,无需修补AMSI/ETW即可使Meterpreter运行。

但是,即使你使用系统调用绕过了基于签名的磁盘检测和Shellcode检测,你也应该能够看到一个新的 Meterpreter Session传入:

10.JPG

但这只是意味着,我们的初始有效负载成功地执行了。一秒钟后,进程被终止并出现以下检测:

11.JPG

同样,这是一个基于行为的检测,由附加的DLL文件触发,通过普通Win32 API和反射DLL注入技术加载。在本例中,stdapi-DLL的注入触发了一个警报。

在msfconsole提示符中,你可以通过以下命令禁用stdapi DLL的加载:

12.png

这样,你就应该可以很好地接收Meterpreter Session:

13.JPG

然而,禁用stdapi加载将导致你的Meterpreter-Session中几乎没有命令/模块,只有“内核命令”可用。

等待几分钟后,你可以使用以下命令手动加载stdapi,但仍应没有检测:

14.JPG

这种基于行为的检测是关于什么的?我不能百分之百地肯定,但很可能是以下因素的组合:

1.新生成的进程;

2.在调用用于反射加载DLL的特定Windows API之前,新进程的时间框架x;

3.内存扫描,用于验证恶意内容;

4.内存中Meterpreter的检测和终止进程的操作。

注意:这是绕过Meterpeter防御行为检测的唯一可能方法。

如上所述,绕过内存扫描的一个通用方法是修改源代码以避免内存中的签名。绕过内存扫描的一个通用方法是修改源代码以避免内存中的签名,因此修改源代码是另一种选择,Meterpreter源代码混淆的自动化方法可以点击这里。这样做之后,就能够在启用autostdapi-Loading的情况下避免这种检测。

第三种方法是内存加密,这对于Meterpreter来说并不容易实现,因为在请求命令之前,HTTP/HTTPS源代码不像许多其他c2框架那样在时间框架x上休眠。它只是抛出许多HTTP(S)请求,其间有一些小延迟。所以内存加密会中断这个过程。如果你使用这个方法,那么你需要在源代码中自己集成一个带有内存加密的自定义Sleep-function。

Cobalt Strike检测

Cobalt Strike很可能是最复杂、分析最深入的C2框架。这很可能是因为在过去几年里,它被许多不同的攻击组织在野外使用。不更改默认设置在大多数环境中是不可用的,因为这会立即被检测到。

即使使用自定义的打包器/加载器和系统调用来执行Shellcode,在许多环境中仍然会失败。因此,我会解释作为操作员在使用此框架时需要做的最低要求和修改。

C2服务器/基础设施最低要求:

1.禁用Malleable配置文件中的分段,如果启用了该功能,你的植入程序几乎会立即被终止,因为有许多Internet范围内的自动扫描器下载第二阶段来分析和共享它。

2.你必须使用带有许多不同重要绕过设置的自定义Malleable C2-Profile来绕过一些检测。

3.必须在C2服务器前面使用重定向器。此重定向程序应释放/阻止已知的沙盒分析IP范围,并且仅允许和重定向那些符合Malleable C2配置文件的请求。RedWarden或RedGuard是实现此流程自动化的最佳工具。使用它还可以避免在第一次连接后对Cobalt Strike服务器进行指纹识别和检测。

植入程序的最低要求:

1.使用加密/混淆和运行时解密/反混淆打包Shellcode。如果你不这样做,加载器将在磁盘或内存中被签名标记(取决于加载方式);

2.使用直接或间接的系统调用来执行CS-Shellcode或从内存加载工件。如果不这样做,在大多数环境中都会导致即时检测,因为Shellcode始终具有相同的IoC,并且很容易被AV/EDR挂钩检测到。

3.使用环境键控(environmental keying)绕过潜在的沙盒或自动EDR云提交分析。

4.你必须通过有关工具包修改Cobalt Strike中的默认睡眠掩码模板。如果在Malleable C2 Profile中启用,信标将加密堆和堆栈内存,以在成功执行后从内存扫描程序中隐藏自身。但由于这个默认的睡眠掩码源代码本身也被AV/EDR签名严重攻击,因此也会被内存扫描器标记。你不应该使用任何未修改的公共Github睡眠加密代码,因为这也会被标记。

所有这些(除了睡眠掩码的修改)都可以通过一个完全自定义的打包器/加载器或使用有关工具包(Arsenal Kit)来完成,Arsenal Kit已经提供了很多模板代码。如果你打算使用Arsenal Kit,那么你必须熟悉C/C++,并对模板代码进行大量自定义,以绕过检测。

睡眠掩码的修改也适用于原始的Shellcode输出,所以当你使用自己的自定义加载器时,你甚至可以在Arsenal Kit中对其进行修改。不过通过上述修改,Microsoft Defender for Endpoint 在我的测试中仍然检测到许多恶意行为。

注:即使你应用了上述所有要求,你的植入程序仍然可以在成熟环境中检测到。根据目标环境中使用的EDR,这是不够的。仍然存在一些问题:

如果你收到信标连接,别以为你能够发现什么。在许多环境中,我都能够让Beacon运行,但在发出一个命令/模块后,植入程序立即被检测到并终止。正如我所说,CS很可能是目前最复杂的框架,看看这些yara规则,你会发现,供应商确实为每个命令/模块实现了检测规则。这些基于行为的检测使我个人只能使用Cobalt Strike启动反向Socks Connection,而不能避免本地系统IoC,通过Socks在网络上完成所有事情。因此,在我的许多项目中,Cobalt Strike或多或少成为了一个独立的socks5反向代理程序。

对于自动AV/EDR分析,一个简单的内存加密可能就可以了,但在这种情况下,你需要避免更多的IoC,如RWX/RX内存权限,你不能使用Win32 Sleep,因为这很容易被检测。

在某些环境中,我的Beacon/Process甚至在回调之前就被检测到。说实话,我不知道这些监测是干什么的,说实话,我也不知道如何绕过他们。

一些更有经验的Cobalt Strike用户向我暗示,用户定义的反射加载器(UDRL)几乎有无限的可能性,比如TitanLdr。在成熟的环境中,通过可塑配置文件选项来调整Cobalt Strike行为是不够的。例如,内核将始终使用Win32 API(具有潜在的检测功能),而不是直接使用Syscall。直到有人将系统调用选项与更新集成。但使用UDRL,你还可以使用导入地址表挂钩修改所有Cobalt Strike 内核行为。例如,你可以将内核的Hook VirtualProtect设置为NtProtectVirtualMemory。

因此,由于CS内核本身的局限性,它可能是坚持使用UDRL的最隐蔽的方式,而不是使用自定义打包器/加载器或经过修改的Arsenal Kit。

对我个人来说,这已经不是一个选择了。挂钩IAT修改一个闭源程序的内核,只是为了绕过基于行为的检测。在某种程度上,我决定至少在这一刻不会为了让这个框架的c2连接运行而越来越深入地研究Windows内部。在一年的时间里,我只开发了很少的没有检测的环境和一些有反向Socks代理的环境,我决定使用其他框架。以前没有CS我也很好,将来也会很好。

真的需要这些绕过技巧吗?

我认为不需要,所有这些绕过技术最终只是用来绕过签名。

如果你使用的是自己生成的Shellcode,你可以选择再次坚持使用Win32 API。WriteProcessMemory或CreateThread将导致对输入参数的检测和对Shellcode入口点的分析。但如果没有已知的恶意签名,它将正常运行,不会被阻止。

如果你正在使用内部工具或经过大量修改的开放源代码,AMSI将永远不会发现你,因为它正在搜索已知的签名。

如果你使用的是一个混淆的开源C2框架,或者是一个自己开发的框架,内存扫描不会发现你。