Webshell, który pobierał się z powrotem po skasowaniu. Strona pokazująca Google sklep z podróbkami. Backdoor ukrywający swój własny wiersz w panelu. Trzy prawdziwe przypadki z jednego dnia, mechanizm po mechanizmie, i wnioski, które z nich wynikają.

To nie był dzień zaplanowany na bezpieczeństwo. Jedna firma zgłosiła, że po aktualizacji „zniknęły zdjęcia”. Druga, że panel administracyjny nagle wyrzuca błąd 403. Trzecia poprosiła o zwykły przegląd. W każdym z tych trzech przypadków na serwerze siedział aktywny kod atakującego, a właściciel strony nie miał o tym pojęcia.
Nazw nie podajemy. Opisujemy mechanizmy, bo to one się powtarzają i to one są warte przeczytania przez każdego, kto ma stronę na WordPressie.
Objaw był prozaiczny. Po aktualizacji WordPressa wszystkie zdjęcia przestały się wyświetlać. Nie błąd 404, tylko 500 i to wyłącznie na plikach, które naprawdę istniały. To sygnał, że żądanie do obrazka nie trafia do pliku, tylko przechodzi przez kod PHP, który się wywala.
W panelu wtyczek stały dwie pozycje o nazwach brzmiących jak coś systemowego: jedna udająca wtyczkę cache, druga „usługę rdzenia”. Żadna z nich nie istnieje w oficjalnym repozytorium. Do tego w katalogu wtyczek wymuszanych, czyli takich, których nie da się wyłączyć z panelu, leżał plik ładujący jedną z nich przy każdym żądaniu.
Pod spodem było gorzej. Rozkodowany kod pokazał webshell o wadze 154 kB, ukryty pod nazwą udającą plik sesji WordPressa, z komunikacją do serwera sterującego w Stanach Zjednoczonych i z zapasowym adresem schowanym za siecią dostarczania treści. Mechanizm był prosty i skuteczny:
Kopie zapasowe shella siedziały w plikach graficznych o nazwach banner.gif, logo.png i avatar.jpg, każdy po około 157 kB. Uruchamiała je reguła w pliku konfiguracyjnym serwera, a druga kopia tej reguły leżała katalog wyżej, poza zasięgiem menedżera plików z panelu hostingu. W katalogu głównym znaleźliśmy też plik z wykradzionymi danymi logowania i skrypt do ataków na inne serwery.
Najciekawsze jest to, co klient uznał za awarię. Aktualizacja WordPressa niczego nie zepsuła. Zepsuła malware, które przestało poprawnie przechwytywać pliki i zaczęło zwracać błąd. Gdyby nie ta aktualizacja, strona działałaby dalej „normalnie”, a atakujący miałby pełny dostęp do serwera przez kolejne miesiące.
Tu objawem był błąd 403 przy logowaniu do panelu. Przy okazji sprawdziliśmy, co widzi wyszukiwarka, i to była właściwa niespodzianka.
Ten sam adres zwracał dwie różne strony zależnie od tego, kto pyta. Przeglądarka dostawała normalną stronę firmy. Robot Google dostawał podrobiony sklep z zegarkami i odzieżą, ze zdjęciami zaciąganymi z zagranicznych serwisów aukcyjnych. Mapa strony zgłoszona do Google miała 1829 adresów, z czego 1828 było fałszywych, a data ostatniej modyfikacji we wszystkich wpisach była ustawiona na dzień do przodu, żeby zawsze wyglądały świeżo.
Błąd 403 też okazał się dziełem atakującego. W pliku konfiguracyjnym serwera siedziała reguła blokująca wykonanie wszystkich plików PHP poza krótką białą listą, a na tej liście były nazwy webshelli. Oryginalny plik WordPressa leżał obok, odłożony pod inną nazwą.
Na tym samym koncie hostingowym działała koparka kryptowalut: binarka o wadze 8,3 MB podszywająca się pod systemowy plik linkera, kopiąca do publicznej puli, w trzech kopiach, uruchamiana ponownie przy każdym logowaniu do powłoki i celowo ustawiona na najniższy priorytet procesora, żeby nie rzucać się w oczy w statystykach hostingu.
To już nie jest „zainfekowana strona”. To przejęte konto hostingowe, na którym strona jest tylko jednym z uruchomionych programów.
Trzecia strona wyglądała idealnie. Wtyczki legalne, użytkownicy w porządku, motyw standardowy, rdzeń aktualny. A jednak.
W katalogu wtyczek wymuszanych leżał plik podający się za narzędzie „pobierające aktualizacje wtyczek ze zdalnego serwera”. Miał dwa mechanizmy ukrywania i oba są warte zapamiętania.
Ukrywał się w panelu. Zakładka z wtyczkami wymuszanymi pokazywała licznik „1”, tabela pod spodem deklarowała dwa elementy, a widoczny był jeden wiersz. Backdoor ustawiał swój własny wiersz na niewidoczny, i to nie w kodzie źródłowym strony, tylko już po jej załadowaniu, więc podejrzenie źródła niczego nie dawało.
Ukrywał się na stronie. Strona pobrana jako anonimowy użytkownik ważyła o 130 kB więcej niż ta sama strona oglądana przez zalogowanego administratora. Te 130 kB to był blok wsunięty w treść i odsunięty poza ekran, zawierający 58 linków do 81 obcych domen: kasyna z kilku krajów i przejęte sklepy. Właściciel nie mógł tego zobaczyć, bo dla niego, jako zalogowanego, ten kod się nie pojawiał. Widział go Googlebot.
Różne mechanizmy, różne cele, ta sama lista wniosków.
Jeżeli cokolwiek z tej listy brzmi znajomo, zacznij od ustalenia faktów, a nie od kasowania plików. Robimy takie rozpoznanie i czyszczenie jako osobną usługę: odwirusowanie WordPressa i naprawa zhakowanej strony.
Drogą wejścia w każdym z tych przypadków był kod dodany do WordPressa: wtyczka, motyw albo publicznie dostępny punkt interfejsu programistycznego. Rdzeń sam w sobie jest pilnowany dobrze, problem robi się tam, gdzie dokłada się kolejne rozszerzenia.
Im dłużej wtyczka nie jest aktualizowana, tym dłużej znana publicznie luka stoi otworem. Atakujący nie szukają konkretnej firmy. Skanują internet pod kątem konkretnej wersji konkretnej wtyczki i wchodzą tam, gdzie zadziała. Twoja strona nie musi być ciekawa, żeby być celem: wystarczy, że jest podatna, bo i tak posłuży do kopania kryptowalut, wysyłania spamu albo pozycjonowania cudzych podróbek.
Ale trzeba powiedzieć też drugą część. Aktualizacja nie czyści strony, która jest już zainfekowana. W pierwszym z opisanych przypadków aktualizacja rdzenia nie usunęła niczego, tylko sprawiła, że malware przestało działać poprawnie. To był łut szczęścia, nie zabezpieczenie.
Aktualizacje w stałym rytmie, kopie poza serwerem i monitorowanie zmian w plikach to rzeczy, które ktoś musi robić regularnie, bo „przy okazji” znaczy nigdy. U naszych klientów robimy to w ramach opieki nad stroną.
Każdy z opisanych ataków potrzebował jednej rzeczy: możliwości wykonania kodu na serwerze, który serwuje stronę. Webshell to plik PHP. Koparka odpalała się z konta powłoki. Podmiana treści dla robota to reguła serwera wskazująca na skrypt. Backdoor był wtyczką, czyli kodem uruchamianym przy każdym wejściu na stronę.
Strona zbudowana w Astro albo w Reakcie i wdrożona jako zestaw plików statycznych nie ma takiego miejsca. Konkretnie:
To nie jest magiczna odporność. Można źle skonfigurować formularz, wystawić klucz interfejsu programistycznego albo stracić konto przez brak dwuskładnikowego logowania. Ale cała klasa ataków opisanych wyżej, czyli wrzucenie pliku, który wykonuje się przy każdym żądaniu, po prostu nie ma na czym się oprzeć.
Jeśli Twoja strona co chwilę wymaga ratowania, policz, ile kosztuje utrzymywanie jej przy życiu przez rok. Często wychodzi drożej niż przebudowa na nowy fundament, a przy okazji znika cała ta kategoria problemów.
Nie każdą stronę trzeba od razu przepisywać. Jeśli WordPress zostaje, to minimum wygląda tak:
I jedna rzecz z doświadczenia tego jednego dnia: jeżeli podejrzewasz infekcję, nie zaczynaj od kasowania. Najpierw odczyt, potem kwarantanna, dopiero na końcu usunięcie. Skasowany na ślepo plik zabiera ze sobą informację o tym, co jeszcze zdążył zainstalować.
Trzy różne sytuacje, trzy różne rozmowy:
Nie wiesz, która z tych dróg jest Twoja? Audyt strony odpowiada na to pytanie liczbami, a nie przeczuciem.
Aktualizacje, kopie zapasowe, bezpieczeństwo i wsparcie. Napisz – dobierzemy pakiet.

Używamy plików cookie, aby zapewnić działanie strony oraz – za Twoją zgodą – analizować ruch i dopasowywać treści. Możesz zaakceptować wszystkie, odrzucić opcjonalne albo wybrać samodzielnie. Zgodę możesz zmienić w każdej chwili. Polityka prywatności ↗︎