Инструмент для эксплуатации радиочастот с поддержкой SDR и атак на протоколы.
Полный инструментарий для исследования беспроводных протоколов через SDR: запись сигналов, автоматическое определение модуляции (ASK/FSK/PSK/OFDM), декодирование битов, …
AI-инструмент на базе A2C reinforcement learning для пассивного перехвата WPA-рукопожатий и PMKID. Запускается на Raspberry Pi …
Автоматизированный аудит беспроводных сетей: атаки на WEP, WPA/WPA2 (PMKID, handshake), WPS (Pixie Dust, Brute). Автоматически выбирает …
Мощный bash-фреймворк для аудита беспроводных сетей: Evil Twin с Captive Portal, захват рукопожатий, WPS Pixie Dust, …
git clone https://github.com/V33RU/rfsploit cd rfsploit pip install -e ".[ble,dev]" sudo apt install hackrf
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 — это одно и то же.
Самолёты передают идентификацию, позицию и скорость в открытом виде на частоте 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.
Усечённые символы на границе захвата игнорируются, их никогда не пытаются угадать. Декодер возвращает наблюдаемые биты или ничего.
ble-enum сообщает о характеристиках, которые рекламируют свойство записи через непарное соединение. Он не записывает в них. Подтвердите эффект на своём устройстве перед тем, как считать это результатом.синтезированный RF, но на хосте разработки не было принято ни одного живого самолёта: сканирование диапазона от 1085 до 1095 МГц показало плоский шум, что означает отсутствие сигнала на антенне. Путь декодирования проверен, путь приёма — нет. - Детектор GSM FCCH был проверен двумя способами: по отношению к синтезированным тонам (чистым, сдвинутым по частоте, с низким отношением сигнал/шум, шумовым и случайным трафиком) и по отношению к живым базовым станциям на хосте разработки, где он подтвердил три GSM-внизлинейных канала и измерил их частотную ошибку. Обнаружение в эфире происходит по захватам и периодически, поэтому пропуск не является доказательством отсутствия.
Пассивный приём и декодирование вещательных сигналов навигации, авиации, сотовой связи и спутников входят в область применения. Сотовая разведка считывает только то, что сеть транслирует всем (какие каналы активны, какой номер канала они используют). Идентификаторы подписчиков не собираются.
pytest
Тесты декодера не требуют радио. Они синтезируют известный сигнал, пропускают его через весь путь приёма с добавленным шумом и проверяют, что возвращаются точно те же биты. Восстановление EV1527 проверено до уровня SNR 5 дБ.
Для оборудования, которым вы владеете или на которое у вас есть письменное разрешение на тестирование. Передача на лицензируемом спектре без разрешения является незаконной в большинстве юрисдикций. Держите передающие работы в экранированной или ослабленной установке.
MIT. См. LICENSE.