介绍
说到黑客,知识就是力量。您对目标系统或网络的了解越多,可用的选项就越多。因此,在进行任何利用尝试之前,必须进行适当的枚举。
假设我们获得了一个 IP(或多个 IP 地址)来执行安全审计。在我们做任何其他事情之前,我们需要了解我们正在攻击的“景观”。这意味着我们需要确定哪些服务在目标上运行。例如,其中一个可能正在运行 Web 服务器,而另一个正在充当 Windows Active Directory 域控制器。建立这张景观“地图”的第一阶段是所谓的港口扫描。当计算机运行网络服务时,它会打开一个称为“端口”的网络结构来接收连接。端口对于发出多个网络请求或提供多个服务是必需的。例如,当您在 Web 浏览器中同时加载多个网页时,程序必须有某种方法来确定哪个选项卡正在加载哪个网页。这是通过使用本地计算机上的不同端口与远程 Web 服务器建立连接来完成的。同样,如果您希望服务器能够运行多个服务(例如,您可能希望 Web 服务器同时运行站点的 HTTP 和 HTTPS 版本),那么您需要某种方式将流量定向到适当的服务。再一次,端口是解决这个问题的办法。网络连接在两个端口之间建立 - 一个在服务器上侦听的开放端口,另一个在您自己的计算机上随机选择的端口。例如,当您连接到网页时,您的计算机可能会打开端口 49534 以连接到服务器的端口 443。
与前面的示例一样,该图显示了同时连接到多个网站时发生的情况。您的计算机会打开一个不同的高编号端口(随机),用于与远程服务器的所有通信。
每台计算机共有 65535 个可用端口;但是,其中许多已注册为标准端口。例如,HTTP Web 服务几乎总是可以在服务器的端口 80 上找到。可以在端口 443 上找到 HTTPS Web 服务。可以在端口 139 上找到 Windows NETBIOS,可以在端口 445 上找到 SMB。需要注意的是;但是,尤其是在 CTF 设置中,即使是这些标准端口也被更改也并非闻所未闻,因此我们必须对目标执行适当的枚举。
如果我们不知道服务器打开了哪些端口,那么我们就没有希望成功攻击目标;因此,我们必须从端口扫描开始任何攻击。这可以通过多种方式实现——通常使用一个名为 nmap 的工具,这是这个房间的重点。Nmap 可用于执行许多不同类型的端口扫描——其中最常见的将在即将到来的任务中引入;但是,基本理论是这样的:nmap 将依次连接到目标的每个端口。根据端口的响应方式,可以将其确定为打开、关闭或过滤(通常由防火墙)。一旦我们知道哪些端口是打开的,我们就可以查看枚举每个端口上正在运行的服务 - 手动或更常见的使用 nmap。
那么,为什么是nmap?简短的回答是,它目前是行业标准是有原因的:没有其他端口扫描工具能接近它的功能(尽管一些新来者现在正在与它的速度相匹配)。它是一个非常强大的工具——它的脚本引擎变得更加强大,可用于扫描漏洞,在某些情况下甚至可以直接执行漏洞利用!同样,这将在即将到来的任务中详细介绍。
开关
现在,重要的是要了解:什么是端口扫描;为什么有必要;NMAP 是任何类型的初始枚举的首选工具。
与大多数渗透测试工具一样,nmap 是从终端运行的。有适用于 Windows 和 Linux 的版本。对于此房间,我们将假设您使用的是 Linux;但是,开关应相同。默认情况下,Nmap 安装在 Kali Linux 和 TryHackMe Attack Box 中。
可以通过键入终端命令行来访问 Nmap,然后是我们将在下面介绍的一些“开关”(告诉程序执行不同操作的命令参数)。nmap
为此,您只需要 nmap 的帮助菜单(使用 ) 访问和/或 nmap 手册页(使用 访问)。对于每个答案,除非另有说明,否则请包括开关的所有部分。这包括开头 () 处的连字符。nmap -h
man nmap
-
描述
使用 Nmap 进行端口扫描时,有三种基本扫描类型。这些是:
- 技术合作计划(TCP)连接扫描 (
-sT
) - SYN“半开”扫描 (
-sS
) - UDP的扫描 (
-sU
)
此外,还有几种不太常见的端口扫描类型,我们还将介绍其中的一些类型(尽管不太详细)。这些是:
- 技术合作计划(TCP)空扫描 (
-sN
) - 技术合作计划(TCP)FIN 扫描 (
-sF
) - 技术合作计划(TCP)圣诞扫描 (
-sX
)
其中大多数(UDP 扫描除外)用于非常相似的目的,但是,它们的工作方式在每次扫描之间有所不同。这意味着,虽然在大多数情况下,前三种扫描之一可能是您的首选,但值得记住的是,存在其他扫描类型。
在网络扫描方面,我们还将简要介绍ICMP(或“ping”)扫描。
TCP Connect 扫描
若要了解 TCP Connect 扫描 (),请务必熟悉 TCP 三向握手。如果这个术语对你来说是新的,那么在继续之前完成介绍性网络是可取的。-sT
简要回顾一下,三方握手由三个阶段组成。首先,连接终端(在本例中为我们的攻击机)向目标服务器发送 TCP 请求,并设置了 SYN 标志。然后,服务器使用包含 SYN 标志和 ACK 标志的 TCP 响应来确认此数据包。最后,我们的终端通过发送设置了 ACK 标志的 TCP 请求来完成握手。
这是TCP/IP网络的基本原则之一,但它与Nmap有什么关系呢?
好吧,顾名思义,TCP Connect 扫描的工作原理是依次与每个目标端口执行三次握手。换言之,Nmap 尝试连接到每个指定的 TCP 端口,并通过接收到的响应来确定服务是否打开。
例如,如果端口关闭,RFC 9293 会声明:
"...如果连接不存在 (CLOSED),则发送重置以响应除另一个重置之外的任何传入段。通过此方法拒绝与现有连接不匹配的 SYN 段。
换言之,如果 Nmap 发送的 TCP 请求将 SYN 标志设置为关闭端口,则目标服务器将使用设置了 RST (Reset) 标志的 TCP 数据包进行响应。通过此响应,Nmap 可以确定端口已关闭。
但是,如果将请求发送到开放端口,则目标将使用设置了 SYN/ACK 标志的 TCP 数据包进行响应。然后,Nmap 将此端口标记为已打开(并通过发回设置了 ACK 的 TCP 数据包来完成握手)。
这一切都很好,但是,还有第三种可能性。
如果端口是打开的,但隐藏在防火墙后面怎么办?
许多防火墙配置为仅丢弃传入的数据包。Nmap 发送 TCP SYN 请求,但未收到任何回复。这表示端口受到防火墙的保护,因此该端口被视为已过滤。
也就是说,配置防火墙以使用 RST TCP 数据包进行响应非常容易。例如,在 Linux 的 IPtables 中,命令的简单版本如下所示:
iptables -I INPUT -p tcp --dport <port> -j REJECT --reject-with tcp-reset
这可能使获得目标的准确读数变得极其困难(如果不是不可能的话)。
SYN 扫描
与 TCP 扫描一样,SYN 扫描 () 用于扫描一个或多个目标的 TCP 端口范围;但是,这两种扫描类型的工作方式略有不同。SYN 扫描有时称为“半开”扫描或“隐身”扫描。-sS
TCP 扫描与目标执行完整的三次握手,而 SYN 扫描在从服务器接收 SYN/ACK 后发回 RST TCP 数据包(这可防止服务器重复尝试发出请求)。换句话说,扫描开放端口的顺序如下所示:
这对我们黑客来说有很多好处:
- 它可用于绕过较旧的入侵检测系统,因为它们正在寻找完整的三次握手。对于现代IDS解决方案,情况通常不再如此;正是由于这个原因,SYN扫描仍然经常被称为“隐形”扫描。
- 侦听开放端口的应用程序通常不会记录 SYN 扫描,因为标准做法是在完全建立连接后记录连接。同样,这与SYN扫描隐身的想法有关。
- SYN 扫描无需费心完成(和断开)每个端口的三次握手,就比标准 TCP Connect 扫描快得多。
但是,SYN 扫描有几个缺点,即:
- 它们需要 sudo 权限[1] 才能在 Linux 中正常工作。这是因为 SYN 扫描需要能够创建原始数据包(而不是完整的 TCP 握手),这是默认情况下只有 root 用户才拥有的权限。
- 不稳定的服务有时会因 SYN 扫描而关闭,如果客户端为测试提供了生产环境,则可能会出现问题。
总而言之,利大于弊。
因此,如果使用 sudo 权限运行,则 SYN 扫描是 Nmap 使用的默认扫描。如果在没有 sudo 权限的情况下运行,则 Nmap 默认为我们在上一个任务中看到的 TCP Connect 扫描。
使用 SYN 扫描识别关闭和过滤的端口时,应用与 TCP Connect 扫描完全相同的规则。
如果端口关闭,则服务器会使用 RST TCP 数据包进行响应。如果端口被防火墙过滤,则 TCP SYN 数据包将被丢弃,或者通过 TCP 重置进行欺骗。
在这方面,两次扫描是相同的:最大的区别在于它们如何处理开放端口。
[1] 也可以通过赋予 Nmap CAP_NET_RAW、CAP_NET_ADMIN 和 CAP_NET_BIND_SERVICE 功能来使 SYN 扫描发挥作用;但是,这可能不允许许多 NSE 脚本正常运行。
UDP 扫描
与 TCP 不同,UDP 连接是无状态的。这意味着,UDP 连接不是通过来回“握手”来启动连接,而是依赖于将数据包发送到目标端口,并且基本上希望它们能够成功。这使得 UDP 非常适合依赖于速度而不是质量的连接(例如视频共享),但缺乏确认使 UDP 的扫描难度大大增加(并且速度要慢得多)。Nmap UDP 扫描的开关为 (-sU
)
当数据包发送到打开的 UDP 端口时,应该没有响应。发生这种情况时,Nmap 将端口称为 。换句话说,它怀疑端口是打开的,但它可能是防火墙。如果它得到 UDP 响应(这是非常不寻常的),则该端口将被标记为打开。更常见的是,没有响应,在这种情况下,请求将作为双重检查第二次发送。如果仍然没有响应,则端口被标记为打开|过滤,Nmap 继续前进。open|filtered
当数据包发送到关闭的 UDP 端口时,目标应使用 ICMP (ping) 数据包进行响应,其中包含端口无法访问的消息。这清楚地标识了关闭的端口,Nmap 将其标记为关闭端口并继续前进。
由于难以识别 UDP 端口是否实际打开,因此与各种 TCP 扫描相比,UDP 扫描往往非常慢(在 20 分钟内扫描前 1000 个端口,连接良好)。因此,通常最好在启用的情况下运行 Nmap 扫描。例如,使用 .将扫描前 20 个最常用的 UDP 端口,从而获得更可接受的扫描时间。--top-ports <number>
nmap -sU --top-ports 20 <target>
在扫描 UDP 端口时,Nmap 通常会发送完全空的请求——只发送原始的 UDP 数据包。也就是说,对于通常由知名服务占用的端口,它将发送特定于协议的有效载荷,该有效载荷更有可能引发响应,从中可以得出更准确的结果。
NULL、FIN 和 Xmas
NULL、FIN 和 Xmas TCP 端口扫描的使用不如我们已经介绍过的任何其他端口,因此我们不会在这里深入探讨。这三者都是相互关联的,主要使用它们,因为相对而言,它们往往比 SYN“隐身”扫描更隐蔽。从 NULL 扫描开始:
- 顾名思义,NULL 扫描 () 是指在发送 TCP 请求时根本没有设置任何标志。根据 RFC,如果端口关闭,目标主机应使用 RST 进行响应。
-sN
- FIN 扫描 () 以几乎相同的方式工作;但是,不是发送完全空的数据包,而是使用 FIN 标志发送请求(通常用于正常关闭活动连接)。同样,如果端口关闭,Nmap 需要 RST。
-sF
- 与此类中的其他两个扫描一样,Xmas 扫描 () 发送格式错误的 TCP 数据包,并期望关闭端口的 RST 响应。它被称为圣诞扫描,因为它设置的标志(PSH、URG 和 FIN)在 Wireshark 中被视为数据包捕获时,它看起来像一棵闪烁的圣诞树。
-sX
使用这些扫描的开放端口的预期响应也是相同的,并且与 UDP 扫描的响应非常相似。如果端口处于打开状态,则对格式错误的数据包没有响应。不幸的是(与打开的 UDP 端口一样),如果端口受防火墙保护,这也是一种预期行为,因此 NULL、FIN 和 Xmas 扫描只会将端口识别为打开|过滤、关闭或过滤。如果端口被识别为通过这些扫描之一进行过滤,则通常是因为目标已响应 ICMP 无法访问的数据包。
还值得注意的是,虽然 RFC 793 要求网络主机使用 RST TCP 数据包响应关闭端口的格式错误数据包,但根本不响应开放端口;在实践中,情况并非总是如此。特别是,众所周知,Microsoft Windows(以及许多思科网络设备)会使用RST响应任何格式错误的TCP数据包 - 无论端口是否实际打开。这会导致所有端口都显示为已关闭。
也就是说,这里的目标当然是防火墙规避。许多防火墙配置为将传入的 TCP 数据包丢弃到设置了 SYN 标志的阻止端口(从而阻止新的连接初始请求)。通过发送不包含 SYN 标志的请求,我们有效地绕过了这种防火墙。虽然这在理论上是好的,但大多数现代IDS解决方案都精通这些扫描类型,因此在处理现代系统时,不要依赖它们100%有效。
ICMP网络扫描
在黑匣子分配中首次连接到目标网络时,我们的第一个目标是获得网络结构的“映射”——或者换句话说,我们想要查看哪些 IP 地址包含活动主机,哪些不包含。
一种方法是使用 Nmap 执行所谓的“ping 扫描”。顾名思义,这完全是:Nmap 将 ICMP 数据包发送到指定网络的每个可能的 IP 地址。当它收到响应时,它会将响应的 IP 地址标记为活动。由于我们将在后面的任务中看到的原因,这并不总是准确的;但是,它可以提供一些基线,因此值得介绍。
为了执行 ping 扫描,我们将开关与 IP 范围结合使用,IP 范围可以通过 hypen () 或 CIDR 表示法指定。即,我们可以使用以下方法扫描网络:-sn
-
192.168.0.x
nmap -sn 192.168.0.1-254
或
nmap -sn 192.168.0.0/24
交换机告诉 Nmap 不要扫描任何端口,迫使它主要依靠 ICMP 回显数据包(或本地网络上的 ARP 请求,如果使用 sudo 或直接以 root 用户身份运行)来识别目标。除了 ICMP 回显请求之外,交换机还会导致 nmap 向目标的端口 443 发送 TCP SYN 数据包,以及向目标的端口 80 发送 TCP ACK(或 TCP SYN,如果不以 root 身份运行)数据包。-sn
-sn
NSE 脚本概述
Nmap Scripting Engine (NSE) 是 Nmap 的一个非常强大的补充,大大扩展了它的功能。NSE 脚本是用 Lua 编程语言编写的,可用于执行各种操作:从扫描漏洞到自动利用漏洞。NSE 对于侦察特别有用,但是,值得牢记脚本库的广泛性。
有许多类别可用。一些有用的类别包括:
safe
:- 不会影响目标intrusive
:- 不安全:可能影响目标vuln
:- 扫描漏洞exploit
:- 尝试利用漏洞auth
:- 尝试绕过正在运行的服务的身份验证(例如匿名登录 FTP 服务器)brute
:- 尝试暴力破解正在运行服务的凭据discovery
:- 尝试查询正在运行的服务以获取有关网络的更多信息(例如,查询SNMP服务器)。
可以在此处找到更详尽的列表。
在下一个任务中,我们将了解如何与 NSE 交互并利用这些类别中的脚本。
与 NSE 合作
在任务 3 中,我们非常简要地查看了用于激活类别中的 NSE 脚本的开关。其他类别以完全相同的方式工作也就不足为奇了。如果运行该命令,则将针对目标运行任何适用的安全脚本(注意:仅激活以活动服务为目标的脚本)。--script
vuln
--script=vuln
--script=safe
要运行特定的脚本,我们将使用 ,例如 .--script=<script-name>
--script=http-fileupload-exploiter
通过用逗号分隔多个脚本,可以以这种方式同时运行多个脚本。例如:。--script=smb-enum-users,smb-enum-shares
某些脚本需要参数(例如,如果它们利用了经过身份验证的漏洞,则需要凭据)。这些可以通过 Nmap 开关给出。这方面的一个例子是脚本(用于使用 PUT 方法上传文件)。这需要两个参数:要将文件上传到的 URL 以及文件在磁盘上的位置。例如:--script-args
http-put
nmap -p 80 --script http-put --script-args http-put.url='/dav/shell.php',http-put.file='./shell.php'
请注意,参数用逗号分隔,并连接到带有句点(即 )的相应脚本。<script-name>.<argument>
可以在此处找到脚本及其相应参数的完整列表(以及示例用例)。
Nmap 脚本带有内置的帮助菜单,可以使用 访问。这往往不像上面给出的链接那样广泛,但是,在本地工作时它仍然很有用。nmap --script-help <script-name>
NSE 脚本搜索脚本
好的,我们知道如何在 Nmap 中使用脚本,但我们还不知道如何找到这些脚本。
为此,我们有两个选项,理想情况下应该相互结合使用。第一个是 Nmap 网站上的页面(在上一个任务中提到),其中包含所有官方脚本的列表。第二个是攻击机器上的本地存储。Nmap 将其脚本存储在 Linux 上。默认情况下,所有 NSE 脚本都存储在此目录中 -- 这是 Nmap 在指定脚本时查找脚本的位置。/usr/share/nmap/scripts
有两种方法可以搜索已安装的脚本。一种是使用文件。尽管有扩展名,但这实际上并不是一个数据库,而是一个包含每个可用脚本的文件名和类别的格式化文本文件。/usr/share/nmap/scripts/script.db
Nmap 使用此文件来跟踪(和利用)脚本引擎的脚本;但是,我们也可以通过它来查找脚本。例如:。grep "ftp" /usr/share/nmap/scripts/script.db
搜索脚本的第二种方法是使用命令非常简单。例如,我们可以使用以下方法获得与上一个屏幕截图相同的结果:ls
ls -l /usr/share/nmap/scripts/*ftp*
请注意在搜索词的两侧使用星号()*
同样的技术也可用于搜索脚本类别。例如:grep "safe" /usr/share/nmap/scripts/script.db
安装新脚本
我们之前提到过,Nmap 网站包含一个脚本列表,那么,如果本地目录中缺少其中一个脚本会怎样?一个标准应该解决这个问题;但是,也可以通过从 Nmap () 下载脚本来手动安装脚本。然后必须跟进 ,这会更新文件以包含新下载的脚本。scripts
sudo apt update && sudo apt install nmap
sudo wget -O /usr/share/nmap/scripts/<script-name>.nse https://svn.nmap.org/nmap/scripts/<script-name>.nse
nmap --script-updatedb
script.db
值得注意的是,如果你要制作自己的 NSE 脚本并将其添加到 Nmap 中,您将需要相同的 “updatedb” 命令 - 这是一项非常易于管理的任务,只需了解一些 Lua 的基本知识!
防火墙规避
我们已经看到了一些绕过防火墙的技术(想想隐身扫描,以及 NULL、FIN 和 Xmas 扫描);但是,还有另一种非常常见的防火墙配置,我们必须知道如何绕过。
典型的 Windows 主机将使用其默认防火墙阻止所有 ICMP 数据包。这就带来了一个问题:我们不仅经常使用 ping 来手动建立目标的活动,Nmap 默认情况下也会做同样的事情。这意味着 Nmap 会将具有此防火墙配置的主机注册为死主机,并且根本不会对其进行扫描。
因此,我们需要一种方法来绕过这种配置。幸运的是,Nmap 为此提供了一个选项:,它告诉 Nmap 在扫描主机之前不要打扰它。这意味着 Nmap 将始终将目标主机视为活动主机,从而有效地绕过 ICMP 块;但是,这样做的代价是可能需要很长时间才能完成扫描(如果主机确实死了,那么 Nmap 仍将检查并仔细检查每个指定的端口)。-Pn
值得注意的是,如果您已经直接在本地网络上,Nmap 还可以使用 ARP 请求来确定主机活动。
Nmap 认为还有许多其他开关可用于防火墙规避。我们不会详细介绍这些内容,但是,可以在此处找到它们。
特别需要注意以下开关:
-f
:- 用于对数据包进行分段(即将它们拆分为更小的片段),从而降低防火墙或 IDS 检测到数据包的可能性。- 的替代方法,但提供了对数据包大小的更多控制:,接受用于发送数据包的最大传输单元大小。这必须是 8 的倍数。
-f
--mtu <number>
--scan-delay <time>ms
:- 用于在发送的数据包之间添加延迟。如果网络不稳定,这非常有用,但对于规避任何可能存在的基于时间的防火墙/IDS 触发器也非常有用。--badsum
:- 这用于为数据包生成无效的校验和。任何真正的 TCP/IP 堆栈都会丢弃此数据包,但是,防火墙可能会自动响应,而无需检查数据包的校验和。因此,此开关可用于确定是否存在防火墙/IDS。-
总结
-
目标 IP 是否响应 ICMP 回显 (ping) 请求 (Y/N)?
正确答案对目标的前 999 个端口执行 Xmas 扫描 -- 有多少个端口显示为打开或过滤?
正确答案这是有原因的——它是什么?
注意:答案将在您的扫描结果中。仔细考虑使用哪些开关 - 并在寻求帮助之前阅读提示!
正确答案提示对目标的前 5000 个端口执行 TCP SYN 扫描 -- 有多少个端口显示为打开?
正确答案打开 Wireshark(有关说明,请参阅 Cryillic 的 Wireshark Room)并对目标上的端口 80 执行 TCP Connect 扫描,监视结果。确保您了解正在发生的事情。针对该框部署 脚本。Nmap能否在21端口成功登录FTP服务器?(是/否)
ftp-anon
正确答案