
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를 사용하는 세 가지 방법이 있으며, 레이어에 따라 모두 사용 가능하지는 않습니다:
자동: 레이어의 고급 함수를 직접 임포트하거나 호출합니다. 프로토콜에 대한 지식이 필요 없습니다. 예를 들어, 검색 모듈에는 여러 산업용 네트워크 프로토콜을 사용하여 장치를 검색하는 몇 가지 함수가 포함되어 있습니다.
표준: 레이어에서 패킷을 제작하여 원격 장치와 상호 작용합니다. 프로토콜에 대한 기본 지식이 필요합니다.
유희: 패킷을 가지고 놀고, 프로토콜을 오용합니다(이를 통해 장치를 퍼징합니다). 최종 사용자는 프로토콜 사양을 파고들기 시작해야 합니다.
이제 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 # 예, 너무 큽니다
pkt.append(LcEMI())
pkt.show2() # 이상한 출력이 나올 수 있습니다
수신 장치는 아마 응답하지 않겠지만, 적어도 BOF가 패킷을 엉망으로 만드는 것을 막지 않는다는 것을 알 수 있습니다.
BOF는 프로토콜 구현을 위해 Scapy에 의존하며, BOF 코드 변경을 Scapy 패킷 및 필드에 반영하는 추가 레이어를 사용합니다. 왜일까요? BOF가 Scapy의 내부 동작을 약간 수정하거나 재정의할 수 있기 때문입니다.
BOF를 사용하기 위해 Scapy 사용법을 알 필요는 없지만, 알고 있다면 Scapy 패킷에 직접 상호 작용할 수도 있습니다.
packet = KNXPacket(type=connect_request)
packet.field1 = 1 # 추가 BOF 작업 적용(예: 유형 변경)
packet.scapy_pkt.field1 = 1 # Scapy Packet 객체에 직접 접근
문서 링크: https://bof.readthedocs.io
HTML 사용자 매뉴얼 및 소스 코드 문서는 저장소에서 빌드할 수 있습니다:
$> cd docs && make html[저장소 경로]/docs/_build/html/index.html로 이동예제 스크립트는 examples 폴더에 있습니다.
기여자를 환영합니다! BOF는 아직 진행 중인 프로젝트로, Scapy 형식의 산업용 네트워크 프로토콜 구현에 의존합니다. 먼저 Scapy에 기여하고 새로운 프로토콜("레이어")을 추가할 수 있습니다. 또는 Scapy 프로토콜을 BOF에 통합하여 기여할 수 있습니다. 문서에 방법이 설명되어 있습니다. 또한, 테스트를 더 쉽게 만들거나 프로토콜 또는 프로토콜 구현에 대한 알려진 공격을 구현하는 고급 함수를 위한 공간이 아직 있습니다.
몇 가지 사전 정보:
우리는 깨끗한 코드를 선호하며, 가능한 한 PEP-8을 준수하는 기여를 기대합니다(테스트하지는 않지만). 새로운 코드는 읽기 쉽고 유지 관리가 가능해야 합니다. 그리고 기억하세요: 함수가 수행하는 작업을 설명할 때 "그리고"를 사용해야 한다면, 아마 분할할 수 있습니다.
단위 테스트를 작성하고 기존 테스트가 여전히 통과하는지 확인하세요! 테스트는 tests/에 있습니다. 모든 단위 테스트를 실행하려면: python -m unittest discover -s tests
버그 보고, 질문, 누락된 문서 및 새로운 기능 요청은 GitHub에서 이슈를 제출하여 해주세요. 버그의 경우 문제를 최대한 명확하게 설명해주세요.
| 자동 | 표준 | 유희 |
|---|
| KNX | X | X | X |
| LLDP | X | ||
| Modbus | X | X | X |
| Profinet DCP | X |