如何在Linux中禁用ICMP时间戳响应

时间:2020-01-09 10:38:11  来源:igfitidea点击:

在生产环境中,安全性是最重要的因素之一,因此我们执行常规的安全扫描并执行常规的补丁程序管理以修复安全漏洞。

在本文中,我们将学习在RHEL/CentOS 7/8 Linux中使用不同的iptables和防火墙保护"禁用ICMP时间戳响应"的步骤。

ICMP时间戳响应概述

  • ICMP,即" I"互联网" C"控制" M"消息" P" rotocol是Internet协议套件中的支持协议。

  • 网络设备(包括路由器)使用它来发送错误消息和操作信息,以指示与另一个IP地址通信时的成功或者失败。

  • ICMP时间戳响应包括ICMP时间戳请求和ICMP时间戳回复

  • 在撰写本文时,共有343个分配的ICMP类型。

  • 在此列表中," ICMP类型13被称为时间戳请求",而" ICMP类型14被称为时间戳回复"。

说明:

我已经在两台RHEL/CentOS 8服务器上使用EPEL REPO安装了" hping3",以验证ICMP时间戳响应。
我们还可以安装nmap并使用nping --icmp-type <XX> -v <IP地址>来验证ICMP时间戳状态

在生产环境中,大多数安全扫描工具(例如VAMS,Nessus等)将建议在Linux中禁用ICMP时间戳响应。

攻击者如何使用时间戳记请求和回复?

目标计算机响应了ICMP时间戳记请求。

通过准确确定目标的时钟状态,攻击者可以更有效地攻击某些基于时间的伪随机数生成器(PRNG)和依赖它们的身份验证系统。

方法1:使用IPtables阻止ICMP时间戳响应

为了阻止ICMP时间戳请求,我们必须在INPUT链中创建一个规则,而为了阻止ICMP时间戳应答,我们需要在OUTPUT链中创建一条规则。

[root@server2 ~]# iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
[root@server2 ~]# iptables -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP

让我们了解这些" iptables"规则的含义,

-A INPUT		Append (not Insert) a new rule inside INPUT chain. 
			If we do append, the rule will be added in the last of existing rules, 
			if you using -I INPUT then the rule will inserted as the first rule in the existing rule set 
-A OUTPUT  		Again, append the rule instead of INSERT
-p icmp    		-p or --protocol can be used which means
			the protocol of the rule or of the packet to check i.e. icmp here
--icmp-type		provide the icmp type for the rule
-j DROP			-j or --jump specifies the target of the rule
			Here we want to DROP the respective packets

因此,我们可以理解,我已经在节点的" INPUT"链中添加了" iptables"规则,并且使用" OUTPUT"链对节点中的所有出站时间戳回复也进行了"拒绝"操作

验证时间戳记响应

检查iptables规则是否已成功添加

[root@server2 ~]# iptables -L | grep timestamp
DROP       icmp --  anywhere             anywhere             icmp timestamp-request
DROP       icmp --  anywhere             anywhere             icmp timestamp-reply

现在,我们可以使用诸如" hping3"或者" nping"之类的许多工具来人为地生成"时间戳请求"和"时间戳回复"以进行验证。
我们将使用" hping3"来生成并发送ICMP时间戳请求和时间戳回复。

[root@server1 ~]# hping3 --icmp --icmptype 13 server2
HPING server2 (eth1 10.10.10.16): icmp mode set, 28 headers + 0 data bytes
^C
--- server2 hping statistic --
3 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

发送给timestamp-request的3个数据包有100%的数据包丢失。

接下来,我们将验证来自server2的timestamp-reply状态。

[root@server2 ~]# hping3 --icmp --icmptype 14 centos8-1
HPING centos8-1 (eth1 10.10.10.12): icmp mode set, 28 headers + 0 data bytes
[send_ip] sendto: Operation not permitted

其中我们得到"不允许操作",这意味着" server2"不允许ICMP时间戳回复。

因此,我们的iptables规则按预期工作。
接下来让我们使用firewalld阻止ICMP时间戳响应。
"防火墙"内有多种方法可用于阻止ICMP时间戳响应。
我会其中分享其中的一些

删除iptables规则

要删除此规则,我们将在语法下方使用:

iptables --delete {CHAIN} {RULE_NUMBER}

要获取规则编号,请执行

[root@server2 ~]# iptables -L INPUT --line-numbers | grep timestamp
6    DROP       icmp --  anywhere             anywhere             icmp timestamp-request
[root@server2 ~]# iptables -L OUTPUT --line-numbers | grep timestamp
2    DROP       icmp --  anywhere             anywhere             icmp timestamp-reply

因此,我们必须删除" INPUT"链中的规则编号" 6"和" OUTPUT"链中的规则编号" 2"

[root@server2 ~]# iptables --delete INPUT 6
[root@server2 ~]# iptables --delete OUTPUT 2

验证是否还有与" ICMP"时间戳相关的规则

[root@server2 ~]# iptables -L --line-numbers | grep timestamp

方法2:使用防火墙直接规则阻止ICMP时间戳响应

iptables类似,我们可以使用firewalldINPUTOUTPUT链创建规则。

语法:

firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>

添加防火墙直接规则

阻止和丢弃ICMPtimestamp-request

[root@server2 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT -5 -p icmp --icmp-type timestamp-request -j DROP
success

阻止和丢弃ICMPtimestamp-reply

[root@server2 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT -5 -p icmp --icmp-type timestamp-reply -j DROP
success

让我们其中了解firewalld命令

  • 我们在过滤器表的" INPUT"和" OUTPUT"链中为IPv4添加了" DIRECT"规则(因为仅在IPv4上支持" ICMP"时间戳响应)。

  • 该规则的优先级低于0(我们可以在"防火墙"帮助页面上了解有关优先级的更多信息)

  • 规则的其余部分是" ARGUMENT",与我们用于" iptables"的内容相同

列出" INPUT"和" OUTPUT"链中的规则

[root@server2 ~]# firewall-cmd --permanent --direct --get-rules ipv4 filter INPUT
-5 -p icmp --icmp-type timestamp-request -j DROP
[root@server2 ~]# firewall-cmd --permanent --direct --get-rules ipv4 filter OUTPUT
-5 -p icmp --icmp-type timestamp-reply -j DROP

验证时间戳记响应

接下来,我们将通过人为生成ICMP类型13和14来验证我们的规则。
ICMP类型13(即时间戳请求)将从客户端节点(server1)发送

[root@server1 ~]# hping3 --icmptype 13 server2 -c 2
HPING 10.43.138.12 (bond0 10.43.138.12): icmp mode set, 28 headers + 0 data bytes
--- 10.43.138.12 hping statistic --
2 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

因此,这里有100%的数据包丢失,这意味着timestamp-request规则正在运行,接下来要验证类型14,我们将尝试从配置了防火墙的server2发送timestamp-reply数据包。
使用nping直接规则

[root@server2 ~]# nping -c1 --icmp-type 14 -v server1

我的终端的摘录

验证防火墙直接规则

因此这也造成了100%的数据包丢失,因此我们的规则正在有效

删除防火墙直接规则

要删除我们之前创建的"防火墙"直接规则,只需复制用于添加和删除--add-rule的命令即可。

[root@server2 ~]# firewall-cmd --permanent --direct --remove-rule ipv4 filter OUTPUT -5 -p icmp --icmp-type timestamp-reply -j DROP
success
[root@server2 ~]# firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT -5 -p icmp --icmp-type timestamp-request -j DROP
success

接下来,重新加载防火墙,以使更改重新启动后将持续存在。

[root@server2 ~]# firewall-cmd --reload
success

现在,我们可以尝试列出并检查这些规则是否仍然存在于各自的" INPUT"和" OUTPUT"链中

# firewall-cmd --permanent --direct --get-rules ipv4 filter OUTPUT
# firewall-cmd --permanent --direct --get-rules ipv4 filter INPUT

方法3:使用防火墙丰富的规则阻止ICMP时间戳响应

使用丰富的语言语法,可以以比直接接口方法更容易理解的方式创建复杂的防火墙规则。

语法:

firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]

这将为区域区域添加丰富的语言"规则"规则。
可以多次指定此选项。
如果省略区域,则使用默认区域

规则syntax

rule [family="rule family"]
    [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
    [ destination [NOT] address="address" ]
    [ element ]
    [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
    [ audit ]
    [ action ]

添加防火墙丰富规则

在服务器上添加这些规则

[root@server2 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" icmp-type name="timestamp-request" drop' --permanent
success
[root@server2 ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" icmp-type name="timestamp-reply" drop' --permanent
success

重新加载firewalld规则,以使更改重新启动是持久的。

[root@server2 ~]# firewall-cmd --reload
success

这些规则是不言自明的,我们结合了上面在直接规则中使用过的主要规则,即,将family =" ipv4" icmp-type name =" timestamp-request" drop配置为带有防火墙的rich-rule

列出丰富的规则

[root@server2 ~]# firewall-cmd --list-all --permanent

验证时间戳记响应

我们将再次使用" hping3"来生成时间戳请求包并将其发送到" server2"

[root@server1 ~]# hping3 --icmptype 13 server2 -c 2
HPING 10.43.138.12 (bond0 10.43.138.12): icmp mode set, 28 headers + 0 data bytes
--- 10.43.138.12 hping statistic --
2 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

因此,我们发送的两个数据包均被丢弃。
让我们尝试将" timestamp-reply"数据包从" server2"发送到" server1"

[root@server2 ~]# nping -c2 --icmp-type 14 -v server1

删除防火墙富规则

要删除"防火墙"丰富规则,我们将使用与添加规则相同的命令,只需将--add-rich-rule替换为--remove-rich-rule。

[root@server2 ~]# firewall-cmd --remove-rich-rule 'rule family="ipv4" icmp-type name="timestamp-reply" drop' --permanent
success
[root@server2 ~]# firewall-cmd --remove-rich-rule 'rule family="ipv4" icmp-type name="timestamp-request" drop' --permanent
success

接下来,重新加载firewalld以使更改重新启动并持续存在

[root@server2 ~]# firewall-cmd --reload
success