2014-04-07 4 views
7

Wir hosten 1000s von Domänen auf mehreren Servern. Wir haben Probleme mit einer großen Menge an Malware und Phpshell. Die Verwendung vieler Scanner hatte keinen Effekt, sie zu unterdrücken. vielleicht haben wir 10/20 vage Ergebnisse von diesen Scannerngrep ganze Server für Shell-Hacks/Malware

, also ich meine eigene kleine Bash-Datei zu diesen Skripten zu finden. Es hat dieses Wochenende 148 phpshells gefunden (ich bin nicht so gut im Erstellen von .SH-Dateien).



Meine Frage Die grep langsam schrecklich ist, wird es für Tage. Wie kann ich dieses Skript effizienter machen?

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 



ENDERGEBNIS

#!/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

Es könnte leistungsfähiger sein, einen vollständigen Scan einmal durchzuführen und danach geänderte Dateien zu verfolgen und nur diese zu scannen. – PeeHaa

+0

Ja, ich will das auch. nur ich brauche das Skript vollständig zu beenden. Jetzt geht es 50% und der Prozess bleibt hängen. Was ich auch gefunden habe, war Shellshacks, die den 'Touch' Befehl verwenden, um das 'Datum geändert' Feld einer Datei zu ändern. – SinisterGlitch

+1

Sie könnten Ihr Skript darauf beschränken, nur in Textdateien zu suchen, damit es Bilder und andere Dinge überspringt. – DanFromGermany

Antwort

7

Speichern Sie Ihre s earch Strings als ein einzelner mehrzeilige Zeichenfolge, und führen Sie fgrep einmal statt in einer Schleife:

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" * 

Diese Version läuft 22x schneller als das Original (0.535s vs 11.817s auf einer ziemlich große Website). Nicht zufällig haben Sie 22 Suchzeichenfolgen.

PS: Vergessen Sie nicht, Ihre $ innerhalb von "", oder Sie finden nicht Ihre 15. und 19. Suchzeichenfolgen. Ich würde eine Testdatei erstellen, die alle Zeichenfolgen enthält, nach denen Sie suchen, und sicherstellen, dass die fgrep "$ values" erfolgreich mit jedem von ihnen übereinstimmt.

+1

Meine Endergebnisse sehen sehr ähnlich wie deins aus! Ich habe es nach erfolgreicher Reinigung gepostet, sogar Watchguard hat sie nicht entfernt. ein bisschen Spaß :) – SinisterGlitch

+1

Eigentlich ist Ihre Antwort eine bessere, da Sie vermeiden, zu \ "s und $ s :) – webb