mirror of
https://github.com/scr34m/php-malware-scanner.git
synced 2026-06-16 12:30:35 +00:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
201ab77516 | ||
|
|
46024eca5e | ||
|
|
a31cc18dc5 | ||
|
|
96806c69e9 | ||
|
|
42c2aad685 | ||
|
|
cad03dc3b4 | ||
|
|
c542a745e4 | ||
|
|
7ac65c0c8d | ||
|
|
5061e319e3 | ||
|
|
b2b2c4b081 | ||
|
|
26458d20af | ||
|
|
70edc4210d | ||
|
|
aec0f56af5 | ||
|
|
2e8b9c604f | ||
|
|
802ead97cc | ||
|
|
4666a101f9 | ||
|
|
e4755feeef |
15
Dockerfile
Normal file
15
Dockerfile
Normal file
@@ -0,0 +1,15 @@
|
||||
FROM php:8.2-cli
|
||||
|
||||
# Install dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
unzip \
|
||||
libzip-dev \
|
||||
&& docker-php-ext-install zip
|
||||
|
||||
WORKDIR /scanner
|
||||
COPY . .
|
||||
RUN chmod +x scan
|
||||
|
||||
ENTRYPOINT ["./scan"]
|
||||
CMD ["/code"]
|
||||
36
README.md
36
README.md
@@ -34,7 +34,7 @@ Usage: php scan.php -d <directory>
|
||||
-t --time Show time of last file change
|
||||
-L --line-number Display matching pattern line number in file
|
||||
-o --output-format Custom defined output format
|
||||
-j --wordpress-version Version of wordpress to get md5 signatures
|
||||
-j <version> --wordpress-version Version of wordpress to get md5 signatures
|
||||
--combined-whitelist Combined whitelist
|
||||
--custom-whitelist Loads whitelist from specified file and merge with existing
|
||||
--disable-stats Disable statistics output
|
||||
@@ -146,3 +146,37 @@ Licensing
|
||||
---------
|
||||
|
||||
PHP malware scanner is [licensed](https://github.com/scr34m/php-malware-scanner/blob/master/LICENSE.txt) under the GNU General Public License v3.
|
||||
|
||||
Docker Usage
|
||||
-----------
|
||||
|
||||
You can also run the scanner using Docker:
|
||||
|
||||
1. Build the image:
|
||||
```bash
|
||||
docker build -t php-malware-scanner .
|
||||
```
|
||||
|
||||
2. Scan a directory:
|
||||
```bash
|
||||
docker run -v /path/to/scan:/code php-malware-scanner -d /code
|
||||
```
|
||||
|
||||
For example, to scan a WordPress installation:
|
||||
```bash
|
||||
docker run -v /var/www/html:/code php-malware-scanner -d /code -j 6.4.1
|
||||
```
|
||||
|
||||
Common usage with flags:
|
||||
```bash
|
||||
# Show only infected files (hide OK status)
|
||||
docker run -v /path/to/scan:/code php-malware-scanner -d /code -k
|
||||
|
||||
# Show comments for matched patterns
|
||||
docker run -v /path/to/scan:/code php-malware-scanner -d /code -c
|
||||
|
||||
# Show MD5 hashes and continue after first match
|
||||
docker run -v /path/to/scan:/code php-malware-scanner -d /code -m -s
|
||||
```
|
||||
|
||||
The `/code` directory inside the container is where your files will be mounted for scanning.
|
||||
|
||||
@@ -22,11 +22,16 @@ SHELL_PASSWORD
|
||||
ConnectBackShell
|
||||
ShellBOT
|
||||
== "bindshell"
|
||||
".\x00..\x20"
|
||||
FM_SESSION_ID
|
||||
HACKED BY
|
||||
|
||||
#Remote Code
|
||||
curl_get_from_webpage
|
||||
file_get_contents('http://codepad.org
|
||||
|
||||
#mailers
|
||||
leafmailer.pw
|
||||
|
||||
#Base64 String Samples. Each plain text string should have 3 base64 equivalents
|
||||
|
||||
@@ -181,6 +186,7 @@ kZWZpbm
|
||||
# Obfuscation related code
|
||||
eval("?>
|
||||
eval('?>
|
||||
@eval(
|
||||
"base64_decode"
|
||||
='base'.(32*2).'_de'.'code'
|
||||
"p"."r"."e"."g"."_"
|
||||
@@ -205,6 +211,13 @@ http://www.fopo.com.ar/
|
||||
@eval("\
|
||||
";eval(
|
||||
eval(eval(
|
||||
@eval(`
|
||||
convert_uudecode(convert_uuencode
|
||||
"64_decode"
|
||||
'f' . 'il' . 'e' . '_'
|
||||
'co' . 'nt' . 'e' . 'nt'
|
||||
'h' . 'tm' . 'l' . 'sp'
|
||||
'ha' . 'r' . 's'
|
||||
|
||||
#Malware/Attack specific strings/fingerprints/signatures
|
||||
MagelangCyber
|
||||
@@ -262,6 +275,13 @@ FaisaL Ahmed aka rEd X
|
||||
smisbot
|
||||
smotherbot
|
||||
Indonesian Hacker Rulez
|
||||
pwetan.com
|
||||
iNHUMaN
|
||||
Heartzz
|
||||
Bye Bye Litespeed
|
||||
BunnyInvisible
|
||||
SEMOGABERKAH
|
||||
BUTERFLYCOUNTRY
|
||||
|
||||
# WP-VCD Malware https://www.getastra.com/blog/911/how-to-fix-wp-vcd-backdoor-hack-in-wordpress-functions-php/
|
||||
wp-vcd
|
||||
@@ -359,6 +379,7 @@ php_uname()
|
||||
str_split(rawurldecode(str_rot13(
|
||||
# generating PHP file name to put content
|
||||
substr(md5(time()), 0, 8) . ".php"
|
||||
'a:1:{s:13:\"administrator\";b:1;}'
|
||||
|
||||
# webshell
|
||||
0byt3m1n1
|
||||
@@ -395,6 +416,7 @@ Array("1207", "3gso", "4thp", "501i", "502i", "503i", "504i", "505i", "506i",
|
||||
|
||||
# eval url decoded string
|
||||
eval(rawurldecode('
|
||||
eval(htmlspecialchars_decode(
|
||||
|
||||
# simple obfuscated function
|
||||
'gz'.'unc'.'ompress'
|
||||
@@ -404,3 +426,30 @@ eval(rawurldecode('
|
||||
'base', '64_dec', 'ode'
|
||||
'cook', 'set', 'ie'
|
||||
'repl', 'str_', 'ace'
|
||||
"base"."64_"
|
||||
'base'.'64_'
|
||||
"t"."m"."p"."_"."n"."a"."m"."e"
|
||||
"f"."i"."l"."e"."_"."p"."u"."t"
|
||||
"f"."i"."l"."e"."_"."g"."e"."t"
|
||||
'ode', 'e64_', 'bas', 'dec'
|
||||
'unct', 'ion', 'te_f', 'crea'
|
||||
'te', 'g', 'nf', 'l', 'a', 'zi'
|
||||
'tion', 'e_func', 'creat'
|
||||
'64_d', 'se', 'eco', 'de', 'ba'
|
||||
'co', 'ki', 'e', 'o', 'set'
|
||||
'str', '_rep', 'lace'
|
||||
|
||||
# process data from request object directly
|
||||
extract($_REQUEST) && @$
|
||||
extract($_REQUEST)&&@$
|
||||
xtract($_REQUEST)&&@$
|
||||
|
||||
# uncompress cafted content
|
||||
gzuncompress(strrev(substr(
|
||||
|
||||
# disable error reporting
|
||||
<?php error_reporting(0);?>
|
||||
|
||||
# infected file include attached on the top of a legit file
|
||||
<?php if (file_exists(dirname(__FILE__) . '/class.theme-modules.php')) include_once(dirname(__FILE__) . '/class.theme-modules.php'); ?>
|
||||
<?php if (file_exists(dirname(__FILE__) . '/class.plugin-modules.php')) include_once(dirname(__FILE__) . '/class.plugin-modules.php'); ?>
|
||||
|
||||
@@ -79,7 +79,7 @@ chr\s*\(\s*['"]?\s*((95)|(0[Xx]5[Ff]))\s*['"]?\s*\)
|
||||
#Escaped path characters: \x2fho\x6de/\x69mp\x75ls\x69oq\x65/w\x77w. or \x2fhome\x2fimpu\x6csioq\x65/www\x2emusc
|
||||
(\\x[0-9abcdef]{2}[a-z0-9.-\/]{1,4}){4,}
|
||||
|
||||
#Malware inffected files sometimes marked with comments like /*87cda*/ to avoid infect again
|
||||
#Malware infected files sometimes marked with comments like /*87cda*/ to avoid infect again
|
||||
\/\*[a-z0-9]{5}\*\/
|
||||
|
||||
# XOR-ed strings with custom math
|
||||
@@ -141,10 +141,22 @@ explode\('\|\x01\|\x03\|\x03', gzinflate\(
|
||||
\$[a-z]11 \^ [a-z]8\(\$[a-z]6, \$[a-z]14, \$[a-z]6\[13\]\(\$[a-z]11\)\)\)\);
|
||||
|
||||
# eval function return and concat
|
||||
eval\([A-Za-z]{5,}\(\) \. '
|
||||
eval\([A-Za-z0-9]{5,}\(\) \. '
|
||||
|
||||
# eval function return, parameter is a hex string
|
||||
eval\([A-Za-z0-9]{5,}\(\"[A-Z0-9]{16,}
|
||||
|
||||
# gzip payload called by variable named function
|
||||
\$[a-zA-Z0-9]{6,}\('\x78\x9C\xAD\x90\x41\x0E
|
||||
|
||||
# obfuscated code return with error suppression
|
||||
return @\$[a-z]{2}\d+\[\d+\]\(\$[a-z]{2}\d+\[\d+\],
|
||||
|
||||
# htaccess alternating
|
||||
[a-z]{1}\([a-z]{1}\(\$[a-z]{2}\.'\/\.htaccess'\)
|
||||
|
||||
# Javascript specific rules
|
||||
|
||||
# JS - escaped command
|
||||
\.fromCharCode\([0-9,]{4,}\)
|
||||
\+-parseInt\(\w\('0x[0-9a-z]+'\)\)\/
|
||||
9
scan.php
9
scan.php
@@ -231,7 +231,7 @@ class MalwareScanner
|
||||
private function parseArgs()
|
||||
{
|
||||
$options = getopt(
|
||||
'd:e:i:o:abmcxlhkwnsptLj:E',
|
||||
'd:e:i:o:abmcxlhkrwnsptLj:E',
|
||||
array(
|
||||
'directory:',
|
||||
'extension:',
|
||||
@@ -244,6 +244,7 @@ class MalwareScanner
|
||||
'follow-link',
|
||||
'help',
|
||||
'hide-ok',
|
||||
'hide-err',
|
||||
'hide-whitelist',
|
||||
'no-color',
|
||||
'no-stop',
|
||||
@@ -622,8 +623,8 @@ class MalwareScanner
|
||||
private function report($start, $dir)
|
||||
{
|
||||
$end = time();
|
||||
echo 'Start time: ' . strftime('%Y-%m-%d %H:%M:%S', $start) . PHP_EOL;
|
||||
echo 'End time: ' . strftime('%Y-%m-%d %H:%M:%S', $end) . PHP_EOL;
|
||||
echo 'Start time: ' . date('Y-m-d H:m:s', $start) . PHP_EOL;
|
||||
echo 'End time: ' . date('Y-m-d H:m:s', $end) . PHP_EOL;
|
||||
echo 'Total execution time: ' . ($end - $start) . PHP_EOL;
|
||||
echo 'Base directory: ' . $dir . PHP_EOL;
|
||||
echo 'Total directories scanned: ' . $this->stat['directories'] . PHP_EOL;
|
||||
@@ -859,7 +860,7 @@ class MalwareScanner
|
||||
echo ' -t --time Show time of last file change' . PHP_EOL;
|
||||
echo ' -L --line-number Display matching pattern line number in file' . PHP_EOL;
|
||||
echo ' -o --output-format Custom defined output format' . PHP_EOL;
|
||||
echo ' -j --wordpress-version Version of wordpress to get md5 signatures' . PHP_EOL;
|
||||
echo ' -j <version> --wordpress-version Version of wordpress to get md5 signatures' . PHP_EOL;
|
||||
echo ' --combined-whitelist Combined whitelist' . PHP_EOL;
|
||||
echo ' --disable-stats Disable statistics output' . PHP_EOL;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user