一、设计方案及可行性分析
该代码是一个用于解析 TLS(Transport Layer Security)协议的 Lua 插件,可以作为 Wireshark 的一个解析器。通过解析不同类型的 TLS 协议记录,包括 Change Cipher Spec 协议、Alert 协议、Handshake 协议和 Record 协议,为每个记录设置相应的协议类型。这个插件主要用于网络数据包的分析和监控,可以增加 Wireshark 对于 TLS 协议的解析能力。
二、详细设计思路
1.系统体系结构,技术选择
该插件基于 Lua 语言编写,作为 Wireshark 的 Lua 插件,用于解析 TLS 协议记录。Wireshark 是一个广泛使用的网络协议分析工具,而Lua作为一种脚本语言,能够很好地扩展Wireshark的功能。基于Wireshark的插件机制,Lua语言被用来实现对TLS协议记录的解析。
2.说明程序中用到的关键数据类型的定义,绘制关键程序的流程图,以及各子模块间 的调用关系图
MyProtocol |
---|
- dissectChangeCipherSpec() |
- dissectAlert() |
- dissectHandshake() |
- dissectRecord() |
- MyProtocol.dissector() |
- 面向对象技术可以用UML建模
MyProtocol |
---|
+ dissectChangeCipherSpec(buffer, pkt) |
+ dissectAlert(buffer, pkt) |
+ dissectHandshake(buffer, pkt, tree) |
+ dissectRecord(buffer, pkt) |
+ MyProtocol.dissector(buffer, pkt, tree) |
- 列出测试目的、测试内容、测试结果,并对结果进行分析
测试目的:验证插件对于不同类型的TLS协议记录的解析准确性。
测试内容:输入不同类型的TLS协议记录数据包,检查插件解析出的协议类型和信息是否准确。
测试结果分析:分析每种类型的TLS协议记录数据包解析的结果,确认是否满足预期,并进行结果分析。
三、设计特色
该插件通过解析不同类型的 TLS 协议记录,提供了对 Change Cipher Spec、Alert、Handshake 和 Record 协议的解析。主要设计特色包括提供准确的协议解析结果,能够帮助网络管理员或安全分析人员更好地理解和分析 TLS 协议相关的数据包。
四、源代码及注释
local my_protocol = Proto("MyProtocol", "My Protocol")
-- 子函数:处理TLS Change Cipher Spec Protocol
local function dissectChangeCipherSpec(buffer, pkt)
pkt.cols.protocol:set("TLS-Change Cipher Spec")
end
-- 子函数:处理TLS Alert Protocol
local function dissectAlert(buffer, pkt)
local level = buffer(5, 1):uint()
local description = buffer(6, 1):uint()
pkt.cols.protocol:set("TLS-Alert")
if level == 0x01 then
pkt.cols.info:set("Level: Warning")
if description == 0x0A then
pkt.cols.info:append(" - Description: Unexpected Message")
end
elseif level == 0x02 then
pkt.cols.info:set("Level: Fatal")
if description == 0x46 then
pkt.cols.info:append(" - Description: Protocol Version")
end
else
pkt.cols.info:set("Encrypted Alert")
end
end
local function dissectHandshake(buffer, pkt, tree)
local handshakeType = buffer(5, 1):uint()
pkt.cols.protocol:set("TLS-Handshake")
if handshakeType == 0x01 then
pkt.cols.info:set("Client Hello")
elseif handshakeType == 0x02 then
pkt.cols.info:set("Server Hello")
local isCertificate = buffer(0x5c, 1):uint()
if isCertificate == 0x0b then
pkt.cols.info:append(" - Certificate")
end
-- 读取加密算法和临时密钥
local cipherSuite = buffer(76, 2):uint()
local keyExchange = buffer(15, 28):bytes() -- 偏移调整
local keyExchangeString = tostring(keyExchange)
-- 打印加密算法和临时密钥到解析树中
local treeItem = tree:add(my_protocol, buffer(), "Encryption Algorithm and Temporary Key")
if cipherSuite == 0x003c then
treeItem:add("RSA Authentication Algorithm:", "RSA Authentication Algorithm Used")
treeItem:add("AES Encryption Algorithm:", "AES Encryption Algorithm Used")
treeItem:add("SHA-256 Integrity Protection Algorithm:", "SHA-256 Integrity Protection Algorithm Used")
treeItem:add("Key Exchange:", keyExchangeString)
end
elseif handshakeType == 0x10 then
pkt.cols.info:set("Key Exchange")
local isChangeCipherSpec = buffer(0x010b, 1):uint()
if isChangeCipherSpec == 0x14 then
pkt.cols.info:append(" - Change Cipher Spec")
end
end
end
-- 子函数:处理TLS Record Protocol
local function dissectRecord(buffer, pkt)
pkt.cols.protocol:set("TLS-Record Data")
end
-- 主函数
function my_protocol.dissector(buffer, pkt, tree)
local typer = buffer(0, 1):uint()
if typer == 0x14 then
dissectChangeCipherSpec(buffer, pkt)
elseif typer == 0x15 then
dissectAlert(buffer, pkt)
elseif typer == 0x16 then
dissectHandshake(buffer, pkt, tree)
elseif typer == 0x17 then
dissectRecord(buffer, pkt)
end
end
-- 注册端口
local tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(443, my_protocol)
五、个人报告
- 小组贡献排序及依据(每个人的工作量):
20211410周意凯:项目规划、主体代码编写
20211421文鑫河:代码完善、调试程序、收集实验成果
20211417黄琪凯:资料搜索整理、实验报告撰写、总结实验经验 - 个人报告(20211421文鑫河):
1)、列出自己的贡献
代码完善
调试程序
收集实验成果
2)、列出设计中遇到的问题及解决方法
问题:对wireshark抓包分析不熟练,不理解为什么TLS数据偏移量直接从0开始,忽略前面的TCP和IP头
解决办法:上网查找资料,加上询问gpt学习,如果TLS考虑了底层协议头的偏移,可能会增加实现的复杂性,并引入潜在的安全风险。通过从0开始的偏移,TLS可以更简洁地处理数据。通过不依赖于底层协议头的偏移,TLS可以更灵活地与不同的网络协议栈集成。
问题:不清楚相关加密算法在TLS协议数据中的体现
解决办法:通过查阅相关资料,可以得知加密算法说明在TLS中占两个字节,如Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)
3)、列出调试过程中遇到的主要问题,并说明解决方法;
问题:从TLS数据中提取的字节无法正常进行比较
解决办法:询问GPT得知,需将提取到的数据转化为uint无符号类型才可以进行比较
问题:提取到的临时密钥数据显示为乱码
解决办法:询问GPT错误情况得知,临时密钥字节数相对较多,需转化为string类型即可正常显示
4)、设计体会及收获
通过这次课程设计,我首先对lua语言有了一定了解。Lua语言确实相对来说比较简单,只需要阅读几篇文章就可以上手编写。通过对lua与wireshark的综合学习,我学会了使用lua提取wireshark数据包中的特定字节信息并进行转化,还可以随意修改wireshark中的protocol、info以及tree中的相关内容。其次,我还对TLS协议以及加密算法有了一些了解。我知道了TLS协议包含的四种子协议:告警协议,握手协议,密钥规格变更协议,记录层协议。同时对相关加密算法在TLS中的字节体现有了认识,如本次课设中的Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c),还有其他诸如临时密钥,证书等TLS数据中的内容。但是这次课设一开始并不顺利,起初没有弄明白具体要做啥,在D1解析数据中疯狂寻找证书信息,但D1里面并没有TLS/SSL协议。后面弄清楚了目的,编写代码就非常简单了,只需要提取数据,进行比对,然后更改信息就行了。
总得来说,通过这次课设,我学到了很多课外的但是专业相关的知识,这对我以后的信息安全工作有一定的助力。
5)、参考资料
https://blog.csdn.net/ryanzzzzz/article/details/129934536
https://baijiahao.baidu.com/s?id=1758641807495130037&wfr=spider&for=pc&searchword=ssl tls协议的记录层字段
https://blog.csdn.net/thlzjfefe/article/details/133041339?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170182462516800222886460%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170182462516800222886460&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-133041339-null-null.142v96pc_search_result_base3&utm_term=wireshark%E6%AF%8F%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%8C%85%E5%88%86%E6%9E%90TLS%2FSSL%E5%8D%8F%E8%AE%AE%E7%B1%BB%E5%9E%8B&spm=1018.2226.3001.4187