Разследване и почистване на компрометирана WordPress инсталация

Ако изгледът или поведението на сайта Ви се промени, това може да означава, че той е компрометиран. В тази статия ще опишем как нашият отдел "Сигурност" реагира в подобни ситуации. Избраният пример е за WordPress инсталация и макар данните да са различни, процесът на разследване е идентичен за повечето популярни уеб-базирани приложения.

Инцидент

Всяка WordPress инсталация съдържа много задължителни файлове за ядрото на WordPress в директорията на сайта, като същото важи и за други популярни уеб-базирани приложения. Там трябва да потърсите за неочаквани или нестандартни файлове или поддиректории в директорията на сайта. В разглеждания пример има два файла в директорията на WordPress инсталацията:

  133ja3lore.php
  a1cw42ipim.php

Ще използваме няколко стандартни Unix команди за събиране на повече информация за тези файлове и как те са се появили в акаунта. Всички акаунти на нашите сървъри поддържат SSH достъп по подразбиране и пълни сървърни логове за уеб достъп, така че ще можете да възпроизведете следващите стъпки и сами.

Откриване на времеви отпечатък

Инструментът stat дава много полезна информация за файлове и използването му за горните съмнителни файлове показва следните резултати:

[17:09:32] server~$ stat ~/www/www/133ja3lore.php
  File: ~/www/www/133ja3lore.php
  Size: 4909          Blocks: 16         IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 202768472   Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 4731/user)   Gid: ( 4674/user)
Access: 2018-02-02 15:16:02.000000000 +0800
Modify: 2018-02-02 15:16:02.000000000 +0800
Change: 2018-08-07 20:49:47.771134758 +0800
 Birth:
[17:09:43] server~$ stat ~/www/www/a1cw42ipim.php
  File: ~/www/www/a1cw42ipim.php
  Size: 4909          Blocks: 16         IO Block: 4096   regular file
Device: fc00h/64512d    Inode: 202768462   Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 4731/user)   Gid: ( 4674/user)
Access: 2018-02-02 15:16:02.000000000 +0800
Modify: 2018-02-02 15:16:02.000000000 +0800
Change: 2018-08-07 19:41:46.676971426 +0800
 Birth:

Символът "~" е съкратена версия за основната директория на акаунта - "/home/$USER", където $USER е потребителското име на акаунта.

Основната разлика между "mtime" (време на модифициране) и "ctime" (време на промяна) атрибутите е, че "mtime" показва времето на последно извършената промяна в съдържанието на файла, докато "ctime" показва времето на последно извършената промяна в съдържанието на файла или на един от неговите атрибути, като права и собственици. Според ситуацията, може да се наложи да използваме времето от "mtime", "ctime" или и двете.

В разглеждания случай ще използваме резултата от "ctime" за допълнителен анализ, тъй като и за двата файла той е по-скорошен. Също така ще използваме времевия отпечатък от "ctime" за файла "a1cw42ipim.php", тъй като той е от час по-рано спрямо другия файл. Следователно той е бил променен/качен първи и ще ни доведе по-близо до точката на пробива.

Разследване в логове

Скорошни логове в реално-време са достъпни в раздел "Логове" на хостинг Контролния панел. Те са удобни, ако атаката е била извършена скоро. В избрания пример инцидентът е станал преди много време, така че ще трябва да използваме архивираните копия на логовете. Тези архиви се съхраняват в директорията "logs" на акаунта и може да се видят през раздел "Файлове" на хостинг Контролния панел, FTP или SSH. Архивите са в GZIP формат, така че можете да използвате "zgrep" Unix командата за търсене в тях. Архивите с логове са разделени в отделни файлове с името на поддомейна и деня от месеца, така че търсене за времевия отпечатък от "ctime" ще изглежда така:

zgrep "19:41:" ~/logs/2018-08/www-07.log.gz

При търсене в логовете е хубаво да се обърне специално внимание на всякакви "POST" заявки. За разлика от "GET" заявките, където всички подавани данни към сайта са в неговия URL адрес, "POST" заявките подават данни към сайта в самата структура на заявката и не могат да бъдат проследени/видяни. Повечето промени на настройки и качвания на файлове използват този метод, но той се използва и за качване на злонамерени файлове. Търсенето от примерния инцидент показва следните две по-интересни заявки:

www.domain.com 192.0.2.1 - - [07/Aug/2018:19:41:44 +0800] "POST /um-api/route/um!core!Files/ajax_image_upload/a2c75736fe HTTP...
www.domain.com 192.0.2.2 - - [07/Aug/2018:19:41:45 +0800] "POST /wp-content/uploads/ultimatemember/temp/Ao3uKpx8B9klgpJ6Ra7A8...

Не очаквайте да откриете точката на пробива от първия опит/файл. Конкретният зловреден файл, който разследваме, може да е бил качен от друг зловреден файл. В повечето случаи процесът на търсене трябва да се повтори няколко пъти, докато се стигне до истинската точка на пробив. Важно е да се спомене, че може акаунтът да е бил компроментиран на друг сървър и след това да е бил преместен. Въпреки че този процес е създаден за нашите хостинг сървъри, трябва да можете да го използвате навсякъде, тъй като всеки уважаващ себе си хостинг доставчик трябва да предоставя подобни инструменти на клиентите си.

След като се открие точката на пробив, може да започнем почистването на сайта и подобряването на защитата срещу подобни атаки в бъдеще. Ако няма наличен чист архив на сайта, този процес може да е трудоемък, но е сравнително праволинеен с повечето модерни уеб-базирани приложения.

Откриването на всички файлове с права за изпълнение на акаунта и ръчното им проверяване за злонамерен код (тъй като повечето системи за автоматично сканиране не работят добре със замаскиран код) е от трудна до невъзможна операция. За щастие, популярните уеб-базирани приложения (например WordPress) може лесно да се инсталират отново, като се запазят всички качвани ръчно файлове и направени настройки. Това е най-бързият и ефективен метод за възстановяване на сайта Ви в чисто и сигурно състояние. Ние използваме този метод почти винаги с изключение на някои по-заплетени инсталации или сайтове.

Запазване на файла wp-config.php, Вашите снимки и лични файлове

Файлът "wp-config.php" съдържа основните настройки за Вашия сайт, включително данните, необходими за връзка с базата данни. Когато запазвате файла, го отворете и проверете за съмнително съдържание, като много дълъг ред от произволни символи. Ако файлът има много дълъг хоризонтален скрол при преглеждане в текстов редактор, то файлът е най-вероятно заразен. Ако това е случаят с Вашия файл "wp-config.php", копирайте настройките за връзка с базата Ви данни в празен/чист "wp-config.php" файл от прясно изтеглен архив на WordPress от официалната му страница.

Вашите снимки и персонални файлове трябва да се намират в директорията "wp-content/uploads". В най-добрия случай там не трябва да има никакви PHP файлове. За съжаление, някои разширения и теми може да съхраняват файлове там в поддиректории, което може да направи задачата за преглед и изчистване на зловреден код още по-трудна. Лесен начин да видите списък с всички PHP файлове в директория е чрез използване на следната команда в SSH:

find ~/www/www/wp-content/uploads/ -iname "*.php"

Ако не получите никакви резултати, можете да копирате директорията "uploads" без притеснения. В противен случай трябва да прегледате PHP файловете ръчно, за да проверите дали са добавени от безобидно разширение или хакер.

Преди да преминете към изтриване на каквото и да било, първо трябва да вземете пълен списък на Вашите активни разширения. Можете да направите това от таблото за управление на WordPress или използвайки следната WP-CLI команда през SSH в директорията на WordPress (например "~/www/www"):

wp plugin list --status=active

Резултатът от командата може да изглежда така:

 +----------------------------------+----------+-----------+---------+
 | name                             | status   | update    | version |
 +----------------------------------+----------+-----------+---------+
 | classic-editor                   |  active  | none      | 1.5     |
 | really-simple-ssl                |  active  | none      | 3.2.3   |
 +----------------------------------+----------+-----------+---------+

Можете да извършите същата операция и за активната тема на сайта:

wp theme list --status=active

 

Изтриване на цялата папка, в която е инсталиран WordPress

Файлът "wp-config.php" и директорията с Вашите снимки и файлове са единствените неща, които трябва да запазите от текущата Ви WordPress инсталация, тъй като основното съдържание на сайта Ви се намира в базата данни. В някои случаи и базата данни трябва да бъде почистена, но те са изключително редки и много по-трудни за обработка. Имайки и списък с активните разширения и тема на сайта, можете да изтеглите техните последни версии от разработчиците им.

Качване на последната версия на WordPress от сигурен източник

Можете да изтеглите WordPress от официалния сайт и да го инсталирате ръчно или да използвате нашия инсталатор в раздел "WordPress мениджър" на хостинг Контролния панел. След инсталиране на последната версия на WordPress, можете да копирате запазения по-рано файл "wp-config.php" и директорията с личните Ви файлове. Можете да инсталирате и всички активни разширения и тема, които сте използвали по-рано. Ако те са публично достъпни в хранилището на WordPress, можете да ги инсталирате чрез WP-CLI команда:

wp plugin install really-simple-ssl classic-editor --activate

След тези стъпки може да изпробвате Вашия сайт - в най-добрия случай той трябва да работи по същия начин, както е работил преди инцидента. В случай, че това не е така, можете да се свържете с нас за помощ и да опишете детайлно проблема, за да се опитаме да Ви помогнем.

Допълнителни предпазни мерки

Когато WordPress сайт е компрометиран, се предполага, че нападателите му са получили достъп до данните за вход на администраторите му. Затова е препоръчително да прегледате и обновите паролите на всички потребители с администраторски права. Трябва да проверите и за странни потребители, създадени около или след възникването на инцидента.

Съветваме Ви да обновите и паролите за Вашия хостинг Контролен панел и всички MySQL потребители. След смяна на паролата за Вашите MySQL потребители, трябва да обновите и всички конфигурационни файлове, като "wp-config.php" файла на Вашата WordPress инсталация.