
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 には3つの使用方法がありますが、レイヤーによってはすべてが利用できるわけではありません:
自動化: レイヤーの高レベル関数を直接インポートまたは呼び出します。プロトコルに関する知識は不要です。たとえば、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 に貢献して新しいプロトコル("layers")を追加することで貢献できます。または、Scapy プロトコルを BOF に統合することで貢献することもできます。ドキュメントにはその方法が説明されています。さらに、テストを容易にしたり、プロトコルやプロトコル実装に対する既知の攻撃を実装する高レベル関数のための余地もまだあります。
事前に知っておくべきことをいくつか示します:
私たちはクリーンなコードを好み、貢献が可能な限り PEP-8 準拠であることを期待しています(テストはしていませんが)。新しいコードは簡単に読めて、保守可能であるべきです。そして覚えておいてください:関数が何をするかを説明するときに "and" を使う必要があるなら、おそらく関数を分割できるでしょう。
ユニットテストを書き、既存のテストがまだ通ることを確認してください! テストは tests/ にあります。すべてのユニットテストは次のコマンドで実行できます: python -m unittest discover -s tests
バグの報告、質問、不足しているドキュメントや新機能のリクエストは、GitHub で issue を送信してください。バグの場合は、問題をできるだけ明確に説明してください。
| 自動化 | 標準 | 遊び心 |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |