SPA Port Knocking avec netfilter

Je vois souvent passer dans mes flux rss des articles sur knockd, logiciel qui permet de configurer un port knocking sur linux.

Je vais vous présenter une alternative utilisant l'extension pknock pour netfilter.

Le principal avantage de pknock sur knockd est dans son utilisation de HMAC qui va empêcher une attaque par rejeu.

Le serveur tourne sur debian jessie, son ip est 1.2.3.4, et il héberge un serveur ssh sur le port 22.

Le client a pour ip 5.6.7.8, et doit envoyer un paquet d'authentification vers le port 1234 du serveur, avant de pouvoir se connecter au serveur ssh.

On commence par installer xtables-addons sur le serveur :

aptitude install xtables-addons-common

Et on rajoute nos règles avec iptables :

iptables -t raw -A PREROUTING -i eth0 -s 0.0.0.0/0 -d 1.2.3.4 -p udp --dport 1234 -m pknock --knockports 1234 --name whitelist --opensecret bUTOqyEZcUOKwgEE0N --closesecret oBI3na4UxPLWSu5szM --autoclose 360 -j DROP
iptables -A INPUT -i eth0 -s 0.0.0.0/0 -d 1.2.3.4 -p tcp --dport 22 -m pknock --checkip --name whitelist -m conntrack --ctstate NEW -j ACCEPT

Le script ci-dessous permet d'envoyer notre payload dans un paquet udp vers le port 1234 du serveur.

#!/usr/bin/env python

import sys
import socket
import hmac
import struct
from Crypto.Hash import SHA256
from time import time

host="1.2.3.4"
port=1234
key={"open":"bUTOqyEZcUOKwgEE0N", "close":"oBI3na4UxPLWSu5szM"}

def gen_hmac(key, ip):
    epoch_mins = (long)(time()/60)
    s=hmac.HMAC(key, digestmod = SHA256)
    s.update(socket.inet_aton(ip))
    s.update(struct.pack("i", epoch_mins))
    return s.hexdigest()

if __name__ == '__main__':
    ip=sys.argv[2]
    digest=gen_hmac(key[sys.argv[1]], ip)
    s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(digest+"\n", (host, port))

On lance le script sur le client :

./kn.py open 5.6.7.8

Et on peut voir sur le serveur que le client est autorisé :

cat /proc/net/xt_pknock/whitelist
src=5.6.7.8 proto=UDP status=ALLOWED accepted_knock_count=1 autoclose_time=21296 [secs]

Il est bien attendu possible d'avoir plusieurs listes, d'ouvrir plusieurs ports, ...


0 commentaire(s) pour SPA Port Knocking avec netfilter


Laisser un commentaire