2014-04-07 6 views
7

Obsługujemy 1000 domen na wielu serwerach. Mamy problemy z ogromną ilością złośliwego oprogramowania i phpshell. Używanie wielu skanerów nie miało wpływu na ich zdejmowanie. może uzyskaliśmy 10/20 niejasnych wyników z tych skanerów:grep cały serwer dla hacków powłoki/złośliwego oprogramowania

więc tworzę własny plik basha, aby znaleźć te skrypty. Znaleźliśmy 148 phpshellów w ten weekend (nie jestem zbyt dobry w tworzeniu plików .SH).



Moje pytanie grep jest straszna powolne, to będzie działać przez kilka dni. Jak mogę uczynić ten skrypt bardziej wydajnym?

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 



wynik końcowy

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

Jedną z lepszych funkcji może być wykonanie pełnego skanowania raz i później, śledzenie zmienionych plików i skanowanie tylko tych plików. – PeeHaa

+0

tak, też tego chcę. tylko potrzebuję skryptu do końca. teraz wynosi 50%, a proces utknął. znalazłem także shellhacks, które używają polecenia php "touch" do zmiany pola "data modyfikacji" pliku. – SinisterGlitch

+1

Możesz ograniczyć swój skrypt, aby wyszukiwał tylko pliki tekstowe, więc pominie zdjęcia. – DanFromGermany

Odpowiedz

7

magazynu Twój s Szukanie ciągi jako pojedynczy ciąg wielowierszowego i uruchomić fgrep raz zamiast w pętli:

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

Ta wersja działa 22x szybciej niż oryginał (0.535s vs 11.817s na jednym dość dużym miejscu). Nieprzypadkowo masz 22 ciągi wyszukiwania.

PS: Nie zapomnij \ "$ $ wewnątrz" ", lub nie znajdziesz swoich 15 i 19 ciągów wyszukiwania. Utworzyłem plik testowy, który ma wszystkie szukane ciągi i sprawdza, czy fgrep "wartości $" pomyślnie pasuje do każdego z nich.

+1

Moje wyniki końcowe wyglądają jak twoje! zamieściłem go po udanym sprzątaniu, nawet strażnik nie usunął ich. kinda fun :) – SinisterGlitch

+1

Właściwie twoja odpowiedź jest lepsza, ponieważ unikasz konieczności \ "s i $ s :) – webb