1. 内存分析
6.1虚拟机的密码是_。(密码中为flag{xxxx},含有空格,提交时不要去掉)
6.2虚拟机中有一个某品牌手机的备份文件,文件里的图片里的字符串为_。(解题过程中需要用到上一题答案中flag{}内的内容进行处理。本题的格式也是flag{xxx},含有空格,提交时不要去掉)
tips也是不要去空格
用volatility_2.6_win64_standalone.exe分析Target.vmem,先看系统版本
volatility_2.6_win64_standalone.exe -f Target.vmem imageinfo
第一个就是,用pslist尝试是否正确
volatility_2.6_win64_standalone.exe -f Target.vmem --profile=Win7SP1x64 pslist
第一题问虚拟机密码,所以直接dumphash就行了。
volatility_2.6_win64_standalone.exe -f Target.vmem --profile=Win7SP1x64 lsadump
flag{W31C0M3 T0 THiS 34SY F0R3NSiCX}
列出虚拟机文件
volatility_2.6_win64_standalone.exe -f Target.vmem --profile=Win7SP1x64 filescan
用国产手机名做关键词搜索,可以发现一个exe,dump下来
volatility_2.6_win64_standalone.exe -f Target.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007d8c7d10 -n --dump-dir=./
大点的文件改后缀为exe双击即可解压
发现images0.tar.enc,为华为手机的加密文件,网上找到个解密项目,密码是之前的flag,空格替换为下划线。
https://github.com/RealityNet/kobackupdec
python3 kobackupdec.py -vvv W31C0M3_T0_THiS_34SY_F0R3NSiCX "D:\Downloads\CTF\陇剑杯\HUAWEI P40_2021-aa-bb xx.yy.zz" D:\qqq
注意backup_path要指定info.xml存在的目录,且dest_path目录也就是qqq不能已存在。
2. wifi
9.1小王往upload-labs上传木马后进行了cat /flag,flag内容为_。(压缩包里有解压密码的提示,需要额外添加花括号)
先看服务器.pcapng
可以发现只有发出去的包,且为哥斯拉php_eval_xor_base64流量
哥斯拉php_eval_xor_base64流量是3.0才更新的php连接方式,其目的是为了支持普通的一句话eval($_POST[1])。不过其本质就是利用pass参数传了一个php_xor_base64哥斯拉马罢了,所以流量特征和php_xor_base64类似。
https://www.freebuf.com/sectool/285693.html
这篇文章很好的分析了哥斯拉的特征和解密方法。
这里由于只有Request,我们的目的是获取cat /flag的内容,肯定在返回包里,所以解密Request没意义,只要记下密码pass,密钥key均为哥斯拉默认的即可。
再看客户端.cap
发现是wifi的流量,可以看到wifi名叫My_Wifi
最后分析Windows 7-dde00fa9.vmem,还是找文件
volatility_2.6_win64_standalone.exe -f "Windows 7-dde00fa9.vmem" imageinfo
volatility_2.6_win64_standalone.exe -f "Windows 7-dde00fa9.vmem" --profile=Win7SP1x86_23418 pslist
volatility_2.6_win64_standalone.exe -f "Windows 7-dde00fa9.vmem" --profile=Win7SP1x86_23418 filescan
报错了,查了下是pyinstaller的问题,用linux版即可。
使用My_Wifi关键词找到关键文件,dump下来。
./volatility_2.6_lin64_standalone -f Windows\ 7-dde00fa9.vmem --profile=Win7SP1x86_23418 filescan | grep My_Wifi
./volatility_2.6_lin64_standalone -f Windows\ 7-dde00fa9.vmem --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000003fdc38c8 -n --dump-dir=./
提示解压密码是GUID
网上搜一下,本机getmac /V /S 127.0.0.1可以看到自己的wifi GUID
这种com格式字符串很有可能在windows文件系统或者注册表中,在自己电脑上搜一下。
那么用Interfaces关键字去定位。
./volatility_2.6_lin64_standalone -f Windows\ 7-dde00fa9.vmem --profile=Win7SP1x86_23418 filescan | grep Interfaces
获取GUID——{529B7D2A-05D1-4F21-A001-8F4FF817FC3A}
用GUID解压My_Wifi.zip获取wifi密码233@114514_qwe
很显然,这个密码是用来解密WiFi流量客户端.cap的
先查看ESSID
aircrack-ng 1.cap
然后解密得到1-dec.cap
airdecap-ng 1.cap -e My_Wifi -p 233@114514_qwe
这样就可以看到wifi的解密流量,里面重要的是http返回包。
前后各16位的md5,中间夹着base64异或流量,典型的哥斯拉特征,和之前的服务器发起包对应起来了。
根据前面的文章分析,就是base64解码并和key的md5前16位异或即可,但文章前面也提了,哥斯拉会判断对方服务器是否支持gzip,支持之后后续的操作都会gzip压缩一次。
我们查看服务器流量的前几次发包。
然后查看wifi流量的返回包
可以看到,在前几次发包之后,base64编码部分都变成fL1tMG打头了,这部分就是需要多一个gzip解压的部分,实战中在这里踩了很大的坑,虽然最终用取巧的办法还是做出来了。取巧的办法后面说。
抄哥斯拉的java代码,写出解密程序。
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Base64;
import java.util.zip.GZIPInputStream;
public class Test{
private static byte[] key = "3c6e0b8a9c15224a".getBytes();
public static void main(String[] args) throws Exception {
byte[] bs = decode("DlMRWA1cL1gOVDc2MjRhRwZFEQ==");
//System.out.println(new String(uncompress(bs)));
System.out.println(new String(bs));
}
public static byte[] decode(String data) {
if (data != null && data.length() > 0) {
return D(data);
} else {
return data.getBytes();
}
}
public static byte[] D(String data) {
byte[] cs = Base64.getDecoder().decode(data);
int len = cs.length;
for(int i = 0; i < len; ++i) {
cs[i] ^= key[i + 1 & 15];
}
return cs;
}
public static String findStr(byte[] respResult) {
String htmlString = new String(respResult);
return htmlString;
}
public static byte[] uncompress(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
GZIPInputStream ungzip = new GZIPInputStream(in);
byte[] buffer = new byte[256];
int n;
while ((n = ungzip.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
} catch (Exception e) {
e.printStackTrace();
}
return out.toByteArray();
}
}
Wifi流量最后一个黑色的返回包,即被waf拦截掉的包就是flag内容。
那么有什么取巧的办法呢?很简单,我们只需要自己弄一个同版本,同密码密钥的哥斯拉,走burp代理,执行命令时拦包改返回包即可。
可以看到我执行了whoami,返回了flag。