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

该代码是一个用于解析 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()
  1. 面向对象技术可以用UML建模
MyProtocol
+ dissectChangeCipherSpec(buffer, pkt)
+ dissectAlert(buffer, pkt)
+ dissectHandshake(buffer, pkt, tree)
+ dissectRecord(buffer, pkt)
+ MyProtocol.dissector(buffer, pkt, tree)
  1. 列出测试目的、测试内容、测试结果,并对结果进行分析
    测试目的:验证插件对于不同类型的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)

五、个人报告

  1. 小组贡献排序及依据(每个人的工作量):
    20211410周意凯:项目规划、主体代码编写
    20211421文鑫河:代码完善、调试程序、收集实验成果
    20211417黄琪凯:资料搜索整理、实验报告撰写、总结实验经验
  2. 个人报告(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