
BOF (Boiboite Opener Framework) é um framework de testes para implementações de protocolos industriais e dispositivos.
BOF (Boiboite Opener Framework) é um framework de teste para implementações de protocolos de campo e dispositivos. É uma biblioteca Python 3.6+ que fornece meios para enviar, receber, criar, analisar e manipular frames de protocolos suportados.
A biblioteca atualmente fornece funcionalidades de descoberta e testes avançados para KNXnet/IP, que é o nosso foco, mas pode ser estendida para outros tipos de protocolos BMS ou de redes industriais. Ela também fornece funções de descoberta multicast e/ou ponta a ponta para redes industriais que utilizam KNXnet/IP, LLDP, Profinet DCP e Modbus TCP.
Por favor, note que atacar sistemas industriais pode ter um impacto severo sobre pessoas, operações industriais e edifícios, e que o BOF deve ser usado com cuidado.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Instale os requisitos com:
pip install -r requirements.txt
As implementações de protocolo usam o formato do Scapy.
BOF é uma biblioteca Python 3.6+ que deve ser importada em scripts.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Existem três formas de usar o BOF, nem todas disponíveis dependendo da camada:
Automático: Importe ou chame diretamente funções de alto nível das camadas. Nenhum conhecimento sobre o protocolo é necessário. Por exemplo, o módulo discovery contém algumas funções para descobrir dispositivos usando vários protocolos de rede industrial.
Padrão: Crie pacotes a partir de camadas para interagir com dispositivos remotos. Conhecimento básico sobre o protocolo é necessário.
Lúdico: Brinque com pacotes, use indevidamente o protocolo (nós fazemos fuzzing de dispositivos com ele). O utilizador final deve ter começado a explorar as especificações do protocolo.
Agora você pode começar a usar o 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 # Sim, é muito grande
pkt.append(LcEMI())
pkt.show2() # Isto pode mostrar algo estranho
Um dispositivo recetor provavelmente não responderá a isso, mas pelo menos você sabe que o BOF não o impedirá de mexer nos seus pacotes.
O BOF depende do Scapy para implementações de protocolo, com uma camada adicional que traduz o código BOF em alterações nos pacotes e campos do Scapy. Porquê? Porque o BOF pode modificar ou substituir ligeiramente o comportamento interno do Scapy.
Não precisa de saber usar o Scapy para usar o BOF; no entanto, se souber, pode interagir diretamente com o pacote Scapy também.
packet = KNXPacket(type=connect_request)
packet.field1 = 1 # Aplicar operações adicionais do BOF (ex: alterar tipos)
packet.scapy_pkt.field1 = 1 # Acesso direto ao objeto Packet do Scapy
Link para a documentação: https://bof.readthedocs.io
O manual do utilizador em HTML e a documentação do código fonte podem ser gerados a partir do repositório:
$> cd docs && make html[caminho para o repositório]/docs/_build/html/index.htmlOs scripts de exemplo estão na pasta examples.
Contribuições são bem-vindas! O BOF ainda é um projeto em andamento, que depende de implementações de protocolos de rede industrial no formato Scapy. Pode contribuir primeiro contribuindo para o Scapy e adicionando novos protocolos ("camadas"). Ou, pode contribuir integrando um protocolo Scapy no BOF. A documentação explica como fazê-lo. Além disso, ainda haverá espaço para funções de nível mais alto que tornarão os testes mais fáceis ou implementarão ataques conhecidos contra protocolos ou implementações de protocolos.
Aqui estão algumas coisas a saber antecipadamente:
Gostamos de código limpo e esperamos que as contribuições estejam o mais em conformidade possível com PEP-8 (mesmo que não testemos isso). Código novo deve ser fácil de ler e manterável. E lembre-se: se precisar de usar "e" enquanto explica o que a sua função faz, provavelmente pode dividi-la.
Por favor, escreva testes unitários e certifique-se de que os existentes ainda
passam! Eles estão em tests/. Pode executar todos os testes unitários com:
python -m unittest discover -s tests
Reporte bugs, faça perguntas ou solicite documentação em falta e novas funcionalidades submetendo um issue no GitHub. Para bugs, por favor descreva o seu problema da forma mais clara possível.
| Automático | Padrão | Lúdico |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |