Napadený WordPress web rozesílající spam

Napadení webu

Obrátil se na mě zákazník s prosbou o vyřešení problému s napadeným WordPress webem, který během posledních 24 hodin rozeslal cca 25 000 spamových emailů, a jejich hosting jim ho vypnul. Ihned jsem se pustil do práce. V přeposlaném e-mailu od hostingu byla ukázka z logu, kde byly spamové requesty očividně zastoupeny voláním „POST /wp-admin/admin-ajax.php“. Už to mi mělo napovědět, že to nebude úplně běžné napadení – to se totiž nesoustředí jen na jeden soubor, ale má rozesetá zadní vrátka po celém webu.

Na FTP jsem letmo zkontroloval obsah složek a souborů, ale nic podezřelého na první pohled vidět nebylo. Dle dat modifikací byly soubory nedotčené, žádné modifikace v odlišné časy … ale už jsem se setkal s malwarem, který po sobě zametal stopy změnou data modifikací svých souborů (aby nebyly podezřelé). Inu bude třeba nad celým webem spustit WordFence analýzu, jenže to jej nejdříve musím celý zduplikovat na svůj počítač, na vypnutém hostingu, který zobrazuje jen vysvětlení, proč web nefunguje, to nepůjde. Nainstalovat poslední verzi WordFence pluginu na počítači s operačním systémem Windows se nakonec také ukázalo jako problém vyžadující upravení cizokrajných nastavení Apache serveru. Ale pak již nic analýze zdrojových souborů nic nebránilo. Ta ovšem nic neodhalila, a já zůstal zaraženě sedět u klávesnice. Dobře, WordPress samotný ani běžné pluginy infekci podle všeho neobsahují.

Web bohužel běží na zakoupené šabloně, kterou není možné 100% analyzovat. Problém by tedy mohl být v ní, nebo v „sesterském“ pluginu, který šablona zřejmě pro svůj běh vyžaduje. Kontrolovat ale soubor po souboru jejich obsah, to by bylo zdlouhavé a ne 100% spolehlivé.

Tak tedy jinak – pokud hosting tvrdí, že je neustále napadán soubor /wp-admin/admin-ajax.php, a ten žádný škodlivý kód neobsahuje, tak je zřejmé, že útočník využívá regulérních funkcí WordPressu, nikoli zadních vrátek. Request se tedy vydává za ajaxové volání a dává WordPressu „pokyn“ k odeslání spamu na tu a tu emailovou adresu. Jak to ale ověřit? Celkem jednoduše – upravil jsem admin-ajax.php, aby všechny POST requesty logoval do textových souborů, a já se pak jen podívám, jaké akce se spouští. K tomu je ale třeba běžící web. Poprosil jsem tedy technickou podporu hostingu station.cz o znovuaktivování webu a druhý den ráno mi bylo po 17 hodinách nečinnosti vyhověno. Tomu říkám technická podpora …

V logu POST requestů začaly ihned naskakovat záznamy, během pár minut už šlo o desítky spamů. Znovu jsem upravil admin-ajax.php, aby tato volání ignoroval, a začal pátrat po funkci, přes kterou útočník spam rozesílal. A objevil jsem ji během chvilky v jednom ze souborů sesterského pluginu šablony. Ta obsahuje seznam inzerátů, a jednou z funkcí je možnost odeslat inzerát na email kamarádovi. Na tuto funkci se útočník zaměřil, a cca co pět sekund přes ni odesílal spamový email. Tyto formuláře „Poslat xy známému“ mají pro provozovatele webu tu nevýhodu, že v něm zadáváte svůj email jako odesilatele doporučení, a dále email příjemce (vašeho známého). Vy se nemusíte přihlašovat do své schránky, web email pošle za vás. Jenže pokud ten formulář není nijak chráněn proti robotům, tak jej lze snadno zneužít k rozesílání libovolného emailu komukoli.

Antispamová ochrana byl vypnutá, klient každopádně tuto nepotřebnou funkci („poslat příteli“) úplně vypnul a skryl, a vše bylo zdánlivě vyřešeno. Ale z logu POST requestů jsem viděl, že spam se posílá dále.

Ihned mi došlo, že tato funkčnost je v pluginu řešena nešťastně – nijak se neřeší, jestli je formulář na webu zobrazen nebo skryt, plugin prostě neustále „naslouchá“, jestli mu nepřijde pokyn k odeslání emailu. A tak stačí, aby mu robot tento pokyn neustále předkládal přímo přes admin-ajax.php „vstupní“ soubor, a emaily budou odesílány. Nepomohlo by ani aktivování antispamu, protože ten byl řešen jen při validaci formuláře, a neumožnil by jeho odeslání. Plugin tedy předpokládá, že přijde-li pokyn na odeslání emailu, musela být antispamová kontrola správně vyhodnocena, jinak by nebyl formulář potvrzen (a nepřišel by pokyn k odeslání) … jenže to útočníka vůbec netrápilo, pokyn předával napřímo na admin-ajax.php, a plugin jej ochotně přijal.

Prozatím byla funkce pro odesílání emailů natvrdo znefunkčněna přímo v kódu pluginu, neboť nepředpokládám jeho (ruční) aktualizaci. V případné novější verzi už může být tato „díra“ také opravena.

Napsal Marek Klusák, programátor a webdesigner. Kontakt

Další příspěvky v rubrice Napadení webu