2024HECTFmisc

恶势力的聊天记录

vol3参考文档

Volatility 3 — Volatility 3 2.11.0 documentation

vol3使用参考

Volatility3内存取证工具使用详解-CSDN博客

vol2命令格式: volatility -f [image] --profile=[profile] [plugin]

这里需要注意 :Volatility3和Volatility2用法差不多,但不需要指定profile ,只是插件调用方式改变,特定的操作系统有特定的插件
python3 vol.py [plugin] -f [image]
 
常用插件:
    layerwriter:列出内存镜像platform信息
    linux.bash:从内存中恢复bash命令历史记录
    linux.check_afinfo:验证网络协议的操作功能指针
    linux.check_syscall:检查系统调用表中的挂钩
    linux.elfs:列出所有进程的所有内存映射ELF文件
    linux.lsmod:列出加载的内核模块
    linux.lsof:列出所有进程的所有内存映射
    linux.malfind:列出可能包含注入代码的进程内存范围
    linux.proc:列出所有进程的所有内存映射
    linux.pslist:列出linux内存映像中存在的进程
    linux.pstree:列出进程树
    mac.bash:从内存中恢复bash命令历史记录
    mac.check_syscall:检查系统调用表中的挂钩
    mac.check_sysctl:检查sysctl处理程序的挂钩
    mac.check_trap_table:检查trap表中的挂钩
    mac.ifconfig:列出网卡信息
    mac.lsmod:列出加载的内核模块
    mac.lsof:列出所有进程的所有内存映射
    mac.malfind:列出可能包含注入代码的进程内存范围
    mac.netstat:列出所有进程的所有网络连接
    mac.psaux:恢复程序命令行参数
    mac.pslist:列出linux内存映像中存在的进程
    mac.pstree:列出进程树
    mac.tasks:列出Mac内存映像中存在的进程
    windows.info:显示正在分析的内存样本的OS和内核详细信息
    windows.callbacks:列出内核回调和通知例程
    windows.cmdline:列出进程命令行参数
    windows.dlldump:将进程内存范围DLL转储
    windows.dlllist:列出Windows内存映像中已加载的dll模块
    windows.driverirp:在Windows内存映像中列出驱动程序的IRP
    windows.driverscan:扫描Windows内存映像中存在的驱动程序
    windows.filescan:扫描Windows内存映像中存在的文件对象
    windows.handles:列出进程打开的句柄
    windows.malfind:列出可能包含注入代码的进程内存范围
    windows.moddump:转储内核模块
    windows.modscan:扫描Windows内存映像中存在的模块
    windows.mutantscan:扫描Windows内存映像中存在的互斥锁
    windows.pslist:列出Windows内存映像中存在的进程
    windows.psscan:扫描Windows内存映像中存在的进程
    windows.pstree:列出进程树
    windows.procdump:转储处理可执行映像
    windows.registry.certificates:列出注册表中存储的证书
    windows.registry.hivelist:列出内存映像中存在的注册表配置单元
    windows.registry.hivescan:扫描Windows内存映像中存在的注册表配置单元
    windows.registry.printkey:在配置单元或特定键值下列出注册表项
    windows.registry.userassist:打印用户助手注册表项和信息
    windows.ssdt:列出系统调用表
    windows.strings:读取字符串命令的输出,并指示每个字符串属于哪个进程
    windows.svcscan:扫描Windows服务
    windows.symlinkscan:扫描Windows内存映像中存在的链接
──(root㉿kali)-[/home/messi/Desktop/vol3]
└─# sudo ln -s /home/messi/Desktop/vol3/vol.py /usr/local/bin/vol3
//添加一个软连接方便使用

列出所有进程

vol3 -f image.vmem windows.pslist.PsList
vol3 -f image.vmem windows.pslist.PsList 每个部分都有特定的含义和功能。我将逐个解释这些部分:

-f image.vmem: -f 参数指定了内存镜像文件的位置。在这个例子中,image.vmem 是你想要分析的 Windows 内存转储文件的路径。VMEM 文件通常是 VMware 虚拟机的内存快照。

windows.pslist.PsList: 这部分指定了要运行的插件。Volatility 的插件结构通常遵循以下格式:<操作系统>.<类别>.<插件名称>。在这里,我们有:
windows: 表示这个插件适用于 Windows 操作系统的内存分析。Volatility 支持多种操作系统(如 Linux 和 macOS),每个操作系统都有自己的一套插件。

pslist: 插件所属的类别,通常表示该插件提供的功能类型。例如,pslist 类别下的插件用于列出进程信息。
PsList: 这是具体要执行的插件名称。PsList 插件用来从内存镜像中提取正在运行的进程列表。它会显示进程 ID (PID)、父进程 ID (PPID)、创建时间和映像路径等信息。

关于 windows. 后面可以跟哪些内容,这取决于你想要进行什么样的分析。以下是几个常见的插件类别及其作用:

pslist: 列出系统中的所有进程。
modules: 显示加载到内存中的模块(DLLs)。
handles: 展示进程句柄,包括文件、注册表键和其他资源。
cmdline: 提取进程的命令行参数。
netscan: 扫描网络连接和端口。
dlllist: 列出每个进程中加载的动态链接库。
privileges: 查看进程所拥有的特权。
malfind: 寻找可能的恶意代码,比如隐藏的或注入的代码。
svcscan: 扫描并显示服务控制管理器数据库中的服务。

--info 参数来获取更多可用插件的信息

vol3 --info | grep windows.

image-20241207210533301

image-20241207210623725

发现后台WeChat进程,使用filescan过滤wxid查找微信文件

vol3 -f image.vmem windows.filescan.FileScan | grep "wxid"

image-20241207211002164

找到微信用户wxid为wxid_ah0tuevc7rbz22

导出微信聊天记录数据库文件

vol3 -f image.vmem windows.filescan.FileScan | grep "wxid_ah0tuevc7rbz22.*Msg.*Multi.*db" > filedb.txt

MSG.db为存储聊天记录的数据库,导出数据库MSG0.db

image-20241207211616832

                                             
┌──(root㉿kali)-[/home/messi/Desktop/vol3]
└─# cat filedb.txt 
0x247c7b90      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\MultiSearchChatMsg.db
0x7da66710      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db
0x7db98970      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db-shm
0x7dc9eac0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db
0x7dcb8b20      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\bak\MSG0_1731071567.bakdb-wal
0x7dcbc7a0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db-shm
0x7dcbcdd0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\bak\MSG0_1731071567.bakdb-shm
0x7dcf18c0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\MultiSearchChatMsg.db-wal
0x7dcf1f20      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db-wal
0x7e0dd8d0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\FTSMSG0.db
0x7f319780      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\MultiSearchChatMsg.db-shm
0x7fa8bbc0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MediaMSG0.db-shm
0x7fa8bf20      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MediaMSG0.db-wal
0x7fb85d40      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\FTSMSG0.db-shm
0x7fca2a10      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MSG0.db-wal
0x7fcb8bc0      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\MediaMSG0.db
0x7fccff20      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\MultiSearchChatMsg.db
0x7fd40360      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\FTSMSG0.db-wal
0x7fdb4d10      \Users\aja\Documents\WeChat Files\wxid_ah0tuevc7rbz22\Msg\Multi\FTSMSG0.db

下载系统中的文件

【volatality 3】使用说明文档_volatility3-CSDN博客

这个插件和2.6中的差异较大, 在3.0的版本中,已经找不到 memdump procdump等插件了

只有一个dumpfiles 我们可以通过-h 来查看下参数 在3.0的版本中一定要指定物理地址进行下载

可以发现,不仅可以通过虚拟地址还可以通过PID、物理地址进行下载文件. 也不再通过-D 指定保存的路径
┌──(root㉿kali)-[/home/messi/Desktop/vol3]
└─# vol3 -f image.vmem windows.dumpfiles.DumpFiles -h                                       
Volatility 3 Framework 2.12.0
usage: vol3 windows.dumpfiles.DumpFiles [-h] [--pid PID] [--virtaddr VIRTADDR] [--physaddr PHYSADDR] [--filter FILTER] [--ignore-case]

Dumps cached file contents from Windows memory samples.

options:
  -h, --help           show this help message and exit
  --pid PID            Process ID to include (all other processes are excluded)
  --virtaddr VIRTADDR  Dump a single _FILE_OBJECT at this virtual address
  --physaddr PHYSADDR  Dump a single _FILE_OBJECT at this physical address
  --filter FILTER      Dump files matching regular expression FILTER
  --ignore-case        Ignore case in filter match

Volatility 3 中,如果你想将转储的文件保存到特定目录,可以直接在命令中指定文件名,而无需使用 -o 参数。以下是更新后的命令:

python3 vol.py -f image.vmem windows.dumpfiles.DumpFiles --virtaddr 0x000000007da66710

输出文件的处理

如果你想将输出文件重定向到某个文件,可以在命令行中使用输出重定向符号(>)来实现。比如:

python3 vol.py -f image.vmem windows.dumpfiles.DumpFiles --virtaddr 0x000000007da66710 > output.txt

dump下MSG.db为存储聊天记录的数据库,导出数据库MSG0.db

┌──(root㉿kali)-[/home/messi/Desktop/vol3]
└─# vol3 -f image.vmem windows.dumpfiles.DumpFiles --virtaddr 0x7da66710

Volatility 3 Framework 2.12.0
WARNING  volatility3.framework.layers.vmware: No metadata file found alongside VMEM file. A VMSS or VMSN file may be required to correctly process a VMEM file. These should be placed in the same directory with the same file name, e.g. image.vmem and image.vmss.
Progress:  100.00               PDB scanning finished                        
Cache   FileObject      FileName        Result
不知道什么原因vol3就是没有转储下来

后续操作就参考其他师傅的wp,用的是vol2

微信数据库是加密的,需要找到密钥才能解密,filescan找到Desktop存在secretkey.zip

0x000000007e1b7660      5      0 RW---- \Device\HarddiskVolume2\Users\aja\Desktop\secretkey.zip

导出解压后,为64个文件,每个文件内容都是一段md5

image-20241212163843115

批量进行MD5破解,拼接在一起即为64位的微信密钥

55e0ab1f18cd42d38e55eeec60f8911a4d22b13f0a154645b6bdc8b41766a58a

使用脚本进行数据库解密

# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import hashlib, hmac, ctypes

SQLITE_FILE_HEADER = bytes("SQLite format 3", encoding='ASCII') + bytes(1)
IV_SIZE = 16
HMAC_SHA1_SIZE = 20
KEY_SIZE = 32
DEFAULT_PAGESIZE = 4096  # 4048数据 + 16IV + 20 HMAC + 12
DEFAULT_ITER = 64000
# yourkey
password = bytes.fromhex("55e0ab1f18cd42d38e55eeec60f8911a4d22b13f0a154645b6bdc8b41766a58a".replace(' ', ''))
with open(r'MSG0.db', 'rb') as f:
    blist = f.read()
print(len(blist))
salt = blist[:16]
key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)

first = blist[16:DEFAULT_PAGESIZE]

# import struct
mac_salt = bytes([x ^ 0x3a for x in salt])
mac_key = hashlib.pbkdf2_hmac('sha1', key, mac_salt, 2, KEY_SIZE)

hash_mac = hmac.new(mac_key, digestmod='sha1')
hash_mac.update(first[:-32])
hash_mac.update(bytes(ctypes.c_int(1)))
# hash_mac.update(struct.pack('=I',1))
if (hash_mac.digest() == first[-32:-12]):
    print('Correct Password')
else:
    raise RuntimeError('Wrong Password')

blist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)]
with open(r'3.db', 'wb') as f:
    f.write(SQLITE_FILE_HEADER)
    t = AES.new(key, AES.MODE_CBC, first[-48:-32])
    f.write(t.decrypt(first[:-48]))
    f.write(first[-48:])
    for i in blist:
        t = AES.new(key, AES.MODE_CBC, i[-48:-32])
        f.write(t.decrypt(i[:-48]))
        f.write(i[-48:])

查看解密后文件

image-20241212164021755

发现一段百度网盘的连接https://pan.baidu.com/s/17Bt-vSpRpBLRuhTWaCgb6g?pwd=mfpt 提取

码: mfpt,百度网盘下载

image-20241212164056738

下载压缩包并解压,为文本文件,是一段很长的hex数据和key

image-20241212164143419

RC4解密

image-20241212164202153

Base64解密结果为图片的MD5,使用网站解码https://tool.jisuapi.com/base642pic.html

image-20241212164230595

HXD打开,文件尾部有PK头,并有hectf_[4number].zip的提示

image-20241212164254622

最后就是根据提示用ARCHPR进行掩码爆破

image-20241212164348667

密码hectf_7865

image-20241212164403755

简单的压缩包

根据正则表达式⽣成字典爆破密码

import itertools
import string

# 定义字符集
lowercase_letters = string.ascii_lowercase  # 小写字母 a-z
digits = string.digits  # 数字 0-9
non_lowercase = ''.join(set(string.printable[:-6]) - set(lowercase_letters))  # 非小写字母
non_digits = ''.join(set(string.printable[:-6]) - set(digits))  # 非数字字符

# 生成符合正则表达式的密码并保存到文件
def generate_password_dict(filename):
    with open(filename, 'w') as f:
        for letter1, letter2 in itertools.product(lowercase_letters, repeat=2):
            for digit in digits:
                for char in non_lowercase:
                    for last_char in non_digits:
                        password = f"{letter1}{letter2}{digit}{char}{last_char}"
                        f.write(password + '\n')
                        # print(f"Generated: {password}")

if __name__ == "__main__":
    output_filename = "generated_passwords.txt"
    # print(f"Generating passwords and saving to {output_filename}...")
    generate_password_dict(output_filename)
    # print("Password generation complete.")

爆破后得到密码:np76_

解压后binwalk直接扫,得到zip.zip

读getzip.py可以得到AES的key和iv之后直接解密即可拿到flag

image-20241212201827355

恶势力的仓库

打开流量包,查看http流量

image-20241212204742807

很明显有login流量,然后追踪tcp流,发现这里有个data传的值为

{“data”:{“username”:“hue=8zZvR2YzlWb”,“password”:“YI6=ECZvd2YzlWb”}}

一看就是被处理过的

image-20241212205304407

login位置,向前找登录的逻辑

image-20241212210012079

有js文件,看了一下居多,没看到什么敏感信息

image-20241212210246022

在刚刚login基础上往下看一个流

image-20241212212027251

image-20241212214310349

找到一些有用的东西

image-20241212212427593

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <link href="bootstrap.min.css" rel="stylesheet">
    <script src="jquery-3.5.1.min.js"></script>
</head>
<body>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-4 mt-5">
                <h3 class="text-center">..................</h3>
                <form id="loginForm">
                    <div class="form-group">
                        <label for="username">Username</label>
                        <input type="text" id="username" class="form-control" required>
                    </div>
                    <div class="form-group">
                        <label for="password">Password</label>
                        <input type="password" id="password" class="form-control" required>
                    </div>
                    <button type="submit" class="btn btn-primary btn-block">Login</button>
                </form>
                <div id="loginStatus" class="mt-3 text-center"></div>
            </div>
        </div>
    </div>

    <script>
	eval(atob('ZnVuY3Rpb24gYmFzZTY0X2VuY29kZShzdHIpe3JldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSl9ZnVuY3Rpb24gYWRkUmFuZG9tQ2hhcnMoc3RyKXtjb25zdCBjaGFycz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiO2xldCByYW5kb21DaGFycz0iIjtmb3IobGV0IGk9MDtpPDM7aSsrKXtyYW5kb21DaGFycys9Y2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjaGFycy5sZW5ndGgpKX1yZXR1cm4gcmFuZG9tQ2hhcnMrc3RyfWZ1bmN0aW9uIHJldmVyc2VTdHJpbmcoc3RyKXtyZXR1cm4gc3RyLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIil9JCgiI2xvZ2luRm9ybSIpLm9uKCJzdWJtaXQiLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTt2YXIgdXNlcm5hbWU9JCgiI3VzZXJuYW1lIikudmFsKCk7dmFyIHBhc3N3b3JkPSQoIiNwYXNzd29yZCIpLnZhbCgpO3ZhciBlbmNvZGVkVXNlcm5hbWU9YWRkUmFuZG9tQ2hhcnMocmV2ZXJzZVN0cmluZyhiYXNlNjRfZW5jb2RlKHVzZXJuYW1lKSkpO3ZhciBlbmNvZGVkUGFzc3dvcmQ9YWRkUmFuZG9tQ2hhcnMocmV2ZXJzZVN0cmluZyhiYXNlNjRfZW5jb2RlKHBhc3N3b3JkKSkpO3ZhciBkYXRhPXtkYXRhOnt1c2VybmFtZTplbmNvZGVkVXNlcm5hbWUscGFzc3dvcmQ6ZW5jb2RlZFBhc3N3b3JkfX07JC5hamF4KHt1cmw6ImxvZ2luLnBocCIsdHlwZToiUE9TVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL2pzb24iLGRhdGFUeXBlOiJqc29uIixkYXRhOkpTT04uc3RyaW5naWZ5KGRhdGEpLHN1Y2Nlc3M6ZnVuY3Rpb24ocmVzcG9uc2Upe2lmKHJlc3BvbnNlLnN1Y2Nlc3Mpe3dpbmRvdy5sb2NhdGlvbi5ocmVmPSJ3YXJlaG91c2UucGhwIn1lbHNleyQoIiNsb2dpblN0YXR1cyIpLmh0bWwoJzxzcGFuIGNsYXNzPSJ0ZXh0LWRhbmdlciI+TG9naW4gZmFpbGVkLCB0cnkgYWdhaW4hPC9zcGFuPicpfX0sZXJyb3I6ZnVuY3Rpb24oKXskKCIjbG9naW5TdGF0dXMiKS5odG1sKCc8c3BhbiBjbGFzcz0idGV4dC1kYW5nZXIiPkVycm9y44CCPC9zcGFuPicpfX0pfSk7'));
    </script>
</body>
</html>
JavaScript 中,atob 函数用于解码使用 Base64 编码的字符串。
function base64_encode(str) {
    return btoa(unescape(encodeURIComponent(str)));
}

function addRandomChars(str) {
    const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    let randomChars = "";
    for (let i = 0; i < 3; i++) {
        randomChars += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return randomChars + str;
}

function reverseString(str) {
    return str.split("").reverse().join("");
}

$("#loginForm").on("submit", function(e) {
    e.preventDefault();

    var username = $("#username").val();
    var password = $("#password").val();

    var encodedUsername = addRandomChars(reverseString(base64_encode(username)));
    var encodedPassword = addRandomChars(reverseString(base64_encode(password)));

    var data = {
        data: {
            username: encodedUsername,
            password: encodedPassword
        }
    };

    $.ajax({
        url: "login.php",
        type: "POST",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(data),
        success: function(response) {
            if (response.success) {
                window.location.href = "warehouse.php";
            } else {
                $("#loginStatus").html('<span class="text-danger">Login failed, try again!</span>');
            }
        },
        error: function() {
            $("#loginStatus").html('<span class="text-danger">Error。</span>');
        }
    });
});

查看eval内base64编码的JavaScript,可看到,密码和用户名都是把

明文base64编码后,倒置了一下,然后在字符串前加了三个随机字符

YI6=ECZvd2YzlWb

可以解出密码为 miscgod! ,这个也是后续压缩包密码

image-20241212215301513

流11上传了一句话木马

image-20241212215515428

流 17 18 19 为 蚁 剑 下 载 文 件 的 流 量 , 下 载 的 文 件 为 机 密 文 件 .7z

nothingnoflag.gif 破防小王.png 三个文件

流16列目录,流17提取出gif图,流18提取出png图,结尾有base64字符串

image-20241212215604827

image-20241212220109426

image-20241212220157592

用之前的密码 miscgod! 解开7z压缩包,然后得到execl,execl中有0和1两种单元

格,都是被隐藏的,将行列设置一样的大小,全选搜索所有1,涂黑后是二维码,扫

码得到flag

ctrl+F 搜索所有的1,然后

image-20241213194752756

image-20241213194922191

image-20241213194958672

选择全部替换

image-20241213195113990

image-20241212220231165