Asterisk‎ > ‎

Linksys SPA Provisioning

Предисловие

После недавнего "падения" сервера с Asterisk и его восстановления в логах обнаружил тысячи вот таких строк:
....
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"10/1/65"<sip:10/1/65@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"11/1/65"<sip:11/1/65@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1346"<sip:1346@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1347"<sip:1347@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
....

В секунду ~70 запросов с "левых" ip-адресов. Явный брутфорс стал для меня неприятным сюрпризом, который заставил задуматься о смене простых паролей для sip-клиентов на более сложные. Смена пароля в конфигах Asteriska дело нескольких минут, смена пароля в web-интерфейсе ip-телефона Linksys SPA922 — минута. Но когда этих телефонов около сотни это становится проблемой.
После гугления нашел информацию о Linksys SPA Provisioning. Что нам это дает? По умолчанию ip-телефоны, поддерживающие provisioning, при загрузке ищут в сети tftp-сервер с конфигурационными файлами вида spa$PSN.cfg и spa$MA.cfg, где $PSN — это модель (в моем случае $PSN=922),а $MA — MAC-адрес телефона. Файл spa$PSN.cfg может содержать как общий конфиг телефона, так и включать пути к другим файлам с конфигурацией. Файл spa$MA.cfg содержит индивидуальные данные телефона, как правило это логин/пароль. Это именно то, что нам нужно для массовой смены паролей. Приступим.

Настройка

ОС — Ubuntu 10.04 Server.
Устанавливаем tftp-сервер:
$ sudo apt-get install atftp atftpd

Правим настройки:
$ sudo mcedit /etc/default/atftpd
USE_INETD=true
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp"

меняем на
USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 --logfile=/var/log/atftp.log /var/tftp"

Выполняем команду:
$ sudo invoke-rc.d atftpd start

Создаем папку и меняем права:
$ sudo mkdir /var/tftp
$ sudo chmod -R 777 /var/tftp
$ sudo chown -R nobody /var/tftp

Создаем файл для ведения логов:
$ sudo touch /var/log/atftp.log

Перезапускаем tftp-сервер:
$ sudo /etc/init.d/atftpd restart

Примечание: у меня после этого сервер не запустился, в логах увидел ошибку atftpd: can't bind port :69/udp.
69 порт, по-умолчанию используемый tftp, занят.

Освободим его:
$ sudo /etc/init.d/openbsd-inetd stop
$ sudo invoke-rc.d atftpd restart

Проверяем:
$ ps -e | grep atftp
  886 ? 00:00:02 atftpd

Настраиваем DHCP-сервер, всего лишь добавляем строчку:
$ sudo mcedit /etc/dhcp3/dhcpd.conf
....
subnet 192.168.0.0 netmask 255.255.255.0 {
....
        option tftp-server-name "192.168.1.200";
....
}

Перезапускаем:
$ sudo /etc/init.d/dhcpd restart

Создаем главный конфигурационный файл с таким содержимым:
$ sudo mcedit /var/tftp/sip922.cfg
<flat-profile>
<Profile_Rule ua="na">/linksys/spa.cfg</Profile_Rule>
<Profile_Rule_B ua="na">/linksys/spa$MA.cfg</Profile_Rule_B>
<Resync_Periodic ua="na">30</Resync_Periodic>
</flat-profile>

Создаем папку для всех остальных файлов:
$ sudo mkdir /var/tftp/linksys
$ sudo chmod -R 777 /var/tftp/linksys
$ sudo chown -R nobody /var/tftp/linksys

Раз уж делаем глобальное обновление, то скачаем заодно и новую прошивку для телефонов:
$ cd /var/tftp/linksys
$ wget http://download.cisco.com/swc/esd/03/282414121/anon/SPA942_6.1.5a.zip
$ 7z x SPA942_6.1.5a.zip

Создаем конфигурационный файл c глобальными настройками для ip-телефонов:
$ sudo mcedit /var/tftp/linksys/spa4all.cfg
<flat-profile>
<Upgrade_Rule>/linksys/spa942-6-1-5a.bin</Upgrade_Rule>
<Upgrade_Enable>Yes</Upgrade_Enable>
<Resync_Periodic ua="na">3600</Resync_Periodic>
<Voice_Mail_Number ua="na">8500#</Voice_Mail_Number>
<Primary_NTP_Server ua="na">time.domain.local</Primary_NTP_Server>
<Time_Zone ua="na">GMT+04:00</Time_Zone>
<Time_Format ua="na">24hr</Time_Format>
<Date_Format ua="na">day/month</Date_Format>
<Select_Logo ua="na">None</Select_Logo>
<Select_Background_Picture ua="na">None</Select_Background_Picture>
<BMP_Picture_Download_URL ua="na"></BMP_Picture_Download_URL>
<Text_Logo ua="na">ETech</Text_Logo>
<Screen_Saver_Enable ua="na">No</Screen_Saver_Enable>
<Screen_Saver_Wait ua="na">300</Screen_Saver_Wait>
<Screen_Saver_Icon ua="na">Phone</Screen_Saver_Icon>
</flat-profile>

Для создания файлов с индивидуальными для каждого телефона настройками я воспользовался скриптом, найденным на просторах интернета. Спасибо автору этой статьи. Скрипт немного переделал под себя:
$ cat /var/tftp/createprov.sh
#!/bin/bash
first=flat-profile
second=GPP_A
third=Display_Name_1_
forth=User_ID_1_
fifth=Password_1_
sixth=Proxy_1_
general='ua="na"'
#Sample File to parse
#IpAddress Mac_Address Sip Server Last First Name Username Password
#192.168.4.1 00065B8C1E2C 192.168.4.1 Tsakalos Stratis 314 314
#192.168.4.5 00065B8C1E2D 192.168.4.1 Test User 255 255
while read line
do
input[$i]=$line;
i=$(( $i + 1 ))
ip_address=`echo $line|cut -d';' -f1`
mac_address=`echo $line|cut -d';' -f2 | tr "[:upper:]" "[:lower:]"`
proxy=`echo $line|cut -d';' -f3`
display=`echo $line|cut -d';' -f4`
number=`echo $line|cut -d';' -f5`
password=`echo $line|cut -d';' -f6`
echo "<$first>" > linksys/spa$mac_address.cfg
echo "<$second>$ip_address</$second>" >> linksys/spa$mac_address.cfg
echo "<$sixth $general>$proxy</$seventh>" >> linksys/spa$mac_address.cfg
echo "<$third $general>$display</$forth>" >> linksys/spa$mac_address.cfg
echo "<$forth $general>$number</$fifth>" >> linksys/spa$mac_address.cfg
echo "<$fifth $general>$password</$sixth>" >> linksys/spa$mac_address.cfg
echo "</$first>" >> linksys/spa$mac_address.cfg
done < sipusers.csv

Этот скрипт берет данные из файла sipusers.csv и создает конфиги вида spa000e08de401a.cfg для каждого телефона.
Теперь необходимо собрать MAC-адреса телефонов с привязкой к номеру.
Делаем скрипт исполняемым:
$ chmod +x /var/tftp/createprov.sh

Конфигурацию телефона можно посмотреть по адресу http://phone_ip_address/admin/spacfg.xml. Там можно увидеть и MAC-адрес и номер телефона, но бегать по айпишникам очень скучно, поэтому запустим пару команд:
$ cd /var/tftp/linksys/
$ wget --tries=1 http://192.168.0.{1..254}/admin/spacfg.xml

Этой командой мы скачали конфиги всех зарегистрированных в сети телефонов.
Получился список файлов:
$ ls -l /var/tftp/linksys/
итого 1268
-rw-r--r-- 1 nobody nogroup 780 2011-04-14 14:12 spa4all.cfg
-rw-r--r-- 1 root root 248 2011-04-13 18:32 spa000e08de401a.cfg
-rw-r--r-- 1 root root 250 2011-04-13 18:32 spa000e08de401b.cfg
-rw-r--r-- 1 root root 236 2011-04-13 18:32 spa000e08de401c.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401d.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401e.cfg
....

$ egrep 'MAC_Address|<User_ID_1' spacfg.xml* >> MAC.txt

Этой командой сделали выборку по MAC-адресу и номеру телефона:
$ cat /var/tftp/linksys/MAC
spacfg.xml:<MAC_Address group="Info/Product_Information">000E08DE401A</MAC_Address>
spacfg.xml:<User_ID_1_ group="Ext_1/Subscriber_Information">101</User_ID_1_>
spacfg.xml.1:<MAC_Address group="Info/Product_Information">000E08DE401B</MAC_Address>
spacfg.xml.1:<User_ID_1_ group="Ext_1/Subscriber_Information">102</User_ID_1_>
spacfg.xml.10:<MAC_Address group="Info/Product_Information">000E08DE401C</MAC_Address>
spacfg.xml.10:<User_ID_1_ group="Ext_1/Subscriber_Information">103</User_ID_1_>
spacfg.xml.11:<MAC_Address group="Info/Product_Information">000E08DE401D</MAC_Address>
spacfg.xml.11:<User_ID_1_ group="Ext_1/Subscriber_Information">104</User_ID_1_>
spacfg.xml.12:<MAC_Address group="Info/Product_Information">000E08DE4001E</MAC_Address>
....

После нехитрых манипуляций в LibreOffice Calc файл MAC.txt привели к такому виду (создали новый файл sipusers.csv):
$ cat /var/tftp/sipusers.csv
192.168.1.200;000e08de401a;192.168.1.200;Maksim Petrov;101;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401b;192.168.1.200;Nikolay Veselov;102;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401c;192.168.1.200;Galina Fedorova;103;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401d;192.168.1.200;Ludmila Sokolova;104;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401e;192.168.1.200;Chiya Chiyo;105;CJI0}I{HbIu'napoJIb
....

Что есть что понятно из примечания в скрипте createprov.sh:
#Sample File to parse
#IpAddress Mac_Address Sip Server Last First Name Username Password
#192.168.4.1 00065B8C1E2C 192.168.4.1 Tsakalos Stratis 314 314
#192.168.4.5 00065B8C1E2D 192.168.4.1 Test User 255 255

Результат

Запускаем createprov.sh на выполнение:
$ ./createprov.sh

Смотрим результат:
$ ls -l /var/tftp/
итого 20
-rwxr-xr-x 1 nobody nogroup 1413 2011-04-13 18:32 createprov.sh
drwxrwxrwx 3 nobody nogroup 4096 2011-04-14 14:12 linksys
-rw-r--r-- 1 root root 5454 2011-04-13 18:04 sipusers.csv
-rw-r--r-- 1 nobody nogroup 240 2011-04-13 10:50 spa922.cfg

$ ls -l /var/tftp/linksys/
итого 1268
-rwxrwxrwx 1 nobody nogroup 814 2010-01-15 10:47 logo.bmp
-rw-r--r-- 1 nobody nogroup 780 2011-04-14 14:12 spa4all.cfg
-rw-r--r-- 1 root root 12835 2011-04-13 17:18 MAC.txt
-rw-r--r-- 1 root root 248 2011-04-13 18:32 spa000e08de401a.cfg
-rw-r--r-- 1 root root 250 2011-04-13 18:32 spa000e08de401b.cfg
-rw-r--r-- 1 root root 236 2011-04-13 18:32 spa000e08de401c.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401d.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401e.cfg
....


ċ
createprov.sh
(1k)
Vitaly Miromanov,
14 июл. 2011 г., 2:06
ċ
sipusers.csv
(0k)
Vitaly Miromanov,
14 июл. 2011 г., 2:06
Comments