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。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖