2026 SUCTF SU_LightNovel 流量分析与域渗透解密教学文档
一、题目背景与核心考点
本题为2026 SUCTF AD类题目,融合了NTLM身份验证、Windows RPC计划任务流量、Kerberos协议(含U2U机制)、PKINIT证书认证、TimeRoasting攻击等域渗透核心技术,难度较往年SU_AD系列显著提升。流量包主要包含两部分:前期NTLM验证流量(无效干扰项)和后期Kerberos加密的RPC计划任务流量(核心有效内容)。
二、环境准备与工具清单
| 工具/资源 | 用途 | 备注 |
|---|---|---|
| Wireshark | 流量分析与协议解析 | 需配置NTLMSSP首选项、Kerberos keytab |
| tshark | 命令行提取流量字段 | 用于批量提取解密后的RPC stub数据 |
| hashcat | NTLM Hash破解 | 配合ntlmrawunhide.py提取Hash |
| impacket | Kerberos票据(ccache)解析 | 提取TGT Session Key |
| steghide | 图片隐写提取 | 处理cert.jpg中的藏头诗隐写 |
| Python脚本 | AES-CBC解密、Base64解码、流量拼接 | 自定义脚本处理RPC加密stub数据 |
| 官方WP与附件 | 参考解法与流量包 | 链接:https://blog.0ran9e.cn/posts/ctf/suctf2026/;附件:https://img.enxiaohao.cn/CTFAttachments/SU_LightNovel.zip |
三、Step 1:NTLM Hash解密(干扰项排除)
3.1 流量特征与Hash提取
流量初期(frame 42、759)为NTLM身份验证流量,可通过ntlmrawunhide.py提取NTLM Hash,再用hashcat破解:
# 提取NTLM Hash(示例)
ntlmrawunhide.py suctf-ad.pcapng > ntlm_hash.txt
# hashcat破解(模式3000为NTLM)
hashcat -a 0 -m 3000 ntlm_hash.txt rockyou.txt
破解结果:91kanna.seto::wire.com:e9b597a6e03a5122:c4ec074163bee82d9f829d1aa22de185(密码taylorswift<3)。
3.2 干扰项验证
该NTLM验证为无效干扰,后续有效流量均基于Kerberos加密,需忽略此部分结果。
四、Step 2:Windows RPC计划任务流量分析
4.1 RPC操作类型识别
流量中涉及Task Scheduler RPC(端口135/593),核心操作类型及含义:
| opnum | 函数名 | 作用 | 流量特征 |
|---|---|---|---|
| 1 | SchRpcRegisterTask | 创建/覆盖计划任务 | 大包,含完整任务XML |
| 2 | SchRpcRetrieveTask | 取回任务XML | 小包,返回任务配置 |
| 13 | SchRpcDelete | 删除任务 | 无数据载荷 |
| 14 | SchRpcRename | 重命名任务 | 含新旧任务名 |
| 19 | SchRpcEnableTask | 启用/禁用任务 | 含任务状态标志 |
4.2 流量流程还原
客户端与目标主机(DC01.wire.com)的交互流程:
- 远程连接任务计划服务(TCP三次握手);
SchRpcRegisterTask(opnum 1):注册任务(frame 881-2572,大包含任务XML);- 运行任务并轮询状态;
SchRpcRetrieveTask(opnum 2):取回任务结果XML(frame 2636-2644);SchRpcDelete(opnum 13):删除任务(清理痕迹)。
4.3 任务XML提取与解密
4.3.1 Wireshark自动解密(小包)
配置NTLMSSP首选项(Edit → Preferences → Protocols → NTLMSSP → NT Password设为taylorswift<3),可直接解密frame 42、759的任务XML,提取task description字段(Base64编码)。
4.3.2 手动提取(大包)
注册任务的RPC包(frame 881-2572)过大,Wireshark无法自动重组,需用tshark提取解密后的stub数据:
tshark -o "ntlmssp.nt_password:taylorswift<3" -r suctf-ad.pcapng -Y "frame.number==42" -T fields -e frame.number -e dcerpc.decrypted_stub_data | xxd -r -p > task_xml.bin
解码task description:
import base64
payload = "..." # 从XML中提取的Base64字符串
decoded = base64.b64decode(payload).decode("utf-16le") # UTF-16LE为Windows默认编码
4.3.3 核心函数分析
任务XML中调用DownloadByPs($taskname),其逻辑为:
- 将目标文件Base64编码;
- 存入
task description字段; - 上传至客户端。
提取frame 759的task description,Base64解码后得到ZIP包,密码仍为taylorswift<3,但hint.zip无有效信息,确认NTLM部分为干扰。
五、Step 3:Kerberos通信解密与RPC流量重组
5.1 Kerberos流量筛选
过滤kerberos协议,发现两次通信:
- 第一次(tcp.stream=5,frame 844-2652):核心有效流量,申请
host/dc01.wire.com服务票据; - 第二次(frame 2671后):后续RPC操作,需导入keytab解密。
5.2 Keytab制作与Wireshark配置
5.2.1 Keytab生成
已知Kerberos认证密码为taylorswift<3,使用ktutil生成keytab:
ktutil
ktutil: addent -password -p administrator@WIRE.COM -k 1 -e aes256-cts-hmac-sha1-96
Password for administrator@WIRE.COM: taylorswift<3
ktutil: wkt admin.keytab
ktutil: quit
5.2.2 Wireshark导入Keytab
Edit → Preferences → Protocols → KRB5 → Keytab Files添加admin.keytab,Wireshark会自动解密Kerberos票据。
5.3 RPC Stub数据解密(Packet Privacy)
SchRpcRegisterTask启用Packet Privacy(RPC加密),需从Kerberos的AP-REQ中提取subkey(frame 876):
- 在Wireshark中找到
KRB5 → AP-REQ → Authenticator → subkey; - 复制subkey的十六进制值(如
0x1a2b3c...); - 使用Python脚本拼接RPC分段包并解密(示例代码):
from Crypto.Cipher import AES
import binascii
subkey = binascii.unhexlify("1a2b3c...") # 从frame 876提取的subkey
iv = binascii.unhexlify("...") # 从RPC stub中提取的IV
ciphertext = binascii.unhexlify("...") # 加密的RPC stub数据
cipher = AES.new(subkey, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
六、Step 4:Cert.zip提取与隐写分析
6.1 Cert.zip解密
从RPC解密后的数据中,提取cert.zip(Base64编码→解码),密码仍为taylorswift<3。
6.2 隐写破解(cert.jpg)
cert.zip中含cert.jpg,使用steghide提取隐写文件:
steghide extract -sf cert.jpg
提示输入密码,根据“藏头诗”线索(cert.jpg内容为濑户环奈相关),密码为濑户环奈倾城绝色,提取得到poem.txt。
七、Step 5:Administrator NTHash与明文密码破解
7.1 U2U机制与TGT Session Key提取
7.1.1 U2U原理
攻击者使用U2U(User-to-User)机制:拿Administrator的TGT,向KDC请求“发给Administrator自己”的票(enc-tkt-in-skey: True),KDC返回用Administrator的TGT Session Key加密的TGS票据。
7.1.2 TGT Session Key提取
使用impacket解析Administrator@WIRE.COM.ccache(从cert.zip提取):
impacket-ccache2john Administrator@WIRE.COM.ccache > ccache.hash
john --show ccache.hash # 提取TGT Session Key
7.2 PAC_CREDENTIAL_INFO解密
7.2.1 AS Reply Key获取
cert.zip中含key文件(01ea8c39173e5e4afbb5a6580b118e4cc21b16d399b8e2322b9090e68acd080a),此为PKINIT AS Reply Key(KDC与客户端通过证书协商生成,用于加密AS-REP的enc-part)。
7.2.2 NTLM Hash提取
解密TGS票据的enc-ticket,提取authorization-data → PAC → PAC_CREDENTIAL_INFO(用AS Reply Key,key usage 16解密),其中包含NTLM_SUPPLEMENTAL_CREDENTIAL,最终得到Administrator的NTLM Hash:xxxxxx(对应明文密码Talor@1989)。
八、Step 6:TimeRoasting攻击与Flag解密
8.1 TimeRoasting原理
Kerberos时间同步(NTP)时,DC返回的时间响应包含认证MAC:MAC = MD5_HMAC(客户端NT Hash, NTP数据)。攻击者枚举NT Hash,与MAC碰撞即可破解密码。
8.2 哈希提取与爆破
从流量中提取TimeRoast哈希(服务端响应frame 775、789),使用timeroast.py爆破:
timeroast.py -r suctf-ad.pcapng -o timeroast.hash
hashcat -a 0 -m 9600 timeroast.hash rockyou.txt
破解结果:明文密码*joker*123。
8.3 Flag解密
使用密码*joker*123的SHA256作为AES-CBC的key和IV,解密flag.txt:
import hashlib
from Crypto.Cipher import AES
password = "*joker*123"
key_iv = hashlib.sha256(password.encode()).digest() # SHA256(password)作为key和IV
cipher = AES.new(key_iv, AES.MODE_CBC, key_iv)
flag = cipher.decrypt(encrypted_flag).strip(b"\x00")
print(flag.decode())
九、关键知识点总结
| 技术点 | 核心原理 |
|---|---|
| NTLM身份验证 | 基于挑战-响应的哈希认证,Hash格式为LMHash:NTHash |
| RPC计划任务流量 | Task Scheduler RPC的opnum对应不同操作,任务XML含Base64编码的文件数据 |
| Kerberos U2U | 请求“发给自己的票”,用TGT Session Key加密TGS票据,绕过服务密钥 |
| PKINIT认证 | 证书预认证,协商AS Reply Key加密AS-REP enc-part |
| PAC_CREDENTIAL_INFO | 存储NTLM Hash,用AS Reply Key加密,需结合PKINIT证书解密 |
| TimeRoasting | 利用NTP时间响应的HMAC碰撞,枚举客户端NT Hash |
十、常见问题与解决方案
- Wireshark无法解密RPC stub:需手动提取subkey(frame 876),用Python脚本拼接分段包并解密;
- steghide提取失败:确认密码为“藏头诗”(濑户环奈倾城绝色),而非
taylorswift<3; - TimeRoast哈希提取错误:过滤
ntp协议,提取服务端响应包(frame 775、789)中的authenticator mac字段。
通过以上步骤,可完整还原题目流量中的域渗透路径,最终解密Flag。