RFSploit

Wireless & RF активный

Инструмент для эксплуатации радиочастот с поддержкой SDR и атак на протоколы.


Установка
git clone https://github.com/V33RU/rfsploit
cd rfsploit
pip install -e ".[ble,dev]"
sudo apt install hackrf
показать оригинал переведено ИИ

rfsploit

RF-разведка, декодирование протоколов в диапазоне ниже 1 ГГц и перечисление BLE, предназначенные для авторизованного лабораторного тестирования и исследований, одобренных производителем.

Передача отключена по умолчанию и остаётся отключённой до тех пор, пока вы явно не включите её дважды: один раз в файле конфигурации, а второй раз при выполнении команды.

Что это делает

Область Возможность
Разведка Сканирование широкополосного спектра, оценка уровня шума, обнаружение пиков
Захват Запись IQ в форматах cs8, cu8, cs16 и cf32
Анализ Обнаружение пакетов, извлечение импульсов OOK и FSK, восстановление времени символа
Ниже 1 ГГц EV1527 и HS1527, тристабильный PT2262, фрейминг KeeLoq, Manchester, PPM
Брелоки Анализ авто/воротных пультов: модуляция, протокол, фиксированный/вращающийся код
Авиация ADS-B на 1090 МГц: позывной, высота, скорость, позиция CPR
Мобильная связь Пассивное сканирование GSM/LTE вниз по каналам по ARFCN/EARFCN, наличие GSM FCCH
BLE Сканирование рекламных пакетов и перечисление GATT через адаптер хоста
Передача Воспроизведение сырых IQ и синтезированных кодов PWM, оба с контролем доступа

Модули

Возможности реализованы как модули в реестре, а не как жёстко закодированные подкоманды, поэтому добавление протокола означает добавление одного файла:

rfsploit modules                 # list everything, grouped by category
rfsploit search keeloq           # find a module by protocol, band or category
rfsploit info decode/adsb        # options, types, defaults and references
rfsploit run decode/adsb duration=30

Опции задаются в формате OPTION=VALUE и проверяются перед взаимодействием с аппаратным обеспечением, поэтому опечатка или значение вне диапазона приводит к немедленной ошибке, а не к сбою в середине захвата:

$ rfsploit run decode/adsb durartion=10
[!] decode/adsb: unknown option(s) durartion. Known options: input, duration,
    backend, lna_gain, vga_gain, amp, format, device

Имя модуля можно сокращать, если оно однозначно, поэтому run subghz и run decode/subghz — это одно и то же.

ADS-B

Самолёты передают идентификацию, позицию и скорость в открытом виде на частоте 1090 МГц. Приём полностью пассивен.

rfsploit run decode/adsb duration=30
ICAO     Callsign   Alt ft  Speed kt  Track   Latitude   Longitude  Msgs
40621D              38000                     52.25720     3.91937    12
4840D6   KLM1023                                                       3

Фреймы, не прошедшие проверку 24-битной CRC, отбрасываются, а не отображаются: испорченная позиция хуже, чем её отсутствие. Позиции требуют пары чётных и нечётных фреймов CPR, поэтому самолёт может не отображаться с позицией, пока обе части не поступят. Для этого нужен антенна на 1090 МГц с обзором неба; обычная антенна для диапазона ниже 1 ГГц почти ничего не услышит.

Обзор мобильной связи

Пассивная разведка того, что вещают мобильные сети: какие каналы downlink находятся в эфире и какой номер канала они используют. Ничего не передаёт и не собирает данные подписчиков. Это противоположность IMSI catcher (см. "Не включено по умолчанию").

rfsploit run recon/cellular band=b3          # LTE band 3, list active carriers
rfsploit run recon/cellular band=gsm900 confirm=true   # GSM, confirm the top hits
3 LTE carrier(s):
   EARFCN         MHz   BW MHz       dB     SNR
     1612   1846.1784    14.76    -19.0    43.9
     1311   1816.1193    18.10    -37.1    25.8

Каналы GSM имеют ширину 200 кГц, поэтому каждый активный ARFCN — это один пик. Несущие LTE имеют ширину от 1,4 до 20 МГц, поэтому они обнаруживаются как блоки повышенной мощности, а центр несущей сопоставляется с EARFCN; отчётная полоса пропускания — это ширина этого блока. Расчёт по плану частот (3GPP TS 45.005 для GSM, TS 36.101 для LTE) зафиксирован на основе опубликованных опорных частот.

confirm=true в диапазоне GSM или модуль decode/gsm-fcch захватывает канал и ищет частотнокорректирующий пакет (FCCH) — чистый тон на 67708 Гц выше несущей, который передаёт только живая базовая станция. Его обнаружение подтверждает наличие реального GSM downlink и измеряет ошибку частоты приёмника:

rfsploit run decode/gsm-fcch arfcn=79 band=gsm900
FCCH tone found: live GSM downlink
  tone offset   : 68320 Hz (ideal 67708)
  frequency err : 612 Hz
  tone duration : 584 us

FCCH повторяется всего несколько раз за 235-миллисекундный мультифрейм и только на несущей BCCH сети, поэтому короткий захват может его пропустить; пропуск не доказывает, что канал мёртв. Это только обнаружение и временная синхронизация. Он не декодирует идентификаторы сети (MCC, MNC, LAC, Cell ID); для этого нужна полная демодуляция GSM с помощью инструмента вроде gr-gsm.

Анализ брелоков

Определяет авто- или ворота пульт и классифицирует его безопасность. Отображает несущую частоту, модуляцию (OOK против FSK), декодированный протокол и тип кода: фиксированный или вращающийся. Это анализ пульта, которым вы владеете.

# capture the same button twice, then compare
rfsploit run capture/iq freq=433.92M output=press1.cs8 duration=4
rfsploit run capture/iq freq=433.92M output=press2.cs8 duration=4
rfsploit run decode/keyfob input=press1.cs8 input2=press2.cs8
  modulation : OOK (AM depth 0.98, FM spread 19960 Hz, high confidence)
  decoded    :
    ev1527        24 bits  hex=B385AD  serial_hex=B385A  button_4bit=13
  security   : FIXED
  two presses of the button decoded to the same payload, so the code does not
  change; a fixed code is replayable

Тест на фиксированный/вращающийся код пассивен и не требует ключа: нажмите одну и ту же кнопку дважды и сравните фреймы. Если они идентичны каждый раз, это фиксированный код (EV1527, PT2262), который можно воспроизвести. Если они различны каждый раз, это вращающийся код (KeeLoq и аналогичные), который нельзя. Преднастройки диапазонов: us (315 МГц, Северная Америка и Япония), eu (433.92 МГц, большая часть мира) и eu868 (868.3 МГц, Европа).

Фиксированный код, подтверждённый на пульте, которым вы владеете, может быть передан с модулем tx/replay, защищённым авторизацией. rfsploit не реализует атаки на транспортные средства: нет RollJam или джеймминга с воспроизведением, нет предсказания вращающегося кода или восстановления ключа, нет джеймминга, нет расширения диапазона через ретрансляцию/PKE, нет клонирования. См. "Не включено по умолчанию".

Аппаратное обеспечение

Backend Приём Передача Требуется
hackrf да да hackrf_transfer, hackrf_sweep
rtlsdr да нет rtl_sdr, rtl_test
soapy да да Python-биндинги SoapySDR
file да запись на диск ничего
Каждый модуль выполняет предварительную проверку возможностей (preflight) перед работой с аппаратным обеспечением. Отсутствие необходимых инструментов, отсутствие устройства, частота или скорость выборки вне диапазона, радио в режиме только приёма, запрашивающее передачу, или радио, уже занятое другим процессом — всё это приводит к немедленной ошибке с указанием команды для её исправления.
$ rfsploit capture -f 8G -s 2M -d 1 -w out.cs8
[!] capture cannot run on this host:
  - frequency: 8000.0000 MHz is outside the hackrf range 1-6000 MHz
    fix: retune within the device range, or use a different radio

Добавьте -v, чтобы вывести все проверки, включая успешно пройденные.

Быстрый старт, без установки

rfsploit.py запускается напрямую из клонированного репозитория. Он добавляет src/ в начало пути импорта, поэтому требуются только numpy и scipy:

git clone https://github.com/V33RU/rfsploit
cd rfsploit
python3 rfsploit.py            # start the interactive console
python3 rfsploit.py devices    # or run a single command
python3 rfsploit.py sweep --start 433M --stop 435M

Это тонкий точкой входа, который передаёт все аргументы той же CLI, что и установленная команда rfsploit, а также python3 -m rfsploit; все три варианта взаимозаменяемы. Без аргументов запускается консоль; с аргументами выполняется одна команда и завершается работа.

Консоль

Консоль — это командная оболочка с контекстом модуля, в стиле msfconsole. Она повторно использует CLI для выполнения, поэтому команда run эквивалентна rfsploit run под капотом.

$ rfsploit
rfsploit > search adsb
  decode/adsb          Decode ADS-B aircraft position, callsign and velocity on 1090 MHz
rfsploit > use decode/adsb
rfsploit(decode/adsb) > show options
rfsploit(decode/adsb) > set duration 30
rfsploit(decode/adsb) > run
Команда Действие
search <term> поиск модулей по имени, диапазону или протоколу
use <module> выбор модуля (работают короткие имена: use adsb)
show options список опций модуля и их текущих значений
set <opt> <value> установка опции (проверка корректности происходит сразу)
unset <opt> сброс опции к значению по умолчанию
run (или exploit) запуск модуля с установленными опциями
info [module], back, help, exit как ожидается

Необязательные опции, которые ещё не установлены, отображаются красным, расширенные параметры настройки скрыты за командой show advanced, а любая команда оболочки (sweep ..., tx-enable) также работает в интерактивном режиме. Автодополнение работает для команд, имён модулей и имён опций. Модули передачи отказываются запускаться, пока не будет выполнена команда tx-enable и не будет установлено значение authorized в true.

Установка

git clone https://github.com/V33RU/rfsploit
cd rfsploit
pip install -e ".[ble,dev]"

Инструменты хоста для HackRF на Debian или Ubuntu:

sudo apt install hackrf

Использование

Проверьте, что может сделать хост:

rfsploit devices

Проведите обзор диапазона и выведите активные несущие частоты:

rfsploit sweep --start 433M --stop 435M --sweeps 8 --threshold 12

Запишите два секунды IQ:

rfsploit capture -f 433.92M -s 2M -d 2 -w remote.cs8

Декодируйте захваченный удалённый сигнал:

rfsploit decode -i remote.cs8 -s 2M -f 433.92M --threshold 20

Декодируйте напрямую с радио:

rfsploit decode -f 433.92M -s 2M -d 10 --threshold 20

Изучите временные метки, когда ничего не декодируется:

rfsploit bursts -i remote.cs8 -s 2M --threshold 20 --extract-dir bursts/
rfsploit decode -i bursts/burst_000.cs8 -s 2M --show-pulses

Сканируйте устройства BLE и перечислите одно из них:

rfsploit ble-scan -d 10
rfsploit ble-enum AA:BB:CC:DD:EE:FF

Машинно-читаемый вывод для любой команды:

rfsploit sweep --start 433M --stop 435M -o sweep.json --json

Передача

Передача требует двух независимых шагов, поэтому ни одна команда не может активировать радио:

rfsploit tx-enable                     # writes the authorisation file, once
rfsploit replay -i remote.cs8 -f 433.92M -s 2M --i-am-authorized
rfsploit transmit-code 101100111000010110101101 -f 433.92M --te 350 --i-am-authorized
rfsploit tx-disable                    # revoke

tx-status отображает текущее состояние. Передача вне общепринятых ISM-диапазонов не блокируется, но это указывается в выводе.

Отправка синтезированного кода вместо воспроизведения сырых IQ-данных — более надёжное доказательство: если приёмник реагирует на transmit-code, то восстановленные биты и время символа были корректными, чего не гарантирует сырое воспроизведение.

Чтение вывода

decode сообщает протокол, количество бит, шестнадцатеричное значение, восстановленное время символа и сколько раз кадр повторился. Если кадр был замечен один раз, это отмечается: удалённые устройства обычно повторяют передачу, а одиночный кадр с большей вероятностью является артефактом декодирования, чем реальным кодом.

Обнаружение пакетов оценивает уровень шума на основе самого захвата, что может не сработать на полностью занятой полосе. Если результат выглядит ненадёжным, инструмент сообщает об этом, а не выдаёт его как чистый:

[!] The threshold did not cleanly separate signal from noise. Adjust --threshold
    and re-run. A dynamic range under 3 dB means the capture is either dead air
    or one unbroken carrier.

Усечённые символы на границе захвата игнорируются, их никогда не пытаются угадать. Декодер возвращает наблюдаемые биты или ничего.

Ограничения

  • Кадры KeeLoq парсятся, но не расшифровываются. Код перехода требует ключа производителя, а счётчик сдвига означает, что захваченный кадр, который приёмник уже видел, не может быть воспроизведён.
  • BLE работает через адаптер Bluetooth хоста, а не через SDR. HackRF не может отслеживать соединение BLE: оно перескакивает 1600 раз в секунду по 40 каналам, что требует Ubertooth One, nRF52840 или аналогичного устройства. Сканирование и перечисление GATT работают, потому что адаптер хоста подключается как обычный центральный узел.
  • ble-enum сообщает о характеристиках, которые рекламируют свойство записи через непарное соединение. Он не записывает в них. Подтвердите эффект на своём устройстве перед тем, как считать это результатом.
  • Бэкенды RTL-SDR и SoapySDR реализованы, но не проверялись на аппаратном обеспечении, так как ни одно из них не было доступно на хосте разработки. Пути HackRF и BLE были проверены от начала до конца.
  • Декодирование ADS-B проверено против опубликованных кадров Mode S и против

синтезированный RF, но на хосте разработки не было принято ни одного живого самолёта: сканирование диапазона от 1085 до 1095 МГц показало плоский шум, что означает отсутствие сигнала на антенне. Путь декодирования проверен, путь приёма — нет. - Детектор GSM FCCH был проверен двумя способами: по отношению к синтезированным тонам (чистым, сдвинутым по частоте, с низким отношением сигнал/шум, шумовым и случайным трафиком) и по отношению к живым базовым станциям на хосте разработки, где он подтвердил три GSM-внизлинейных канала и измерил их частотную ошибку. Обнаружение в эфире происходит по захватам и периодически, поэтому пропуск не является доказательством отсутствия.

Не включено по дизайну

  • Нет IMSI-ловушки. Это активная поддельная базовая станция: она вынуждает телефоны неосведомлённых людей подключаться к ней. Она направлена на третьих лиц, а не на оборудование, находящееся на тестировании, и является незаконной в большинстве юрисдикций.
  • Нет подделки или блокировки GPS, что нарушает навигацию для самолётов, судов и дорожного транспорта далеко за пределами любой тестовой установки.
  • Нет атак на транспортные средства. Модуль ключевого брелока классифицирует фиксированные и скользящие коды, но не реализует техник, которые крадут автомобили: нет RollJam или джейм-повторения, нет предсказания скользящих кодов или десинхронизации счётчика, нет восстановления криптографических ключей, подключённых к передатчику, нет релейной передачи / расширения диапазона пассивного входа, нет брутфорса фиксированных кодов (De Bruijn / OpenSesame) и нет клонирования брелока. Повторение фиксированного кода на удалённом устройстве, которым вы владеете, через модуль гейт-TX/повторения, — это единственный путь передачи, и он предназначен для вашего собственного оборудования.

Пассивный приём и декодирование вещательных сигналов навигации, авиации, сотовой связи и спутников входят в область применения. Сотовая разведка считывает только то, что сеть транслирует всем (какие каналы активны, какой номер канала они используют). Идентификаторы подписчиков не собираются.

План развития

  • Авиация и морская связь: ADS-B выполнен, следующий — AIS на 162 МГц
  • Спутниковые нисходящие каналы: метеорологические изображения NOAA APT и Meteor LRPT, Inmarsat STD-C
  • Сотовая связь: разведка выполнена; декодирование системной информации GSM (MCC/MNC/LAC/CID) через gr-gsm-пропускной модуль, когда доступны соответствующие инструменты
  • Утилитарные и телеметрические сигналы: датчики в стиле rtl_433, TPMS, пейджинг POCSAG и FLEX

Тесты

pytest

Тесты декодера не требуют радио. Они синтезируют известный сигнал, пропускают его через весь путь приёма с добавленным шумом и проверяют, что возвращаются точно те же биты. Восстановление EV1527 проверено до уровня SNR 5 дБ.

Область применения

Для оборудования, которым вы владеете или на которое у вас есть письменное разрешение на тестирование. Передача на лицензируемом спектре без разрешения является незаконной в большинстве юрисдикций. Держите передающие работы в экранированной или ослабленной установке.

Лицензия

MIT. См. LICENSE.

Войдите, чтобы оставить комментарий