陇剑杯 2021 wifi-Writeup

本篇将分享 [陇剑杯 2021] “wifi” 题目的解题思路。

题目提供了三个文件:客户端流量包、服务端流量包和一个内存镜像。

1. 分析服务器流量,锁定哥斯拉 Webshell

首先,我用 Wireshark 打开了服务端流量包,很快就注意到一个可疑的文件上传数据包。

发现可疑文件上传包

为了看清里面到底是什么,我追踪了它的 HTTP 流。

追踪 HTTP 会话数据

在会话数据中,我发现了一段经过层层编码的 Payload。这种 eval(base64_decode(strrev(urldecode(...)))) 的结构是典型的哥斯拉 Webshell(Godzilla)的通信特征。

发现加密 Payload

通过解码,我确认了这是一个哥斯拉 php_eval_xor_base64 变种的 Webshell。

解码后的 Webshell 源码

2. 内存取证,提取 WiFi 凭据

既然有 Webshell,那么客户端和服务器之间必定有通信。我打开客户端流量包,发现流量被 WPA2 加密了。要解密,就必须找到 WiFi 的 SSID 和密码。从流量包中,我可以轻松看到 SSID 是 “My_Wifi”。

发现 WiFi SSID

密码去哪找呢?这时候,内存镜像文件就派上用场了。我使用 Volatility 3 来分析这个 Windows 7 的内存镜像。首先,获取系统基本信息。

1
python vol.py -f "Windows 7-dde00fa9.vmem" windows.info

获取系统信息

接着,我用 filescan 插件在内存中搜索与 “My_Wifi” 相关的文件。

1
2
$env:PYTHONIOENCODING = "utf-8"
python vol.py -f "Windows 7-dde00fa9.vmem" windows.filescan | Select-String "My_Wifi"

搜索 WiFi 相关文件

运气不错,找到了一个 My_Wifi.zip 文件。我立刻使用 dumpfiles 将它从内存中提取出来。

1
2
python vol.py -f "Windows 7-dde00fa9.vmem" windows.dumpfiles --physaddr 0x3fdc38c8
Rename-Item "file.0x3fdc38c8.dmp" "My_Wifi.zip"

然而,解压时发现 ZIP 文件有密码,注释提示密码是 Network Adapter GUID

ZIP 文件密码提示

于是,我回到 Volatility,继续在内存中搜索网络接口信息,以找到这个 GUID。

1
2
python vol.py -f "Windows 7-dde00fa9.vmem" windows.filescan | Out-File -FilePath filescan.txt -Encoding utf8
Select-String -Path filescan.txt "Interfaces" > interfaces_files.txt

获取网络适配器 GUID

成功找到了 GUID:{529B7D2A-05D1-4F21-A001-8F4FF817FC3A}。用这个 GUID 作为密码,我成功解压了 ZIP 文件,得到了 无线网络连接-My_Wifi.xml

打开这个 XML 文件,WiFi 密码赫然在列。

获取 WiFi 密码

WiFi 密码是:233@114514_qwe

3. 解密流量,最终夺旗

拿到了密码,解密客户端流量就轻而易举了。我在 Wireshark 中配置好 WPA2 解密密钥(SSID: My_Wifi, 密码: 233@114514_qwe)。

配置 Wireshark 解密

解密后,过滤 HTTP 流量,我看到了四个来自哥斯拉 Webshell 的响应包。

发现 Webshell 响应包

追踪其中一个 HTTP 流,提取出加密的响应数据。

提取加密响应数据

最后,使用哥斯拉的解密脚本,对这段数据进行解密,就能得到最终的 Flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function encode($D, $K) {
for($i = 0; $i < strlen($D); $i++) {
$c = $K[$i + 1 & 15];
$D[$i] = $D[$i] ^ $c;
}
return $D;
}

$key = '3c6e0b8a9c15224a';
$key1 = "72a9c691ccdaab98fL1tMGI4YTljMn75e3jOBS5/V31Qd1NxKQMCe3h4KwFQfVAEVworCi0FfgB+BlWZhjRlQuTIIB5jMTU=b4c4e1f6ddd2a488";
$str = substr($key1, 16, -16); // 去除前后各16位字符
$str = gzdecode(encode(base64_decode($str), $key));
echo $str;
?>

运行脚本,成功输出 Flag:flag{5db5b7b0bb74babb66e1522f3a6b1b12}

总结

这个题目综合考察了流量分析和内存取证技术,从发现 Webshell 到解密 WiFi 流量,再到最后从 C2 响应中解出 Flag,环环相扣,是一道质量很高的 CTF 赛题。