网络安全网络攻击

网络攻击

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

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

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

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

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


缓冲区溢出

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

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

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

注意:堆栈内存结构只是程序存储变量和运行所需信息的地方。堆栈将位于计算机 RAM("随机存取存储器")内

返回指针决定 CPU("中央处理单元")接下来应该在哪里执行代码。 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 尝试执行下一条指令时,它现在被告知在 AAAAAAA...

的位置执行代码

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

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

漏洞扫描程序

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

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

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

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

代码执行

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

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

  • 让受害者在 C2("命令和控制")服务器上注册,接受攻击者的命令
  • 在系统上创建一个新的后门用户帐户,以便攻击者以后可以使用它
  • 与受害者一起打开一个 GUI("图形用户界面"),以便攻击者可以远程控制它
  • 接收一个命令行终端,一个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("安全运营中心")应尝试丰富数据,例如源 IP 地址和目标 IP 地址以及上下文,以帮助使数据更有价值。

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


点对点流量

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

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

例如,SMB 使用的端口 445 是用于检测入侵的良好指标。 在大多数环境中,客户端不应通过 SMB 相互通信,但在攻陷期间,攻击者很可能会尝试使用 SMB 进一步攻陷系统。

Peer-to-Peer


Lateral Movement and Pivoting

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

转向意味着攻击者使用受感染的主机进入其他网络。 此处展示了 Eve 入侵了一个系统并使用它来扫描和发现其他系统的示例:

Pivoting Lateral Movement

Lateral Movement is the act of taking advantage of the pivot and exploit another system using the pivot. This new system can now be further used to do pivoting and more lateral movement. Eve in this example uses Server X to further discover System B.

Pivoting Lateral Movement