
nOBEX allows emulating the PBAP, MAP, and HFP profiles to test vehicle infotainment systems and similar devices using these profiles
nOBEX는 PBAP, MAP, HFP 프로파일을 에뮬레이션하여 차량용 인포테인먼트 시스템 및 이러한 프로파일을 사용하는 유사한 장치를 테스트할 수 있게 해줍니다. nOBEX는 실제 휴대폰에서 이러한 프로파일에 대한 실제 가상 파일시스템을 복제하는 PBAP 및 MAP 클라이언트를 제공합니다. 즉, 전체 전화번호부와 모든 문자 메시지를 다운로드합니다. 원시 vcard, XML 목록 및 MAP BMSG 구조가 저장되며, 네거티브 테스트를 위해 원하는 대로 수정할 수 있습니다. 그런 다음 nOBEX는 PBAP 및 MAP 서버 역할을 하여 차량 및 기타 장치가 연결하여 전화번호부와 메시지 정보를 검색할 수 있게 합니다. Vcard, BMSG 및 XML 목록은 저장된 그대로 정확히 전송되므로, 사용자가 변조한 잘못된 데이터도 그대로 전달됩니다. 대부분의 차량용 헤드 유닛은 PBAP 및 MAP를 사용하기 전에 HFP 지원을 요구하므로, nOBEX는 HFP에 대한 기초적인 지원도 제공합니다. 차량의 헤드 유닛에서 오는 AT 명령에 사용자가 맞춤 설정할 수 있는 사전 정의 응답을 보내줍니다. 이를 통해 실제 휴대폰을 흉내낼 수 있습니다.
nOBEX는 David Boddie의 PyOBEX 프로젝트를 기반으로 구축되었습니다. OBEX를 쉽게 접근하고 다루기 쉽게 만든 David의 큰 노력 없이는 이 도구가 존재할 수 없었을 것입니다. nOBEX는 대용량 다중 부분 OBEX 메시지 지원, HFP 에뮬레이션, PBAP 및 MAP 서버, MAP 클라이언트, 그리고 개선된 PBAP 클라이언트를 추가하여 PyOBEX를 확장합니다.
nOBEX(및 PyOBEX)는 BlueZ 블루투스 스택을 사용하여 서비스 발견 프로토콜(SDP)을 통해 서비스를 광고하고 RFCOMM 연결을 설정합니다. nOBEX/PyOBEX에는 클라이언트 및 서버 역할을 위한 OBEX 사양의 독립 실행형 구현이 포함되어 있습니다. Python 2와 3이 모두 지원됩니다.
클라이언트 모드에서 nOBEX는 BlueZ를 사용하여 서버가 제공하는 서비스를 쿼리합니다. 요청한 서비스를 사용할 수 있음을 감지하면 SDP를 통해 지정된 포트의 RFCOMM을 통해 서버에 연결합니다. OBEX 요청은 사용 중인 프로파일에 따라 구성되어 서버로 전송됩니다. 응답은 해석되어 디스크에 저장됩니다. PBAP 및 MAP 클라이언트 모드는 실제 휴대폰을 복제하는 데 사용할 수 있습니다.
서버 모드에서 nOBEX는 SDP를 통해 사용 가능한 서비스를 광고합니다. 클라이언트가 광고된 포트에 RFCOMM 연결을 하면 서버는 OBEX 요청을 수락하고 처리합니다. 요청에 대한 OBEX 응답은 디스크의 데이터를 사용하여 전송됩니다. PBAP 및 MAP 서버는 각각의 클라이언트가 생성한 파일/폴더 구조와 일치하는 구조를 제공합니다.
다음 설정 지침은 Fedora 24, 27 및 29에서 테스트되었습니다. 다른 최신 배포판에서도 작동할 수 있지만, 경험은 다를 수 있습니다. 배포판에 sdptool이 포함되어 있지 않은 경우 레거시 bluez 도구(包括 sdptool)를 설치해야 할 수 있습니다. 또한 OBEX 서버는 공유 블루투스 어댑터를 사용하는 가상 머신에서는 작동하지 않는 경향이 있습니다. Linux를 네이티브로 실행하거나, VM 전용 USB 블루투스 어댑터를 사용하십시오.
SDP에서 광고되는 로컬 서비스를 탐색해 보십시오:
sudo sdptool browse local
최신 배포판을 사용 중이라면 BlueZ 5의 일부 주요 API 변경으로 인해 실패할 수 있습니다. bluetoothd를 호환 모드로 실행하여 해결할 수 있습니다. bluetoothd의 systemd 서비스를 편집하여 수행합니다.
sudo vi /usr/lib/systemd/system/bluetooth.service
ExecStart 줄에 --compat을 추가하십시오:
ExecStart=/usr/libexec/bluetooth/bluetoothd --compat
이제 bluetoothd를 다시 시작하십시오:
sudo service bluetooth stop
sudo systemctl daemon-reload
sudo service bluetooth start
sudo hciconfig -a hci0 reset
로컬 SDP 서비스 탐색을 다시 테스트하십시오(이번에는 작동해야 합니다):
sudo sdptool browse local
nOBEX를 받아 설치하십시오:
git clone https://github.com/nccgroup/nOBEX.git
cd nOBEX
sudo python3 setup.py install
전화번호부를 복제하려는 휴대폰의 MAC 주소를 찾으십시오:
hcitool scan
기존 휴대폰의 PBAP 콘텐츠를 복제하십시오(올바른 MAC과 가급적 비어 있거나 존재하지 않는 대상 디렉토리를 사용하십시오):
python3 examples/pbapclient.py 5C:51:88:8A:EC:5B ~/pbap_root/
또는 examples/pbap_root 폴더에 있는 PBAP 샘플 데이터 트리를 사용하십시오.
PBAP 덤프 디렉토리의 vcard와 목록 XML을 원하는 대로 수정하십시오. 이제 복제된 전화번호부를 사용하여 PBAP 서버를 실행하십시오:
sudo python3 examples/multiserver.py --pbap ~/pbap_root/
또한 PBAP 클라이언트를 컴퓨터(PBAP 서버)와 페어링해야 합니다.
테스트 MAP 트리를 구축하기 위해 휴대폰에서 메시지 데이터를 가져오십시오:
python3 examples/mapclient.py 5C:51:88:8A:EC:5B ~/map_root/
또는 휴대폰이 MAP를 제대로 지원하지 않는 경우 examples/map_root 폴더에 있는 MAP 샘플 데이터 트리를 사용하십시오.
샘플 데이터를 원하는 대로 수정하십시오. 그런 다음 MAP 트리의 루트를 찾을 위치를 지정하여 서버를 실행하십시오.
sudo python3 examples/multiserver.py --map ~/map_root/
HFP 클라이언트(핸즈프리, 차량용 키트 에뮬레이터)는 HFAG(휴대폰/모뎀)와 통신하기 위한 AT 명령 CLI를 제공합니다. RFCOMM 서버임에도 불구하고 HFAG(휴대폰/모뎀)의 "클라이언트"이기 때문에 "HFP 클라이언트"라고 부릅니다. "서버"(HFAG)가 RFCOMM 연결을 시작하는 주체임에도 불구하고 HF 에뮬레이터("클라이언트")를 사용하여 HFAG에 AT 명령을 보냅니다.
HF 에뮬레이터를 실행하려면:
sudo python3 examples/hfpclient.py
휴대폰을 페어링하기 전에 HF 에뮬레이터를 시작하여 SDP를 통해 자신이 HF임을 광고해야 할 수 있습니다. HF 에뮬레이터가 실행 중이면 휴대폰이 에뮬레이터 스크립트와 AT 명령 RFCOMM 연결을 시작합니다. 이 과정을 빠르게 하려면 휴대폰의 블루투스 설정에서 페어링된 컴퓨터를 클릭하여 연결/재연결을 트리거할 수 있습니다.
HFAG(휴대폰/모뎀)가 연결을 시작하면 일반적으로 HFP 세션을 구성할 수 있는 제한된 시간(30초에서 1분)이 주어집니다. 유용한 AT 명령(예: 통화 시작)을 보내려면 먼저 제한된 시간 내에 일련의 AT 명령을 보내야 합니다. 그렇지 않으면 HFAG가 연결을 끊을 수 있습니다. 다음 초기 AT 명령 시퀀스는 대부분의 휴대폰에서 작동합니다:
AT+BRSF=39
AT+CIND=?
AT+CIND?
AT+CMER=3,0,0,1
AT+CHLD=?
AT+CCWA=1
AT+CLIP=1
AT+NREC=0
HFP 서버(오디오 게이트웨이)는 비교적 기본적이며, 선택된 명령에 미리 구성된 응답을 보내줍니다. 서버는 기본적으로 일반적인 HFP 명령을 지원하도록 설정되어 있지만, 모든 차량은 추가 명령 및/또는 응답 변경이 필요할 수 있습니다. 사용자 지정 응답은 각 줄에 명령과 응답 쌍이 있고 명령과 응답이 탭으로 구분된 텍스트 파일을 통해 구성할 수 있습니다. 샘플 구성 파일은 examples/bbeast 폴더에서 찾을 수 있습니다.
다른 서버와 달리 nOBEX HFP AG 구현은 실제로 RFCOMM 연결을 수락하지 않습니다. HFP 표준은 연결을 설정하는 방법에 대해 모호하므로 HF와 AG 모두 연결을 수락하고 시작할 수 있습니다. 헤드 유닛마다 연결 설정 방식이 다릅니다. 그러나 대부분의 HF 장치는 AG가 자체 포트에서 연결을 수락하지 않는 경우 AG가 연결하는 것을 수락하는 경향이 있습니다. 따라서 nOBEX HFP AG "서버"는 페어링된 장치 중 HF 서비스를 지원하는 장치를 검색한 다음 해당 HF 장치에 연결합니다.
HFP AG 코드는 /var/lib/bluetooth/*/* 아래에 나열된 장치 중 HFP HF 역할을 지원한다고 주장하는 모든 장치에 연결을 시도합니다. 따라서 HFP 서버를 사용하기 전에 해당 디렉토리에서 잘못된 페어링을 모두 삭제해야 합니다.
독립 실행형 HFP AG를 실행하려면(구성 파일은 선택 사항):
sudo python3 examples/multiserver.py --hfp [config_file]
HFP 서버(HFAG)는 런타임에 자동 응답을 편집하거나 AT 응답을 수동으로 보낼 수 있는 대화형 작업도 지원합니다. HFP 서버는 localhost의 포트 7137에서 명령을 수신합니다. 아래와 같이 netcat을 사용하여 연결할 수 있습니다:
nc localhost 7137
이 인터페이스에는 두 가지 간단한 명령만 있습니다:
send <atresp> - atresp를 AT 응답으로 보냅니다ursp <atcmd> <atresp> - atcmd에 대한 자동 응답을 atresp로 업데이트/설정합니다다음 예제 명령은 수신 전화를 시뮬레이션합니다:
ursp AT+CLCC +CLCC: 1,1,4,0,0,"1234567890",129
send RING
FTP(파일 전송 프로파일) 클라이언트를 사용하면 nOBEX를 실행하는 다른 컴퓨터나 Bluetooth File Transfer 앱을 실행하는 Android 휴대폰과 같은 OBEX FTP 서버의 파일을 탐색할 수 있습니다. examples 디렉토리에 FTP 클라이언트 샘플 프로그램이 있습니다.
python3 examples/ftpclient.py SERVER_MAC_ADDRESS [save_directory]
블루투스 MAC 주소만 인수로 사용하여 예제 FTP 클라이언트를 실행하면 서버의 OBEX FTP를 통해 액세스할 수 있는 모든 파일의 재귀 디렉토리 목록이 출력됩니다. 선택적 save_directory 인수를 제공하면 스크립트는 서버에서 액세스 가능한 모든 파일을 다운로드하여 컴퓨터의 지정된 저장 디렉토리에 저장합니다.
FTP 서버를 사용하면 클라이언트가 지정된 폴더 내의 컴퓨터(서버)에 있는 파일을 탐색할 수 있습니다.
sudo python3 examples/multiserver.py --ftp PATH_TO_FTP_FOLDER
OPP(개체 푸시 프로파일) 클라이언트를 사용하면 컴퓨터의 파일을 OBEX OPP 서버로 푸시할 수 있습니다.
python3 examples/pushclient.py SERVER_MAC_ADDRESS FILE_TO_PUSH
OPP 서버를 사용하면 클라이언트가 지정된 폴더 내의 컴퓨터(서버)로 파일을 푸시할 수 있습니다.
sudo python3 examples/multiserver.py --opp PATH_TO_OPP_FOLDER
multiserver.py 스크립트는 HFP, MAP, PBAP, FTP 및 OPP 서버의 모든 조합을 동시에 실행할 수 있습니다. 위 예제의 인수를 결합하기만 하면 됩니다. HFP, MAP 및 PBAP를 동시에 실행하려면:
python3 examples/multiserver.py --map ~/map_root/ --pbap ~/pbap_root/ --hfp [config_file]
HFP와 PBAP의 조합은 2012 Ford Focus에서 성공적으로 테스트되었습니다.
nOBEX의 주요 목적은 자동차 헤드 유닛에서 PBAP 및 MAP 클라이언트에 대한 네거티브 테스트와 퍼징을 수행하는 것입니다. HFP 지원과 PBAP/MAP 클라이언트 지원은 이 목표를 돕기 위한 것입니다. 수동으로 수정된 XML 목록, vcard 및 BMSG를 사용하여 서버를 실행함으로써 수동 퍼징을 수행할 수 있습니다. OBEX는 다중 부분 메시지에 걸쳐 있을 수 있는 많은 중첩 TLV 구조를 가진 풍부한 퍼징 대상입니다. PBAP와 MAP는 vcard, BMSG 및 XML 파서로 공격 표면을 크게 늘립니다.
nOBEX에는 자동화된 퍼징을 위한 통합 지원이 없지만 Python으로 작성되었기 때문에 확장하기 쉽습니다. 더 강력한 퍼징 기능은 변형 엔진과 결합하고 대상 장치를 계측하여 구축할 수 있습니다.
자동차 헤드 유닛에서 MAP 및 PBAP를 퍼징하는 것 외에도 nOBEX는 PBAP, MAP 및 기타 OBEX 프로파일(예: FTP)의 클라이언트 및 서버 역할 모두에 대한 일반적인 포지티브 테스트에도 사용할 수 있습니다. PBAP 및 MAP 서버는 Android용 OBEX Commander 앱으로 테스트되었으며, 잘못된 OBEX 통신과 변조된 프로파일별 데이터로 인해 많은 크래시가 발생할 수 있었습니다. 또한 HFP 지원을 사용하여 AT 명령을 수동으로 퍼징할 수 있습니다.