Port-Knocking ausgehend

Wer einen Mikrotik-Router als Port-Knocking-Client einrichten will, kann das mit dem „Traffic-Generator“-Tool tun.

Eine Anleitung wie man die „Gegenstelle“, also den Port-Knocking-Server, einrichtet, findet man im Internet.
Zum Beispiel direkt bei Mikrotik: https://wiki.mikrotik.com/wiki/Port_Knocking

Eine Beschreibung wie man einen Mikrotik als Port-Knocking-Client einrichtet, habe ich aber noch nicht gefunden.

 

Traffic-Generator

Mit Hilfe dieses Tools – welches eigentlich zu Testzwecken gedacht ist – kann man selbst Pakete erstellen. Port Knocking wird meistens mittels UDP oder TCP implementiert, auch wenn andere Protokolle – wie ICMP – denkbar wären.

Im folgenden Beispiel wird von einer Sequenz, die wie folgt aufgerufen werden muss, ausgegangen:

  1. initial muss Port 1111 über UDP (oder TCP) aufgerufen werden
  2. danach muss Port 2222 über UDP (oder TCP) aufgerufen werden
  3. final muss Port 3333 über UDP (oder TCP) aufgerufen werden

Es hier wird nicht von einer Mischsequenz, z. B. UDP -> TCP -> UDP, ausgegangen!

 

Schritt 1 – Packet-Template anlegen – UDP:

/tool traffic-generator packet-template add data-byte=0x10 ip-dst=1.2.3.4 name=UDP1 udp-dst-port=1111
/tool traffic-generator packet-template add data-byte=0x10 ip-dst=1.2.3.4 name=UDP2 udp-dst-port=2222
/tool traffic-generator packet-template add data-byte=0x10 ip-dst=1.2.3.4 name=UDP3 udp-dst-port=3333

 

Schritt 1 – Packet-Template anlegen – TCP:

/tool traffic-generator packet-template add data-byte=0x10 header-stack=mac,ip,tcp ip-dst=1.2.3.4 name=TCP1 tcp-dst-port=1111 tcp-flags=syn
/tool traffic-generator packet-template add data-byte=0x10 header-stack=mac,ip,tcp ip-dst=1.2.3.4 name=TCP2 tcp-dst-port=2222 tcp-flags=syn
/tool traffic-generator packet-template add data-byte=0x10 header-stack=mac,ip,tcp ip-dst=1.2.3.4 name=TCP3 tcp-dst-port=3333 tcp-flags=syn

 

Schritt 2- Stream anlegen – UDP:

/tool traffic-generator stream add id=11 name=UDP1 packet-size=150 tx-template=UDP1
/tool traffic-generator stream add id=12 name=UDP2 packet-size=150 tx-template=UDP2
/tool traffic-generator stream add id=13 name=UDP3 packet-size=150 tx-template=UDP3

 

Schritt 2- Stream anlegen – TCP:

/tool traffic-generator stream add id=21 name=TCP1 packet-size=150 tx-template=TCP1
/tool traffic-generator stream add id=22 name=TCP2 packet-size=150 tx-template=TCP2
/tool traffic-generator stream add id=23 name=TCP3 packet-size=150 tx-template=TCP3

 

Im obigen Beispiel wird die Ziel-IP 1.2.3.4 kontaktiert. Es ist zwar möglich einen DNS-Namen über die Winbox einzutragen, allerdings wird dieser sofort in eine IP aufgelöst und diese IP fest hinterlegt. Mit Hilfe eines kleinen Scripts kann man aber auch dynamische DNS-Namen „DynDNS/DDNS“ nutzen, siehe unten.

Die Größe der Pakete beträgt 150 Byte auf Layer 2. Wenn das nicht definiert wird, werden die Pakete mit der maximalen MTU der ausgehenden Schnittstelle, über die die Pakete den Router verlassen, erzeugt. Falls Tunnelprotokolle in nach- oder übergeordneten Netzen eingesetzt werden, würde die Kommunikation ggf. fehlschlagen. Mit 150 Byte sollte das nicht passieren.

Bei TCP wurde zusätzlich die Flag „syn“ gesetzt, TCP-Pakete ohne Flag könnten ggf. gefiltert werden (Connection-State „invalid“).

 

Die Pakete kommen korrekt an der Zielmaschine an:

150 Byte Länge
= 14 Byte L2-Header + 20 Byte IPv4-Header + 8 Byte UDP-Header (oder + 20 Byte TCP-Header)
+ Payload 108 Byte bei UDP (oder 96 Byte bei TCP)

 

Scripting

Die angelegten Pakete kann man nun z. B. mittels eines Scripts ausführen lassen:

/tool traffic-generator quick stream=UDP1,UDP2,UDP3 duration=1s packet-count=1

/tool traffic-generator quick stream=TCP1,TCP2,TCP3 duration=1s packet-count=1

Wenn das nicht klappt, ist es möglich, dass die Pakete zu schnell ausgelöst werden. Hier könnte man dann einzelne Scripte anlegen und diese über ein weiteres „Überscript“ mittels „delay“ ausführen. Zum Beispiel bei TCP (muss für UDP dann ebenfalls angelegt werden):

 

Script 1 „TCP1“:

/tool traffic-generator quick stream=TCP1 duration=1s packet-count=1

 

Script 2 „TCP2“:

/tool traffic-generator quick stream=TCP2 duration=1s packet-count=1

 

Script 3 „TCP3“:

/tool traffic-generator quick stream=TCP3 duration=1s packet-count=1

 

Hauptscript:

/system script run TCP1;
:delay 1s;
/system script run TCP2;
:delay 1s;
/system script run TCP3;

 

Dynamische-DNS-Namen nutzen

Da man im Traffic-Generator nur Ziel-IPs eintragen kann, braucht man um das Ganze an dynamisch wechselnde IP-Adressen (DynDNS/DDNS) anzupassen, ein kleines Script. Welches man ganz oben in das erste Script einfügen muss:

/ip dns cache flush;
:delay 1s;

:local resolvedAddress [:resolve "port-knocking.meine-domain.de"];

:foreach template in=[/tool traffic-generator packet-template find] do={
/tool traffic-generator packet-template set $template ip-dst=$resolvedAddress
}

 

  1. Zuerst wird der DNS-Cache geleert, um ggf. einen veralteten Eintrag zu löschen.
  2. Danach wird der gewünschte DNS-Name neu in der Variable „$resolvedAddress“ aufgelöst (DNS-Name hier: port-knocking.meine-domain.de).
  3. Danach werden alle ip-dst-Einträge in den Traffic-Generator Packet-Templates aktualisiert.
    Dies könnte man noch mittels „find“ weiter eingrenzen, sollte aber nur in den wenigsten Fällen nötig sein*.

 

* zum Beispiel:

:local resolvedAddress [:resolve "port-knocking.meine-domain.de"];

/tool traffic-generator packet-template set [find name="UDP1"] ip-dst=$resolvedAddress
/tool traffic-generator packet-template set [find name="UDP2"] ip-dst=$resolvedAddress
/tool traffic-generator packet-template set [find name="TCP3"] ip-dst=$resolvedAddress

 

Anmerkungen

Über die hier vorgestellte Methode könnte auch ein definierter Quellport als zusätzlicher Matcher für das Port-Knocking verwendet werden. Allerdings birgt das die Gefahrt, dass ein SNAT auf einem übergeordneten Netzelement den gesetzten Quellport überschreibt. Außerdem ist es in den meisten anderen Port-Knocking-Anwendungen nicht möglich einen Quellport zu definieren.

 

In den Packet-Templates kann man über die Winbox keine TCP-Pakete konfigurieren!
Die entsprechende Registerkarte fehlt, das geht (momentan) nur die CLI, weshalb hier auch nur die CLI-Befehle gezeigt werden.

 

Ich habe zwei Tickets bei Mikrotik eröffnet:

  • SUP-127585: Fehlende TCP-Registerkarte in den Packet-Templates
  • SUP-127586: Feature Request: Port-Knocking-Client (wenn auch wie vorgestellt möglich, ist das für ein simples Port-Knocking eigentlich zu umständlich und nur für erfahrene ROS-Anwender sinnvoll)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert