
BOF (Boiboite Opener Framework) es un framework de pruebas para implementaciones y dispositivos de protocolos industriales.
BOF (Boiboite Opener Framework) es un framework de pruebas para implementaciones de protocolos de campo y dispositivos. Es una librería de Python 3.6+ que proporciona medios para enviar, recibir, crear, parsear y manipular tramas de los protocolos soportados.
La librería actualmente proporciona funciones de descubrimiento y pruebas ampliadas para KNXnet/IP, que es nuestro enfoque, pero puede extenderse a otros tipos de BMS o protocolos de redes industriales. También proporciona funciones de descubrimiento multicast y/o de extremo a extremo para redes industriales que dependen de KNXnet/IP, LLDP, Profinet DCP y Modbus TCP.
Ten en cuenta que atacar sistemas industriales puede tener un grave impacto en las personas, las operaciones industriales y los edificios, y que BOF debe usarse con cuidado.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Instala los requisitos con:
pip install -r requirements.txt
Las implementaciones de protocolos utilizan el formato de Scapy.
BOF es una librería de Python 3.6+ que debe importarse en scripts.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Hay tres formas de usar BOF; no todas están disponibles dependiendo de la capa:
Automatizado: Importa o llama directamente a funciones de alto nivel de las capas. No se requiere conocimiento del protocolo. Por ejemplo, el módulo discovery contiene algunas funciones para descubrir dispositivos usando varios protocolos de redes industriales.
Estándar: Construye paquetes a partir de las capas para interactuar con dispositivos remotos. Se requiere conocimiento básico del protocolo.
Lúdico: Juega con los paquetes, usa mal el protocolo (hacemos fuzzing de dispositivos con él). El usuario final debería haber comenzado a profundizar en las especificaciones del protocolo.
¡Ahora puedes empezar a usar 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 receptor probablemente no responderá a eso, pero al menos sabes que BOF no te impedirá manipular tus paquetes.
BOF se apoya en Scapy para las implementaciones de protocolos, con una capa adicional que traduce el código de BOF a cambios en los paquetes y campos de Scapy. ¿Por qué? Porque BOF puede modificar ligeramente o anular el comportamiento interno de Scapy.
No necesitas saber cómo usar Scapy para usar BOF; sin embargo, si lo sabes, eres libre de interactuar directamente también con el paquete de 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
Enlace a la documentación: https://bof.readthedocs.io
El manual de usuario en HTML y la documentación del código fuente se pueden compilar desde el repositorio:
$> cd docs && make html[path to repository]/docs/_build/html/index.htmlLos scripts de ejemplo están en la carpeta examples.
¡Los contribuidores son bienvenidos! BOF sigue siendo un proyecto en curso, que se basa en implementaciones de protocolos de redes industriales en formato Scapy. Puedes contribuir primero aportando a Scapy y añadiendo nuevos protocolos ("layers"). O bien, puedes contribuir integrando un protocolo de Scapy en BOF. La documentación explica cómo hacerlo. Además, todavía habrá espacio para funciones de alto nivel que faciliten las pruebas o implementen ataques conocidos contra protocolos o implementaciones de protocolos.
Aquí tienes algunas cosas que debes saber de antemano:
Nos gusta el código limpio y esperamos que las contribuciones cumplan con PEP-8 tanto como sea posible (aunque no lo probamos). El código nuevo debe ser fácil de leer y mantener. Y recuerda: si necesitas usar "y" mientras explicas lo que hace tu función, probablemente puedas dividirla.
Por favor, escribe pruebas unitarias y asegúrate de que las existentes sigan pasando. Están en
tests/. Puedes ejecutar todas las pruebas unitarias con: python -m unittest discover -s tests
Reporta errores, haz preguntas o solicita documentación faltante y nuevas funciones enviando un issue a través de GitHub. Para errores, describe tu problema lo más claramente que puedas.
| Automatizado | Estándar | Lúdico |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |