菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

网络安全 网络攻击


网络攻击

网络上托管的协议和应用程序的攻击非常多。Web 应用程序在本课程中有其自己的章节介绍。

服务可能存在固有的错误,使其容易被攻击者利用。这些攻击通常涉及通过易受攻击的服务向操作系统发送特殊指令,以控制运行网络服务的进程。缓冲区溢出就是一类此类攻击。

网络通常包含许多应用程序,其中一些仅提供简单的登录,另一些则具有复杂的功能。获得攻击面概览并映射容易被利用的漏洞的一种方法是端口扫描目标环境中的所有资产,然后对它们进行截图。

像 EyeWitness (https://github.com/FortyNorthSecurity/EyeWitness) 这样的工具就能做到这一点。该工具允许我们快速了解网络上存在哪些资产,然后提供每个服务的屏幕截图。通过屏幕截图,我们可以轻松快速地评估哪些系统值得我们进一步仔细检查。

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


缓冲区溢出

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

C 和 C++ 编程语言允许开发人员非常精细地控制内存管理。这对于需要开发人员非常接近硬件进行编程的应用程序来说是理想的,但也容易出现漏洞。Java、JavaScript、C#、Ruby、Python 等编程语言并不轻易允许开发人员犯这些错误,这使得使用这些语言编写的应用程序发生缓冲区溢出的可能性降低。 

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

注意:堆栈内存结构只是程序存储其运行所需的变量和信息的地方。堆栈将位于计算机的 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 的变量中的函数。如 char name[12]; 所示,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。它会导致受害者监听一个端口,当攻击者连接时,他们会收到一个 shell。

Bind Shell

防火墙有助于防止攻击者连接到受害者。防火墙将有效地拒绝到受害者的入站连接,只要该端口未被允许。一个端口只能由一个应用程序监听,因此除非攻击者禁用该服务,否则他们无法监听已被占用的端口。

为了绕过这种防御措施,攻击者将尝试让受害者连接到攻击者,从而使受害者能够访问有效载荷。许多防火墙不幸的是未配置为拒绝出站流量,这使得这种攻击对攻击者非常有威胁。

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

Reverse Shell

注意:代码执行意味着攻击者可以在受害者系统上运行他们的代码。他们选择部署什么代码由他们决定,但这通常涉及到攻击者能够长期在受害者系统上运行命令。 

网络监控

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

存在通过预先编程了有效载荷的恶意软件的妥协,这些恶意软件不需要 C2。这种类型的恶意软件能够破坏甚至气隙网络。

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

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

Network Monitoring Beacon

只有攻击者的创造力才能限制 C2。在考虑如何阻止具有巧妙 C2 通道的攻击者时,我们通常必须依靠检测网络上的统计异常和差异。例如,网络监控工具可以检测到

  • C2 使用的长连接,但这种长连接对于所讨论的协议来说是不自然的。HTTP 是不常见长连接的协议之一,但攻击者可能将其用于远程控制。 
  • C2 使用的信标(Beacons)来指示受害者还活着并准备好接收命令。信标被许多种类的软件使用,不仅仅是攻击者,但了解哪些信标存在以及您期望哪些信标是好的实践。 
  • 突然从网络爆发的数据脉冲。这可能表明应用程序正在进行大型上传,或者攻击者正在窃取数据。尝试了解是哪个应用程序和用户导致了数据脉冲,并为其添加上下文。这正常吗? 

存在许多方法可以供防御者尝试查找异常。这些异常应与发送数据的源系统的数据进一步相关联。

对于网络监控,应应用上下文以帮助区分噪声和信号。这意味着 SOC(“安全运营中心”)应尝试丰富数据,例如源和目标 IP 地址,并添加上下文以帮助使数据更有价值。

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


点对点流量

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

然而,攻击者很可能希望使用点对点(即客户端到客户端)通信来利用低垂的果实,例如重用凭证或利用薄弱或易受攻击的客户端。

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

Peer-to-Peer


横向移动和枢轴

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

枢轴(Pivoting)是指攻击者使用被妥协的主机来触及其他网络。这里展示了一个插图,其中 Eve 妥协了一个系统并正在利用它来扫描和发现其他系统。

Pivoting Lateral Movement

横向移动(Lateral Movement)是指利用枢轴并利用枢轴来攻击另一个系统。这个新系统现在可以进一步用于枢轴和更多的横向移动。在此示例中,Eve 使用 Server X 进一步发现 System B。

Pivoting Lateral Movement



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持