渗透测试基础(全)(2)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 渗透测试基础(全)

渗透测试基础(全)(1)https://developer.aliyun.com/article/1525430

传输协议和端口

互联网协议(IP)是一种网络层协议。如果您不熟悉不同的协议层,您应该查找开放系统互连(OSI)模型。位于 IP 之上的是传输层协议。通常,它们是传输控制协议(TCP)和用户数据报协议(UDP)。这些协议各有不同的功能。如果你绝对地、肯定地必须让它到达那里,并且你想知道它到达那里,你会使用 TCP。这有点像你去邮局时使用递送确认。你会得到类似送货收据的东西。如果你根本不在乎,只是想把它扔在风中,你会使用 UDP。使用 UDP,您会获得一点速度优势,因为没有确保您的消息在另一端被接收的所有开销。使用 TCP,您可以确保不会留下任何数据包。

每种传输层协议都需要一种多路传输流量的方法,这样即使在一台计算机上也可以同时进行多种通信交换。这是通过使用端口来实现的。当数据包在计算机之间(甚至在一台计算机上)发送时,每个数据包都由源端口和目的端口标记,因此计算机可以跟踪它是哪个通信交换的一部分。如果我们没有端口,系统将不知道将入站消息与什么相关联。使用端口,操作系统知道什么应用程序应该得到正在被接收的任何消息。很明显,这在服务器端是正确的,但在客户端也是正确的。当服务器响应时,它必须构建其响应,以便客户端计算机能够将数据包定向到正确的应用程序。因此,服务器利用到达消息中的源端口成为返回消息中的目的端口。传出消息使用的源端口不能在应用程序间重用,这就是为什么操作系统知道如何用返回消息返回到发送消息的应用程序。然而,即使操作系统会跟踪这些信息,这些端口也不会被认为是开放的,因此它们永远不会显示为侦听。当您远程扫描一个系统时,您将永远看不到刚刚用作连接到另一个系统的源端口的端口。

端口扫描

端口扫描使我们能够找到主动侦听来自互联网其余部分的连接的端口。这意味着应用程序已经绑定到该端口,并向操作系统表明它准备好接受该端口上的连接。您可以通过使用 telnet client 或 netcat 之类的程序一次连接一个端口来手动进行端口扫描,但最简单和最好的方法是使用端口扫描程序,该程序可以在成千上万个可用端口中自动执行扫描过程。有几种,但使用最广泛的是 nmap。端口扫描程序的目的是与目标系统通信,以触发指示端口是否正在侦听的响应,这是端口扫描器会做的。这取决于您使用的传输协议。TCP 和 UDP 的行为方式完全不同。这是因为 TCP 是面向连接的协议,这是确保承诺的有保证的交付所必需的。相反,UDP 是无连接的。端口扫描器将利用不同传输协议的工作方式来确定端口是打开的(监听)还是关闭的(不监听)。因此,对 TCP 在系统间建立连接的作用有一个基本的了解是很有用的。为了建立从一个系统到另一个系统的连接,TCP 使用所谓的三次握手。

三次握手做了几件事。首先,它确定另一端有人在听。这可以通过双向握手来完成,因此它也保证了声称的发送者在那里,并且通信不是伪造的,通常被称为欺骗。一旦我们知道所讨论的系统已经就位并可以进行通信,三次握手的另一件事就是设置一些必要的信息,以确保消息以正确的顺序被正确接收。

有两个头字段用于确保消息以正确的顺序发送和接收。这是序列号和确认号,它们是同一枚硬币的两面。序列号是用来表示我们在序列中的位置的。确认信息被发送回去,以表明在另一端已经收到了哪些消息。例如,如果我发送了 100 个字节,我的序列号就是 100。如果另一端已经接收到所有的字节,确认号将是 101,以表示它希望看到下一个字节。

使用 nmap,可以通过两种不同的方式使用三次握手。第一种是 SYN 扫描,也称为半开扫描。在我们深入了解这是什么之前,让我们来看看三方握手实际上是什么样子的。我们将快速浏览一些概念,帮助您更好地理解不同类型的扫描及其工作原理。如果你想更深入地了解,网上有很多资源可以让你更深入地了解 TCP/IP 协议族。

在图 3-5 中,您可以看到左边的客户端笔记本电脑正在与右边的另一个系统进行通信。客户端系统发送设置了同步(SYN)标志的消息。此外,还有一个序列号的 TCP 字段,它被设置为该消息的一部分。这称为初始序列号(ISN ),它不仅用于确定发送消息的顺序,还用于确定接收消息的顺序。接收系统(您可以将其视为服务器)通过设置确认标志(ACK)来做出响应,表示消息已收到。与 ACK 标志一起,它将确认号字段设置为比接收到的序列号大 1。这告诉客户端,在这种情况下,它期望下一个字节数。除了 ACK 标志和编号之外,服务器还通过初始化自己的序列号来建立自己的通信端,客户端将需要这个序列号。因此,它会设置 SYN 标志和序列号。

图 3-5。

Three-way handshake

服务器可以使用两个单独的消息来发送 SYN 和 ACK,但是从通信流的角度来看,将两个消息放在一个包中更紧凑。现在,客户端已经表明它想要进行通信,并且建立了用于通信的参数。服务器已作出响应,表明它已开始营业,并已确认客户端。建立双向通信通道的最后一步是客户端向服务器确认。一旦发生这种情况,使用 ACK 标志和确认号来指示序列号已被接收,三次握手就完成了,双方准备好发送和接收消息,根据需要根据正在传输的字节数增加序列号和确认号。

TCP 扫描

SYN 扫描是一种常见的扫描技术,有时也称为半开扫描。在 SYN 扫描中,运行扫描器的系统向目标发送 SYN 消息。目标将通过 SYN/ACK 做出响应,表示端口已打开,或者通过设置了重置(RST)标志的消息做出响应,表示需要重置或关闭通信。这些响应中的任何一个都将告诉扫描器端口的状态,然后可以传递给用户。

这种扫描还有一种可能性,或者您可以使用的任何其他类型的扫描。如果扫描仪没有得到任何反应,这可能意味着一些事情。首先是系统瘫痪了。有些扫描器,如 nmap,会发出 Internet 控制消息协议(ICMP)回应请求,以确定系统是否启动。如果系统用回应应答来响应回应请求,而端口没有响应,这意味着扫描数据包或对扫描数据包的响应被丢弃。使用 TCP,因为它是面向连接的,所以消息将被多次重发,以确保消息不会在传输过程中被简单地丢弃。如果经过多次重试后,仍然没有应答,扫描器将认为数据包被某种过滤器丢弃。结果,您将得到指示该端口正在被过滤的响应,这可能意味着存在某种东西,但只是有防火墙挡路。

默认情况下,像 nmap 这样的扫描器只会扫描有限数量的端口。默认情况下,nmap 将扫描大约 1000 个众所周知的端口。如果您想扫描更多,您可以提供一个逗号分隔的列表或一个范围。你也可以通过在命令行添加一个-p-来告诉 nmap 扫描所有 65,536 个端口,如图 3-6 所示。扫描的端口越多,完成扫描所需的时间就越长,这也是 nmap 默认使用最有可能被使用的端口的原因之一。图 3-6 中的扫描是针对本地网络默认网关的 SYN 扫描。有三个端口显示为打开,一个端口显示为关闭。通常,您不会在列表中看到关闭的端口,因为没有任何理由显示关闭的端口。如果他们不出现,他们被认为是关闭的。在这种情况下,仅从 nmap 扫描结果来看,不清楚为什么会显示关闭的端口。为了确定为什么 nmap 不只是忽略关闭的端口,您必须查看交换的数据包。

图 3-6。

nmap scan

由于我们所做的是半开扫描,我们将目标系统置于半开连接状态,这意味着有一个端口正在等待最终确认。为了防止系统利用保持端口打开的资源,nmap 礼貌地向目标系统发送 RST 消息,指示它应该关闭通信,不要再期待任何东西。可能会注意到许多半开连接,因为半开连接可能是 SYN flood 的指示。半开放连接是指已经收到 SYN 消息并发送了 ACK,但尚未收到返回 ACK 的连接。另一个 TCP 扫描使用–sT而不是–sS。这是一个连接扫描,这意味着它通过整个三次握手来创建开放的连接,然后将其拆除。这稍微礼貌一点,但是也增加了扫描器和目标之间发送的消息总数。

SYN 泛洪是通过发送大量 SYN 消息,在系统上留下大量半开连接而产生的。目标上的操作系统可能只有有限数量的插槽可用于这些半开连接,因此有可能使目标处于无法接受任何附加连接请求的状态,从而导致拒绝服务。

还有其他类型的扫描使用 TCP 作为传输协议,并利用 TCP 内置的其他标志,但 SYN 扫描和连接扫描通常会为您提供有关打开和关闭端口的信息。其他扫描曾经有助于逃避检测,但除非您正在使用设备非常过时的网络,否则其他类型的扫描不太可能为您提供与两种最常见的扫描有很大不同的详细信息。

UDP 扫描

虽然您通常连接的大多数服务都使用 TCP 作为传输协议,但并不是所有的服务都这样。其中一些,如 DNS、NTP 和 Syslog,使用 UDP。UDP 扫描的不同之处在于没有定义的发起通信的模式。在 TCP 的情况下,您发送一个 SYN 消息,端口响应指示它是打开的还是关闭的。这在协议中有很好的定义。就 UDP 而言,它应该是快速的和无连接的。这意味着应用程序需要处理诸如消息顺序和确定消息是否已经收到之类的事情。

如果 nmap 向 UDP 端口发送消息,但没有得到应答,这并不意味着什么。这可能意味着端口被关闭并且没有响应。这可能意味着消息被丢弃。这可能意味着有一个应用程序,但该应用程序通常不会对它收到的消息发送响应。因此,nmap 将不得不继续重试该端口,直到它得到一个应答或者干脆放弃,并且它放弃的事实可能实际上意味着或者可能不意味着任何有用的东西。对于 TCP,有与重试相关联的计时规则。这包括回退计时器,以确保您等待可变长度的时间,以防这只是一个计时问题,您在某个地方遇到拥塞。使用 UDP,所有这些都完全取决于应用程序,没有一致的规则。

使用 nmap,您可以使用标记“–sU”进行 UDP 端口扫描。您还可以指定要尝试的端口,就像 TCP 扫描一样。TCP 和 UDP 扫描都允许您使用节流参数"-T"设置扫描速度您最多可以设置 5 个数字,其中 3 是默认值。较低的油门数字会降低通信速度,这可能有助于减少目标对您的检测。更高的限制数导致通信速度更快。你的扫描会更快,但是你会在很短的时间内向你的目标发送大量的流量,这可能会被警惕的防御者注意到。

尽管基本的 TCP 和 UDP 扫描非常常见,但是您可以使用 nmap 进行许多其他类型的扫描。其他一些方法包括在 TCP 报头中设置不同的标志,如 FIN 扫描或 XMAS 扫描。FIN 扫描设置完成(FIN)标志。圣诞节扫描设置了许多其他奇怪的标志,你永远不会看到在同一时间设置。所有的旗帜都摆好后,据说会让包裹像圣诞树一样亮起来。

操作系统和版本扫描

nmap 可以为您获取大量信息,随着您对它的了解越来越多,您甚至可以编写 nmap 可以为您运行的脚本。一条可能非常有用的信息是操作系统的名称和版本。在图 3-7 中,你可以看到一个操作系统扫描的例子,它是使用–O作为参数请求的。

图 3-7。

nmap operating system scan

您可以将操作系统扫描与另一个扫描(如 SYN 扫描)结合使用。Nmap 利用由 nmap 开发人员维护的指纹数据库来识别目标操作系统。它利用与打开和关闭端口和初始序列号相关的行为,以及与网络通信和协议相关的其他行为。在此处显示的情况下,扫描正确地识别了目标操作系统,但错误地识别了其版本。版本不正确意味着可能还没有被扫描的操作系统的较新版本的指纹。

除了确定正在使用的操作系统之外,nmap 还能够确定正在运行的应用程序和版本。它通过尝试从与服务的交换中提取信息来实现这一点。为了执行版本扫描,您可以向 nmap 提供-sV。如果您提供-A作为参数,它将进行版本扫描和操作系统扫描。

高速扫描

nmap 不是唯一可用的扫描器,尽管它被广泛使用。还有其他扫描仪,如 masscan,可以非常快速地进行大规模网络扫描。像 nmap 这样的工具可以扫描大的地址块,但它并不是专门为这个功能而开发的。因此,nmap 完全有能力进行大型扫描,但是如果您有大量的地址块需要扫描,您可能需要考虑专门为此开发的扫描仪。由于 nmap 被广泛认为是默认使用的扫描仪,像 masscan 这样的较新的扫描仪已经实现了相同的命令行参数,以便兼容。massscan 是专门为大型网络的高速扫描而开发的端口扫描仪。既然你在做同样的工作,没有什么特别的理由去多此一举。指定目标、端口和扫描类型的方式与在 nmap 中相同。使用 masscan,您还可以设置每秒数据包的速度。由于 masscan 不使用系统网络堆栈来创建和发送数据包,因此速度非常非常快。在硬件上运行的 Linux 系统的情况下,这意味着不是在虚拟机中,据说它每秒能够发送超过 150 万个包。这可能足以在您的网络上引起重大问题,因此请确保您有一个非常好的理由以该速度运行,并且您已经通知了负责您正在测试的网络的任何人,以防止中断。如果您正在使用或测试客户的网络,这一点尤其正确。

抓取横幅

nmap 可以做的另一个功能是抓取横幅。这意味着它连接到应用程序端口,并获取服务器应用程序在该连接上发出的任何消息。这些被称为横幅或欢迎信息。有时你可以从他们那里得到应用程序的名字和版本号。

识别应用程序和版本是有帮助的,因为通过使用应用程序和版本号,您可以查找可能被利用的漏洞。您可以在很多地方查找这些信息,包括每个供应商,但是您也可以使用常见漏洞和暴露(CVE)项目。你可以在cve.mitre.org访问 CVE 项目维护的数据库。CVE 项目是一种供应商中立的跟踪软件漏洞的方式。他们的数据库会给你一个方法在一个地方查找问题。CVE 知识库是获取这些信息的一个地方。它不是唯一的一个,但是它已经存在了超过 15 年,并且相当全面。

虽然 nmap 能够确定应用程序的名称和版本,但是您可能更喜欢自己直接与应用程序服务器进行交互。一个可以用来做这件事的程序是 telnet 客户端。telnet 这个词有点奇怪,因为它可以指客户机、服务器或协议。在我们的例子中,我们将使用您通常用来连接到 telnet 服务器的程序。然而,这并不是这把小小的瑞士军刀能够发挥的唯一功能。实际上,telnet 客户端实际上只是一个程序,它启动一个到您想要的任何端口的 TCP 连接。如果不指定端口,它默认为端口 23,这是 telnet 服务器将侦听的默认端口。如果您连接到 telnet 服务器,客户端将为您完成 telnet 应用程序协议的所有协商。但是,如果您指定了另一个端口,telnet 客户端将只留给您一个到在该端口监听的应用程序的原始连接。在图 3-8 中,您可以看到使用 telnet 客户端连接到 Google 的 Web 服务器。

图 3-8。

Using the telnet client

一旦您使用 telnet 建立了与服务器的连接,您将需要知道一些协议命令以获得响应。有些连接,比如到 SSH 服务器的连接,根本不需要任何协议知识。它将只为您提供版本,如下图所示。除了连接之外,SSH 服务器提供了它的协议版本以及应用程序的名称和版本:

telnet 172.30.42.23 22
Trying 172.30.42.23...
Connected to 172.30.42.23.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.9

然而,并不是所有的服务器都是这样,正如你在图 3-8 中看到的。即使使用了正确的协议,服务器也只提供服务器的名称。在这种情况下,我们通过使用命令GET / HTTP/1.1指示我们正在使用“协议版本 1.1”在服务器的根处寻找默认网页。除此之外,我们指出我们正在寻找的主机名,因为 HTTP 协议的 1.1 版本提供了在单个 IP 地址上虚拟服务器的可能性。然而,我们得到的回报是,这是gws,我们只是碰巧知道它是“谷歌网络服务器”。没有版本号。当然,这是一种安全的操作方式,但并不是所有的软件在信息方面都如此吝啬。

telnet 客户端只能使用 TCP 作为传输协议。如果您想使用 UDP,您将需要使用完全不同的程序。netcat 就是这样一个程序,它也能够使用 TCP,就像 telnet 客户端一样。它还可以在您指定的任何端口上用作 UDP 或 TCP 的监听器。在图 3-9 中,你可以看到一个使用 netcat 连接到 UDP 服务器的例子。为了便于演示,netcat 正在连接的服务器是一个简单的 Python 脚本,当消息到达时,它只是用received进行回复。真实世界的 UDP 服务不会轻易响应,否则它们的通信将是二进制的,不可读的。

图 3-9。

Using netcat with UDP

为了在 netcat 中使用 UDP,您需要在命令行中指定–u。否则,netcat 默认使用 TCP 作为传输协议。Netcat 还支持 IPv4 或 IPv6,这使得它非常通用,因为越来越多的企业开始在其网络中实现 IPv6。服务提供商并不允许 IPv6 从客户端通过他们的网络。因此,您不太可能对客户端进行任何远程 IPv6 测试。然而,您有时很可能从客户端网络内部执行测试,因此您可能需要使用 IPv6。

摘要

开始渗透测试时,您会希望在目标网络上找到系统。一旦您找到了有响应的系统,您就需要找到开放的端口。打开的端口将告诉您哪些应用程序正在这些系统上侦听,因为如果没有应用程序在端口上侦听,就不可能有一个端口是打开的。在我们开始检查开放端口之前,您需要理解 IP 地址如何映射到主机名,反之亦然。有几个工具可以与 DNS 一起使用来查找关于目标域的信息。这包括不同类型的主机记录,如邮件交换器。许多信息也与域名相关,尽管有时这些信息是私人的。您可能会获得姓名和电子邮件地址,以便在以后的社交工程攻击中使用。除此之外,您还可以获得与该域相关联的名称服务器,这可能会告诉您该公司正在使用的基础架构的一些信息。

虽然 nmap 是最常见的端口扫描器,并且已经存在了 15 年以上,但它并不是唯一可用的端口扫描器。大多数可用的扫描器与 nmap 做同样的事情,尽管其中一些被设计为在同时扫描大块 IP 地址的情况下更快。使用 nmap,您可以扫描 TCP 和 UDP 端口,并确定底层操作系统。虽然 UDP 扫描非常简单,但是您可以执行多种 TCP 扫描类型。这包括设置不同的 TCP 标志,以便有可能逃避保护或检测。

一旦确定了开放端口,如果可能的话,您将需要确定应用程序和版本。虽然您可以使用 nmap 来收集这些信息,但是您也可以自己使用 telnet 客户端或 netcat 之类的程序来收集这些信息。使用这些程序,您可以自己启动到监听服务的连接,然后如果您向服务器发送协议命令,通常可以得到响应。不是所有的服务都是基于文本的,这意味着你可能不能仅仅发送简单的命令。相反,你可能需要利用一个能为你发送二进制信息的程序,或者你可以自己写一个简单的程序来做这件事。有时,您只是希望能够验证自动化工具提供的响应。这是您可能希望使用 telnet 或 netcat 等手动技术的另一个原因。

练习

  1. 使用 nslookup 和 dig 获取您个人或公司域的邮件交换记录。如有必要,使用gmail.com作为您正在查找的域。
  2. 获取与 IP 地址4.2.2.18.8.8.8相关联的主机名。
  3. 获取与您公司的 Web 服务器主机名相关联的 IP 地址。从主机名中获得 IP 地址后,反向查找 IP 地址,查看相应的主机名是什么。
  4. 对本地网络中的所有主机执行 SYN 扫描。大多数家用网络设备提供/24 网络,这意味着它提供 255.255.255.0 的网络掩码。为了扫描整个网络,您可以提供网络地址,后跟网络掩码或子网位数,如/24。例如,如果您的网络位于 192.168.1.0 上,您应该扫描 192.168.1.0/24。
  5. 使用 nmap 或您选择的工具在您的网络上执行全连接 TCP 扫描。看看同步扫描有没有什么不同。
  6. 使用 nmap 或您选择的工具在您的本地网络上执行 UDP 扫描。比较 UDP 扫描和 TCP 扫描所用的时间。

四、漏洞

如果您已经一章一章地学习了,现在您已经有了一些响应连接尝试的系统的 IP 地址。您还拥有这些系统上开放的端口列表。你要做的下一件事是弄清楚你如何进入那些系统。您需要知道这些端口背后的应用程序可能存在哪些漏洞。

我们知道,如果有一个开放的端口,就有一个应用程序在监听它。端口不会神奇地打开,如果端口没有打开,操作系统会简单地重置连接。这意味着,如果您在 TCP 连接上收到对连接尝试的响应,您就知道有一个程序在等待您的响应。然而,对于 UDP 应用程序来说,情况稍微复杂一些,因为对于发送到 UDP 端口的消息,没有定义响应。UDP 协议规范没有说明在开放端口上有通信时应该做什么。本质上,根据协议定义,响应完全由应用程序决定,而完全不由操作系统决定。

您的扫描很有可能打开了端口,无论它们是 TCP、UDP 还是其中的一部分。端口号,以及您收集的任何横幅,在您试图找出下一步该怎么做时会有些用处。下一步是寻找漏洞。虽然有很多方法可以手动完成这项工作,但最好的方法是使用漏洞扫描器。如果你正在为一家公司工作,并且你有一个体面的预算,有一些优秀的商业扫描仪。然而,如果你只是想自己做一些学习和调查,或者如果你有一个很小的组织,几乎没有预算,有开源和非常低成本的扫描仪非常好,易于使用。

在我们开始研究这些扫描器之前,我们将回顾一下什么是漏洞,并研究一些识别漏洞的方法。这将包括查看一些常见的扫描仪以及如何使用它们。

什么是漏洞?

在你去寻找某样东西之前,你应该知道它是什么。漏洞仅仅是系统中的弱点,无论该系统是软件、硬件设计还是网络。您可能会发现漏洞的原因有很多。这可能只是配置错误,启用了不必要的功能,这些功能可能会被恶意使用。一个例子是意外打开匿名 FTP,这可能允许某人上传大量数据,从而导致磁盘被填满。如果 FTP 服务器可以访问敏感数据,并且打算在用户可以访问之前要求进行身份验证,则同样的错误配置可能会允许从该服务器提取敏感数据。具有大量配置设置的复杂软件,包括 Web 服务器和 Java 应用服务器,仅举几个例子,就容易出现这种错误配置。

就漏洞而言,错误配置并不是唯一的可能性。错误的配置并不总是导致系统能够做一些有趣的事情。这就是我们想要软件缺陷被利用来做有趣的事情的地方。有许多不同类型的错误会导致系统被利用。其中最持久和最常见的是缓冲区溢出。缓冲区是用于存储数据的一块内存。在这种情况下,它将是一个内存块来存储用户提供的一段数据。缓冲区的大小是固定的,如果用户发送的数据比预期的多,那么后续的内存空间就会被超出的部分填满。这是某些编程语言(最著名的是 C 编程语言)没有输入约束的结果。由于输入缓冲区存储在称为堆栈的内存结构中,并且程序要返回的内存位置的地址也存储在内存中,这种特殊类型的漏洞为攻击者打开了大门,攻击者可以通过操纵返回地址来控制执行流,迫使程序转到攻击者控制的一组代码。图 4-1 显示了一个堆栈的简单示意图。顶部是内存缓冲区。一旦分配给缓冲区的空间用完,剩余的空间开始流入它下面的所有内容,包括已经保存的地址,以便将执行流返回到调用内存段。

图 4-1。

Stack using a buffer

有一些方法可以修复这种类型的漏洞,包括使堆栈不可执行。您还可以使用一种称为堆栈金丝雀的东西,它是一个随机值,在将执行返回到内存中的调用区域之前会对其进行检查。如果金丝雀是它所期望的那样,寄信人地址就被认为是安全的。如果金丝雀被改变了,程序将会暂停,而不是将控制权返回给攻击者可能已经上传到正在运行的程序中的代码。

我们不会详尽地列出所有不同类型的漏洞,而是会在缓冲区溢出问题上停下来,因为这是一个经典问题,至今仍存在。您可能想看看其他主题,如竞争条件、堆溢出、整数溢出和各种注入攻击。你可以看到溢出是很常见的。大多数情况下,任何时候程序接受用户的输入,用户的输入都应该被认为是完全不可信的,但是程序员并不总是这样做。或者,在试图做正确的事情的过程中,他们可能无意中打开了通往其他事情的大门。无论哪种方式,都有许多不同类型的漏洞。开放 Web 应用程序安全项目(OWASP)每年都会跟踪常见的漏洞。虽然 OWASP 通常专注于 Web 应用程序安全,但不同的漏洞类别通常存在于不同的应用程序类型中。

其他组织,如计算机应急响应小组(CERT ),也跟踪主要漏洞,但与 OWASP 不同,它包括漏洞的类型,CERT 列出具体的漏洞。类似 CERT 的列表是基于实际攻击的。他们根据已报告的攻击信息创建列表。由于已知的攻击,该列表最终成为组织需要立即解决的所有基本漏洞。还有其他组织也有类似的名单。

漏洞扫描器

现在我们或多或少知道了什么是漏洞,我们应该开始寻找一些漏洞。毕竟,我们需要找到进入系统的方法来赚取我们的薪水,我们通过利用漏洞来做到这一点。您当然可以通过大量的手工工作来找到这些漏洞,但是如果您使用扫描仪,这要容易得多;有几种可供选择。可能性范围从非常高端的商业扫描仪到开源扫描仪,中间有大量的选择。漏洞扫描器从 20 世纪 90 年代就已经出现了。最早的一个是分析网络的安全管理员工具(撒旦)。撒旦是由 Dan Farmer 和 Wietse Venema 在 20 世纪 90 年代中期开发的。Farmer 和 Venema 都因他们参与的其他安全相关项目而闻名。法默从计算机甲骨文和密码扫描仪开始,其中包括一些专门的漏洞检查。

撒旦附带了一个小脚本,可以让你把撒旦这个词的所有实例都改成圣诞老人,给那些可能被撒旦这个名字冒犯的人。目前的商业扫描仪圣人是基于撒旦。安全审计员的研究助理(SARA)也是撒旦的追随者。

漏洞扫描器通过对系统和软件运行大量测试来工作。这可能包括运行端口扫描来查找打开的端口和侦听应用程序。它还会检查操作系统是什么。基于这些数据,漏洞扫描程序将确定是否存在潜在的漏洞。它实际上并没有利用这些漏洞。它也不能定位未知的漏洞。如果一个软件中有一个缺陷到目前为止还没有被报告,扫描仪就不能将其识别为一个问题。这包括通常所说的零日攻击。零日漏洞是指已经开发了一个漏洞,但该漏洞尚未向软件供应商披露,因此可以修复的软件错误。因此,软件的安装容易受到零日持有者的攻击,直到供应商意识到该漏洞并开发出可以安装的修补程序。

漏洞扫描器从数据库或模块集合中运行。这些测试集需要定期更新,以便跟上存在的大量漏洞。事实是,软件缺陷不断被发现,包括非常旧的软件。

近年来一个值得注意的错误是 ShellShock,这是 Bourne-again shell (bash)中的一个漏洞。这是一个存在了大约二十年的漏洞,但直到最近才被发现。仅仅因为一个软件或者一个操作系统是旧的,并不意味着没有新的错误被发现。

在过去的几十年里,关于研究人员和 bug 猎人,以及当他们发现一个 bug 时应该如何与软件供应商互动,安全社区内部一直存在争论。许多软件供应商长期以来更愿意在任何关于缺陷的事情被公之于众之前有足够的时间来修复缺陷。一旦问题被披露,在供应商修复缺陷之前,恶意用户可以利用这些详细信息来创建和利用漏洞。发布可能被用来暴露无辜和不知情的用户的细节是不道德的。然而,对于供应商来说,不修复他们已经被告知的漏洞也是不道德的。因此,有一个中间地带。像微软这样的公司愿意与研究人员合作,并允许研究人员将自己的发现归功于自己。他们也有一个验证错误并解决它们的过程。其他公司在及时解决问题方面做得不太好,并且通常在安全社区中以不解决问题和不与研究人员合作而闻名。

有像 Bugtraq 和 Full Disclosure 这样的邮件列表,其中经常发布与第三方(如 bug 猎人和研究人员)发现的问题相关的公告。除了了解第三方披露的错误,您还可以了解可用于利用这些漏洞的概念验证代码。

扫描漏洞

这里需要注意的是,虽然漏洞扫描器并不实际运行漏洞来确定系统是否易受攻击,但您总是有可能影响系统的运行。仅仅是扫描行为就可能导致系统或应用程序故障。在扫描系统之前,您确实应该向系统所有者提供大量通知,以便他们在受到影响时做好准备。可以使用 Canvas、Core Impact 和 Metasploit 等漏洞利用框架来验证漏洞。

有许多漏洞扫描器。你可以购买软件扫描仪或设备。您可以利用开源解决方案,或者您可以简单地购买一项服务,由提供商通过互联网或专用网络连接为您进行扫描,然后向您提供结果。这里我们将重点介绍 Nessus、Nexpose 和 OpenVAS。首先,查看这些的原因是因为它们很容易获得并且有免费版本。一旦你熟悉了这些是如何工作的,你应该能够使用你遇到的任何其他扫描仪。

当您执行漏洞扫描时,需要了解一些事情。扫描程序将根据您提供的配置及其存储的已发布漏洞数据库,检查所有可能的漏洞。每个扫描仪都有不同的配置选项集。有些比其他的更详细。此外,随着时间的推移,不同的扫描仪已经改变了它们的选项和配置方式。在图 4-2 中,您可以看到 Nessus 中高级扫描选项的一部分。Nessus 已经存在很长时间了,是一个备受尊敬的漏洞扫描器。它最初是一个拥有独立客户端的开源扫描仪。目前,您为 Nessus 配置了一个不断发展的 Web 界面。像 Nessus 这样的产品可能会随着时间的推移而改变其界面。在某些时候,界面可能会与您在此屏幕截图中看到的有所不同。

图 4-2。

Nessus options

虽然 Nessus 必须获得商业使用许可,但它的开发商 Tenable Security 确实提供了家庭许可证。使用家庭许可证不需要任何费用,但它严格是非商业性的,它将只允许您扫描多达 16 个 IP 地址。如果你想看看你所有的家庭系统,或者你只是想获得一些在你的家庭系统上使用它的经验,你可以下载 Nessus。然而,为了在商业环境中使用它,包括作为顾问,你需要支付商业许可证。当前的 Nessus 产品提供了许多预配置的模板,包括用于支付卡行业(PCI)合规性审计的扫描模板。

一旦选择了所有选项,就可以开始扫描了。该界面旨在为您提供即时反馈。在图 4-3 中,您可以看到显示扫描结果的图表。此图表显示了被发现具有运行系统的 IP 地址,以及每个 IP 地址发现的每种类型漏洞的数量。漏洞从左到右排列,最严重和最关键的漏洞位于条形的左侧,最不严重的信息性发现位于条形的右侧。在这个特殊的例子中,大部分的发现只是信息性的。虽然有一些与第一个列表 172.30.2.8 相关的重要发现,但它并不是一个很大的数字,并且显示的红色长条几乎不可见。如果我把鼠标放在红色的长条上,Nessus 显示有一个重要的发现。

图 4-3。

Nessus results

扫描器通常能够检查远程和本地漏洞。远程漏洞是一种不需要您在系统上的漏洞。您可以在任何能够通过网络连接访问系统的地方。本地漏洞是指需要用户打开系统会话的漏洞。这可能意味着坐在计算机前,甚至通过远程连接协议(如远程桌面协议(RDP)、安全外壳(SSH)或 Telnet)进行连接。如果您连接到系统,可以运行安装在系统上的程序,则您拥有本地连接,可以触发本地漏洞。

Nessus 扫描会检查远程漏洞,因为如果我在网络上,扫描仪就只能看到这些。包括 Nessus 在内的一些扫描仪将允许您提供本地凭据。您可以使用安全外壳(SSH)连接、服务器消息块(SMB)、Telnet 或其他类型的远程访问进入。提供凭据将允许您作为本地系统的授权用户获得扫描程序可以找到的所有漏洞的列表。这可能包括过时的软件包或系统上的错误配置,这可能会将系统暴露给想要执行恶意或未经授权的操作的本地用户。扫描器通过网络登录到被扫描的系统,以获得进行本地检查所需的本地访问权限。

任何本地扫描都将限于已通过身份验证的用户被授予的权限。管理用户通常拥有系统的完全运行权限,而其他用户可能无法识别所有已安装软件的所有漏洞。

许多管理员可能对本地漏洞不太感兴趣。原因是,为了获得对漏洞的访问权限,攻击者必须使用远程漏洞或一组授权的凭据获得对系统的访问权限。一些管理员和组织会认为触发本地漏洞的唯一方式是攻击者对系统进行物理访问。组织有时认为他们的员工完全值得信任,因此本地漏洞不值得花费资源来修复。如果您运行的 Web 服务器相当坚固,那么您可能会担心更新系统上的某些库可能会影响站点的功能。保持网站的功能性很重要。如果用户不能利用由于更新而损坏的页面,说系统更新了新软件不会让任何人感觉更好。

更新软件有可能导致停机。一些系统对停机更敏感,因此请求对这些系统进行更新需要一个广泛的过程来证明更新的重要性。

当然,Nessus 不是唯一可用的扫描仪。虽然它是商用的,但它并不是唯一一款免费的商用扫描仪。Rapid7 提供的 Nexpose 也有社区版。Nexpose 的社区版本与 Nessus 的家庭许可证有类似的限制。社区许可证允许您访问所有功能,但您只能访问 16 个目标。除了个人使用,这通常会使它不切实际。如果您必须一次扫描 16 台主机,那么即使只扫描 254 台主机的 C 类地址,也要花费相当长的时间,然后导出数据并清除数据库,然后才能重新开始。社区版本对于在家学习和测试是有好处的,但是如果你想在真实的环境中使用它,它真的没有太大的意义。

使用 Nexpose 的一个优点是它可以与 Metasploit 集成。Metasploit 是一个漏洞利用框架,因此集成意味着您可以在很短的时间内从漏洞识别快速转移到验证和/或利用。就像 Nessus 一样,Nexpose 也有一个 Web 界面。Nexpose 和 Nessus 之间的一个很大区别是 Nexpose 的组织方式。Nessus 提供了您可以用来开始工作的扫描和策略,Nexpose 添加了组织和站点。这种详细程度对于可能有许多客户的顾问来说非常有用。他们想要区分他们的客户,甚至他们的客户站点。您创建了一个存储组织信息(包括联系人)的站点,因此您最终会得到一个与您的扫描相关的更全面的信息数据库。在图 4-4 中,你可以看到启动 Nexpose 扫描的样子。您可以点击通过许多信息收集屏幕,但它可能有助于存储这些信息。

图 4-4。

Nexpose scan start

从屏幕截图中,您可以看到收集的所有信息。您可以使用主机列表、地址范围和一组排除规则来跟踪与组织关联的所有资产。您可以选择想要使用的模板,也可以设置凭证,就像使用 Nessus 一样。使用 Nexpose,您可以拥有多个用户并对组织设置访问控制。通过这种方式,您可以向可能需要查看结果以开展补救活动的其他用户提供访问权限。一旦建立了拥有所有资产、凭据和访问控制的组织,您就可以开始扫描或设置开始扫描的时间。一旦扫描开始,您将会看到一个进度指示,如图 4-5 所示。与典型的进度条不同,它提供了结果的快速摘要,包括迄今为止的漏洞计数。

图 4-5。

Nexpose Progress

在继续讨论结果之前,我们要看的最后一个扫描仪是 OpenVAS。OpenVAS 以开源 Nessus 的副本作为新项目的基础开始了它的生命。从那以后,OpenVAS 的架构和界面经历了几次变化。最初,OpenVAS 有一个独立的应用程序,但它已经从修改后的应用程序转向像其他扫描仪一样的网络界面。您可以在图 4-6 中看到基于 Web 的界面的入口点。这台扫描仪的工作方式和其他的相似。您有扫描策略和目标。如果要进行本地扫描,您需要提供凭据。有了 OpenVAS,你可以直接从应用程序的首页进行快速扫描。你插入一个目标,点击开始扫描,OpenVAS 就上路了。

图 4-6。

OpenVAS

一旦完成扫描,您将获得一个潜在漏洞列表。请记住,这些只是潜在的漏洞,而不是确认可利用的漏洞。您仍然需要手动验证它们。这需要使用像 Canvas、Core Impact 或 Metasploit 这样的利用框架。在下一章中,我们将更仔细地研究如何利用漏洞。同时,您应该仔细阅读漏洞类型。你可以通过你正在使用的扫描仪做到这一点。扫描器对它们发现的漏洞有很好的解释,包括补救建议。对于 Nexpose,您将获得到 Metasploit 模块和漏洞数据库网站的链接。这种额外的帮助将使您更快地验证问题。

OpenVAS 默认安装为 Kali Linux 的一部分。事实上,Kali Linux 已经默认安装了很多您可能想要使用的工具。还安装了 Metasploit,您可能也想安装 Nexpose。

但是,在某些情况下,您可以手工进行验证。有些验证非常简单,您可以使用我们之前讨论过的一些技术,比如手动直接连接到服务器。通常,结果的详细信息将提供足够的信息,以便您能够通过轻松复制扫描程序的操作来验证漏洞。如果没有,您可能需要使用其他技术或工具,如漏洞工具包。

渗透测试基础(全)(3)https://developer.aliyun.com/article/1525433

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
安全 Unix Shell
渗透测试快速启动指南(全)(5)
渗透测试快速启动指南(全)
53 0
|
6月前
|
SQL 安全 测试技术
『渗透测试基础』| 什么是渗透测试?有哪些常用方法?如何开展?测试工具有哪些?优势在哪里?
『渗透测试基础』| 什么是渗透测试?有哪些常用方法?如何开展?测试工具有哪些?优势在哪里?
362 0
|
6月前
|
安全 网络安全 数据库
渗透测试快速启动指南(全)(4)
渗透测试快速启动指南(全)
62 1
|
3月前
|
安全 测试技术 网络安全
|
4月前
|
安全 小程序 测试技术
渗透测试具有哪些重要的作用
渗透测试是网络安全管理的关键组成部分,它帮助组织识别和修复安全漏洞,减少数据泄露和系统入侵的风险。通过定期进行渗透测试,组织不仅能够提高自身的安全防护能力,还能够在市场中树立良好的安全形象,增强客户信任。因此,对于任何希望保护其网络资产并维持业务连续性的组织来说,渗透测试都是必不可少的。
|
4月前
|
SQL 安全 网络协议
网络扫描与渗透测试基础
【7月更文挑战第12天】网络扫描与渗透测试是保障网络安全的重要手段,通过模拟黑客攻击的方式,发现潜在的安全漏洞,并提供修复建议,为系统安全保驾护航。在网络安全日益重要的今天,掌握网络扫描与渗透测试技术对于企业和组织来说至关重要。希望本文能够为读者提供有益的参考和借鉴。
|
6月前
|
安全 Linux 网络安全
渗透测试基础(全)(3)
渗透测试基础(全)
112 2
|
6月前
|
安全 Java 测试技术
渗透测试基础(全)(5)
渗透测试基础(全)
48 1
|
6月前
|
安全 关系型数据库 MySQL
渗透测试快速启动指南(全)(2)
渗透测试快速启动指南(全)
70 2
|
6月前
|
安全 Linux 网络安全
渗透测试快速启动指南(全)(3)
渗透测试快速启动指南(全)
80 1