Автоматическая смена WPA2-пароля (preshared key) на Wi-Fi роутере

в 9:49, , рубрики: bash, curl, linux, scripting, tp-link, wifi, системное администрирование, метки: , , , ,

Задача

— генерация 8ми-значного числа и автоматическая установка в качестве WPA2-пароля на Wi-Fi роутере один раз в неделю
— отправка нового пароля на email
— создание html-страницы с паролем

Имеется

— Linux с установленным web-сервером (web-сервер будет отдавать вот эту страницу /opt/company/wifi-guest/index.html) и доступом к Wi-Fi точке через прокси (адрес прокси proxy.company.lan:3128)
— Wi-Fi роутер TP-LINK WR1043ND (адрес точки доступа ggw.company.lan)
— smtp-сервер (адрес сервера 10.10.10.10, исходящий адрес — notificaions@company.com, адрес получателя admins@company.com)

Для решения потребуются

— Firefox с плагином HttpFox
— curl
— bash-скрипт

Решение

1. С помощью плагина HttpFox получаем POST или GET запрос выполняемый браузером для смены пароля и перезагрузки. В случае с нашим роутером это будут GET-запросы вида:

"http://$http_url/userRpm/WlanSecurityRpm.htm?wepSecOpt=3&wpaSecOpt=3&wpaCipher=1&intervalWpa=0&secType=3&pskSecOpt=3&pskCipher=1&interval=0&Save=Save&pskSecret=$NEW_WPA_PASSWORD"

и

"http://$http_url/userRpm/SysRebootRpm.htm?Reboot=Reboot"

2. Используя curl и вышеуказанные GET-запросы получаем html-страницы, которые возвращает роутер в случае успешного выполнения команды. Из этих страниц берём строки, которые мы будем считать уникальными для определения успешности выполнения команд. Например для установки пароля:

"location.href="/userRpm/WlanSecurityRpm.htm";"

— а для перезагрузки:

"<TD class=h2 id="t_restart">Restarting...</TD>"

3. Подставляем эти значения в bash-скрипт и включаем скрипт в cron на запуск один раз в неделю.
4. Тестируем запуск запуск скрипта вручную.
5. Готово!

#!/bin/bash -e

# Description: script is purposed for automatic changing WPA2 key on TP-LINK WR1043ND (Wi-Fi router) using curl

# Common variables
proxy_url=proxy.company.lan:3128
proxy_username=proxy-user
proxy_password=proxy-pass
http_url=ggw.company.lan
http_username=http-user
http_password=http-pass
# Define email message title
smtp_title="Guest Wi-Fi password has been changed"
# Define smtp server and email addresses
smtp_server=10.10.10.10
smtp_send_from=notificaions@company.com
smtp_send_to=admins@company.com
smtp_links="Password link: http://wifi-guest.company.lannAdmin link: http://$http_url"
webpage_path=/opt/company/wifi-guest/index.html

# Special variables
set_password_successfuly='location.href="/userRpm/WlanSecurityRpm.htm";'
perform_reboot_successfuly='<TD class=h2 id="t_restart">Restarting...</TD>' 
stat_begin='^var hostList = new Array($'
stat_end='.*);'

# Core variables
CURL="curl --silent --proxy $proxy_url --proxy-user $proxy_username:$proxy_password --user $http_username:$http_password"
# Generate 8-digit password
NUMPASS_MIN=10000000
NUMPASS_MAX=99999999
NEW_WPA_PASSWORD="$(( ($RANDOM*($NUMPASS_MAX-$NUMPASS_MIN)/32767)+$NUMPASS_MIN ))"
# Date and time
DATE_TIME="$(date +"%F %T")"

# Set password
$CURL "http://$http_url/userRpm/WlanSecurityRpm.htm?wepSecOpt=3&wpaSecOpt=3&wpaCipher=1&intervalWpa=0&secType=3&pskSecOpt=3&pskCipher=1&interval=0&Save=Save&pskSecret=$NEW_WPA_PASSWORD" | grep "$set_password_successfuly" > /dev/null && SET_PASS="OK" || SET_PASS="ERR"
[[ $SET_PASS != "OK" ]] && echo "Set password error" && exit 1

# Reboot
$CURL "http://$http_url/userRpm/SysRebootRpm.htm?Reboot=Reboot" | grep "$perform_reboot_successfuly" > /dev/null && REBOOT="OK" || REBOOT="ERR"
[[ $REBOOT != "OK" ]] && echo "Reboot error" && exit 1

# Update web page
echo "
<html>
    <head>
        <meta http-equiv="Pragma" content="no-cache">
        <meta http-equiv="Cache-Control" content="no-cache">
    </head>
    <body>
        <center>
    </body>
</html>
" > $webpage_path

# Send password and statistics to admins
wifi_stat=$($CURL "http://$http_url/userRpm/WlanStationRpm.htm" | awk "/$stat_begin/,/$stat_end/")
smtp_message="New Wi-Fi password: $NEW_WPA_PASSWORDnnWi-Fi statistics:n$wifi_statnn$smtp_links"
echo -e "$smtp_message" | 
    env smtp=$smtp_server from=$smtp_send_from 
    /usr/bin/mail -v 
    -s "$smtp_title" 
    $smtp_send_to

Автор: giner


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js