20211322肖权城信息安全设计wireshark课设个人报告
北京电子科技学院
《信息安全工程技术应用》课程设计报告
基于Wireshark插件的国密标准检测工具的设计与实现
小组成员姓名:
- 20211406 张顺扬
- 20211312 徐元琦
- 20211322 肖权城
指导教师: 娄嘉鹏
提交时间: 2023年12月16日
一、设计方案及可行性分析
设计方案
- 插件架构
- 国密标准检测模块
- 国密标准检测模块
- 用户界面模块
- 国密标准检测模块实现
- 协议解析
- 国密标准识别
- 结果输出
可行性分析
-
Wireshark插件开发框架
- 优势:插件化架构、多语言支持
- 劣势:学习曲线较陡峭
-
协议解析复杂性
- 优势:SSL VPN协议公开且有详细文档
- 劣势:多版本和变种需要考虑
-
用户界面交互
- 优势: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建模
类图:
- ssl_tls_proto类
- 方法:dissector(tvb, pktinfo, root)
- DissectorTable类
- 方法:get("tcp.port"), add(443, ssl_tls_proto)
- 方法:get("tcp.port"), add(443, ssl_tls_proto)
时序图:
- 加载插件时序、解析SSL/TLS时序的关系图
主要时序操作:
-
加载插件时序:
- DissectorTable的get方法。
- DissectorTable的add方法。
-
解析SSL/TLS时序:
- ssl_tls_proto的dissector方法。
- 调用相应的解析函数,如dissect_ssl_handshake、dissect_cipher_spec_change等。
4. 测试目的、内容、结果及分析
测试目的:
- 验证插件能够正确解析SSL/TLS协议,包括握手协议、CipherSpec Change协议、Record Layer协议、Alert Protocol协议。
测试内容:
- 通过Wireshark捕获包含SSL/TLS流量的数据包。
- 分析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()