从2024年网鼎杯半决赛入门IOT————IOT网络协议分析babyRTP
字数 2080 2025-08-22 12:22:15
IOT网络协议分析:从2024年网鼎杯半决赛babyRTP题目入门
1. 题目背景与概述
这是一个基于RTP(实时传输协议)的IOT网络协议分析题目,涉及双端推流服务。题目名称为"babyRTP",主要考察对RTP协议的理解和实际应用能力。
RTP协议基础:
- RTP(Real Time Transport Protocol):由IETF于1996年在RFC 1889中公布
- 为IP上的语音、图像等实时传输的多媒体数据提供端对端的传输服务
- 本身不保证服务质量(QoS),需配合RTCP(Real-time Transport Control Protocol)使用
- RTCP功能:监控服务质量并传送会话参与者信息,服务器可利用其数据包信息改变传输速率和负载数据类型
2. 环境搭建与准备
2.1 环境要求
- 服务端:Ubuntu 22.04.5
- 分析工具:Kali Linux(用于binwalk解包)
- 网络抓包工具:Wireshark
2.2 固件处理步骤
- 使用binwalk解包babyrtp.bin文件:
binwalk babyrtp.bin - 解压得到的out.zip文件
- 将解压后的图片文件重命名为flag.jpg
- 将flag.jpg放置到/usr目录下
- 运行pwn文件启动服务
注意:如果Ubuntu上binwalk不可用,可在Kali Linux上解包后传输到Ubuntu
3. 服务分析
3.1 服务架构
- Web服务端口:8080
- RTP流传输端口:5004
3.2 关键函数分析
3.2.1 handle_request函数
- 处理客户端连接请求
- 调用extract_url函数处理输入
3.2.2 extract_url函数
- 通过URL参数"url="接收输入
- 要求参数为IPv4地址并以"&"结尾
- 示例格式:
url=192.168.1.1&
3.2.3 push_stream函数
- 接收参数:flag.jpg、aes_key.bin、IP地址和端口5004
- 调用rtp_aes_push函数持续执行流传输
4. RTP加密流传输分析
4.1 rtp_aes_push功能
- 将flag.jpg进行AES加密
- 使用aes_key.bin文件作为密钥
- 通过RTP协议将加密内容发送到指定IP的5004端口
4.2 加密过程细节
- 数据读取:一次读取图片1024字节
- AES加密:
- 加密块大小:16字节
- 不足16字节用数字补齐
- RTP封装:
- 加密后数据长度从1024变为1036字节
- 前12字节为RTP头信息,后1024字节为加密数据
5. 解题步骤详解
5.1 获取加密数据流
-
构造URL请求:
http://[服务IP]:8080/?url=[本地IP]&示例:
http://192.168.1.100:8080/?url=192.168.1.1& -
使用Wireshark抓包:
- 选择正确的网络接口(如NAT虚拟网卡)
- 过滤RTP流量:
rtp
5.2 数据处理与提取
-
从Wireshark导出数据:
- 追踪流 → UDP流
- 显示方式改为"原始数据"
- 另存为output.bin
-
使用Python脚本处理数据:
with open("output.bin", "rb") as f: all_data = f.read() padding = 1036 - len(all_data) % 1036 all_data += b"0" * padding data_seg = [] for i in range(len(all_data) // 1036): temp = all_data[i*1036:(i+1)*1036] data_seg.append(temp[12:]) # 去除前12字节头信息 with open("images.bin", "wb") as f: for i in data_seg: f.write(i)
5.3 AES解密
-
获取密钥:
- 路径:
/usr/aes_key.bin - 或从解包后的固件中提取
- 路径:
-
Python解密脚本:
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import os key = open("aes_key.bin", "rb").read() def decrypt_file(input_path, output_path, key): cipher = AES.new(key, AES.MODE_ECB) with open(input_path, 'rb') as infile, open(output_path, 'wb') as outfile: while True: block = infile.read(16) if len(block) == 0: break elif len(block) < 16: block = block.ljust(16, b'\0') decrypted_block = cipher.decrypt(block) outfile.write(decrypted_block) outfile.truncate(os.path.getsize(output_path) - decrypted_block.count(b'\0')) decrypt_file("images.bin", "flag.jpg", key) print("解密完成!") -
替代方案:使用CyberChef工具解密
- 导入加密文件
- 使用AES解密模块
- ECB模式
- 提供密钥
- 保存为JPG格式
6. 关键知识点总结
-
RTP协议特点:
- 实时传输协议,常用于音视频流
- 不保证可靠性,但保证实时性
- 通常与RTCP配合使用
-
AES加密要点:
- ECB模式(电子密码本模式)
- 固定块大小16字节
- 需要处理填充数据
-
数据包分析技巧:
- 识别和过滤RTP流量
- 理解协议头部结构
- 有效载荷提取方法
-
解题思路:
- 逆向分析服务逻辑
- 构造合法请求获取加密数据
- 正确处理协议封装
- 实现正确的解密流程
7. 常见问题与解决方案
-
binwalk无法使用:
- 在Kali Linux上解包后传输
- 或尝试更新binwalk版本
-
Wireshark抓不到包:
- 确认选择了正确的网络接口
- 检查防火墙设置
- 尝试使用tcpdump辅助抓包
-
解密失败:
- 检查密钥是否正确
- 确认数据去除了RTP头
- 验证AES模式和填充方式
-
服务无法启动:
- 检查文件路径是否正确
- 确认依赖库已安装
- 检查端口是否被占用
8. 扩展学习
-
深入RTP协议:
- 研究RFC 3550(RTP标准文档)
- 了解RTP头部各字段含义
- 学习RTCP的QoS监控机制
-
AES加密进阶:
- 比较ECB、CBC等不同模式
- 学习PKCS#7填充标准
- 研究初始化向量(IV)的使用
-
IOT安全分析:
- 固件逆向工程技巧
- 常见IOT协议分析
- 漏洞挖掘方法
-
相关CTF题目:
- 历年网鼎杯IOT题目
- DEF CON CTF中相关题目
- 其他CTF比赛的网络协议分析题
通过本题的完整分析,我们系统性地学习了RTP协议在IOT环境中的应用,以及如何分析加密的网络流量。这种从协议理解到实际分析再到数据解密的完整流程,是IOT安全研究的基础技能。