2024HECTFmisc
2024HECTFmisc
恶势力的聊天记录
vol3参考文档
Volatility 3 — Volatility 3 2.11.0 documentation
vol3使用参考
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.
发现后台WeChat进程,使用filescan过滤wxid查找微信文件
vol3 -f image.vmem windows.filescan.FileScan | grep "wxid"
找到微信用户wxid为wxid_ah0tuevc7rbz22
导出微信聊天记录数据库文件
vol3 -f image.vmem windows.filescan.FileScan | grep "wxid_ah0tuevc7rbz22.*Msg.*Multi.*db" > filedb.txt
MSG.db为存储聊天记录的数据库,导出数据库MSG0.db
┌──(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
下载系统中的文件
这个插件和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
批量进行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:])
查看解密后文件
发现一段百度网盘的连接https://pan.baidu.com/s/17Bt-vSpRpBLRuhTWaCgb6g?pwd=mfpt 提取
码: mfpt,百度网盘下载
下载压缩包并解压,为文本文件,是一段很长的hex数据和key
RC4解密
Base64解密结果为图片的MD5,使用网站解码https://tool.jisuapi.com/base642pic.html
HXD打开,文件尾部有PK头,并有hectf_[4number].zip的提示
最后就是根据提示用ARCHPR进行掩码爆破
密码hectf_7865
简单的压缩包
根据正则表达式⽣成字典爆破密码
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
恶势力的仓库
打开流量包,查看http流量
很明显有login流量,然后追踪tcp流,发现这里有个data传的值为
{“data”:{“username”:“hue=8zZvR2YzlWb”,“password”:“YI6=ECZvd2YzlWb”}}
一看就是被处理过的
login位置,向前找登录的逻辑
有js文件,看了一下居多,没看到什么敏感信息
在刚刚login基础上往下看一个流
找到一些有用的东西
<!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! ,这个也是后续压缩包密码
流11上传了一句话木马
流 17 18 19 为 蚁 剑 下 载 文 件 的 流 量 , 下 载 的 文 件 为 机 密 文 件 .7z
nothingnoflag.gif 破防小王.png 三个文件
流16列目录,流17提取出gif图,流18提取出png图,结尾有base64字符串
用之前的密码 miscgod! 解开7z压缩包,然后得到execl,execl中有0和1两种单元
格,都是被隐藏的,将行列设置一样的大小,全选搜索所有1,涂黑后是二维码,扫
码得到flag
ctrl+F 搜索所有的1,然后
选择全部替换