Wybrane realizacje

Reakcja na incydent WordPress

Strona wyglądała normalnie. Google przez pięć i pół miesiąca widział linki do kasyn.

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.

Edytor strony WordPress z zaznaczonymi ukrytymi blokami spamu i ekranem logowania dwuskładnikowego
Bloki wypchnięte poza ekran przez position:absolute. Niewidoczne dla odwiedzających, widoczne dla wyszukiwarek.

Zlecenie: najpierw ustalić, co się stało, potem cokolwiek ruszać

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

Co wykazała analiza

5,5 miesiąca
ukrytego spamu na stronie głównej i stronie usług
8 linków
do kasyn, chwilówek i kantorów kryptowalut w 7 ukrytych blokach
6000+
prób odgadnięcia hasła przez xmlrpc.php w sześć tygodni
3,8 GB
starych archiwów strony, które każdy mógł pobrać po adresie

02

Atakujący logował się prawdziwym hasłem administratora

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.

  1. 28 maja

    Pierwszy ukryty link na stronie głównej.

  2. Lipiec

    Linki do chwilówek, kasyn i kantorów kryptowalut w dwóch kolejnych falach.

  3. 28 września

    Strona usług dostaje blok linków do litewskich kasyn.

  4. 3 listopada

    Ostatnia zmiana strony głównej, z adresu IP w AWS.

  5. 12 listopada

    Start kopii, analizy i czyszczenia.

Co zrobiliśmy, krok po kroku

  1. 01

    Najpierw kopia

    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.

  2. 02

    Analiza

    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.

  3. 03

    Czyszczenie

    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.

  4. 04

    Zamknięcie drzwi

    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.

  5. 05

    Łatki i wzmocnienie

    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

Zasady pracy na działającej produkcji

Dowody przed sprzątaniem

Na serwerze nic się nie zmieniło, dopóki kopia nie została sprawdzona, a wyniki przekazane.

Zgoda na każdą zmianę

Każdą zmianę proponowaliśmy, klient ją akceptował i dopiero wtedy ją wdrażaliśmy.

Kopia przy każdej edycji

Każdy zmieniany plik i tabela były zapisywane wcześniej, każdy krok da się cofnąć w kilka minut.

Odwracalność

Gdy klient chciał z powrotem usunięty menedżer plików, przywróciliśmy go z kopii w minutę.

04

Najgroźniejsze znalezisko było na „czystej” stronie

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.

Szczegóły techniczne

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?

Ustalimy, co się stało, zanim cokolwiek zostanie usunięte.

Zamów analizę