#!/bin/bash # EvoMalware, script to detect infected websites. # You can set aggressive to true to search for suspicions scripts. aggressive=false # Path to search for. wwwpath=/home # URL to download patterns and filenames. databaseURL="http://antispam00.evolix.org/evomalware" databasePATH=/var/lib/evomalware whitelistLocal="${databasePATH}/evomalware.whitelist.local" # Tools. find="ionice -c3 find -O3" grep="nice -n 19 grep" wc="nice -n 19 wc" wget="wget -q -t 3" md5sum="md5sum --status -c" # Various. fileslist=$(mktemp) tmpPATH=/tmp/evomalware.tmp trap "rm -rf $fileslist $tmpPATH" EXIT usage() { cat< $fileslist 2>/dev/null while read file; do # Search known filenames. if [[ "$file" =~ $filenames ]]; then echo "Known malware: $file" # Search .php files in WP's wp-content/uploads/ elif [[ "$file" =~ "wp-content/uploads/" ]]; then echo "PHP file in a non-PHP folder detected: $file" # Count the length of the longest line and search if suspect php functions are used. elif [[ $($wc -L "$file" 2>/dev/null | cut -d' ' -f1) -gt 10000 ]]; then grep -q -E "$suspect" "$file" if [[ $? -eq 0 ]]; then # Don't suspect "one line" .js file due to common minification. if [[ ! "$file" =~ .js$ ]]; then echo "Suspect file! More than 10000 characters in one line (and suspect PHP functions): $file." fi fi else # Search for patterns. $grep -H -E -r -l -q "$patterns" "$file" 2>/dev/null if [[ $? -eq 0 ]]; then echo "Contains a known malware pattern: $file" fi fi done < $fileslist # Search for suspicious scripts... Only when in aggressive mode. if ( $aggressive ); then cd $wwwpath $find . -name javascript.php $find . -name bp.pl $find . -name tn.php $find . -name tn.php3 $find . -name tn.phtml $find . -name tn.txt $find . -name xm.php $find . -name logs.php $find . -type f -name "*.php" -exec sh -c 'cat {} | awk "{ print NF}" | sort -n | tail -1 | tr -d '\\\\n' && echo " : {}"' \; | sort -n | tail -10 $find . -type f -name "*.php" -exec sh -c 'cat {} | awk -Fx "{ print NF}" | sort -n | tail -1 | tr -d '\\\\n' && echo " : {}"' \; | sort -n | tail -10 $grep -r 'ini_set(chr' . $grep -r 'eval(base64_decode($_POST' . $grep -r 'eval(gzinflate(' . $grep -r 'ini_set(.mail.add_x_header' . $grep -r '@require' . $grep -r '@ini_set' . $grep -ri 'error_reporting(0' . $grep -r base64_decode . $grep -r codeeclipse . $grep -r 'eval(' . $grep -r '\x..\x..' . $grep -r 'chr(rand(' . fi