从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 固件处理步骤

  1. 使用binwalk解包babyrtp.bin文件:
    binwalk babyrtp.bin
    
  2. 解压得到的out.zip文件
  3. 将解压后的图片文件重命名为flag.jpg
  4. 将flag.jpg放置到/usr目录下
  5. 运行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 加密过程细节

  1. 数据读取:一次读取图片1024字节
  2. AES加密
    • 加密块大小:16字节
    • 不足16字节用数字补齐
  3. RTP封装
    • 加密后数据长度从1024变为1036字节
    • 前12字节为RTP头信息,后1024字节为加密数据

5. 解题步骤详解

5.1 获取加密数据流

  1. 构造URL请求:

    http://[服务IP]:8080/?url=[本地IP]&
    

    示例http://192.168.1.100:8080/?url=192.168.1.1&

  2. 使用Wireshark抓包:

    • 选择正确的网络接口(如NAT虚拟网卡)
    • 过滤RTP流量:rtp

5.2 数据处理与提取

  1. 从Wireshark导出数据:

    • 追踪流 → UDP流
    • 显示方式改为"原始数据"
    • 另存为output.bin
  2. 使用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解密

  1. 获取密钥:

    • 路径:/usr/aes_key.bin
    • 或从解包后的固件中提取
  2. 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("解密完成!")
    
  3. 替代方案:使用CyberChef工具解密

    • 导入加密文件
    • 使用AES解密模块
    • ECB模式
    • 提供密钥
    • 保存为JPG格式

6. 关键知识点总结

  1. RTP协议特点

    • 实时传输协议,常用于音视频流
    • 不保证可靠性,但保证实时性
    • 通常与RTCP配合使用
  2. AES加密要点

    • ECB模式(电子密码本模式)
    • 固定块大小16字节
    • 需要处理填充数据
  3. 数据包分析技巧

    • 识别和过滤RTP流量
    • 理解协议头部结构
    • 有效载荷提取方法
  4. 解题思路

    • 逆向分析服务逻辑
    • 构造合法请求获取加密数据
    • 正确处理协议封装
    • 实现正确的解密流程

7. 常见问题与解决方案

  1. binwalk无法使用

    • 在Kali Linux上解包后传输
    • 或尝试更新binwalk版本
  2. Wireshark抓不到包

    • 确认选择了正确的网络接口
    • 检查防火墙设置
    • 尝试使用tcpdump辅助抓包
  3. 解密失败

    • 检查密钥是否正确
    • 确认数据去除了RTP头
    • 验证AES模式和填充方式
  4. 服务无法启动

    • 检查文件路径是否正确
    • 确认依赖库已安装
    • 检查端口是否被占用

8. 扩展学习

  1. 深入RTP协议

    • 研究RFC 3550(RTP标准文档)
    • 了解RTP头部各字段含义
    • 学习RTCP的QoS监控机制
  2. AES加密进阶

    • 比较ECB、CBC等不同模式
    • 学习PKCS#7填充标准
    • 研究初始化向量(IV)的使用
  3. IOT安全分析

    • 固件逆向工程技巧
    • 常见IOT协议分析
    • 漏洞挖掘方法
  4. 相关CTF题目

    • 历年网鼎杯IOT题目
    • DEF CON CTF中相关题目
    • 其他CTF比赛的网络协议分析题

通过本题的完整分析,我们系统性地学习了RTP协议在IOT环境中的应用,以及如何分析加密的网络流量。这种从协议理解到实际分析再到数据解密的完整流程,是IOT安全研究的基础技能。

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文件: 解压得到的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://192.168.1.100:8080/?url=192.168.1.1& 使用Wireshark抓包: 选择正确的网络接口(如NAT虚拟网卡) 过滤RTP流量: rtp 5.2 数据处理与提取 从Wireshark导出数据: 追踪流 → UDP流 显示方式改为"原始数据" 另存为output.bin 使用Python脚本处理数据: 5.3 AES解密 获取密钥: 路径: /usr/aes_key.bin 或从解包后的固件中提取 Python解密脚本: 替代方案:使用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安全研究的基础技能。