20211322肖权城信息安全设计wireshark课设个人报告

北京电子科技学院

《信息安全工程技术应用》课程设计报告

基于Wireshark插件的国密标准检测工具的设计与实现

小组成员姓名:

  • 20211406 张顺扬
  • 20211312 徐元琦
  • 20211322 肖权城

指导教师: 娄嘉鹏

提交时间: 2023年12月16日

一、设计方案及可行性分析

设计方案

  1. 插件架构
    • 国密标准检测模块

  • 用户界面模块
  1. 国密标准检测模块实现
    • 协议解析
    • 国密标准识别
    • 结果输出

可行性分析

  1. Wireshark插件开发框架

    • 优势:插件化架构、多语言支持
    • 劣势:学习曲线较陡峭
  2. 协议解析复杂性

    • 优势:SSL VPN协议公开且有详细文档
    • 劣势:多版本和变种需要考虑
  3. 用户界面交互

    • 优势:Wireshark提供丰富的用户界面组件
    • 劣势:需要符合Wireshark的风格和规范

二、详细设计思路

1. 系统体系结构与技术选择

**系统体系结构:

  • 采用插件化架构,利用Wireshark的插件开发框架进行开发。
  • 主要模块包括SSL/TLS握手协议解析、CipherSpec Change协议解析、Record Layer协议解析、Alert Protocol协议解析等。
  • 使用Lua语言编写Wireshark插件,通过DissectorTable将插件注册到指定的TCP端口。

**技术选择:

  • 编程语言: Lua,Wireshark插件的主要开发语言。
  • Wireshark插件框架: 利用Wireshark提供的Dissector API和相关函数。
  • UML建模工具: 使用UML建模工具(如PlantUML)绘制关键程序的流程图和调用关系图。

2. 关键数据类型定义与流程图

关键数据类型定义:

  • Lua中无显式数据类型定义,但需要注意Wireshark API返回的数据类型如TvbRange和Proto。

流程图和调用关系图:

  • 绘制流程图,包括主处理函数dissect_ssl_tls、握手协议解析函数等的关系。

3. UML建模

类图:

  1. ssl_tls_proto类
    • 方法:dissector(tvb, pktinfo, root)
  2. DissectorTable类
    • 方法:get("tcp.port"), add(443, ssl_tls_proto)

时序图:

  • 加载插件时序、解析SSL/TLS时序的关系图

主要时序操作:

  1. 加载插件时序:

    • DissectorTable的get方法。
    • DissectorTable的add方法。
  2. 解析SSL/TLS时序:

    • ssl_tls_proto的dissector方法。
    • 调用相应的解析函数,如dissect_ssl_handshake、dissect_cipher_spec_change等。

4. 测试目的、内容、结果及分析

测试目的:

  • 验证插件能够正确解析SSL/TLS协议,包括握手协议、CipherSpec Change协议、Record Layer协议、Alert Protocol协议。

测试内容:

  1. 通过Wireshark捕获包含SSL/TLS流量的数据包。
  2. 分析Wireshark插件的解析结果,检查是否正确解析协议类型、握手类型、加密算法等信息。

测试结果及分析:

  • 结果:插件能够正确解析SSL/TLS协议,显示相应的信息。
  • 分析:检查Wireshark的解析树,确保插件输出的信息与预期一致。调试和修复插件代码,确保准确性。

通过以上设计思路,可以更好地理解和实现Wireshark插件的SSL/TLS协议解析功能,确保插件的可靠性和准确性。

三、设计特色

插件化架构和模块化设计

设计采用了插件化架构,充分利用Wireshark插件开发框架,将SSL/TLS协议解析功能模块化,包括握手协议解析、CipherSpec Change协议解析、Record Layer协议解析、Alert Protocol协议解析和GateToGate协议等。每个模块负责特定协议的解析,使得系统具有更好的可扩展性和维护性。插件注册到指定的TCP端口,实现了对SSL/TLS流量的实时解析。

易读的代码和注释

代码采用Lua语言编写,具有较好的可读性和简洁性。注释清晰,对关键逻辑和功能进行了解释说明,方便理解和修改代码。
基于Wireshark API的开发
设计充分利用Wireshark插件开发框架提供的API,包括DissectorTable、Proto等,通过注册到TCP端口实现了对SSL/TLS流量的捕获和解析。这种基于Wireshark API的开发方式使得插件能够与Wireshark紧密集成,充分发挥Wireshark强大的网络分析能力。

面向对象的设计理念

尽管Lua语言并不是经典的面向对象语言,但通过在设计中使用对象的思想,如ssl_tls_proto类,成功抽象出插件的核心功能,并且模块之间通过对象的方式进行关联。这样的设计理念使得系统更易理解、更具灵活性。

强调测试的重要性

在设计中,强调了测试的重要性,明确了测试目的、内容和预期结果。这有助于保证插件的准确性和稳定性。通过对插件在实际SSL/TLS流量数据上的测试,可以验证其对各种协议类型的正确解析,并及时发现和修复可能存在的问题。

清晰的设计文档

通过上述设计思路,详细说明了系统体系结构、关键数据类型的定义、程序流程图、UML类图和时序图等方面。这样的设计文档有助于项目的理解和沟通,也为日后的维护和拓展提供了清晰的指导。

四、源代码及注释

-- SSL/TLS握手协议解析函数
local function dissect_ssl_handshake(tvb, pktinfo, root)
    -- 读取握手消息类型
    local handshakeType = tvb(5, 1):uint()
pktinfo.cols.protocol:set(<span class="hljs-string">"SSL/TLS - Handshake"</span>)

<span class="hljs-comment">-- 根据握手消息类型设置信息列</span>
<span class="hljs-keyword">if</span> handshakeType == <span class="hljs-number">0x01</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Handshake Type: Client Hello"</span>)
<span class="hljs-keyword">elseif</span> handshakeType == <span class="hljs-number">0x02</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Handshake Type: Server Hello"</span>)

    <span class="hljs-comment">-- 检查是否有证书</span>
    <span class="hljs-keyword">local</span> isCertificate = tvb(<span class="hljs-number">0x5c</span>, <span class="hljs-number">1</span>):uint()
    <span class="hljs-keyword">if</span> isCertificate == <span class="hljs-number">0x0b</span> <span class="hljs-keyword">then</span>
        pktinfo.cols.info:append(<span class="hljs-string">" - Certificate Present"</span>)
    <span class="hljs-keyword">end</span>

    <span class="hljs-comment">-- 读取加密算法和临时密钥</span>
    <span class="hljs-keyword">local</span> cipherSuite = tvb(<span class="hljs-number">76</span>, <span class="hljs-number">2</span>):uint()
    <span class="hljs-keyword">local</span> keyExchange = tvb(<span class="hljs-number">15</span>, <span class="hljs-number">28</span>):bytes()   <span class="hljs-comment">-- 偏移调整</span>
    <span class="hljs-keyword">local</span> keyExchangeString = <span class="hljs-built_in">tostring</span>(keyExchange)

    <span class="hljs-comment">-- 打印加密算法和临时密钥到解析树中</span>
    <span class="hljs-keyword">local</span> treeItem = root:add(my_protocol, tvb(), <span class="hljs-string">"Encryption Algorithm and Temporary Key"</span>)

    <span class="hljs-keyword">if</span> cipherSuite == <span class="hljs-number">0x003c</span> <span class="hljs-keyword">then</span>
        treeItem:add(<span class="hljs-string">"Cipher Suite:"</span>, <span class="hljs-string">"RSA_AES_SHA256"</span>)
        treeItem:add(<span class="hljs-string">"Key Exchange:"</span>, keyExchangeString)
    <span class="hljs-keyword">end</span>
<span class="hljs-keyword">elseif</span> handshakeType == <span class="hljs-number">0x10</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Handshake Type: Key Exchange"</span>)

    <span class="hljs-comment">-- 检查是否为Change Cipher Spec</span>
    <span class="hljs-keyword">local</span> isChangeCipherSpec = tvb(<span class="hljs-number">0x010b</span>, <span class="hljs-number">1</span>):uint()
    <span class="hljs-keyword">if</span> isChangeCipherSpec == <span class="hljs-number">0x14</span> <span class="hljs-keyword">then</span>
        pktinfo.cols.info:append(<span class="hljs-string">" - Change Cipher Spec"</span>)
    <span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>

end

-- CipherSpec Change协议解析函数
local function dissect_cipher_spec_change(tvb, pktinfo, root)
local record_type = tvb(0, 1):uint()

<span class="hljs-comment">-- 根据记录类型设置信息列</span>
<span class="hljs-keyword">if</span> record_type == <span class="hljs-number">0x14</span> <span class="hljs-keyword">then</span> <span class="hljs-comment">-- SSL/TLS Record Layer: Change Cipher Spec</span>
    pktinfo.cols.protocol:set(<span class="hljs-string">"SSL/TLS - Cipher Spec Change"</span>)
<span class="hljs-keyword">else</span>
    pktinfo.cols.protocol:set(<span class="hljs-string">"SSL/TLS - Other Cipher Spec"</span>)
<span class="hljs-keyword">end</span>

end

-- Record Layer协议解析函数
local function dissect_record_layer_protocol(tvb, pktinfo, root)
if tvb:len() < 1 then
return
end

<span class="hljs-keyword">local</span> record_type = tvb(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>):uint()

pktinfo.cols.protocol:set(<span class="hljs-string">"SSL/TLS - Record Layer Protocol"</span>)

<span class="hljs-comment">-- 添加特定于Record Layer Protocol的逻辑</span>
<span class="hljs-keyword">if</span> record_type == <span class="hljs-number">0x14</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:append(<span class="hljs-string">" - Custom Record Layer Logic: Detected Change Cipher Spec!"</span>)
<span class="hljs-keyword">else</span>
    pktinfo.cols.info:append(<span class="hljs-string">" - Custom Record Layer Logic: Other Record Type"</span>)
<span class="hljs-keyword">end</span>

end

-- Alert Protocol协议解析函数
local function dissect_alert_protocol(tvb, pktinfo, root)
local level = tvb(5, 1):uint()
local description = tvb(6, 1):uint()

pktinfo.cols.protocol:set(<span class="hljs-string">"SSL/TLS - Alert"</span>)

<span class="hljs-comment">-- 根据警告级别和描述设置信息列</span>
<span class="hljs-keyword">if</span> level == <span class="hljs-number">0x01</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Level: Warning"</span>)
    <span class="hljs-keyword">if</span> description == <span class="hljs-number">0x0A</span> <span class="hljs-keyword">then</span>
        pktinfo.cols.info:append(<span class="hljs-string">" - Description: Unexpected Message"</span>)
    <span class="hljs-keyword">end</span>
<span class="hljs-keyword">elseif</span> level == <span class="hljs-number">0x02</span> <span class="hljs-keyword">then</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Level: Fatal"</span>)
    <span class="hljs-keyword">if</span> description == <span class="hljs-number">0x46</span> <span class="hljs-keyword">then</span>
        pktinfo.cols.info:append(<span class="hljs-string">" - Description: Protocol Version"</span>)
    <span class="hljs-keyword">end</span>
<span class="hljs-keyword">else</span>
    pktinfo.cols.info:set(<span class="hljs-string">"Encrypted Alert"</span>)
<span class="hljs-keyword">end</span>

end

-- 主处理函数
local function dissect_ssl_tls(tvb, pktinfo, root)
local record_type = tvb(0, 1):uint()

<span class="hljs-keyword">if</span> record_type == <span class="hljs-number">0x17</span> <span class="hljs-keyword">then</span>
    <span class="hljs-comment">-- SSL/TLS Record Layer</span>
    dissect_record_layer_protocol(tvb, pktinfo, root)
<span class="hljs-keyword">elseif</span> record_type == <span class="hljs-number">0x14</span> <span class="hljs-keyword">then</span>
    <span class="hljs-comment">-- CipherSpec Change</span>
    dissect_cipher_spec_change(tvb, pktinfo, root)
<span class="hljs-keyword">elseif</span> record_type == <span class="hljs-number">0x15</span> <span class="hljs-keyword">then</span>
    <span class="hljs-comment">-- Alert Protocol</span>
    dissect_alert_protocol(tvb, pktinfo, root)
<span class="hljs-keyword">elseif</span> record_type == <span class="hljs-number">0x16</span> <span class="hljs-keyword">then</span>
    <span class="hljs-comment">-- SSL/TLS Handshake</span>
    dissect_ssl_handshake(tvb, pktinfo, root)
<span class="hljs-keyword">end</span>

end

-- 注册协议
local function ssl_tls_protocol_init()
local ssl_tls_proto = Proto("ssl_tls", "SSL/TLS Protocol")

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ssl_tls_proto.dissector</span><span class="hljs-params">(tvb, pktinfo, root)</span></span>
    dissect_ssl_tls(tvb, pktinfo, root)
<span class="hljs-keyword">end</span>

<span class="hljs-comment">-- 注册端口</span>
<span class="hljs-keyword">local</span> tcp_table = DissectorTable.get(<span class="hljs-string">"tcp.port"</span>)
tcp_table:add(<span class="hljs-number">443</span>, ssl_tls_proto)

end

-- 调用注册函数
ssl_tls_protocol_init()




posted @ 2023-12-16 16:44  入林寻梨花白  阅读(12)  评论(0编辑  收藏  举报