如何使用 Nmap 和 Tcpdump 测试防火墙配置

介绍

为您的基础设施设置防火墙是为您的服务提供安全的一种很好的方法. 一旦您制定了您满意的策略,下一步是测试您的防火墙规则。

在本指南中,我们将讨论一些工具和技术,您可以使用来验证您的防火墙规则. 这些是恶意用户可能使用的相同工具,因此您将能够看到他们通过对您的服务器提出请求可以找到哪些信息。

前提条件

在本指南中,我们将假设您至少在一个服务器上配置了防火墙,您可以按照以下一个或多个指南开始构建防火墙策略:

  • Iptables
  • UFW
  • FirewallD

您还可以配置 DigitalOcean’s Cloud Firewalls,这些防火墙作为DigitalOcean基础设施上的服务器的额外外层运行,因此您不需要在服务器上自行配置防火墙。

在本指南中,我们将呼叫包含你想要测试 target的防火墙策略的服务器。除了你的目标,你还需要访问一个服务器来测试,位于你的防火墙保护的网络之外。

一旦你有一个服务器来测试和你想要评估的目标,你可以继续这个指南。

<$>[警告] [标签警告] 您只应在您控制的基础设施上执行本指南中描述的活动,以便进行安全审核。

我们将使用的工具来测试防火墙策略

您可以使用几种不同的工具来测试我们的防火墙策略. 其中一些具有重叠的功能. 我们不会涵盖所有可能的工具. 相反,我们将涵盖一些一般的审计工具类别,并讨论我们将在本指南中使用的工具。

包装分析师

包分析器可以用来仔细监控接口上的所有网络流量. 大多数包分析器可以实时操作,显示发送或接收的包,或将包信息写入文件并在稍后处理。

对于本指南的用途,我们将使用tcpdump工具,这是一个很好的选择,因为它在Linux系统上具有强大、灵活性和普遍性,您将使用它来捕捉原始包,当我们运行测试时,如果我们需要后续分析的转录,其他一些流行的选项是Wireshark(或tshark),它的命令行表表表弟)和tcpflow,可以以有组织的方式组合整个TCP对话。

港口扫描仪

为了生成数据流量和响应,您的数据包分析器将使用端口扫描仪来捕获数据,可以使用端口扫描仪来制造和发送各种类型的数据包到远程主机,以发现服务器接受的数据流量类型。

您可以使用nmap发送不同类型的包,试图找出目标计算机上的哪些服务以及防火墙规则保护它。

设置审计机器

在你开始之前,你应该确保我们安装了必要的工具。你可以从Ubuntu的存储库中获取tcpdumpnmap。运行apt update来更新你的本地包列表,然后用apt install安装它们:

1sudo apt update
2sudo apt install tcpdump nmap

接下来,创建一个目录,您可以存储扫描结果:

1mkdir ~/scan_results

要确保您获得清洁的结果,请退出您可能在审计系统和目标系统之间开放的任何会话,包括SSH会话,您可能在Web浏览器中建立的任何HTTP(S)连接等。

扫描您的目标对开放的TCP端口

现在我们已经准备好了我们的服务器和文件,您将开始扫描目标主机以获取开放的TCP端口。

nmap知道如何做的一些TCP扫描实际上有几种,通常最好的是SYN扫描,也被称为半开扫描,因为它从来没有真正谈判一个完整的TCP连接,这经常被攻击者使用,因为它不会在一些入侵检测系统上注册,因为它从来没有完成完整的握手。

设置包裹捕获

在扫描之前,您将设置tcpdump来捕捉测试产生的流量,这将有助于您在需要的情况下更深入地分析发送和接收的包。

1mkdir ~/scan_results/syn_scan

您可以開始「tcpdump」捕捉並用以下命令將結果寫入您的「~/scan_results/syn_scan」目錄中的檔案:

1sudo tcpdump host target_ip_addr -w ~/scan_results/syn_scan/packets

默认情况下,tcpdump将在前面运行. 为了在同一窗口运行nmap扫描,您需要暂停tcpdump过程,然后在后面重新启动它。

我们可以通过按CTRL-Z来暂停运行过程:

1[secondary_label Output]
2^Z
3[1]+  Stopped sudo tcpdump host target_ip_addr -w ~/scan_results/syn_scan/packets

现在,您可以通过键入bg来重新启动背景中的任务:

1bg

您应该收到类似的输出线,这一次没有停止标签,并在末尾有一个,表示该过程将在背景中运行(即不再阻止您的终端):

1[secondary_label Output]
2[1]+ sudo tcpdump host target_ip_addr -w ~/scan_results/syn_scan/packets &

该命令现在在背景中运行,监控您的审计和目标机器之间发生的任何包,我们现在可以运行我们的SYN扫描。

运行 SYN 扫描

随着tcpdump记录您的流量到目标机器,您已经准备好运行nmap

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你为什么这么认为? 开始SYN扫描 技术上,这是nmap在没有提供扫描类型的情况下将进行的默认扫描,但我们将列入此处以明确。

  • QQ-Pn`**: 这告诉"nmap"省略了主机发现步骤,如果主机不响应一个ping,这个步骤会提早中止测试. 既然你知道目标在网络上 你可以跳过这个
  • -p-: 默认情况下,SYN扫描只会尝试最常用的1000个端口. 这告诉nmap检查每一个可用的港口。
  • -T4: 这为nmap设定了一个时间轮廓,要求它加快测试速度,以免结果略差。 0是最慢的,5是最快的. 既然你正在扫描每个端口, 你可以用这个作为基线, 并重新检查以后任何可能报告错误的端口。
  • -vv: 这增加了输出的动词.
  • QQ- 理由 : 这告诉nmap提供了港口状况报告有某种方式的原因。
  • -oN: 此将结果写入一个文件, 用于以后的分析 。 (英语)

<$>[注] 注: 要检查IPv6,您需要在您的命令中添加6旗。

一起,命令将看起来像这样的东西:

1sudo nmap -sS -Pn -p- -T4 -vv --reason -oN ~/scan_results/syn_scan/nmap.results target_ip_addr

即使设置为 4 的时机模板,扫描也可能需要一段时间,因为它通过 65,535 个端口运行。

 1[secondary_label Output]
 2Starting Nmap 6.49BETA4 ( https://nmap.org ) at 2022-12-19 16:54 EDT
 3Initiating Parallel DNS resolution of 1 host. at 16:54
 4Completed Parallel DNS resolution of 1 host. at 16:54, 0.12s elapsed
 5Initiating SYN Stealth Scan at 16:54
 6Scanning 198.51.100.15 [65535 ports]
 7Discovered open port 22/tcp on 198.51.100.15
 8Discovered open port 80/tcp on 198.51.100.15
 9SYN Stealth Scan Timing: About 6.16% done; ETC: 17:02 (0:07:52 remaining)
10SYN Stealth Scan Timing: About 8.60% done; ETC: 17:06 (0:10:48 remaining)
11
12. . .

停止 tcpdump Packet 捕获

一旦扫描完成,您可以将我们的tcpdump过程带回前沿并停止。

将其带出背景,运行fg,用于前面:

1fg

停止运行过程,按Ctrl+C

分析结果

您现在应该在您的~/scan_results/syn_scan目录中有两个文件,一个叫做packets,由tcpdump运行生成,另一个叫做nmap.results

让我们先看看nmap.results文件:

1less ~/scan_results/syn_scan/nmap.results
 1[label ~/scan_results/syn_scan/nmap.results]
 2# Nmap 6.49BETA4 scan initiated Mon Dec 19 17:05:13 2022 as: nmap -sS -Pn -p- -T4 -vv --reason -oN /home/user/scan_results/syn_scan/nmap.results 198.51.100.15
 3Increasing send delay for 198.51.100.15 from 0 to 5 due to 9226 out of 23064 dropped probes since last increase.
 4Increasing send delay for 198.51.100.15 from 5 to 10 due to 14 out of 34 dropped probes since last increase.
 5Nmap scan report for 198.51.100.15
 6Host is up, received user-set (0.00097s latency).
 7Scanned at 2022-12-19 17:05:13 EDT for 2337s
 8Not shown: 65533 closed ports
 9Reason: 65533 resets
10PORT STATE SERVICE REASON
1122/tcp open ssh syn-ack ttl 63
1280/tcp open http syn-ack ttl 63
13
14Read data files from: /usr/local/bin/../share/nmap
15# Nmap done at Mon Dec 19 17:44:10 2022 -- 1 IP address (1 host up) scanned in 2336.85 seconds

您可以推断,端口22和端口80在扫描主机上是开放的,以便允许SSH和HTTP流量。您还可以观察到,65533个端口被关闭。另一个可能的结果是过滤。过滤意味着这些端口被识别为被网络路径沿着的东西阻止。

要查看向目标发送和接收的实际包流量,您可以将文件读回tcpdump,如下:

1sudo tcpdump -nn -r ~/scan_results/syn_scan/packets | less

此文件包含两个主机之间发生的整个对话,您可以通过多种方式进行过滤。

例如,要只查看到目标的 sent 流量,您可以键入:

1sudo tcpdump -nn -r ~/scan_results/syn_scan/packets 'dst target_ip_addr' | less

同样,要只查看响应流量,您可以将dst更改为src:

1sudo tcpdump -nn -r ~/scan_results/syn_scan/packets 'src target_ip_addr' | less

开放的TCP端口会用SYN包响应这些请求,我们可以通过一个类似于以下的过滤器直接搜索此类型的答案:

1sudo tcpdump -nn -r ~/scan_results/syn_scan/packets 'src target_ip_addr and tcp[tcpflags] & tcp-syn != 0' | less

这只会显示成功的SYN响应,并应匹配您在nmap运行中看到的端口:

1[secondary_label Output]
2reading from file packets, link-type EN10MB (Ethernet)
317:05:13.557597 IP 198.51.100.15.22 > 198.51.100.2.63872: Flags [S.], seq 2144564104, ack 4206039348, win 29200, options [mss 1460], length 0
417:05:13.558085 IP 198.51.100.15.80 > 198.51.100.2.63872: Flags [S.], seq 3550723926, ack 4206039348, win 29200, options [mss 1460], length 0

您可以根据您所看到的数据进行更多的分析,所有这些都被捕获用于非同步处理和分析。

扫描您的目标对开放的 UDP 端口

现在你已经掌握了如何运行这些测试的方法,你可以完成类似的过程来扫描打开的UDP端口。

设置包裹捕获

再次,创建一个目录来保存您的结果:

1mkdir ~/scan_results/udp_scan

再次启动tcpdump捕获,此时将文件写入新的~/scan_results/udp_scan目录:

1sudo tcpdump host target_ip_addr -w ~/scan_results/udp_scan/packets

停止流程并将其放到背景中,输入Ctrl+Z,然后运行bg:

1bg

运行 UDP 扫描

现在你已经准备好运行 UDP 扫描了. 由于 UDP 协议的性质,这种扫描通常比 SYN 扫描需要 ** 更长时间. 事实上,如果你扫描系统上的每个端口,它可能需要一天以上。

大多数旗帜将与您使用的SYN扫描相同,实际上,唯一的新旗帜是:

  • -sU:这会告诉nmap进行UDP扫描。

加速UDP测试

如果你担心这个测试需要多长时间,你可能只想在一开始测试你的UDP端口的子集。你只能通过放弃p-标志来测试1000个最常见的端口。

因为你正在扫描自己的基础设施,也许加速UDP扫描的最佳选择是暂时禁用对目标系统的ICMP速率限制。 通常,Linux主机限制ICMP响应每秒1次(这通常是一件好事,但不是我们的审计),这意味着一个完整的UDP扫描将需要超过18小时。

1sudo sysctl net.ipv4.icmp_ratelimit
1[secondary_label Output]
2net.ipv4.icmp_ratelimit = 1000

1000是响应之间的毫秒数,您可以通过键入:

1sudo sysctl -w net.ipv4.icmp_ratelimit=0

测试后返回此值非常重要。

运行测试

请确保将结果写入 ~/scan_results/udp_scan 目录. 总的来说,该命令应该是这样的:

1sudo nmap -sU -Pn -p- -T4 -vv --reason -oN ~/scan_results/udp_scan/nmap.results target_ip_addr

扫描完成后,您应该在目标机器上重置您的 ICMP 速率限制(如果您修改了它):

1sudo sysctl -w net.ipv4.icmp_ratelimit=1000

停止 tcpdump Packet 捕获

通过运行fg来将tcpdump过程带回审计机的最前沿:

1fg

然后,用Ctrl+C停止包捕获。

分析结果

现在,你可以看看生成的文件。

结果的 nmap.results 文件应该与最后的结果相似:

1less ~/scan_results/udp_scan/nmap.results
 1[label ~/scan_results/udp_scan/nmap.results]
 2# Nmap 6.49BETA4 scan initiated Mon Dec 19 12:42:42 2022 as: nmap -sU -Pn -p- -T4 -vv --reason -oN /home/user/scan_results/udp_scan/nmap.results 198.51.100.15
 3Increasing send delay for 198.51.100.15 from 0 to 50 due to 10445 out of 26111 dropped probes since last increase.
 4Increasing send delay for 198.51.100.15 from 50 to 100 due to 11 out of 23 dropped probes since last increase.
 5Increasing send delay for 198.51.100.15 from 100 to 200 due to 3427 out of 8567 dropped probes since last increase.
 6Nmap scan report for 198.51.100.15
 7Host is up, received user-set (0.0010s latency).
 8Scanned at 2022-12-19 12:42:42 EDT for 9956s
 9Not shown: 65532 closed ports
10Reason: 65532 port-unreaches
11PORT STATE SERVICE REASON
1222/udp open|filtered ssh no-response
1380/udp open|filtered http no-response
14443/udp open|filtered https no-response
15
16Read data files from: /usr/local/bin/../share/nmap
17# Nmap done at Mon Dec 19 15:28:39 2022 -- 1 IP address (1 host up) scanned in 9956.97 seconds

此结果与早期 SYN 结果之间的关键差异可能是标记为开放或过滤的端口数量,这意味着nmap无法确定是否缺乏响应意味着服务接受了流量,或者是否被一些防火墙或过滤机制在交付路径上放下。

分析tcpdump输出也更为困难,因为没有连接标志,并且您必须匹配 ICMP 响应与 UDP 请求。

您可以看到nmap需要发送多少个包到被报告为open Unibertsfiltered的端口,请求查看向报告的端口之一的UDP流量:

1sudo tcpdump -nn -Q out -r ~/scan_results/udp_scan/packets 'udp and port 22'
1[secondary_label Output]
2reading from file /home/user/scan_results/udp_scan/packets, link-type EN10MB (Ethernet)
314:57:40.801956 IP 198.51.100.2.60181 > 198.51.100.15.22: UDP, length 0
414:57:41.002364 IP 198.51.100.2.60182 > 198.51.100.15.22: UDP, length 0
514:57:41.202702 IP 198.51.100.2.60183 > 198.51.100.15.22: UDP, length 0
614:57:41.403099 IP 198.51.100.2.60184 > 198.51.100.15.22: UDP, length 0
714:57:41.603431 IP 198.51.100.2.60185 > 198.51.100.15.22: UDP, length 0
814:57:41.803885 IP 198.51.100.2.60186 > 198.51.100.15.22: UDP, length 0

将其与标记为关闭的扫描端口之一的结果进行比较:

1sudo tcpdump -nn -Q out -r ~/scan_results/udp_scan/packets 'udp and port 53'
1[secondary_label Output]
2reading from file /home/user/scan_results/udp_scan/packets, link-type EN10MB (Ethernet)
313:37:24.219270 IP 198.51.100.2.60181 > 198.51.100.15.53: 0 stat [0q] (12)

您可以尝试手动重建nmap所经历的过程,首先编制一份列表,列出我们正在发送UDP包的所有端口,如下:

1sudo tcpdump -nn -Q out -r ~/scan_results/udp_scan/packets "udp" | awk '{print $5;}' | awk 'BEGIN { FS = "." } ; { print $5 +0}' | sort -u | tee outgoing

然后你可以看到我们收到了哪些 ICMP 包,说该端口无法到达:

1sudo tcpdump -nn -Q in -r ~/scan_results/udp_scan/packets "icmp" |  awk '{print $10,$11}' | grep unreachable | awk '{print $1}' | sort -u | tee response

然后,您可以采取这两个响应,并查看哪些UDP包从未收到ICMP响应:

1comm -3 outgoing response

这应该大多与nmap报告的端口列表相匹配(它可能包含来自丢失的返回包的一些虚假阳性)。

主机和服务发现

您可以在目标上运行一些额外的测试,看看nmap是否能够识别运行的操作系统或任何服务版本。

1mkdir ~/scan_results/versions

在服务器上发现服务的版本

您可以尝试通过被称为指纹检测的过程猜测服务的版本,您可以从服务器中获取信息,并将其与我们数据库中已知的版本进行比较。

在这种情况下,一个tcpdump不会太有用,所以你可以跳过它。

您需要使用的nmap扫描是由-sV旗启动的. 由于您已经完成了SYN和UDP扫描,您可以通过您需要用-p旗查看的准确端口。

1sudo nmap -sV -Pn -p 22,80 -vv --reason -oN ~/scan_results/versions/service_versions.nmap target_ip_addr

如果您查看结果的文件,您可能会收到有关服务运行的信息,这取决于服务的响应是多么聊天:

1less ~/scan_results/versions/service_versions.nmap
 1[label ~/scan_results/versions/service_versions.nmap]
 2# Nmap 6.49BETA4 scan initiated Mon Dec 19 15:46:12 2022 as: nmap -sV -Pn -p 22,80 -vv --reason -oN /home/user/scan_results/versions/service_versions.nmap 198.51.100.15
 3Nmap scan report for 198.51.100.15
 4Host is up, received user-set (0.0011s latency).
 5Scanned at 2022-12-19 15:46:13 EDT for 8s
 6PORT STATE SERVICE REASON VERSION
 722/tcp open ssh syn-ack ttl 63 OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
 880/tcp open http syn-ack ttl 63 nginx 1.4.6 (Ubuntu)
 9Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
10
11Read data files from: /usr/local/bin/../share/nmap
12Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
13# Nmap done at Mon Dec 19 15:46:21 2022 -- 1 IP address (1 host up) scanned in 8.81 seconds

在这里,你可以看到测试能够识别 SSH 服务器版本和包装它的 Linux 发行版,以及接受的 SSH 协议版本。

发现主机操作系统

您可以尝试根据其软件的特性和响应来nmap猜测主机操作系统,这与服务版本一样工作。 再次,我们将从这个测试中排除tcpdump运行,但您可以执行它,如果你愿意。

您需要执行操作系统检测的旗帜是-O(标题字母O).一个完整的命令可能看起来像这样:

1sudo nmap -O -Pn -vv --reason -oN ~/scan_results/versions/os_version.nmap target_ip_addr

如果您查看输出文件,您可能会看到这样的东西:

1less ~/scan_results/versions/os_version.nmap
 1[label ~/scan_results/versions/os_versions.nmap]
 2# Nmap 6.49BETA4 scan initiated Mon Dec 19 15:53:54 2022 as: nmap -O -Pn -vv --reason -oN /home/user/scan_results/versions/os_version.nmap 198.51.100.15
 3Increasing send delay for 198.51.100.15 from 0 to 5 due to 65 out of 215 dropped probes since last increase.
 4Increasing send delay for 198.51.100.15 from 5 to 10 due to 11 out of 36 dropped probes since last increase.
 5Increasing send delay for 198.51.100.15 from 10 to 20 due to 11 out of 35 dropped probes since last increase.
 6Increasing send delay for 198.51.100.15 from 20 to 40 due to 11 out of 29 dropped probes since last increase.
 7Increasing send delay for 198.51.100.15 from 40 to 80 due to 11 out of 31 dropped probes since last increase.
 8Nmap scan report for 198.51.100.15
 9Host is up, received user-set (0.0012s latency).
10Scanned at 2022-12-19 15:53:54 EDT for 30s
11Not shown: 998 closed ports
12Reason: 998 resets
13PORT STATE SERVICE REASON
1422/tcp open ssh syn-ack ttl 63
1580/tcp open http syn-ack ttl 63
16No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
17TCP/IP fingerprint:
18OS:SCAN(V=6.49BETA4%E=4%D=8/27%OT=22%CT=1%CU=40800%PV=N%DS=2%DC=I%G=Y%TM=55
19OS:DF6AF0%P=x86_64-unknown-linux-gnu)SEQ(SP=F5%GCD=1%ISR=106%TI=Z%CI=Z%TS=8
20OS:)OPS(O1=M5B4ST11NW8%O2=M5B4ST11NW8%O3=M5B4NNT11NW8%O4=M5B4ST11NW8%O5=M5B
21OS:4ST11NW8%O6=M5B4ST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120
22OS:)ECN(R=Y%DF=Y%T=40%W=7210%O=M5B4NNSNW8%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+
23OS:%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
24OS:T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A
25OS:=Z%F=R%O=%RD=0%Q=)T7(R=N)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPC
26OS:K=G%RUCK=G%RUD=G)U1(R=N)IE(R=N)
27
28Uptime guess: 1.057 days (since Mon Dec 12 14:32:23 2022)
29Network Distance: 2 hops
30TCP Sequence Prediction: Difficulty=245 (Good luck!)
31IP ID Sequence Generation: All zeros
32
33Read data files from: /usr/local/bin/../share/nmap
34OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
35# Nmap done at Mon Dec 12 15:54:24 2022 -- 1 IP address (1 host up) scanned in 30.94 seconds

我们可以看到,在这种情况下,nmap没有根据它看到的签名对操作系统的猜测。如果它收到更多的信息,它可能会显示不同的百分比,这表明目标机器的签名如何匹配其数据库中的操作系统签名。

操作系统识别可以帮助攻击者确定哪些攻击可能对系统有用,设置防火墙以响应更少的查询可以帮助阻碍某些检测方法的准确性。

结论

测试您的防火墙,并对内部网络的外部攻击者构建意识,可以帮助您最大限度地降低风险。您从探索自己的基础设施中获得的信息可能会开启关于是否需要重新审查任何政策决定以增加安全性的对话。

要了解您的防火墙的某些策略改进,请参阅 此指南

Published At
Categories with 技术
Tagged with
comments powered by Disqus