Dowody przed sprzątaniem
Na serwerze nic się nie zmieniło, dopóki kopia nie została sprawdzona, a wyniki przekazane.
Reakcja na incydent WordPress
Polska firma prawno-księgowa podejrzewała włamanie na swoje strony WordPress. Zrobiliśmy kopię wszystkiego, odtworzyliśmy przebieg ataku, usunęliśmy spam i zamknęliśmy każdą drogę, z której korzystał atakujący.
Firma prowadzi trzy strony WordPress na jednym koncie hostingowym: stronę firmową, stronę usług i centrum pomocy. Nikt nie wiedział, jak głęboki jest problem, i nikt nie chciał sprzątania, które zniszczy ślady.
„Strony są zhakowane, co najmniej jedna. Zrób kopię, przeskanuj pliki i bazy. Na razie niczego nie zmieniaj.”
01
02
Każda zmiana ze spamem pochodziła z prawdziwego konta administratora, po zwykłym logowaniu udanym za pierwszym razem. Trwał też brute force, ale atakujący znał już hasło. Dwie czyste strony miały tych samych administratorów.
Pierwszy ukryty link na stronie głównej.
Linki do chwilówek, kasyn i kantorów kryptowalut w dwóch kolejnych falach.
Strona usług dostaje blok linków do litewskich kasyn.
Ostatnia zmiana strony głównej, z adresu IP w AWS.
Start kopii, analizy i czyszczenia.
Pliki, bazy danych, logi dostępu i stare archiwa ze wszystkich trzech stron, około 10 GB, skopiowane lokalnie przed analizą. Bazy zapisane bajt w bajt, żeby polskie znaki i cyrylicę dało się odtworzyć dokładnie.
Rdzeń WordPressa porównany plik po pliku z oficjalnym wydaniem. Wtyczki, motywy, uploads i mu-plugins sprawdzone pod kątem web shelli, bazy pod kątem ukrytych bloków i obcych adminów, logi pod kątem logowań i zmian. Sprawdziliśmy też, co widzi Googlebot.
30 bloków spamu usuniętych z 11 rekordów bazy, w tym z 9 starych rewizji, żeby spam nie wrócił przez przywrócenie wersji. Każda zmiana sprawdzona względem hasha rekordu, widoczny tekst bez zmian.
Publiczne archiwa usunięte, fałszywa wtyczka i folder z backdoorem skasowane, xmlrpc.php zablokowany, klucze bezpieczeństwa wymienione, hasła do baz zmienione. Obcy adres e-mail do resetu haseł zastąpiony w 15 miejscach.
Zdalne wykonanie kodu w WPML (CVSS 9.9) i odczyt dowolnych plików w Smart Slider 3 Pro zamknięte jednolinijkowymi łatkami. Naprawiony panel admina, przestawione aktualizacje, 2FA obowiązkowe dla każdego admina i redaktora.
03
Na serwerze nic się nie zmieniło, dopóki kopia nie została sprawdzona, a wyniki przekazane.
Każdą zmianę proponowaliśmy, klient ją akceptował i dopiero wtedy ją wdrażaliśmy.
Każdy zmieniany plik i tabela były zapisywane wcześniej, każdy krok da się cofnąć w kilka minut.
Gdy klient chciał z powrotem usunięty menedżer plików, przywróciliśmy go z kopii w minutę.
04
Dwa stare archiwa w publicznym katalogu głównej strony zwracały HTTP 200 każdemu, kto znał adres. Takie archiwa zwykle zawierają wp-config.php z hasłami do bazy. Nie da się udowodnić, że tędy wyciekło hasło administratora, ale to najbardziej prawdopodobna droga. Dziś zwracają 404.
Dostęp przez SSH i cPanel UAPI. Praca przez WP-CLI i bezpośredni SQL na połączeniu latin1, z podmianą bajtową i kontrolą MD5, żeby treści wielojęzyczne pozostały nietknięte.
Spam ukryto przez position:absolute i przesunięcia typu left:-503011px oraz biały tekst lub tekst 8–12 px. Dwie kopie wklejono jako escapowany HTML, więc na stronie głównej widać było surowy kod.
Łatki: WPML nie renderuje już treści shortcode’u przełącznika języków jako szablonu Twig (CVE-2024-6386). Eksport w Smart Slider 3 Pro wymaga uprawnień do edycji i tokenu bezpieczeństwa (CVE-2026-3098).
Logowanie dwuskładnikowe działa przez aplikację uwierzytelniającą (TOTP) z kodami zapasowymi i 30-dniowym okresem przejściowym. Admini dostali jednostronicową instrukcję PDF ze zrzutami, kody QR rozmyte.
Analizę prowadził agent AI pracujący przez SSH pod kontrolą człowieka. Agent analizował logi, porównywał pliki i pracował na bazie. Decyzje podejmowali ludzie i to oni zatwierdzali każdą zmianę.
Podejrzewasz, że Twoja strona WordPress została przejęta?