
BOF (Boiboite Opener Framework) est un framework de test pour les implémentations et les appareils de protocoles industriels.
BOF (Boiboite Opener Framework) est un framework de test pour les implémentations de protocoles de terrain et les dispositifs. C'est une bibliothèque Python 3.6+ qui fournit des moyens d'envoyer, recevoir, créer, analyser et manipuler des trames des protocoles supportés.
La bibliothèque fournit actuellement des fonctionnalités de découverte et de test étendu pour KNXnet/IP, qui est notre objectif, mais elle peut être étendue à d'autres types de protocoles BMS ou de réseaux industriels. Elle fournit également des fonctions de découverte multicast et/ou de bout en bout pour les réseaux industriels reposant sur KNXnet/IP, LLDP, Profinet DCP et Modbus TCP.
Veuillez noter que cibler des systèmes industriels peut avoir un impact grave sur les personnes, les opérations industrielles et les bâtiments, et que BOF doit être utilisé avec précaution.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Installez les dépendances avec :
pip install -r requirements.txt
Les implémentations de protocole utilisent le format de Scapy.
BOF est une bibliothèque Python 3.6+ qui doit être importée dans les scripts.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Il y a trois façons d'utiliser BOF, toutes ne sont pas disponibles selon la couche :
Automatisé : Importer ou appeler directement des fonctions de haut niveau des couches. Aucune connaissance du protocole requise. Par exemple, le module discovery contient quelques fonctions pour découvrir des dispositifs en utilisant plusieurs protocoles de réseaux industriels.
Standard : Créer des paquets à partir des couches pour interagir avec des dispositifs distants. Connaissances de base du protocole requises.
Ludique : Jouer avec les paquets, abuser du protocole (nous faisons du fuzzing de dispositifs avec). L'utilisateur final devrait avoir commencé à creuser les spécifications du protocole.
Maintenant vous pouvez commencer à utiliser 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 dispositif récepteur ne répondra probablement pas à cela, mais au moins vous savez que BOF ne vous empêchera pas de jouer avec vos paquets.
BOF s'appuie sur Scapy pour les implémentations de protocole, avec une couche supplémentaire qui traduit le code BOF en modifications sur les paquets et champs Scapy. Pourquoi ? Parce que BOF peut légèrement modifier ou outrepasser le comportement interne de Scapy.
Vous n'avez pas besoin de savoir utiliser Scapy pour utiliser BOF, mais si vous le savez, vous êtes libre d'interagir directement avec le paquet Scapy également.
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
Lien vers la documentation : https://bof.readthedocs.io
Le manuel d'utilisation en HTML et la documentation du code source peuvent être construits à partir du dépôt :
$> cd docs && make html[chemin vers le dépôt]/docs/_build/html/index.htmlLes exemples de scripts se trouvent dans le dossier examples.
Les contributeurs sont les bienvenus ! BOF est encore un projet en cours, qui repose sur des implémentations de protocoles de réseaux industriels au format Scapy. Vous pouvez d'abord contribuer en contribuant à Scapy et en ajoutant de nouveaux protocoles ("layers"). Ou, vous pouvez contribuer en intégrant un protocole Scapy dans BOF. La documentation explique comment faire. De plus, il y aura encore de la place pour des fonctions de plus haut niveau qui faciliteront les tests ou implémenteront des attaques connues contre des protocoles ou des implémentations de protocoles.
Voici quelques choses à savoir avant de contribuer :
Nous aimons le code propre et attendons des contributions qu'elles soient conformes à PEP-8 autant que possible (même si nous ne le testons pas). Le nouveau code doit être facilement lisible et maintenable. Et rappelez-vous : si vous avez besoin d'utiliser "et" en expliquant ce que fait votre fonction, alors vous pouvez probablement la diviser.
Veuillez écrire des tests unitaires et assurez-vous que les tests existants passent toujours ! Ils se trouvent dans tests/. Vous pouvez exécuter tous les tests unitaires avec : python -m unittest discover -s tests
Signalez des bogues, posez des questions ou demandez de la documentation manquante et de nouvelles fonctionnalités en soumettant un problème sur GitHub. Pour les bogues, veuillez décrire votre problème aussi clairement que possible.
| Automatisé | Standard | Ludique |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |