前言
隨著物聯(lián)網(wǎng)的發(fā)展,連接到互聯(lián)網(wǎng)的設(shè)備數(shù)量呈指數(shù)增長,物聯(lián)網(wǎng)信息安全越來越重要。
因此,TLS 逐漸成為物聯(lián)網(wǎng)通訊的標(biāo)配。但是 TLS 是加密傳輸,這給調(diào)試增加了一定的難度。
筆者最近工作中一直用到 HTTPS,但是苦于 wireshark 只能抓取 HTTP 的明文數(shù)據(jù)包,無法抓取 HTTPS 的數(shù)據(jù)包,于是就有了這篇文章,在 RT-Thread 系統(tǒng)上,使用 wireshark 抓取 HTTPS 數(shù)據(jù)包.
簡單介紹TLS1.2握手和協(xié)商過程
client hello
客戶端向服務(wù)器發(fā)送 tls 版本,加密方式,客戶端隨機(jī)數(shù)等。
server hello
服務(wù)器端返回協(xié)商信息的結(jié)果,包括使用的 tls 版本,使用哪一種加密方式(cipher suite), 服務(wù)器的隨機(jī)數(shù)(random_s)。
證書校驗
客戶端驗證證書的合法性,如果驗證通過才會進(jìn)行后續(xù)通訊
client key exchange
客戶端發(fā)送協(xié)商密鑰發(fā)送給服務(wù)端
server change cipher spec
服務(wù)器通知客戶端以后使用此協(xié)商密鑰進(jìn)行加密
hangshake message finish
客戶端接收服務(wù)器發(fā)送的握手消息,驗證通過后,握手完成。
此后的通訊都采用協(xié)商密鑰和加密算法通訊。
設(shè)備端解密https數(shù)據(jù)包
查閱文檔得知,wireshark 支持將 tls 會話中使用的密鑰保存到外部文件中,供 wireshark 使用。
流程圖
在沒有抓包路由器的情況下,使用方案A, 電腦創(chuàng)建 wifi 熱點(diǎn),設(shè)備端連接電腦熱點(diǎn),并發(fā)起 https 請求,服務(wù)器接收到請求,向設(shè)備端發(fā)出響應(yīng),設(shè)備端根據(jù)響應(yīng)的內(nèi)容,計算出密鑰, 并將設(shè)備端隨機(jī)數(shù)和密鑰通過 udp 發(fā)送到 pc,保存到 sslkey.log 文件,wireshark 根據(jù)設(shè)備端隨機(jī)數(shù)和密鑰即可將 tls 數(shù)據(jù)包解密。
配置wireshark
新建 sslkey.log 文件,并配置為 windows 系統(tǒng)變量。
配置 wireshark編輯->首選項->protocols->SSL(version 2.4.9),更高版本的 wireshark 操作步驟為:編輯->首選項->protocols->TLS
配置好之后重啟 wireshark
按照下面的格式,向 sslkey.log 寫入客戶端隨機(jī)數(shù)和密鑰, 即可使 wireshark 解密 tls 數(shù)據(jù)包.
1CLIENT_RANDOM5a497axx3756f69b4axxx2CLIENT_RANDOM5dfb96xxb07a9da164xxx3CLIENT_RANDOM5a497axx12e14567b9xxx4CLIENT_RANDOM55c00xxxb07a9da164xxx5CLIENT_RANDOM5a497xxxb03ca0d5fcxxx
數(shù)據(jù)的含義如下:
CLIENT_RANDOM: 固定標(biāo)簽(支持 SSL 3.0, TLS 1.0, 1.1, 1.2)
第二個參數(shù):客戶端隨機(jī)數(shù)(random_c)32個字節(jié),編碼為64個十六進(jìn)制字符
第三個參數(shù): 48字節(jié)的協(xié)商密鑰,編碼為96個十六進(jìn)制字符
接下來只要找到設(shè)備上的客戶端隨機(jī)數(shù)和密鑰,保存到 syskey.log,即可通過 wireshark 解密 tls 數(shù)據(jù)包。
下面函數(shù),保存了客戶端隨機(jī)數(shù)和密鑰信息。
ssl_tls.c
1intmbedtls_ssl_derive_keys(mbedtls_ssl_context*ssl) 2{ 3... 4 5MBEDTLS_SSL_DEBUG_MSG(3,("ciphersuite=%s", 6mbedtls_ssl_get_ciphersuite_name(session->ciphersuite))); 7MBEDTLS_SSL_DEBUG_BUF(3,"mastersecret",,48); 8MBEDTLS_SSL_DEBUG_BUF(4,"randombytes",handshake->randbytes,64); 9MBEDTLS_SSL_DEBUG_BUF(4,"keyblock",keyblk,256);10...11}
其中session->master保存的是密鑰,handshake->randbytes保存的是客戶端和服務(wù)器的隨機(jī)數(shù)。也就是說,將這兩個參數(shù)保存到 sslkey.log 文件中,那么 wireshark 就能解密設(shè)備上的https數(shù)據(jù)包。
編寫 udp 客戶端,將客戶端隨機(jī)數(shù)和密鑰發(fā)送到 windows,windows 編寫 udp server python 腳本,用于接收數(shù)據(jù),并將數(shù)據(jù)寫入 sslkey.log 文件
1#include
udpserver.py
1importsocket 2 3BUFSIZ=1024 4ip_port=('0.0.0.0',5000) 5file=r'd:\work\tmp\sslkey.log' 6 7server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 8server.bind(ip_port) 910whileTrue:11random_c,client_addr=server.recvfrom(BUFSIZ)12master,client_addr=server.recvfrom(BUFSIZ)13print("openfile"+""+file)14write_data='CLIENT_RANDOM'+str(random_c,encoding='utf-8')+''+str(master,encoding='utf-8')15print(write_data)1617withopen(file,'a')asf:18f.write(write_data)19print("closefile"+""+file)
需要注意的是,設(shè)備使用上述方法解密 https 的數(shù)據(jù)包,加密算法目前只能是 RSA,所以還需要強(qiáng)制客戶端發(fā)送的加密方式(cipher suites)只能是 RSA。
修改packages\mbedtls-latest\ports\inc\tls_config.h,注釋掉如下宏定義:
1//#defineMBEDTLS_KEY_EXCHANGE_PSK_ENABLED2//#defineMBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED3//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED4//#defineMBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED5//#defineMBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED6//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED7//#defineMBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED8//#defineMBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED9//#defineMBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
這樣就可以確??蛻舳撕头?wù)器只使用 RSA 的加密方式進(jìn)行通信, 但是部分服務(wù)器不支持 RSA 的方式,握手過程會失敗。
將udpcli_send函數(shù)添加到mbedtls_ssl_derive_keys函數(shù)中,如下所示
1MBEDTLS_SSL_DEBUG_MSG(3,("ciphersuite=%s", 2mbedtls_ssl_get_ciphersuite_name(session->ciphersuite))); 3MBEDTLS_SSL_DEBUG_BUF(3,"mastersecret",session->master,48); 4MBEDTLS_SSL_DEBUG_BUF(4,"randombytes",handshake->randbytes,64); 5MBEDTLS_SSL_DEBUG_BUF(4,"keyblock",keyblk,256); 6 7//replaceyouripaddress 8udpcli_send("192.168.123.206",handshake->randbytes,32,session->master,48); 910mbedtls_zeroize(handshake->randbytes,sizeof(handshake->randbytes));
windows 運(yùn)行 python 腳本(注意修改sslkey.log的文件路徑)
1pythonudpserver.py
設(shè)備聯(lián)網(wǎng)成功后,在 MSH 終端輸入
1\|/ 2-RT-ThreadOperatingSystem 3/|\4.0.1buildApr22019 42006-2019Copyrightbyrt-threadteam 5lwIP-2.0.2initialized! 6[I/SAL_SOC]SocketAbstractionLayerinitializesuccess. 7 8........... 9msh/mnt/sdcard>10msh/mnt/sdcard>11msh/mnt/sdcard>12msh/mnt/sdcard>wgethttps://www.rt-thread.com/service/rt-thread.txt1.txt
wireshark抓包
加密的數(shù)據(jù)包
解密的數(shù)據(jù)包
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44671瀏覽量
373691 -
路由器
+關(guān)注
關(guān)注
22文章
3732瀏覽量
113847 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
261瀏覽量
24398
原文標(biāo)題:基于RT-Thread 使用 wireshark 抓取 HTTPS 數(shù)據(jù)包
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論