2014-04-07 14 views
7

Ospitiamo migliaia di domini su più server. Abbiamo problemi con enormi quantità di malware e phpshell. L'uso di molti scanner non ha avuto alcun effetto nel portarli giù. forse abbiamo ottenuto 10/20 risultati vaghi da quegli scannergrep intero server per hack shell/malware

così ho creato il mio piccolo file bash per trovare quegli script. Trovato 148 phpshells questo fine settimana (non sono bravo a creare file .SH).



La mia domanda Il grep è terribile lento, avrà una durata di giorni. come posso rendere questo script più efficiente?

array=(
    "base64_decode(" 
    "substr(md5(strrev(" 
    "cwd = @getcwd();" 
    "chr((ord(" 
    "gzinflate(base64_decode(" 
    "php_uname()" "] = chr(ord(" 
    "cwd[strlen($cwd)" 
    "ini_get('safe_mode');" 
    "=\"\x62\"" 
    "\"+ r + \"&r=\" + document.referrer;\"" 
    "if(strtoupper(substr(PHP_OS, 0, 3)) == \"WIN\")" 
    "window.top.location.href=\"http://" 
    "@ini_get(\"disable_functions\")" 
    "$g3='';$g3.=$r;$g3.=$h;$g3.=$y" 
    "hacked" 
) 

for value in "${array[@]}" 
do 
    printf "\n[$value] [start => $(date +"%T")]\n" 
     grep -l -inr "$value" "/home/" 
    printf "\n[end => $(date +"%T")]\n" 
done 



RISULTATO FINALE

#!/bin/bash 
LC_ALL=C grep -F -n -r -f /root/scanner/pattern.txt "/home/" 

Pattern.txt

eval($___($__)); 
eval(stripslashes(@$_POST[ 
eval(stripslashes(array_pop(
eval(base64_decode(
eval(gzinflate(str_rot13(base64_decode(
gzinflate(base64_decode(
Array(base64_decode(
sha1(base64_decode(
print(base64_decode(
wsoScandir($dir) 
substr(current(array_keys(
cwd = @getcwd(); 
$OOO000000=urldecode(
$l___l_='base'.(32*2) 
substr(md5(strrev(
cwd[strlen($cwd) 
="x62 
+ r + "&r=" + document.referrer; 
if(strtoupper(substr(PHP_OS, 0, 3)) == "WIN") 
){if(@copy(
copy("endless.html 
system("wget 
symlink("/","sym/root"); 
@copy($_FILES['file']['tmp_name'] 
error_reporting(0);if(
x6C\x28\x67\x7A\x69 
"/.*/e","\x28\x65\x76\x61 
preg_replace("/.*/e", 
Windows-1251";preg_replace(
); exit(); } if(isset(
system("$cmd"); die;} 
rtrim($security_code, "/"); 
+3

Potrebbe essere meglio eseguire una scansione completa delle prestazioni una volta e poi tenere traccia dei file modificati e scansionarli solo. – PeeHaa

+0

sì, lo voglio anche io. solo ho bisogno che la sceneggiatura finisca completamente. ora va al 50% e il processo si blocca. anche quello che ho trovato era shellhacks che utilizza il comando php "touch" per cambiare il campo "data modified" di un file. – SinisterGlitch

+1

È possibile limitare lo script per esaminare solo i file di testo, quindi salterà le immagini. – DanFromGermany

risposta

7

Conservare il s earch stringhe come una singola stringa multilinea, ed eseguire fgrep una volta invece che in un ciclo:

values="eval(base64_decode(
gzinflate(base64_decode(
cwd = @getcwd(); 
chr((ord(
substr(md5(strrev(
chr(ord(
cwd[strlen(\$cwd) 
ini_get('safe_mode'); 
=\"\x62\" 
\"+ r + \"&r=\" + document.referrer;\" 
if(strtoupper(substr(PHP_OS, 0, 3)) == \"WIN\") 
window.top.location.href=\"http:// 
@ini_get(\"disable_functions\") 
){if(@copy(
eval(\$___(\$__)); 
copy(\"endless.html\" 
system(\"wget 
symlink(\"/\",\"sym/root\"); 
@copy(\$_FILES['file']['tmp_name'] 
error_reporting(0);if(
x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74 
hacked" 

LC_ALL=C fgrep -nr --include \*.php "$values" * 

Questa versione funziona 22x più veloce rispetto all'originale (0.535s vs 11.817s su un sito abbastanza grande). Non casualmente, hai 22 stringhe di ricerca.

PS: non dimenticare di \ your $ inside of ", o non troverai le stringhe di ricerca 15 e 19. Creerei un file di test che contiene tutte le stringhe che stai cercando e verifica che i "valori $" di fgrep corrispondano correttamente a ciascuna di esse.

+1

Le mie conclusioni sono molto simili alle tue! l'ho pubblicato dopo una pulizia di successo, anche la watchguard non li ha rimossi. kinda fun :) – SinisterGlitch

+1

In realtà, la tua risposta è migliore, dato che eviti di dover \ "s e $ s :) – webb