diff --git a/scan.py b/scan.py index ee9d71b..fd8c35a 100644 --- a/scan.py +++ b/scan.py @@ -7,15 +7,14 @@ # To Do: # - Organize # - Translate -# - Add more patterns -# +# - Add more patterns - work in progress +# - remove false positives - work in progress import os import re import fnmatch whitelist = [ - '/lp-msh-scanner/', '/lp-msh-scanner/', '/._', 'cache/object/000000/', @@ -190,39 +189,39 @@ whitelist = [ debug = True line_early = 15 scoring = { - 'WHITELISTED': (-10, u'fichier en whitelist manuelle'), - 'WHITELISTED_LINE': (-10, u'ligne en whitelist manuelle'), - 'PHP_COMMENTS': (-10, u'Fichier commence proprement avec une description'), - 'CLASS_FUNCTION': (-10, u'Fonction ou classe définie au tout début'), - 'BASE64_STRING': (50, u'Motif base64 trouvé'), - 'CRYPT_PHP': (50, u'Script CryptPHP qui inclue social.png'), - 'PHP_SHELL': (50, u'Script Shell'), - 'PHP_OBFUSC_SHELL': (50, u'Script Shell caché'), - 'ACCESS_DENIED': (-30, u'Execution bloquée en tout début de fichier'), - 'JAVASCRIPT_HACK': (50, u'Hack javascript'), - 'HAS_EVAL': (2, u'Contient eval()'), - 'HAS_EVAL_EARLY': (10, u'Contient eval() en début de fichier'), - 'HAS_CALL_FUNC_EARLY': (3, u'Contient call_user_func() en début de fichier'), - 'HAS_BASE64DECODE': (2, u'Contient base64_decode() ou str_rot13()'), - 'HAS_BASE64DECODE_EARLY': (10, u'Contient base64_decode() ou str_rot13() en début de fichier'), - 'HAS_MAIL': (1, u'Contient mail()'), - 'HAS_MAIL_EARLY': (2, u'Contient mail() en début de fichier'), - 'LONG_LINE': (5, u'Contient une ligne de plus de 1000 caractères'), - 'LONG_LINE_EARLY': (8, u'Contient une ligne de plus de 1000 caractères début de fichier'), - 'VERY_LONG_LINE': (5, u'Contient une ligne de plus de 3000 caractères'), - 'VERY_LONG_LINE_EARLY': (9, u'Contient une ligne de plus de 3000 caractères en début de fichier'), - 'MD5_VAR': (10, u'Contient une variable encodée en MD5'), - 'INCLUDE_REQUIRE': (-2, u'Contient include() ou require() sans http'), - 'COOKIE_FORM1': (20, u'Contient form1=@$_COOKIE'), - 'MAIL_X_HEADER': (5, u'Contient mail.add_x_header'), - 'SET_TIME_0': (5, u'Contient set_time_limit(0)'), - 'SET_ERRORREPORTING_0': (2, u'Contient error_reporting(0)'), - 'SET_TIMELIMIT_0': (2, u'Contient memory_limit(0)'), - 'SET_IGNOREUSERABORT_0': (2, u'Contient ignore_user_abort()'), - 'UPLOAD_FILE': (2, u'Contient move_uploaded_file()'), - 'FEW_LINES': (0, u'Contient peu de lignes'), + 'WHITELISTED': (-10, u'Manually whitelisted file'), + 'WHITELISTED_LINE': (-10, u'Manually whitelisted line'), + 'PHP_COMMENTS': (-10, u'File starts with a proper description'), + 'CLASS_FUNCTION': (-10, u'Class function defined early'), + 'BASE64_STRING': (50, u'base64 string found'), + 'CRYPT_PHP': (50, u'CryptoPHP inclusion for social.png'), + 'PHP_SHELL': (50, u'Shell Script'), + 'PHP_OBFUSC_SHELL': (50, u'Obfuscated Shell Script'), + 'ACCESS_DENIED': (-30, u'Early block execution'), + 'JAVASCRIPT_HACK': (50, u'Javascript'), + 'HAS_EVAL': (2, u'Has eval()'), + 'HAS_EVAL_EARLY': (10, u'Has eval() early'), + 'HAS_CALL_FUNC_EARLY': (3, u'Has call_user_func() early'), + 'HAS_BASE64DECODE': (2, u'Has base64_decode() or str_rot13()'), + 'HAS_BASE64DECODE_EARLY': (10, u'Has base64_decode() or str_rot13() early'), + 'HAS_MAIL': (1, u'Has mail()'), + 'HAS_MAIL_EARLY': (2, u'Has mail() early'), + 'LONG_LINE': (5, u'Has a line of more than 1000 characters'), + 'LONG_LINE_EARLY': (8, u'Has a line of more than 1000 characters early'), + 'VERY_LONG_LINE': (5, u'Has a line of more than 3000 characters'), + 'VERY_LONG_LINE_EARLY': (9, u'Has a line of more than 3000 characters early'), + 'MD5_VAR': (10, u'Has une variable encodée en MD5'), + 'INCLUDE_REQUIRE': (-2, u'Has include() ou require() sans http'), + 'COOKIE_FORM1': (20, u'Has form1=@$_COOKIE'), + 'MAIL_X_HEADER': (5, u'Has mail.add_x_header'), + 'SET_TIME_0': (5, u'Has set_time_limit(0)'), + 'SET_ERRORREPORTING_0': (2, u'Has error_reporting(0)'), + 'SET_TIMELIMIT_0': (2, u'Has memory_limit(0)'), + 'SET_IGNOREUSERABORT_0': (2, u'Has ignore_user_abort()'), + 'UPLOAD_FILE': (2, u'Has move_uploaded_file()'), + 'FEW_LINES': (0, u'Has peu de lignes'), 'EMPTY_FILE': (-100, u'Fichier vide'), - 'MANY_LINES': (-2, u'Contient beaucoup de lignes'), + 'MANY_LINES': (-2, u'Has beaucoup de lignes'), 'MANY_LINES2': (-5, u'Gros fichier avec de lignes'), 'MANY_LINES3': (-10, u'Très gros fichier avec de lignes'), 'BAD_NEWLINES': (-5, u'Ficher sur 1 ligne sans saut de ligne'), @@ -230,8 +229,8 @@ scoring = { 'UA_GOOGLE': (5, u'Vérifie le User-Agent contre Google'), 'EXEC_SHELL': (5, u'Utilise system() ou shell_exec()'), 'CONCAT_STRING': (10, u'Chaine cachée par concaténation'), - 'MANY_GLOBALS': (20, u'Contient très souvent $GLOBALS'), - 'BIN_HOST': (10, u'contient /bin/host'), + 'MANY_GLOBALS': (20, u'Has très souvent $GLOBALS'), + 'BIN_HOST': (10, u'Has /bin/host'), 'SHELL_COMPACT': (5, u'2eme ligne louche (shell?)'), 'CURL_HTTP': (5, u'téléchargement HTTP'), 'XXTEA_ENCRYPT': (20, u'Code source encode avec XXTEA (possible ransomware)'),