
BOF (Boiboite Opener Framework) ist ein Test-Framework für Implementierungen industrieller Protokolle und Geräte.
BOF (Boiboite Opener Framework) ist ein Test-Framework für Feldprotokoll-Implementierungen und -Geräte. Es ist eine Python-3.6+-Bibliothek, die Mittel bereitstellt, um Frames der unterstützten Protokolle zu senden, zu empfangen, zu erstellen, zu parsen und zu manipulieren.
Die Bibliothek bietet derzeit Discovery- und erweiterte Testfunktionen für KNXnet/IP, das unseren Schwerpunkt bildet, lässt sich aber auf andere Arten von BMS- oder industriellen Netzwerkprotokollen erweitern. Sie bietet auch Multicast- und/oder End-to-End-Discovery-Funktionen für industrielle Netzwerke, die auf KNXnet/IP, LLDP, Profinet DCP und Modbus TCP basieren.
Bitte beachten Sie, dass das Ausrichten auf industrielle Systeme schwerwiegende Auswirkungen auf Menschen, industrielle Abläufe und Gebäude haben kann und dass BOF mit Vorsicht verwendet werden muss.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Installieren Sie die Abhängigkeiten mit:
pip install -r requirements.txt
Die Protokollimplementierungen verwenden das Format von Scapy.
BOF ist eine Python-3.6+-Bibliothek, die in Skripte importiert werden sollte.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Es gibt drei Möglichkeiten, BOF zu verwenden, die je nach Layer nicht alle verfügbar sind:
Automatisiert: Importieren oder rufen Sie direkt Funktionen höherer Ebene aus den Layern auf. Keine Kenntnisse über das Protokoll erforderlich. Beispielsweise enthält das Discovery-Modul einige Funktionen, um Geräte mithilfe verschiedener industrieller Netzwerkprotokolle zu entdecken.
Standard: Erstellen Sie Pakete aus Layern, um mit entfernten Geräten zu interagieren. Grundkenntnisse über das Protokoll erforderlich.
Spielerisch: Spielen Sie mit Paketen, nutzen Sie das Protokoll zweckentfremdet (wir fuzzen damit Geräte). Der Endbenutzer sollte bereits begonnen haben, sich in die Spezifikationen des Protokolls einzuarbeiten.
Jetzt können Sie mit der Verwendung von BOF beginnen!
from bof.modules.discovery import *
devices = multicast_discovery(iface="eth0", verbose=True)
from bof.layers.knx import search
devices = search()
for device in devices:
print(device)
from bof.layers.knx import *
pkt = KNXPacket(type="search request")
responses = KNXnet.multicast(pkt, (KNX_MULTICAST_ADDR, KNX_PORT))
for response, _ in responses:
print(KNXPacket(response))
from bof.layers.knx import KNXnet, KNXPacket, SID
from bof import BOFNetworkError
try:
knxnet = KNXnet().connect("192.168.1.242", 3671)
pkt = KNXPacket(type=SID.description_request,
ip_address=knxnet.source_address,
port=knxnet.source_port)
pkt.show2()
response, _ = knxnet.sr(pkt)
response.show2()
except BOFNetworkError as bne:
pass
finally:
knxnet.disconnect()
from bof.layers.knx import KNXPacket, SID
from bof.layers.raw_scapy.knx import LcEMI
pkt = KNXPacket(type=SID.description_request)
pkt.ip_address = b"\x01\x01"
pkt.port = 99999 # Yes it's too large
pkt.append(LcEMI())
pkt.show2() # This may output something strange
Ein Empfängergerät wird darauf wahrscheinlich nicht antworten, aber zumindest wissen Sie, dass BOF Sie nicht davon abhält, mit Ihren Paketen herumzuspielen.
BOF stützt sich für Protokollimplementierungen auf Scapy, mit einer zusätzlichen Schicht, die BOF-Code in Änderungen an Scapy-Paketen und -Feldern übersetzt. Warum? Weil BOF das interne Verhalten von Scapy leicht modifizieren oder überschreiben kann.
Sie müssen nicht wissen, wie man Scapy verwendet, um BOF zu nutzen; wenn Sie es jedoch können, können Sie auch direkt mit dem Scapy-Paket interagieren.
packet = KNXPacket(type=connect_request)
packet.field1 = 1 # Applying additional BOF operations (ex: change types)
packet.scapy_pkt.field1 = 1 # Direct access to Scapy Packet object
Link zur Dokumentation: https://bof.readthedocs.io
Das HTML-Benutzerhandbuch und die Quellcode-Dokumentation können aus dem Repository erstellt werden:
$> cd docs && make html[path to repository]/docs/_build/html/index.htmlBeispielskripte befinden sich im Ordner examples.
Mitwirkende sind willkommen! BOF ist noch ein laufendes Projekt, das auf industriellen Netzwerkprotokollimplementierungen im Scapy-Format basiert. Sie können zunächst beitragen, indem Sie zu Scapy beitragen und neue Protokolle („Layer“) hinzufügen. Oder Sie können beitragen, indem Sie ein Scapy-Protokoll in BOF integrieren. Die Dokumentation erklärt, wie das geht. Darüber hinaus gibt es weiterhin Raum für Funktionen höherer Ebene, die Tests erleichtern oder bekannte Angriffe gegen Protokolle oder Protokollimplementierungen umsetzen.
Hier ein paar Dinge, die Sie vorher wissen sollten:
Wir mögen sauberen Code und erwarten, dass Beiträge so weit wie möglich PEP-8-konform sind (auch wenn wir es nicht testen). Neuer Code sollte leicht lesbar und wartbar sein. Und denken Sie daran: Wenn Sie beim Erklären, was Ihre Funktion tut, „und“ verwenden müssen, können Sie sie wahrscheinlich aufteilen.
Bitte schreiben Sie Unit-Tests und stellen Sie sicher, dass die vorhandenen weiterhin bestehen! Sie befinden sich in tests/. Sie können alle Unit-Tests ausführen mit: python -m unittest discover -s tests
Melden Sie Fehler, stellen Sie Fragen oder fordern Sie fehlende Dokumentation und neue Funktionen an, indem Sie ein Issue auf GitHub einreichen. Beschreiben Sie Ihr Problem bei Fehlern bitte so klar wie möglich.
| Automatisiert | Standard | Spielerisch |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |