文章

Port Knocking

Port Knocking

端口敲门:knock ip port1 port2 port3.

安装一下

sudo apt install -y knockd

配置 knockd 服务

cat /etc/knockd.conf
[options]
    UseSyslog
[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn


配置文件里有两个参数:
    sequence 按照顺序依次访问端口,command执行的条件。默认使用TCP访问。
    command 当knockd监测到sequence端口访问完成,然后执行此处command,这里为通过iptables开启关闭ssh外部访问。

knock碰撞

┌──(nerubian㉿kali)-[~/vulnhub]
└─$ sudo knock 192.168.56.104 10000 4444 65535

┌──(nerubian㉿kali)-[~/vulnhub]
└─$ knock -h
usage: knock [options] <host> <port[:proto]> [port[:proto]] ...
options:
  -u, --udp            make all ports hits use UDP (default is TCP)
  -d, --delay <t>      wait <t> milliseconds between port hits
  -4, --ipv4           Force usage of IPv4
  -6, --ipv6           Force usage of IPv6
  -v, --verbose        be verbose
  -V, --version        display version
  -h, --help           this help

example:  knock myserver.example.com 123:tcp 456:udp 789:tcp

手工循环碰撞

for x in  7000 8000 9000;do;nmap -Pn --host_timeout 201 --max-retries 0 -p $x  <target IP>;done

bash碰撞脚本

#!/bin/bash

# 定义要进行 port knocking 的目标主机
target_host="your_target_host"

# 定义要进行 port knocking 的目标端口
target_ports=(4444:udp 8331:tcp 7331:tcp 31337:tcp 31338:tcp)

# 逐个测试端口组合
for ports in $(eval echo "{${target_ports[*]}}")
do
    IFS=':' read -r port protocol <<< "$ports"
    echo "Knocking port $port using protocol $protocol"
    nc -z -w 1 $target_host $port
done

python碰撞脚本

pip install python-nmap
import itertools
import nmap

# 定义要进行 port knocking 的目标主机
target_host = "your_target_host"

# 定义要进行 port knocking 的目标端口
target_ports = [(4444, 'udp'), (8331, 'tcp'), (7331, 'tcp'), (31337, 'tcp'), (31338, 'tcp')]

# 生成所有可能的端口顺序组合
possible_port_combinations = list(itertools.permutations(target_ports))

# 初始化 nmap 扫描器
nm = nmap.PortScanner()

# 逐个测试端口组合
for ports in possible_port_combinations:
    print("Testing port knocking sequence:", ports)

    # 构建要扫描的端口字符串
    port_string = ','.join(str(port[0]) for port in ports)
    scan_results = nm.scan(target_host, arguments=f"-p{port_string}")

    # 检查端口是否处于打开状态
    open_ports = [f"{port[0]} ({port[1]})" for port in ports if str(port[0]) in nm[target_host]['tcp']]

    # 如果找到了正确的 knocking 顺序
    if len(open_ports) == 5:
        print("Port knocking successful! Open ports:", open_ports)
        break
License:  CC BY 4.0