网络安全 网络攻击


网络攻击

针对网络上托管的协议和应用程序的攻击非常多。 Web 应用程序在本课程的单独部分中介绍。

服务可能存在固有的错误,导致它们被攻击者利用。这些攻击通常涉及通过易受攻击的服务对操作系统使用特殊指令,以控制操作网络服务的进程。缓冲区溢出是此类攻击的一种。

网络通常包含许多应用程序,其中一些应用程序包含简单的登录,其他应用程序包含复杂的功能。概述攻击面并找出易于利用的漏洞的一种方法是对目标环境中的所有资产进行端口扫描,然后对其进行屏幕截图。

EyeWitness (https://github.com/FortyNorthSecurity/EyeWitness) 等工具可以完成此任务。该工具使我们能够快速了解​​网络上代表的资产,然后提供每个服务的屏幕截图。通过屏幕截图,我们可以轻松查看并快速评估我们应该仔细查看哪些系统。

利用服务意味着以非预期的方式滥用该服务。通常,这种利用活动意味着攻击者能够运行自己的代码,这称为 RCE ("Remote Code Execution")。


缓冲区溢出

对网络服务的利用有时涉及滥用应用程序的内存管理功能。内存管理?是的,应用程序需要在计算机内存中移动数据才能使应用程序正常工作。当编程语言让开发人员控制内存时,可能会存在缓冲区溢出等问题。存在许多类似的漏洞,本节我们回顾一下缓冲区溢出。

编程语言 C 和 C++ 允许开发人员很好地控制内存的管理方式。这对于需要开发人员非常接近硬件进行编程但存在漏洞的应用程序来说是理想的选择。 Java、JavaScript、C#、Ruby、Python 等编程语言不容易让开发人员犯这些错误,从而使用这些语言编写的应用程序不太可能出现缓冲区溢出。

当未经净化的输入放入变量时,就会发生缓冲区溢出。这些变量通过称为堆栈的内存结构在操作系统上表示。然后,攻击者可以覆盖堆栈中称为返回指针的部分。

笔记:堆栈内存结构只是程序存储运行所需的变量和信息的地方。该堆栈将位于计算机 RAM 内 ("Random Access Memory")

返回指针决定 CPU ("Central Processing Unit") 接下来应在何处执行代码。 CPU 只是控制系统在任何给定时刻应执行哪些指令。返回指针只是内存中应该执行的地址。 CPU 必须始终被告知在哪里执行代码,这就是返回指针允许它执行的操作。

当攻击者能够控制返回指针时,意味着攻击者可以控制CPU应该执行哪些指令!

例如,考虑以下代码 C 示例(不用担心,您不必是 C 开发人员,但请尽力理解这个简单应用程序的用途):

#include <string.h>
void storeName (char *input) {
  char name[12];
  strcpy(name, input);
}

int main (int argc, char **argv) {
  storeName(argv[1]);
  return 0;
}

在许多编程语言(包括 C)中,应用程序在名为 main 的函数中启动。这在上面的代码中有所表明int main (int argc, char **argv) {。在大括号 { 和 } 内,程序只是运行一个名为storeName(argv[1]);。这将简单地接受用户在程序中输入的任何内容并将其提供给 storeName 函数。

该应用程序有 11 行代码,但请将注意力集中在以下行:strcpy(name, input);。这是一个尝试将文本从输入复制到名为 name 的变量中的函数。名称最多可包含 12 个字符,如行所示char name[12];。代码中是否有任何地方阻止提供的名称超过 12 个字符? name 变量由使用应用程序的用户提供,并直接传递到 storeName 函数中。

在此应用程序中,没有清洁或消毒,确保输入的长度符合应用程序的预期。运行该程序的任何人都可以轻松输入一个大于 name 变量可以容纳的最大值的值。 name 变量保存 12 个字符,但是当 CPU 被告知写入超过 12 个字符时会发生什么?它只会执行所要求的操作,覆盖所需的内存!

当尝试写入大于预期的值时,CPU 仍会尝试将该值写入内存。这实际上会导致 CPU 覆盖内存中的其他内容,例如允许攻击者控制 CPU 的返回指针。同样,如果攻击者可以覆盖并控制返回指针,则攻击者可以控制 CPU 应执行哪些代码。

一个图形示例显示 Alice 将她的名字写入我们在上面示例中使用的应用程序中:

Buffer Overflow

Alice 表现得很好,并提供了一个名称,使应用程序按其应有的方式运行。她提供了她的名字 Alice,然后将其简单地写入应用程序内存中。

然而,Eve 向应用程序发送了太多字符。然后会发生什么? CPU 有效地获取她的输入并将输入写入内存,同时覆盖其他存在的值!

Exploit Buffer Overflow

Eve 的输入导致 CPU 写入的数据比应用程序预期的多得多,并且导致返回指针被覆盖。当CPU尝试执行下一条指令时,它现在被告知执行位置处的代码啊啊啊啊...

如果 Eve 要控制这台服务器,她就必须在内存中提供 CPU 可以理解的代码,而不是写 A。接下来,她将使返回指针具有一个值,告诉 CPU 执行 Eve 自己的 CPU 代码。

笔记:简单地说,缓冲区溢出允许攻击者通过小心地覆盖受害者的内存来控制受害者的 CPU。

漏洞扫描器

漏洞扫描器会自动查找网络中软件和配置中的常见漏洞。它并不是为了发现新类别的漏洞而设计的,而是使用预定义的插件(或模块)列表来扫描服务中的问题和漏洞。它不一定会寻找零日漏洞!零日漏洞是一种全新的漏洞,软件供应商和防御者以前都不知道;对于零日漏洞,目前尚无针对该问题的已知补丁。

扫描仪具有网络映射和端口扫描功能,包括探索和查找遇到的不同应用程序中的漏洞的方法。

漏洞扫描器通常支持使用凭据进行配置,使其能够登录系统并评估漏洞,而不是从未经身份验证的角度查找漏洞。

笔记:漏洞扫描器主要寻找已知漏洞和错误配置,而不是零日漏洞!

代码执行

当攻击者发现他们能够利用的漏洞时,他们需要决定要运行什么有效负载。有效负载是攻击者希望通过漏洞传递的代码。

攻击者可以决定使用许多不同的有效负载,以下是一些示例:

  • 让受害者向 C2 ("Command and Control") 服务器注册并接受攻击者的命令
  • 在系统上创建一个新的后门用户帐户,以便攻击者稍后可以使用它
  • 与受害者一起打开 GUI ("Graphical User Interface"),以便攻击者可以远程控制它
  • 接收命令行终端,一个 shell,攻击者可以通过它发送命令

攻击者常见的有效负载是绑定外壳。它导致受害者侦听端口,当攻击者连接时,他们会收到 shell。

Bind Shell

防火墙有助于防止攻击者连接到受害者。只要端口不被允许,防火墙就会有效地拒绝受害者的传入连接。只有一个应用程序可以侦听某个端口,因此攻击者无法侦听已在使用的端口,除非禁用该服务。

为了规避这种防御措施,攻击者会尝试让受害者连接到攻击者,从而使受害者提供对有效负载的访问权限。不幸的是,许多防火墙没有配置为拒绝出口流量,这使得这种攻击对于攻击者来说非常可行。

在此示例中,我们看到攻击者使用反向 shell 使受害者连接到攻击者。

Reverse Shell

笔记:代码执行意味着攻击者可以在受害者系统上运行他们的代码。他们选择部署什么代码取决于他们,但这通常涉及攻击者有办法在受害者系统上长期运行命令。

网络监控

在大多数情况下,攻击者需要网络来远程控制目标。当攻击者能够远程控制目标时,这是通过命令和控制通道(通常称为 C&C 或 C2)来完成的。

通过使用不需要 C2 的有效负载进行预编程的恶意软件,存在危害。这种恶意软件甚至能够危害气隙网络。

通常可以通过查找 C2 通道来检测妥协。 C2 可以采用任何形式,例如:

  • 使用 HTTPS 与攻击者服务器进行通信。这使得C2看起来像网络浏览
  • 使用社交网络自动发布和阅读消息
  • 像 Google Docs 这样的系统可以向受害者添加和编辑命令

Network Monitoring Beacon

只有攻击者的聪明才智才能限制 C2。在考虑如何利用巧妙的 C2 通道阻止攻击者时,我们通常必须依赖于检测网络上的统计异常和差异。例如,网络监控工具可以检测:

  • C2 使用长连接,但这对于相关协议来说是不自然的。 HTTP 是长连接并不常见的协议之一,但攻击者可能会使用它进行远程控制。
  • C2 使用信标来表明受害者还活着并准备好接受命令。信标被多种软件使用,不仅仅是攻击者,但了解存在哪些信标以及您期望哪些信标是很好的做法。
  • 数据突然从网络中爆发出来。这可能表明应用程序上传了大量数据,或者攻击者窃取了数据。尝试了解哪个应用程序和用户导致数据选通发生并向其应用上下文。正常还是不正常?

防御者可以通过多种方式尝试发现异常情况。这些异常应该进一步与发送数据的源系统的数据相关。

对于网络监控,应应用上下文来帮助确定信号中的噪声。这意味着 SOC ("Security Operations Center") 应尝试丰富数据,例如具有上下文的源 IP 地址和目标 IP 地址,以帮助使数据更有值。

应用上下文可以用以下场景来描述:攻击来自 Internet,但它试图利用 Linux 漏洞攻击 Windows 服务。这通常被视为噪音,可以安全地忽略;除非,如果进行攻击的 IP 地址是来自您自己的网络或您信任的提供商的 IP 地址怎么办?我们可以应用的上下文可以为我们进一步探索攻击提供有值的见解。毕竟,我们不希望我们信任的系统发起任何攻击!


点对点流量

大多数网络都是以客户端到服务器的方式配置的。客户端访问服务器以获取信息,当客户端需要彼此交互时,他们通常通过服务器进行。

然而,攻击者可能希望使用点对点(即客户端到客户端)通信来利用容易实现的目标,例如重复使用凭据或利用弱或易受攻击的客户端。

例如,SMB 使用的端口 445 是用于检测妥协的良好指示器。在大多数环境中,客户端不应通过 SMB 相互通信,但是在妥协过程中,攻击者可能会尝试使用 SMB 进一步损害系统。

Peer-to-Peer


横向运动和旋转

一旦系统遭到破坏,攻击者就可以利用该系统来探索受感染系统可以访问的其他网络。在受感染的系统通过防火墙具有更多特权或者系统可以通过例如附加网卡访问其他网络的环境中,这可能是可能的。

旋转意味着攻击者使用受感染的主机进入其他网络。这里展示了这一点的一个例子,其中 Eve 已经破坏了一个系统,并使用它来扫描和发现其他系统:

Pivoting Lateral Movement

横向运动是利用枢轴并利用枢轴利用另一个系统的行为。这个新系统现在可以进一步用于旋转和更多的横向运动。本示例中的 Eve 使用服务器 X 来进一步发现系统 B。

Pivoting Lateral Movement