前言
隨著物聯網的發展,連接到互聯網的設備數量呈指數增長,物聯網信息安全越來越重要。
因此,TLS 逐漸成為物聯網通訊的標配。但是 TLS 是加密傳輸,這給調試增加了一定的難度。
筆者最近工作中一直用到 HTTPS,但是苦于 wireshark 只能抓取 HTTP 的明文數據包,無法抓取 HTTPS 的數據包,于是就有了這篇文章,在 RT-Thread 系統上,使用 wireshark 抓取 HTTPS 數據包.
簡單介紹TLS1.2握手和協商過程
client hello
客戶端向服務器發送 tls 版本,加密方式,客戶端隨機數等。
server hello
服務器端返回協商信息的結果,包括使用的 tls 版本,使用哪一種加密方式(cipher suite), 服務器的隨機數(random_s)。
證書校驗
客戶端驗證證書的合法性,如果驗證通過才會進行后續通訊
client key exchange
客戶端發送協商密鑰發送給服務端
server change cipher spec
服務器通知客戶端以后使用此協商密鑰進行加密
hangshake message finish
客戶端接收服務器發送的握手消息,驗證通過后,握手完成。
此后的通訊都采用協商密鑰和加密算法通訊。
設備端解密https數據包
查閱文檔得知,wireshark 支持將 tls 會話中使用的密鑰保存到外部文件中,供 wireshark 使用。
流程圖
在沒有抓包路由器的情況下,使用方案A, 電腦創建 wifi 熱點,設備端連接電腦熱點,并發起 https 請求,服務器接收到請求,向設備端發出響應,設備端根據響應的內容,計算出密鑰, 并將設備端隨機數和密鑰通過 udp 發送到 pc,保存到 sslkey.log 文件,wireshark 根據設備端隨機數和密鑰即可將 tls 數據包解密。
配置wireshark
新建 sslkey.log 文件,并配置為 windows 系統變量。
配置 wireshark編輯->首選項->protocols->SSL(version 2.4.9),更高版本的 wireshark 操作步驟為:編輯->首選項->protocols->TLS
配置好之后重啟 wireshark
按照下面的格式,向 sslkey.log 寫入客戶端隨機數和密鑰, 即可使 wireshark 解密 tls 數據包.
1CLIENT_RANDOM5a497axx3756f69b4axxx2CLIENT_RANDOM5dfb96xxb07a9da164xxx3CLIENT_RANDOM5a497axx12e14567b9xxx4CLIENT_RANDOM55c00xxxb07a9da164xxx5CLIENT_RANDOM5a497xxxb03ca0d5fcxxx
數據的含義如下:
CLIENT_RANDOM: 固定標簽(支持 SSL 3.0, TLS 1.0, 1.1, 1.2)
第二個參數:客戶端隨機數(random_c)32個字節,編碼為64個十六進制字符
第三個參數: 48字節的協商密鑰,編碼為96個十六進制字符
接下來只要找到設備上的客戶端隨機數和密鑰,保存到 syskey.log,即可通過 wireshark 解密 tls 數據包。
下面函數,保存了客戶端隨機數和密鑰信息。
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保存的是客戶端和服務器的隨機數。也就是說,將這兩個參數保存到 sslkey.log 文件中,那么 wireshark 就能解密設備上的https數據包。
編寫 udp 客戶端,將客戶端隨機數和密鑰發送到 windows,windows 編寫 udp server python 腳本,用于接收數據,并將數據寫入 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)
需要注意的是,設備使用上述方法解密 https 的數據包,加密算法目前只能是 RSA,所以還需要強制客戶端發送的加密方式(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
這樣就可以確保客戶端和服務器只使用 RSA 的加密方式進行通信, 但是部分服務器不支持 RSA 的方式,握手過程會失敗。
將udpcli_send函數添加到mbedtls_ssl_derive_keys函數中,如下所示
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 運行 python 腳本(注意修改sslkey.log的文件路徑)
1pythonudpserver.py
設備聯網成功后,在 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抓包
加密的數據包
解密的數據包
-
物聯網
+關注
關注
2927文章
45887瀏覽量
388064 -
路由器
+關注
關注
22文章
3814瀏覽量
115995 -
數據包
+關注
關注
0文章
269瀏覽量
24878
原文標題:基于RT-Thread 使用 wireshark 抓取 HTTPS 數據包
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
TLS-V1.2 HTTPS請求吞吐量非常差
不受信任的證書EAP-TLS錯誤5035
用2048位的密鑰大小與TLS SSL服務器通信?
深度還原TLS握手問題的排查思路和方法
TLS1.3的正式運行版本,為互聯網安全筑起了新的長城

科普:簡化SSL/TLS的握手過程
使用TLS 1.3的優勢有哪些
HTTPS協議是什么?為什么安全?
基于TLS DoIP測試開發實踐

評論