Oprava hacknutého WordPress webu

Napadení webu

V pondělí ráno jsem usedl s kávou k počítači a přemýšlel, do které práce se pustím nejdříve, když mi přišel e-mail s prosbou o vyřešení „hacku“ WP webu mého několikaletého klienta (kterému jsem původně implementoval platební bránu). Provozovatel hostingu web vypnul, protože rozesílal tisíce spamových e-mailů denně – jasná známka napadení webu a jeho zneužití k nekalým účelům. Tyto problémy „mám rád“, protože je to vždy něco nového, souboj s neviditelným nepřítelem, zákopový boj digitální války 🙂

Zásadní problém byl, že jsem neměl přístup do administrace WordPressu (web byl vypnutý), abych mohl nainstalovat bezpečnostní plugin (Wordfence Security). Ten rychle odhalí, které soubory WordPressu jsou napadeny a umožňují robotovi vytvářet své vlastní soubory. Naštěstí jsem měl přístup k access logům, bez kterých bych tento hack těžko vyřešil, a na FTP server ke zdrojovým souborům. Ty jsem letmo prohlédl, ale jejich datům modifikace již moc významu nepřikládal – a oprávněně: později jsem našel kód, který výslovně nastavoval propašovaným souborům stejná data modifikace, jaká měly ostatní soubory ve složce. Podíval jsem se tedy rovnou do posledních access logů a hledal přístupy na .php soubory, nebo POST požadavky. Obojího je v běžném provozu WordPressu minimum. Ihned jsem našel přímé přístupy na soubory, ke kterým se přímo určitě přistupovat nemá, a v nich vždy úsek zašifrovaného kódu. Vše jsem promazal, a opravil, a nechal web opět spustit.

V logu bylo také množství POST požadavků na soubor xmlrpc.php … přes ten roboti zkoušejí odhalit slabá hesla. A pokud se jim nějaký plugin nebrání omezeným počtem pokusů, tak mohou zkoušet, zkoušet … až se jim to podaří. Je dobré tuto službu vypnout, 99 % uživatelů ji nikdy nevyužije. Zato každý záškodnický robot ano.

Našel jsem také napadený jeden soubor šablony, nejpravděpodobnější počátek hacku. Opět jsem usuzoval na odhalení hesla některého z administrátorů, a pak propašování cizího kódu přes administrační rozhraní editace souborů šablony. Pak si již robot mohl s celým webem dělat, co chtěl. Nechal jsem si ještě zaslat výpis FTP přihlášení, kde nic podezřelého nebylo, takže k editaci onoho souboru mohlo dojít pouze přes administraci. Všem administrátorům se tedy změnila hesla.

Nyní již bylo možné nainstalovat WordFence Security, který odhalil několik dalších napadených souborů WordPressu, a také pluginů. Provádí to tak, že si vždy stáhne oficiální kódy redakčního systému (nebo pluginu), a porovná je s těmi, co jsou nainstalovány. Pokud se nějaký soubor liší, pak na 99 % obsahuje něco, co v něm být nemá. Svoji práci odvedl, ale problém byl, že web používá zakoupenou šablonu, která není volně dostupná, a tak není možné její soubory zkontrolovat proti „oficiální verzi“. Prošel jsem tedy její soubory ručně, ale byly jich stovky, a já měl být pečlivější.

Dalšího dne ráno byl web totiž opět vypnut, a některé ze škodlivých souborů, co jsem o den dříve smazal, byly znovu na svých místech. A spam se vesele rozesílal. Aha. Nezbylo tedy než celý web stáhnout na disk, smazat kompletní instalaci WordPressu a ručně ji nahrát z nové čisté instalace, a to samé udělat se všemi pluginy. Vše, co nebylo možné takto „obnovit“, bylo třeba projít pečlivě ručně. Ve složkách s mediálními soubory byly opravdu jen obrázky, takže zbývala jen složka šablony. Bylo v ní už bohužel mnoho úprav, nebylo možné ji tedy přehrát původní verzí, a tak jsem znovu procházel všechny soubory ručně a hledal v nich bloky zašifrovaného kódu – a několik jich odhalil. Takže tady zůstala ta zadní vrátka, která opět infikovala čisté soubory WordPressu.

Nyní jsem již měl připravený naprosto vyčištěný web, takže jsem ten původní na FTP serveru smazal, a nahrál svoji čistou verzi. Web byl opět zprovozněn.

A o pár hodin později opět napaden. Sakra! Došlo k napadení souboru wp-include/nav-menu.php. Ale pozor! Ten soubor mohl být napaden pouze během těch několika hodin, protože pocházel z čisté instalace! Takže v access lozích musí být o tomto útoku záznam, a to v docela úzkém časovém okně. Někde tam bude přístup na soubor obsahující zadní vrátka, který jsem já ještě neodhalil. Pečlivě jsem procházel záznamy, a vedle stovek „volání“ klíčového škodlivého souboru, který jsem již dávno odstranil, se najednou objevil jeden osamocený přístup na jiný regulérní soubor šablony. Podíval jsem se do něj, a na jeho začátku byl JEDEN ŘÁDEK cizího kódu. Není divu, že jsem jej při procházení stovek souborů přehlédl. A tento jeden řádek stačil k tomu, aby se webem začala infekce znovu šířit. Soubor jsem opravil, nechal analyzovat celou instalaci a pluginy, a vše bylo OK. Ještě jsem co pár hodin prohlížel logy, na jaké soubory jsou evidovány podezřelé přístupy, a všechny jen vracely chybu „404 – soubor nenalezen“.

Web byl vyčištěn. Při řešení tohoto napadení jsem si už v některých chvílích opravdu říkal, že nevím, jak dál, a nakonec to byl zatím nejrozsáhlejší hack, který jsem řešil. Ke zdárnému konci.

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