Hacknutý můj vlastní WordPress web

Napadení webu

Nečekal jsem to, ale na vlastní kůži jsem si vyzkoušel, jaké je to mít hacknutý vlastní web. Že by staré lidové moudro o kovářově kobyle? 🙂 Na začátku listopadu jsem se po dlouhé době potřeboval podívat na FTP server svého webu, a naprostou náhodou si tam mezi WP složkami souborů všiml cizokrajné složky /yeg49e0/. Vytvořena 1. 11. v 17:10. A ke stejnému času modifikovaný soubor wp-load.php, ve kterém přibyl jeden jediný řádek PHP kódu: include(‚…/yeg49e0/1a9ra.php‘). Tedy každé načtení stránky webu spouštělo i skript nějakého malwaru. Ten jsem deaktivoval, odmazal, a prozkoumal web – nikde nic zvláštního, nebyl doinstalován žádný podezřelý plugin, vytvořen nový administrátor, nebo články infikovány zpětnými odkazy nebo divným, javascriptem. Překvapující ale bylo, že malware neodhalil Ithemes Security bezpečnostní plugin.

O co se ten malware snažil?

Z letmého prozkoumání kódu malwaru mi vyšlo, že jeho úkolem nebylo web nějak poškodit nebo kompromitovat, ale využít jej k podpoře prodeje různých léků a prášků s názvy, které mi nic neříkají. Pro roboty vyhledávačů se web začal tvářit, že jsou na něm stovky a tisíce podstránek s informacemi o různých lécích a jak a kde je koupit. Například URL mklusak.cz/online-predpis-seroquel. Ta adresa na webu žádným způsobem neexistovala, nebyla vytvořena stránka s tímto názvem / adresou. Ale malware číhal, až na tuto stránku přijde Google robot, a tehdy si její zobrazení „ukradl“ pro sebe, a robotovi naservíroval předpřipravený obsah – stránka pro indexovacího robota vypadala například takto:

Googlí robot si tedy zaindexoval krásnou stránku plnou textu a různých klíčových slov. Nebylo mi jasné, jak se k té URL adrese ale robot vůbec dostal, jak se o ní dozvěděl, aby ji přišel indexovat? A myslím, že jedna z prvních akcí toho malwaru byla ta, že když identifikoval přístup Google robota na nějakou existující stránku webu, tak mu ji podvrhl stránkou s tisíci odkazy na tyto budoucí falešné podstránky, a Google si je ochotně „zapomatoval“, a záhy začal přicházet přímo na tyto URL adresy.

A výsledky vyhledávání se brzy začaly plnit takovýmito odkazy:

Domény webů jsem skryl, ale věřte, že to opravdu nejsou online lékárny. A pokud byste na tento výsledek klikli a „šli“ na onu falešnou URL na napadeném webu, opět by si tento požadavek malware odchytl, a okamžitě by vás přesměroval na úplně jiný web, na online lékárnu / eshop kdesi v Kanadě, kde byste si mohli onen seroquel, verapamil, zestril, celexu či zocor reálně koupit. Hlavním cílem tohoto malware bylo tedy zneužití webu (webů) k zaplevelení Google výsledků spoustou odkazů, které ale reálně vedly na jeden online obchod. Zjednodušeně.

Mechanismus napadení webu

Fajn, věděl jsem, co ten malware měl za cíl, ale nevěděl jsem, jak se do mého WordPress webu dostal. Prvním krokem bylo prohledat přístupové / access logy a pátrat v nich.  A hned jsem tam našel requesty odpovídající okamžiku, kdy se ona cizorodá složka na webu objevila.

185.170.213.195 – – [01/Nov/2022:17:11:46 +0100] „POST /yeg49e0/1a9ra.php HTTP/1.1“ 200 74 „-“ „Mozilla/5.0 (Windows NT 10.0; WOW64; …
185.170.213.195 – – [01/Nov/2022:17:11:47 +0100] „POST /yeg49e0/1a9ra.php HTTP/1.1“ 200 74 „-“ „Mozilla/5.0 (Windows NT 6.1; Win64; …
185.170.213.195 – – [01/Nov/2022:17:11:47 +0100] „POST /yeg49e0/1a9ra.php HTTP/1.1“ 200 78 „-“ „Mozilla/5.0 (Windows NT 6.1; Win64; …
185.170.213.195 – – [01/Nov/2022:17:11:47 +0100] „POST /yeg49e0/1a9ra.php HTTP/1.1“ 200 30 „-“ „Mozilla/5.0 (Windows NT 10.0; WOW64; …
185.170.213.195 – – [01/Nov/2022:17:11:48 +0100] „POST /yeg49e0/1a9ra.php HTTP/1.1“ 200 28 „-“ „Mozilla/5.0 (Windows NT 10.0; WOW64 …

IP adresa kdesi z Nizozemí, několik POST requestů na existující PHP skript, a o chvíli později pak už requesty přímo na infikovaný WordPress:

185.165.242.245 – – [01/Nov/2022:17:20:45 +0100] „POST /jsniyov HTTP/1.1“ 200 … kód odpovědi 200 („úspěch“), nikoli 404. Tento request už odchytil a zpracoval malware načtený do WP prostředí, jinak by to skončilo 404 chybou.

A do tohoto okamžiku v access lozích za několik dní zpět nic podezřelého. Žádné přístupy do WP adminu, žádné podezřelé přístupy na nějaké nezáplatované bezpečnostní chyby v těch pár pluginech, co tu mám. Pokud by byla zneužita nějaká taková zranitelnost ve WordPressu, tak by to bylo zalogováno pár chvil před tím, než byly ty cizí soubory na FTP serveru vytvořeny. Jenže žádné takové requesty v logu nebyly.

Kde se ty soubory na FTP tedy vzaly? Že by tam byly nahrány přímo FTP přenosem? Obrátil jsem se na podporu hostingu Savana, jestli se lze nějak dostat k logům FTP serveru, a v odpovědi mi ony logy poslali. A bylo to tam:

2022-11-01T17:11:45+01:00 username (185.170.213.195) – FTP session opened.
2022-11-01T17:11:45+01:00 username (185.170.213.195) – USER *****: Login successful.
2022-11-01T17:11:48+01:00 username (185.170.213.195) – FTP session closed. 

Na sekundy přesně, stejná IP adresa, a šokující „Login successful“. Záškodník se mi připojil na FTP s MÝM HESLEM, a nahrál si tam malware, na který obratem poslal několik HTTP requestů, a oživil jej. Samozřejmě, záškodníkem nemyslím nutně živého útočníka, to může být klidně nějaký automatizovaný botnet, robot atd. A tím oživením je myšleno, že upravil wp-load.php soubor, aby vždy donačítal i PHP skripty onoho malwaru a ten tak byl „přítomen“ u každého příchozího požadavku na web. Jak jsem pak dopátral, tak ten malware přednostně infikoval wp-load.php, ale nebyl-li ten přítomen a web běžel na jiném redakčním systému, tak se zaháčkoval do výchozího index.php souboru.

FTP účet, jehož heslo útočník znal, nikde mimo své PC nepoužívám, nemohl být tedy ukraden někde online. Mám jej jen na svém PC, ovšem – stejně jako spousty účtů pro přístupy na weby klientů. To bylo to nejdivnější – jak to, že byl napaden pouze můj web? Jak by se nějaký vir v mém PC náhodou trefil zrovna do FTP hesla k mému webu? Obzvlášť když jsem jej za poslední měsíce ani nepoužil.

Podezření

Jenže ve mně začalo hlodat tušení, že to možná bylo jinak. Když jsem různá klíčová slova ze seznamu v kódu malwaru házel do Googlu, zda o tom hacku něco nezjistím, tak jsem nacházel spousty výše zmíněných výsledků / jiných napadených webů. A z logiky popsané výše o tom majitelé webů patrně vůbec nevěděli – že jejich weby slouží k jakési prapodivné propagaci všemožných léků. Však si do Googlu zadejte „zocor levně“ a uvidíte sami 🙂 Vždy jsem si tedy web rozklikl, a na nalezený kontakt napsal e-mail s informací o tomto problému, takový malý dobrý skutek. Poznamenával jsem si IP adresy napadených webů, a dle nich zjišťoval, kde jsou ony weby hostovány. A až podezřele často, přibližně v polovině případů, to bylo na serverech hostingové společnosti Savana – stejně jako v mém případě. Sepsal jsem svoje poznatky do e-mailu podpoře, na který se mi ale kupodivu nedostalo žádné odpovědi.

Spojil se se mnou ale jiný webař, který měl na starosti jeden z napadených webů, jehož majiteli jsem poslal informaci o jeho napadení. A i ten poté odhalil infekce v různých webech ve svém FTP účtu – a také u Savany.

A o pár dní později se mi začala schránka plnit e-maily od Savany o nutnosti změny hesel k FTP účtům. Protože jsem dlouhá léta k Savaně umisťoval webové stránky svých klientů, tak mi těchto upozornění přišla opravdu spousta.

Nevím, co se reálně stalo, ale nevíce to ve mně vzbuzuje pocit, že u Savany došlo k úniku přihlašovacích údajů k FTP. Kdyby tomu tak nebylo, tak by prosté zvýšení útoků na FTP asi nevedlo k nutnosti resetovat všem zákazníkům hesla k FTP účtům. To by byl dost overkill.

Dohra

Web jsem měl vyčištěný, a podařilo se mi situaci zachránit ještě před tím, než na něm Google stihl zaindexovat nějaké falešnosti. Ale jednoho rána usednu k PC a naprostou náhodou si ve složce serverových accesslogů všimnu, že dnešní brzce ranní log už má velikost několik megabajtů! Více než accesslog za celý předchozí den! Otevřu jej a vidím tisíce reqůestů typu:

37.221.129.75 [09/Nov/2022:05:11:29] „GET /koupit-pravachol-online-s-bezplatnymi-vzorky HTTP/1.1“ 404 19393 …
113.254.61.24 [09/Nov/2022:05:11:29] „GET /mohu-koupit-pravachol-pres-prepazku HTTP/1.1“ 404 19393 …
112.134.156.60 [09/Nov/2022:05:11:30] „GET /mohu-si-koupit-pravachol HTTP/1.1“ 404 19393 …
138.94.117.237 [09/Nov/2022:05:11:31] „GET /levne-pravachol HTTP/1.1“ 404 19393 …
116.88.145.227 [09/Nov/2022:05:11:32] „GET /koupit-pilulku-pravachol HTTP/1.1“ 404 19393 …

Nějaký botnet oťukával ony falešné URL adresy, které na mém webu měly být, jenže kvůli chybějícímu malwaru nyní dávaly „správně“ chybu 404. Jenže protože těch requestů chodilo několik do sekundy, a „hezkou“ 404 stránku v dobré víře generoval WordPress redakční systém, tak byl můj server výkonnově úplně KO. A tím samozřejmě i všechny weby klientů, které mám umístěné přímo na něm (a nikoli v oddělených účtech) – načtení webu trvalo desítky sekund, pokud se vůbec podařilo. Pohled do správy hostingu byl také zajímavý, „load“ serveru se zvedl na šestnáctinásobek přiděleného výkonu:

Průměrná zátěž mého serveru se pohybuje na hodnotě 0.1, teď byl 15-16. Hezké, ale co s tím? Smazat web? A nakonec jsem se utkal s botnetem v souboji na život a na smrt, kdy jsem do .htaccess souboru mého webu vkládal pravidla, kdy pak server přístupům na určité URL adresy vracel rovnou instantní serverovou HTTP 403 Forbidden chybu, aniž by ty vůbec dorazily až do WordPressu (a ten by generoval 404 chybu).

# killnout každý request obsahující v URL následující slova
RewriteEngine On
RewriteCond %{REQUEST_URI} (na-prodej-online|online-koupit|diflucan|pentasa|pravachol|zestril …)
RewriteRule ^(.*)$ – [F,L] 

Neustále jsem sledoval access log, a jakmile se v něm začaly opět objevovat 404 odpovědi, protože botnet začal oťukávat URL adresy s novým lékem, tak jsem pravidlo aktualizoval o nové klíčové slovo. A vedle toho připravil ještě obecnější pravidlo níže:

# killnout všechny requesty ZAČÍNAJÍCÍ na následující slova
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(koupit|kde-koupit|jak-koupit|mohu-si-koupit …)
RewriteRule ^(.*)$ – [F,L]

Tím jsem si také hodně uvolnil ruce, protože to pokrylo tisíce requestů, aniž bych musel vědět, jaký lék v těch URL právě figuruje. A po několika hodinách „útok“ skončil, jak začal, ale to už byla zátěž serveru dávno na běžné úrovni, a botnet jen marně bušil na dveře.

 

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