
BOF (Boiboite Opener Framework) è un framework di test per implementazioni di protocolli industriali e dispositivi.
BOF (Boiboite Opener Framework) è un framework di testing per implementazioni di protocolli di campo e dispositivi. È una libreria Python 3.6+ che fornisce i mezzi per inviare, ricevere, creare, analizzare e manipolare frame dei protocolli supportati.
Attualmente la libreria fornisce funzionalità di discovery e test estesi per KNXnet/IP, che è il nostro focus, ma può essere estesa ad altri tipi di protocolli BMS o di rete industriale. Fornisce inoltre funzioni di discovery multicast e/o end-to-end per reti industriali basate su KNXnet/IP, LLDP, Profinet DCP e Modbus TCP.
Si noti che prendere di mira sistemi industriali può avere un grave impatto su persone, operazioni industriali ed edifici e che BOF deve essere usato con cautela.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Installa i requisiti con:
pip install -r requirements.txt
Le implementazioni dei protocolli usano il formato di Scapy.
BOF è una libreria Python 3.6+ che dovrebbe essere importata negli script.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Ci sono tre modi per usare BOF, non tutti disponibili a seconda del layer:
Automated: Importa o chiama direttamente funzioni di alto livello dai layer. Non è richiesta alcuna conoscenza del protocollo. Ad esempio, il modulo discovery contiene alcune funzioni per scoprire dispositivi usando diversi protocolli di rete industriale.
Standard: Costruisci pacchetti dai layer per interagire con dispositivi remoti. È richiesta una conoscenza di base del protocollo.
Playful: Gioca con i pacchetti, usa impropriamente il protocollo (fuzziamo i dispositivi con esso). L'utente finale dovrebbe aver iniziato a esplorare le specifiche del protocollo.
Ora puoi iniziare a usare BOF!
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
Un dispositivo destinatario probabilmente non risponderà, ma almeno sai che BOF non ti impedirà di pasticciare con i tuoi pacchetti.
BOF si basa su Scapy per le implementazioni dei protocolli, con un layer aggiuntivo che traduce il codice BOF in modifiche sui pacchetti e campi di Scapy. Perché? Perché BOF può modificare o sovrascrivere leggermente il comportamento interno di Scapy.
Non è necessario saper usare Scapy per usare BOF; tuttavia, se lo sai, sei libero di interagire direttamente anche con il pacchetto Scapy.
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 alla documentazione: https://bof.readthedocs.io
Il manuale utente HTML e la documentazione del codice sorgente possono essere generati dal repository:
$> cd docs && make html[path to repository]/docs/_build/html/index.htmlGli script di esempio sono nella cartella examples.
I contributori sono i benvenuti! BOF è ancora un progetto in corso, che si basa su implementazioni di protocolli di rete industriale in formato Scapy. Puoi contribuire prima contribuendo a Scapy e aggiungendo nuovi protocolli ("layer"). Oppure puoi contribuire integrando un protocollo Scapy in BOF. La documentazione spiega come farlo. Inoltre, ci sarà ancora spazio per funzioni di livello superiore che renderanno i test più facili o implementeranno attacchi noti contro protocolli o implementazioni di protocolli.
Ecco alcune cose da sapere in anticipo:
Ci piace il codice pulito e ci aspettiamo che i contributi siano il più possibile conformi a PEP-8 (anche se non lo testiamo). Il nuovo codice dovrebbe essere facilmente leggibile e manutenibile. E ricorda: se hai bisogno di usare "e" mentre spieghi cosa fa la tua funzione, probabilmente puoi dividerla.
Per favore scrivi Unit test e assicurati che quelli esistenti passino ancora! Si trovano in tests/. Puoi eseguire tutti i unit test con: python -m unittest discover -s tests
Segnala bug, fai domande o richiedi documentazione mancante e nuove funzionalità aprendo una issue su GitHub. Per i bug, descrivi il tuo problema nel modo più chiaro possibile.
| Automated | Standard | Playful |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |