Історія одного злому або чим погані ftp

Сайт крутиться на одній комерційній CMS написаної на php, досить популярної, але трохи (багато?) «Кривий». Кривизна полягає в змішуванні логіки та інтерфейсу, зберігання частини коду в бд і подальшому виконанні через eval, використанні plain-sql запитів і інших радощів, «полегшують» життя програмістів. Вихідний код CMS здатний увергнути в трепетний жах навіть досвідченого кодера: багатокілометрові функції з безліччю умов неменшою довжини, глобальні змінні, eval-и і купа інших принад чекають зазирнув сюди сміливця. Незважаючи на жахливу програмну архітектуру, админка CMS достатня продумана - створюється враження, що ТЗ на систему писав профі, а реалізовував студент. Дізналися використовувану вами CMS? Співчуваю ...

Заглянувши в основний шаблон сайту, я відразу виявив підключення в футере підозрілого скрипта:

Вихідний код скрипта footer.php:

Було очевидно, що це шкідливий код і що сайт використовується як майданчик для розміщення платних посилань. Причому зломщики подбали про те, щоб власники сайту не побачили лівих посилань: посилання відображалися для всіх, крім відвідувачів з IP Єкатеринбурга (сайт знаходиться в регіоні Єкатеринбург). Як же власникам сайту вдалося побачити посилання? Виявилося що сервіс, який зловмисники використовували для визначення міста по IP, просто перестав працювати. Точніше почав видавати 404 помилку (тест: ip-whois.net/ip_geo.php?ip=212.104.72.58)

Прибравши з шаблону шкідливий інклуд, я взявся за файл logo.png, який був звичайно ніякий не картинкою, а справжнісіньким php-кодом. Исходник logo.png: pastebin.com/cTsgW2RU.

Бачимо що скрипт закодований і стиснутий і два виклики:

Вийшов досить довгий масив: pastebin.com/xyqJVfmV
Після цього я накидав простенький декодер, який замінює всі виклики функції _527006668 на відповідний елемент масиву $ a: pastebin.com/RxVyACiS
Результат прогнав через phpbeautifier.com: pastebin.com/wvw1mJA5

Теги як би натякають, тому я пішов на сайт sape.ru, скачав їх API для веб-майстра і виявив, що наш зловредів це трохи модифікований код sape. А конкретно, були замінені назви класів, назви файлів і список серверів, з яких скрипт отримував посилання.

Список серверів зловреда:
  • dispenser-01.strangled.net
  • dispenser-02.us.to
  • dispenser.amursk-rayon.ru

Перші два використовуються для виведення звичайних і контекстнихх посилань, третій для виведення статей. Всі три сайти перебувають на доменах третього рівня, і мене зацікавило, що це за домени такі. Я прогнав їх через сервіс who.is і отримав список DNS-серверів доменів.

Перевірка dispenser-01.strangled.net і dispenser-02.us.to:

На цьому дослідження зловреда було вирішено припинити, але бажаю дізнатися, чи не стикався чи хтось ще з подібною проблемою, я пішов і загугли "TRUSTLINK_client". Гугл знайшов 4 сайта на яких TRUSTLINK_client зламався і php вивів повідомлення про помилку. Скільки сайтів зламано і справно працює, приносячи прибуток власникам зловреда і збитки своїм господарям залишається тільки здогадуватися.

Залишалося з'ясувати, яким шляхом шкідливий код потрапив на сайт. Спочатку у мене було три гіпотези:
  • власники сайту посіяли паролі від ftp / ssh (вірус на комп'ютері, потрапляння в паблік і т.п.)
  • підбір паролів до ftp / ssh перебором
  • вразливість в ПО сервера

Де звична дата / час? Не зрозуміло…
Відкрив лог-файл виду @<цифры-буквы-бла-бла-бла>.s:

Схоже на спроби підбору пароля, але впевненості немає. Швидке гугленіе за форматом лог-файлу результату не принесло. Запитувати у знавців на форумах було лінь, тому вирішив просто взяти за аксіому припущення про те, що був підібраний пароль до ftp.

Чого я не зробив, але варто було б? По хорошому слід було б відключити ftp, а замість нього іспользровать sftp. Але на сайт вивантажують дані сторонні програми, які нічого крім ftp не вміють. Ще варто було б завести код на сайті під git. Але в умовах, коли чимала частина коду зберігається в БД, це не врятує від несанкціонованого измения коду.

Можливо я упустив щось ще, буду радий будь-яких пропозицій і конструктивної критики. І нехай будуть ваші сервера в безпеці! І нехай не зламає вас хакер!

Чому немає варіанта відповіді «я ​​найняв фрілансера за їжу, і мене зламали».

99% всіх зломів йде від мелкоправочніков за 1 годину, особливо розчулює «зроблю за відгук». Поки головою такі замовники думати не будуть, ламати їх і нема чого. не більше ніж місяць тому зустрів щось подібне, коротке розслідування за датою зміни файлів виявило проблему на 3 сайтах від одного і того ж фрілансера, який давно почив у лазні за множинну реєстрацію.

І можна cms в личку, навіть цікаво стало :)

Буквально кілька днів тому зустрічався з сайтом на WP, який перестав працювати після перенесення на інший хостинг. Просто видавав «білий екран смерті», в балках було порожньо, примусове включення виведення помилок також нічого не давало. Методом виключення знайшов винуватця - плагін, який генерував меню. Шкідливий код був в файлі «social.png», ось сам код (забавно, що він не обсфуцірован, але абсолютно нечитаний, тому розбиратися в тому, що він робить, мені якось не захотілося).
На мій погляд, найчастіше зараження сайтів відбувається навіть не через підбір \ злом паролів для ssh, ftp, дірки в популярних CMS і так далі, а через усілякі «заражені» плагіни, шаблони тощо, які вебмастера самі встановлюють собі на сайт.

Як на машину зайшли, ви так і не з'ясували, але все, ssh / ftp / БД - фігня ненадійна ...

ssh / ftp / БД - фігня ненадійна ...

Можете пояснити вашу думку? На мою ssh цілком надійний, коли правильно налаштований. БД теж, якщо в коді немає ін'єкцій і підключення дозволено тільки з localhost, а за замовчуванням так воно і є.

Так ваш же заголовок «або чим погані ftp / ssh-паролі / код в БД» відразу розташовує до пояснення в пості. А пояснення-то і немає, тільки історія одного злому без опису ЯК проникли-то в підсумку.

Сам злом - ніяк. А ось виявлення факту злому і усунення наслідків - дуже навіть.

В результаті вам все-одно поміняли код, що зберігається на диску. Наявність або відсутність додаткового коду десь ще (в БД наприклад) на детектування подібного неподобства не відбилося б. Так зі зберіганням частини в БД, інше ніхто не заважає зберігати із застосуванням згаданого git.

Який там щас годину?


Ага, 53хххххх - схоже на 5367fb36 з балки.

Тепер додамо супер-ретельності - логічно що після секунд дробові частки. Їх можна кодувати по-різному, наприклад 0x00000000 = 0 сек, 0xFFFFFFFF = 0.999+ сек, 0x80000000 = 0.5 сек.

беремо
@ 40000000527270a43690410c tcpsvd: info: status 10/100 @ 40000000527270a524e8249c tcpsvd: info: status 11/100
Ніде немає чисел більше мільярда, і все закінчуються на два нулі. Припущення: тут в Хекс кодується тупо кількість мільярдних часток секунди.
Фігачіть для першого рядка.

Схожі статті