V(N)shell 出题小记
字数 3056
更新时间 2026-02-27 02:15:58
VShell CTF 题目《V&N 2026》完整逆向分析与教学文档
1. 题目概述与环境配置
本题是一个模拟真实攻防场景的CTF题目,核心目标是通过分析流量包和逆向工程,逐步解密一个名为VShell的C2(命令与控制)木马,并最终获取目标机器上受保护的文件内容。
关键环境信息:
- VShell监听器配置:
- 模式:TCP
- 监听地址:0.0.0.0:11451
- VKey:
We1c0nn3_t0_VNctf2O26!!! - Salt:
It_is_my_secret!!!
- 受害者机器:
- 虚拟机:Virtualbox Kali Linux
- 网络:单网卡,Host-only模式,IP地址:192.168.56.103
- 目标文件:桌面存在
VIP_file和VIP.zip。
2. 攻击流程与初步流量分析
- 初始访问:攻击者首先访问目标Web服务(端口8000),通过上传隐蔽的
gift文件植入第一阶段木马(stage1)。 - 上线执行:攻击者通过执行
bash open命令,触发stage1加载器运行,使其成功连接C2服务器上线。 - 数据传输:攻击者在目标机器上执行命令,并使用
zip加密了一个文件,随后用zip2john工具提取了对应的PK哈希值,为后续文件恢复做准备。
流量包初步分析要点:
- 过滤流量,可发现
shell.php执行了一系列系统命令。 - 追踪
bash open命令执行后的TCP流,可以观察到受害机(192.168.56.103)开始与新的IP端口(192.168.56.1:11451)进行通信,此即为第二题答案:C2服务器的监听地址。 - 该通信流中传输的数据即为第二阶段主木马(
stage2)。
3. 第一阶段加载器 (stage1/gift) 逆向分析
将从流量中导出的gift文件(即stage1)放入IDA进行静态分析。
主要逻辑(main函数):
- 加载器首先会构建一个包含
l64(可能为架构标识)和监听地址等信息的消息包,发送给C2服务器。 - 随后,它会从服务器接收一段经过加密的数据。
- 加载器使用0x99作为密钥,对接收到的数据进行逐字节异或(XOR) 解密。
- 解密后的数据即为第二阶段的木马程序(
stage2),加载器会将其加载到内存并执行。
关键点:stage1的核心作用是一个下载器,其解密算法简单(单字节XOR),目的是从C2服务器获取更复杂、功能完整的stage2主木马。
4. 第二阶段主木马 (stage2) 逆向分析与Config解密
获取到stage2后,需进行深入逆向以获取其配置(config)和通信加密逻辑。
4.1 配置信息 (config) 解密
VShell的加密配置块在内存中有固定特征。
方法一:通过固定大小定位
- 在IDA中分析
stage2的汇编代码,搜索十六进制值5000h(即十进制20480)。这是因为VShell无论何种模式,其加密后的config数据均存放在一个大小为20480字节的缓冲区中。 - 找到引用此大小的函数(如
sub_598F00),该函数即为处理config的解密函数。 - 逆向该函数或参考公开资料可知,
config的解密逻辑为:- 加密模式:AES-CBC
- 填充方式:本题中并非标准PKCS#7,而是使用0x00填充至块大小。
- 密钥与IV:解密所需的Key和IV均为加密数据块本身的前16个字节。
- 反序列化:解密后的明文是一段JSON字符串,程序会调用
encoding/json.Unmarshal进行反序列化。
提取与解密步骤:
- 使用IDA脚本或手动从内存/二进制中提取出这20480字节的加密数据。
- 取前16字节作为AES-128-CBC解密的Key和IV。
- 使用取出的Key和IV,对剩余数据进行AES-CBC解密(注意去除末尾的0x00填充)。
- 解密后即可得到明文的JSON配置。从中可以找到关键的Salt值,即第三题答案:
It_is_my_secret!!!。
方法二:通过JSON反序列化函数定位
- 在IDA中全局搜索字符串
"json"或函数encoding/json.Unmarshal。 - 通过交叉引用找到调用该函数的位置(例如地址
0x598FB8)。 - 在该地址设置调试断点(使用GDB/Pwngdb),当程序执行到此处时,寄存器或栈中即保存着解密后的明文JSON配置结构体指针,可直接dump出来。
4.2 流量通信加密分析
stage2与C2服务器之间的通信流量是加密的。
逆向定位方法:
在主木马的汇编代码中搜索字符串"client",有很大概率能找到处理通信加密的主逻辑函数(例如sub_6D7E40)。审计该函数可知:
- 建立连接后,木马会首先验证VKey(
We1c0nn3_t0_VNctf2O26!!!),验证失败则退出。 - 验证通过后,后续通信数据使用 AES-GCM 模式进行加密认证。
- 密钥:由配置中的
Salt值(It_is_my_secret!!!)进行MD5哈希得到。 - Nonce (IV):每次加密随机生成,随密文一起传输。
- 附加认证数据 (AAD):可能为空或包含特定头信息。
- 密钥:由配置中的
加密流量包格式解析:
选取一个完整的TCP应用层数据包进行分析,其结构如下:
[d7 00 00 00] [a7 9b 3b 8a 06 96 1f f9 83 a5 d1 21] [06 56 68 1a e1 c... (密文) ...fa eb a0 49 9f 78 d4] [d0 57 c9 09 12 18 4e 3f 0d ae f1 bb 6d 20 a2 1a]
- 长度头(4字节):例如
d7000000,小端序表示为215字节。此字段用于分割数据流,实际解密时可能不需要。 - Nonce/IV(12字节):AES-GCM所需的12字节随机数,例如
a79b3b8a06961ff983a5d121。 - 密文(长度可变):真正的加密数据。
- 尾部垃圾数据(16字节):例如
d057c90912184e3f0daef1bb6d20a21a,解密时直接丢弃,并非GCM认证标签。
单条流量解密脚本思路:
- 从原始流量中分离出12字节的Nonce和中间的密文数据段。
- 计算Salt的MD5值作为AES-128-GCM的密钥。
- 使用该Key和Nonce,对密文进行AES-GCM解密(无需提供AAD)。
- 解密结果即为攻击者与木马交互的明文指令或数据。通过此方法解密相关流量,可找到用于加密
VIP.zip的密码,即第四题答案:White_hat。
5. 压缩包破解与文件恢复
最终目标是获取桌面VIP_file的内容。
- 获取哈希:攻击者使用
zip2john工具从VIP.zip提取出了PKZIP格式的密码哈希。此哈希可用于离线破解。 - 已知明文攻击:在解密流量后,我们已获知压缩包的密码为
White_hat。 - 恢复内容:使用密码
White_hat直接解压VIP.zip,或使用获得的密码及其对应的加密密钥(通过明文攻击得到),即可解压出VIP_file。 - 查看
VIP_file文件内容,得到最终答案:Welcome to the V&N family。
技术要点总结:
- 本题完整还原了从Web入侵、木马下载、配置解密到流量分析的全链条。
- 涉及
AES-CBC、AES-GCM两种加密模式的分析与解密。 - 考察了通过逆向工程定位关键数据(固定大小缓冲区、特定API调用)的能力。
- 结合了网络流量分析、二进制逆向和加密解密实战。