Still Shines.

端口敲门

Word count: 1.3k / Reading time: 4 min
2019/09/08 Share

前言

众所周知,在公网上多暴露一个端口,就会多增加一份安全风险,那么如何能降低这类情况的安全风险呢,直接能想到的解决方案就是将端口隐藏起来,这里就将介绍到一种将端口隐藏在公网中的技术,叫端口敲门(Port knocking)。

端口敲门

详解端口敲门技术简单的讲就是从外按预先设定好的顺序,尝试访问服务器上一组闭合的端口。一旦服务器收到了正确的连接尝试序列,就会动态修改防火墙规则,以允许发送连接的主机尝试通过特定端口进行连接。这个特定端口就是我们想要隐藏的真正端口。

这里举一个例子,有一台主机要对服务器进行远程ssh访问,但目标服务器并没有开启22端口,这时主机尝试对服务器的某些特定的端口按一定顺序访问,如访问1001,1002,1004,1003。当服务器接收到特定的端口访问请求后,如果验证通过,则修改防火墙规则,开放出22端口,此时这台主机就能对服务器进行链接了。

端口敲门的优势与劣势

·优势:
直观的来说,这项技术很好的隐藏了端口,降低了端口被直接攻击的风险。就算攻击者知道了目标服务器使用了这项技术隐藏了端口,也要进行大量爆破,爆破条件极其困难。在没有正确的端口访问情况下,被隐藏端口的服务是没有开启的,而运行端口敲门服务的进程不直接提供端口访问,这将会让攻击者十分头疼。
·缺点:
这项技术在2004年就有论文讲述了如何实现,但在如今尚未存在广泛应用,可发现其中也是存在许多不足。首先就是不能确定端口敲门服务程序是否能稳健运行,当服务出现故障时,那么即使尝试链接了正确序列的端口,也无法开放被隐藏服务端口了。这就需要存在一个守护进程,在端口敲门服务进程出现问题时进行重启。其次还有个很严重的问题就是非常依赖网络环境,如果网络环境是高延迟的,那么这项服务则很可能出现问题。

端口敲门服务的实现

前面讲了这么多废话,也要具体讲讲这项技术如何实现,网上有不少教程,我这里整理了一下。

一:实验环境

服务器:kali 192.168.1.6
客户机:Ubuntu 192.168.1.8
用客户机ssh连接服务器:192.168.1.6

6972404fe67ffbf6827d2c3c3968e1ba.png

二:服务器Kali上安装配置端口敲门服务
1、安装knockd

1
2
apt-get  install  update
apt-get  install  knockd  -y

2、配置knockd服务:

vim /etc/knockd.conf

· sequence 设置为自己想要的端口序列。
· 将seq_timeout 设置为30,以免超时时间过小出错。
· command为要添加的防火墙命令,在openSSH下插入一条开启22端口的防火墙规则 -I 为插入到最前面,最先生效,以防止过滤所有端口的情况将此条规则吃掉。closeSSH下为删除(-D)之前插入到开启22的规则,此处的iptables规则可根据需要自行定义,我的设置如下:
34a4a72b7b60e6e49c62c7f36017932e.png

3、配置/etc/default/knockd,修改START_KNOCKD=1。41360280c727ee9f1b16b6b61e74d260.png

4、启动knockd。

service knockd start

f6194f7d7e18fa17b0805b67d9289ca6.png

5、添加适当的iptables规则(实际应用的时候,应该更具需要写入iptables规则文件中,可永久保存)
· 确保服务器可通过本地主机接口与自己对话:

1
iptables  -A  INPUT  -s  127.0.0.0/8  -j   ACCEPT

·本次测试中,阻塞所有进入服务器的通信:

1
iptables  -A  INPUT  -j  DROP

·查看添加到iptables规则:

1
iptables  -L  -n

6cbd75296a3b4b334b0406fc1cd270ba.png

此时ssh已经无法连接。

0e71fdd31a97ea5ac42ae9fb50ae4f72.png

6、使用7777/8888/9999队列号敲门登录:
这里可以使用nmap进行登陆:

1
for x in 7777 8888 9999; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x 192.168.1.6;done

e60f1a49a95df2eb505a1fad06079a90.png

可看到kali服务器上的iptables多了一条规则,此时22端口开启。

4049856a54caf0ea6cccdb0a7476aa69.png

这样就能ssh重新连接上。

7aa9085cfae6557786c5d67a4f7fd35f.png

7、使用9999/8888/7777队列号关门

1
for x in 9999 8888 7777; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x 192.168.1.6;done

fe3223b33717404d1250b3052c922823.png

此时看到之前的iptables规则被删除,回到不能访问的状态。

a5e2698bcd58f6c4d37bee611b0ade92.png

此时ssh已经连接不上。
a5e2698bcd58f6c4d37bee611b0ade92.png

结语

总而言之,有时增加系统的安全性时,会降低一部分用户友好性,本来可以直接连接的端口现在要经过一个更复杂的过程,这也给己方人员造成不便,但如果考虑到系统的绝密性,也是有用处的。也可以作为一个出题思路,放在CTF比赛中,应该也会很有趣。

CATALOG
  1. 1. 前言
  2. 2. 端口敲门
  3. 3. 端口敲门的优势与劣势
  4. 4. 端口敲门服务的实现
  5. 5. 结语