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_fileVIP.zip

2. 攻击流程与初步流量分析

  1. 初始访问:攻击者首先访问目标Web服务(端口8000),通过上传隐蔽的gift文件植入第一阶段木马(stage1)。
  2. 上线执行:攻击者通过执行bash open命令,触发stage1加载器运行,使其成功连接C2服务器上线。
  3. 数据传输:攻击者在目标机器上执行命令,并使用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函数):

  1. 加载器首先会构建一个包含l64(可能为架构标识)和监听地址等信息的消息包,发送给C2服务器。
  2. 随后,它会从服务器接收一段经过加密的数据。
  3. 加载器使用0x99作为密钥,对接收到的数据进行逐字节异或(XOR) 解密。
  4. 解密后的数据即为第二阶段的木马程序(stage2),加载器会将其加载到内存并执行。

关键点stage1的核心作用是一个下载器,其解密算法简单(单字节XOR),目的是从C2服务器获取更复杂、功能完整的stage2主木马。

4. 第二阶段主木马 (stage2) 逆向分析与Config解密

获取到stage2后,需进行深入逆向以获取其配置(config)和通信加密逻辑。

4.1 配置信息 (config) 解密

VShell的加密配置块在内存中有固定特征。

方法一:通过固定大小定位

  1. 在IDA中分析stage2的汇编代码,搜索十六进制值 5000h (即十进制20480)。这是因为VShell无论何种模式,其加密后的config数据均存放在一个大小为20480字节的缓冲区中。
  2. 找到引用此大小的函数(如sub_598F00),该函数即为处理config的解密函数。
  3. 逆向该函数或参考公开资料可知,config的解密逻辑为:
    • 加密模式:AES-CBC
    • 填充方式:本题中并非标准PKCS#7,而是使用0x00填充至块大小。
    • 密钥与IV:解密所需的Key和IV均为加密数据块本身的前16个字节。
    • 反序列化:解密后的明文是一段JSON字符串,程序会调用encoding/json.Unmarshal进行反序列化。

提取与解密步骤:

  1. 使用IDA脚本或手动从内存/二进制中提取出这20480字节的加密数据。
  2. 取前16字节作为AES-128-CBC解密的Key和IV。
  3. 使用取出的Key和IV,对剩余数据进行AES-CBC解密(注意去除末尾的0x00填充)。
  4. 解密后即可得到明文的JSON配置。从中可以找到关键的Salt值,即第三题答案:It_is_my_secret!!!

方法二:通过JSON反序列化函数定位

  1. 在IDA中全局搜索字符串"json"或函数encoding/json.Unmarshal
  2. 通过交叉引用找到调用该函数的位置(例如地址0x598FB8)。
  3. 在该地址设置调试断点(使用GDB/Pwngdb),当程序执行到此处时,寄存器或栈中即保存着解密后的明文JSON配置结构体指针,可直接dump出来。

4.2 流量通信加密分析

stage2与C2服务器之间的通信流量是加密的。

逆向定位方法:
在主木马的汇编代码中搜索字符串"client",有很大概率能找到处理通信加密的主逻辑函数(例如sub_6D7E40)。审计该函数可知:

  1. 建立连接后,木马会首先验证VKeyWe1c0nn3_t0_VNctf2O26!!!),验证失败则退出。
  2. 验证通过后,后续通信数据使用 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]
  1. 长度头(4字节):例如d7000000,小端序表示为215字节。此字段用于分割数据流,实际解密时可能不需要。
  2. Nonce/IV(12字节):AES-GCM所需的12字节随机数,例如a79b3b8a06961ff983a5d121
  3. 密文(长度可变):真正的加密数据。
  4. 尾部垃圾数据(16字节):例如d057c90912184e3f0daef1bb6d20a21a,解密时直接丢弃,并非GCM认证标签。

单条流量解密脚本思路:

  1. 从原始流量中分离出12字节的Nonce和中间的密文数据段。
  2. 计算Salt的MD5值作为AES-128-GCM的密钥。
  3. 使用该Key和Nonce,对密文进行AES-GCM解密(无需提供AAD)。
  4. 解密结果即为攻击者与木马交互的明文指令或数据。通过此方法解密相关流量,可找到用于加密VIP.zip的密码,即第四题答案:White_hat

5. 压缩包破解与文件恢复

最终目标是获取桌面VIP_file的内容。

  1. 获取哈希:攻击者使用zip2john工具从VIP.zip提取出了PKZIP格式的密码哈希。此哈希可用于离线破解。
  2. 已知明文攻击:在解密流量后,我们已获知压缩包的密码为White_hat
  3. 恢复内容:使用密码White_hat直接解压VIP.zip,或使用获得的密码及其对应的加密密钥(通过明文攻击得到),即可解压出VIP_file
  4. 查看VIP_file文件内容,得到最终答案:Welcome to the V&N family

技术要点总结:

  • 本题完整还原了从Web入侵、木马下载、配置解密到流量分析的全链条。
  • 涉及AES-CBCAES-GCM两种加密模式的分析与解密。
  • 考察了通过逆向工程定位关键数据(固定大小缓冲区、特定API调用)的能力。
  • 结合了网络流量分析、二进制逆向和加密解密实战。
 全屏