LINUX.ORG.RU

Генерация RTS-пакетов в Aircrack-ng

 , ,


0

2

Здравствуйте!

Столкнулся со следующей проблемой:

Ubuntu 14.04 64, Aicrack-ng одной из последних версий, три адаптера под rt2800usb драйвером. Все работает замечательно, кроме одной вроде простой вещи. Попытался тут попробовать «пропинговать» внешние устройства (как АР так и STA) через связку RTS/CTS - пакеты и обнаружил следующую проблему:

драйвер устройств ни в какую не хочет передавать одиночные RTS, всегда ждет когда их наберется ровно 15 штук и только после этого выкидывает их в эфир всем скопом, соотвественно на другом конце возникают проблемы с обработкой, абоненты слишком частых RTS не любят.

Инъекции любых других пакетов проходят железно. Если логировать выводы самого приложения, то оно передает пакет на дескриптор устройства нормально. Взял код aireplay-ng, закомментил там в функции тестирования соединений все не относящееся к RTS, собрал, запустил, то же самое - wireshark показывает, что пакеты передаются строго по 15 штук. Если запускать передачу в цикле и ставить между write на сокет устройства задержку 10 микросек, то все те же наборы по 15 пакетов с задежкой между сериями около 2.8 секунд.

Проверял на всех 3 адаптерах, запускал даже на Android под Nethunter - везде одно и тоже.

В стандарте про какие-то ограничения ничего не нашел, в гугле тоже.

Кто-нибудь сталкивался?

Тут важно понимать сам стандарт 802.11 и реализацию «в железе». Для затравочки, большинство современных адаптеров (в простейшем случае) состоят из PHY + MAC/PCU частей и обвязки интерфейса подключения. Драйвер настраивает PHY (каналы, мощность и т.п.) и работает, как правило с MAC/PCU. Последняя - это аппаратная реализация простейших алгоритмов 802.11 (реакция на ACK, RTS/CTS, аггрегирование фреймов в DMA буфере). Плюс, начиная с 802.11n в стандарте стала обязательна функция WME/WMM (Wireless Multimedia Extencions), которая предполагает разделение трафика на 4 группы, плюс в драйверах есть группа для BEACONS (и всех служебных фреймов, у них другие параметры CCA, запрещено аггрегирование, ожидание ACK и т.д.).

В PCU передаются только DMA-запакованные фреймы в одну из цепочек WMM на передачу, и PCU сам решает как агрегировать фреймы в воздухе. Соответственно, посылая собственноручно сформированный служебный фрейм драйвер должен уметь оповестить (если это возможно) об этом PCU часть устройства, иначе она будет считать это простыми данными и слать их в эфир по логике обычных фреймов с данными.

В простейшем случае в конкретном драйвере конкретного чипа нужно добавить hook в цепочке tx, на правильную идентификацию этих служебных данных, чтоб устройство не пыталось быть «слишком умным». Как правило это поддерживают большинство устройств, но в драйвере это может быть и не реализовано. Потому вы и наблюдаете обычное аггрегирование RTS фреймов.

ЗЫ. На Qualcomm-Atheros, например, есть другая проблема - пересчёт поля duration блоком PCU, отключить который можно только исправив сам ath9k.

nickleiten ★★★ ()
Последнее исправление: nickleiten (всего исправлений: 1)

Есть ещё одна неочевидная проблема с вай-фай. UAPSD, технология энергосбережения. Все мобильные клиенты (смартфоны, планшеты и даже ноутбуки) эту функцию включают по умолчанию.

Суть в том, что при подключении к БС станция уведомляет её о своём listen_interval (максимальное количество «маячков» БС, которая станция может пропустить в спящем режиме PHY). То есть, условно при listen_interval 2 БС знает, что каждый второй маячок станция будет слушать на предмет наличия определённого флага, который говорит станции, что в текущий beacon_interval нужно проснутся и получить данные от БС (а если точнее, то этот флаг - aid устройства, для которого есть данные в буфере БС). Дальше станция просыпается, получает данные все данные от БС, по завершении процесса станция заново посылает PS-POLL (могу ошибаться с названием, но один из PowerSave фреймов), сигнализирующий, что она спит и передавать ей что-либо бессмысленно без предупреждения в нужном beacon'е.

Можно использовать «грязный хак» в стеке mac80211, устанавливать все биты uapsd для всех aid в 1 и уменьшить beacon_interval при поднятии точки доступа до 50-75TU, тогда станция будет просыпаться через каждые listen_inteval*beacon_interval. Очевидный минус - станции начинают немного больше пожирать энергии из своих аккумуляторов.

nickleiten ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.