
BOF (Boiboite Opener Framework) — это фреймворк для тестирования реализаций промышленных протоколов и устройств.
BOF (Boiboite Opener Framework) — это фреймворк для тестирования реализаций полевых протоколов и устройств. Это библиотека Python 3.6+, предоставляющая средства для отправки, приёма, создания, разбора и манипулирования кадрами поддерживаемых протоколов.
В настоящее время библиотека предоставляет функции обнаружения и расширенного тестирования для KNXnet/IP, который является нашей основной задачей, но она может быть расширена на другие типы BMS или промышленных сетевых протоколов. Она также предоставляет функции многоадресного и/или сквозного обнаружения для промышленных сетей, использующих KNXnet/IP, LLDP, Profinet DCP и Modbus TCP.
Обратите внимание: воздействие на промышленные системы может иметь серьёзные последствия для людей, промышленных объектов и зданий, поэтому BOF необходимо использовать с осторожностью.
pip install boiboite-opener-framework
https://pypi.org/project/boiboite-opener-framework/
git clone https://github.com/Orange-Cyberdefense/bof.git
Установите зависимости с помощью:
pip install -r requirements.txt
Реализации протоколов используют формат Scapy.
BOF — это библиотека Python 3.6+, которую следует импортировать в скрипты.
import bof
from bof.layers import profinet, knx
from bof.layers.knx import KnxPacket
Существует три способа использования BOF, и не все они доступны в зависимости от уровня:
Автоматизированный: импортируйте или напрямую вызывайте высокоуровневые функции из уровней. Знание протокола не требуется. Например, модуль discovery содержит несколько функций для обнаружения устройств с использованием различных промышленных сетевых протоколов.
Стандартный: создавайте пакеты из уровней для взаимодействия с удалёнными устройствами. Требуется базовое знание протокола.
Экспериментальный: играйте с пакетами, неправильно используйте протокол (с его помощью мы фаззим устройства). Конечный пользователь должен уже начать разбираться в спецификациях протокола.
Теперь вы можете начать использовать 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
Устройство-получатель, скорее всего, не ответит на это, но по крайней мере вы знаете, что BOF не помешает вам возиться со своими пакетами.
BOF использует Scapy для реализации протоколов, добавляя дополнительный уровень, который преобразует код BOF в изменения пакетов и полей Scapy. Зачем? Потому что BOF может незначительно изменять или переопределять внутреннее поведение Scapy.
Для использования BOF вам не нужно уметь пользоваться Scapy, однако если вы умеете, вы также можете напрямую взаимодействовать с пакетом 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
Ссылка на документацию: https://bof.readthedocs.io
Пользовательское руководство в формате HTML и документацию по исходному коду можно собрать из репозитория:
$> cd docs && make html[path to repository]/docs/_build/html/index.htmlПримеры скриптов находятся в папке examples.
Мы приветствуем участников! BOF — это всё ещё развивающийся проект, который опирается на реализации промышленных сетевых протоколов в формате Scapy. Вы можете начать с вклада в Scapy и добавления новых протоколов («уровней»). Либо вы можете внести вклад, интегрировав протокол Scapy в BOF. В документации объясняется, как это сделать. Кроме того, всегда найдётся место для высокоуровневых функций, которые упростят тестирование или реализуют известные атаки на протоколы или их реализации.
Вот несколько вещей, которые стоит знать заранее:
Нам нравится чистый код, и мы ожидаем, что вклад будет по возможности соответствовать PEP-8 (даже если мы это не проверяем). Новый код должен легко читаться и поддерживаться. И помните: если при объяснении того, что делает ваша функция, вам нужно использовать «и», то, вероятно, её можно разделить.
Пожалуйста, пишите модульные тесты и убедитесь, что существующие по-прежнему проходят! Они находятся в
tests/. Вы можете запустить все модульные тесты с помощью: python -m unittest discover -s tests
Сообщайте об ошибках, задавайте вопросы или запрашивайте недостающую документацию и новые функции, создавая issue на GitHub. При сообщении об ошибках, пожалуйста, описывайте свою проблему как можно яснее.
| Автоматизированный | Стандартный | Экспериментальный |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |