Linksys SPA Provisioning или облегчаем себе жизнь при массовой настройке IP-телефонов

3 мая 2011 г.

Предисловие

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

/linksys/spa.cfg
/linksys/spa$MA.cfg
30

Создаем папку для всех остальных файлов:

$ sudo mkdir /var/tftp/linksys
$ sudo chmod -R 777 /var/tftp/linksys
$ sudo chown -R nobody /var/tftp/linksys

Раз уж делаем глобальное обновление, то скачаем заодно и новую прошивку для телефонов:

$ cd /var/tftp/linksys
$ wget 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

/linksys/spa942-6-1-5a.bin
Yes
3600
8500#
time.etg.local
GMT+04:00
24hr
day/month
None
None

ETech
No
300
Phone

Для создания файлов с индивидуальными для каждого телефона настройками я воспользовался скриптом, найденным на просторах интернета. Спасибо автору этой статьи. Скрипт немного переделал под себя:

$ 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" >> linksys/spa$mac_address.cfg
echo "<$sixth $general>$proxy" >> linksys/spa$mac_address.cfg
echo "<$third $general>$display" >> linksys/spa$mac_address.cfg
echo "<$forth $general>$number" >> linksys/spa$mac_address.cfg
echo "<$fifth $general>$password" >> linksys/spa$mac_address.cfg
echo "" >> linksys/spa$mac_address.cfg
done < sipusers.csv

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

$ chmod +x /var/tftp/createprov.sh

Конфигурацию телефона можно посмотреть по адресу phone_ip_address/admin/spacfg.xml. Там можно увидеть и MAC-адрес и номер телефона, но бегать по айпишникам очень скучно, поэтому запустим пару команд:

$ cd /var/tftp/linksys/
$ wget --tries=1 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|> MAC.txt

Этой командой сделали выборку по MAC-адресу и номеру телефона:

$ cat /var/tftp/linksys/MAC
spacfg.xml:000E08DE401A
spacfg.xml:101
spacfg.xml.1:000E08DE401B
spacfg.xml.1:102
spacfg.xml.10:000E08DE401C
spacfg.xml.10:103
spacfg.xml.11:000E08DE401D
spacfg.xml.11:104
spacfg.xml.12:000E08DE4001E
....

После нехитрых манипуляций в 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
....

Спасибо за внимание. Возможно это кому-то облегчит жизнь.

Теги: рубрика Linux
  • Похожие статьи
  • Предыдущие из рубрики