本文章中所有內容僅供學習交流,抓包內容、敏感網址、資料介面均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關,若有侵權,請聯絡我立即刪除!
在當今網際網路時代,保護通訊資料的安全性變得至關重要。為了建立安全的通訊連線,TLS(Transport Layer Security)協定被廣泛應用於Web瀏覽器、移動應用和其他網路應用程式中。而與此同時,識別和分析這些TLS通訊也成為網路安全研究和威脅情報分析的重要任務之一。JA3指紋作為一種獨特的指紋識別技術,為我們提供了一種有效的手段來識別和分析TLS通訊。
JA3指紋(JA3 fingerprint)是一種用於網路流量分析的技術,旨在識別和分類不同的TLS(Transport Layer Security)使用者端。TLS是一種常用於加密網際網路通訊的協定,它提供了安全的資料傳輸和身份驗證機制。
JA3指紋通過分析TLS握手階段中使用者端和伺服器之間交換的握手訊息來建立一個唯一的指紋。在TLS握手期間,使用者端和伺服器交換一系列的握手訊息,包括支援的TLS版本、密碼套件、壓縮演演算法和TLS擴充套件等資訊。JA3指紋將這些訊息中的特定欄位進行雜湊處理,生成一個字串來表示使用者端的TLS設定。
由於不同的TLS使用者端在握手訊息中的欄位值可能會有所不同,因此它們生成的JA3指紋也會有所不同。這使得JA3指紋可以用於識別和區分不同型別的TLS使用者端,例如Web瀏覽器、移動應用程式、惡意軟體等。
通過分析網路流量中的JA3指紋,安全分析人員和網路管理員可以檢測和識別異常的TLS行為、惡意軟體的活動或者潛在的網路攻擊。然而,值得注意的是,JA3指紋並非絕對可靠,因為攻擊者可以通過更改TLS
JA3指紋由TLS握手訊息中的特定欄位值組成,並使用逗號進行分隔。以下是JA3指紋的一般格式和組成:
JA3_HASH,JA3_SSLVersion,JA3_CipherSuites,JA3_Extensions
JA3_HASH:這是根據TLS握手訊息中的使用者端Hello訊息計算得出的雜湊值,通常使用MD5或SHA256演演算法生成。JA3_HASH用於唯一標識TLS使用者端的設定。
JA3_SSLVersion:這是使用者端支援的TLS版本號。例如,TLS 1.2的版本號是0x0303,TLS 1.3的版本號是0x0304。
JA3_CipherSuites:這是使用者端支援的加密套件列表。加密套件指定了用於加密通訊的加密演演算法和金鑰交換協定。每個加密套件都有一個唯一的標識號。在JA3指紋中,多個加密套件由逗號分隔。
JA3_Extensions:這是使用者端在TLS握手訊息中傳送的TLS擴充套件列表。TLS擴充套件提供了額外的功能和安全性選項。常見的擴充套件包括Server Name Indication (SNI)、Supported Elliptic Curves、Supported Point Formats等。在JA3指紋中,多個擴充套件由逗號分隔。
以下是一個範例JA3指紋的格式:
eb6f49e8db7ad1809f885d12232f4855,0x0303,0xc02c,c02b,c02f,c00a,c009,c013,c014,0xff01,0x0000
在上述範例中,JA3_HASH為"eb6f49e8db7ad1809f885d12232f4855",JA3_SSLVersion為0x0303(表示TLS 1.2),JA3_CipherSuites包括多個加密套件,JA3_Extensions為空。
JA3指紋和JA3S指紋是兩種相關但略有不同的TLS指紋技術。
JA3指紋(Just Another SSL/TLS Fingerprint):它是根據使用者端傳送的TLS握手訊息中的欄位值生成的指紋。這些欄位包括SSL/TLS版本、加密套件、TLS擴充套件等資訊。JA3指紋用於識別和分類不同的TLS使用者端。
JA3S指紋(Just Another SSL/TLS Signature):它是基於伺服器在TLS握手過程中傳送的伺服器Hello訊息中的欄位值生成的指紋。與JA3指紋不同,JA3S指紋用於識別和分類不同的TLS伺服器。
JA3指紋和JA3S指紋的生成方法類似,都是通過計算握手訊息中的欄位值的雜湊值來生成唯一的指紋。它們的區別在於指紋生成的訊息來源不同:JA3指紋是基於使用者端Hello訊息,而JA3S指紋是基於伺服器Hello訊息。
這兩種指紋技術在網路安全領域中被廣泛應用,可以用於檢測異常的TLS行為、識別惡意軟體和網路攻擊等。同時,它們也有一定的侷限性,因為攻擊者可以偽造或篡改握手訊息中的欄位值,以逃避指紋識別。因此,在使用JA3和JA3S指紋進行分析時,需要結合其他技術和方法進行驗證和確認。
JA3和JA3S工具現在已經開源
下載地址: https:https://github.com/salesforce/ja3
TLS握手過程中包含了多個關鍵資訊,這些資訊對於建立安全連線和進行身份驗證非常重要。以下是TLS握手過程中的一些關鍵資訊:
使用者端支援的TLS版本:使用者端在ClientHello訊息中指定其支援的TLS版本,例如TLS 1.2或TLS 1.3。伺服器會根據使用者端支援的版本選擇適當的協定版本進行通訊。
加密套件(Cipher Suite):加密套件定義了在通訊過程中使用的加密演演算法和金鑰交換演演算法。它包括對稱加密演演算法(如AES、DES)、金鑰交換演演算法(如RSA、Diffie-Hellman)和訊息認證演演算法(如HMAC)等。
亂數(Random):使用者端和伺服器都會生成一個亂數,用於生成對稱加密演演算法的金鑰、初始化向量(IV)和計算訊息鑑別碼(MAC)。亂數的目的是增加通訊的隨機性和安全性。
數位憑證(Digital Certificate):伺服器在ServerHello訊息中會傳送數位憑證,證書用於驗證伺服器的身份。證書包含伺服器的公鑰和證書頒發機構(CA)的簽名,使用者端可以使用該公鑰驗證伺服器的身份和建立安全通訊。
使用者端金鑰交換(Client Key Exchange):在握手過程中,使用者端可能需要傳送金鑰交換相關的資訊,用於與伺服器協商對談金鑰。這可以是一個PreMaster Secret(預主金鑰)或Diffie-Hellman交換的公鑰。
對談識別符號(Session Identifier):伺服器可以為成功建立的對談分配一個唯一的對談識別符號,以便在後續的握手過程中快速恢復對談狀態,從而提高效能。
TLS擴充套件(TLS Extensions):TLS擴充套件提供了額外的功能和安全性選項。常見的擴充套件包括Server Name Indication(SNI,用於指定伺服器的域名)、支援的加密演演算法、應用層協定協商(ALPN)等。
這些關鍵資訊在TLS握手期間的交換和協商,確保了通訊的機密性、完整性和身份驗證,從而建立了安全的TLS連線。
生成JA3指紋需要從TLS握手資訊中提取關鍵欄位,並對這些欄位進行雜湊處理。以下是生成JA3指紋的一般步驟:
提取TLS握手訊息中的關鍵欄位:從使用者端Hello訊息中提取以下欄位值:
- 支援的TLS版本(SSLVersion)
- 加密套件(CipherSuites)
- TLS擴充套件(Extensions)
將提取的欄位值組合成一個字串:將上述欄位值按照特定的順序連線起來,使用逗號進行分隔。例如:SSLVersion,CipherSuites,Extensions。
對組合的字串進行雜湊處理:使用特定的雜湊演演算法,例如MD5或SHA256,對上述組合的字串進行雜湊處理,生成一個雜湊值。
將雜湊值作為JA3指紋:將生成的雜湊值作為最終的JA3指紋。
需要注意的是,不同的實現和工具可能對欄位的順序和格式有所不同。為了確保一致性,建議使用廣泛接受的規範來提取欄位和生成JA3指紋。
範例
假設提取的欄位值為:
SSLVersion: 0x0303
CipherSuites: c02c,c02b,c02f,c00a,c009,c013,c014
Extensions: 0xff01,0x0000
組合的字串為:0x0303,c02c,c02b,c02f,c00a,c009,c013,c014,0xff01,0x0000
通過MD5雜湊處理上述字串得到雜湊值:eb6f49e8db7ad1809f885d12232f4855
最終的JA3指紋為:eb6f49e8db7ad1809f885d12232f4855
實際實現中可能會有一些細微的差異。
JA3指紋具有一定的可變性和唯一性,這取決於TLS使用者端的設定和握手訊息中的欄位值。
不同的TLS使用者端可能支援不同的TLS版本、加密套件和TLS擴充套件,因此它們的JA3指紋會有所不同。
特定的TLS使用者端可能會在不同的環境或設定下生成不同的JA3指紋。例如,同一款Web瀏覽器在不同的作業系統、版本或外掛設定下生成的JA3指紋可能會有差異。
在大多數情況下,每個TLS使用者端的設定會生成一個唯一的JA3指紋。由於握手訊息中的欄位值是在握手期間由使用者端動態生成的,因此不同的設定通常會產生不同的JA3指紋。
JA3指紋的雜湊演演算法(如MD5或SHA256)通常能夠保證較低的碰撞概率,即不同的設定生成相同的指紋的可能性較低。
然而,需要注意的是,JA3指紋並不是絕對唯一和確定性的識別符號,也存在一些限制和侷限性:
攻擊者可以通過修改握手訊息中的欄位值來更改JA3指紋,從而規避指紋識別。
同一款TLS使用者端的不同版本或修補程式更新可能會導致生成不同的JA3指紋,因此在比較和匹配JA3指紋時需要考慮版本和細微差異。
由於新的TLS版本、加密套件和擴充套件的釋出,TLS使用者端的設定也可能會發生變化,進而影響JA3指紋的唯一性。
綜上所述,JA3指紋在識別和分類TLS使用者端方面提供了一種有用的方法,但在實際應用中需要綜合考慮其他因素並進行進一步驗證,以確保準確性和可靠性。
具體分為兩部分
網路安全領域的應用
威脅情報分析
惡意軟體檢測
流量分析和監測
應用領域的應用
應用識別和版本檢測
通訊指紋的對比和識別
封包的分類和過濾
JA3指紋:eb6f49e8db7ad1809f885d12232f4855
實用技巧:
JA3指紋的比對:通過收集和比對網路流量中的JA3指紋,可以檢測和識別不同型別的TLS使用者端。例如,您可以建立一個JA3指紋資料庫,並與實時的網路流量進行比對,以發現異常或惡意的TLS行為。
惡意軟體識別:JA3指紋可用於檢測和分類惡意軟體的通訊行為。通過比對已知惡意軟體的JA3指紋,您可以快速識別並阻止類似指紋的流量,以提高網路安全性。
威脅情報分析:JA3指紋可以與威脅情報平臺進行整合,以獲取有關特定指紋的更多資訊。這樣,您可以瞭解該指紋是否與已知的惡意活動、攻擊或特定組織相關聯。
異常檢測:通過監視網路流量中的JA3指紋變化,您可以識別到不尋常的TLS行為。例如,當某個JA3指紋頻繁變化或與正常流量有明顯差異時,可能表明存在潛在的安全問題或攻擊行為。
風險評估和存取控制:在安全環境中,根據JA3指紋可以評估使用者端的安全性,並採取相應的存取控制策略。如果某個使用者端的JA3指紋與高風險的設定相關,可以採取額外的安全措施,例如強制進行多因素身份驗證或限制其存取許可權。
安全事件響應:JA3指紋可以用於網路安全事件的響應和調查。在檢測到安全事件後,可以使用JA3指紋追蹤相關的TLS使用者端,並識別受影響的系統或使用者,從而進行進一步的分析和應對。
注意,JA3指紋僅作為一種輔助工具和指標,應與其他安全技術和方法相結合使用,以全面評估和提高網路安全性。
JA3指紋具有隱私保護和加密協定選擇以及JA3指紋的可變性和易受干擾性
以下是常見的限制和隱私考慮:
設定和環境的影響:JA3指紋受到TLS使用者端的設定和環境影響。不同的設定和環境可能導致不同的JA3指紋,這可能增加了誤報或漏報的風險。
版本和升級的影響:TLS使用者端的版本和升級可能導致JA3指紋的變化。對於同一款TLS使用者端的不同版本,其生成的JA3指紋可能會有差異。這需要在分析和比對JA3指紋時考慮版本和細微差異。
隱私洩露風險:JA3指紋可以洩露關於使用者端的一些資訊,例如所使用的TLS版本、加密套件和擴充套件。這些資訊可能被用於識別和追蹤特定的使用者端,從而對隱私造成風險。特別是在面對具有大規模網路流量的環境時,JA3指紋的唯一性可能導致識別個體使用者。
指紋偽造:攻擊者有可能通過修改TLS握手訊息中的欄位值來偽造JA3指紋,以規避指紋識別和防禦措施。這可能降低JA3指紋的可靠性和準確性,因此在使用JA3指紋時需要謹慎驗證和結合其他資訊進行分析。
資料採集和儲存:收集和儲存大量的JA3指紋資料可能需要相應的資源和隱私保護措施。確保合規性和資料安全性非常重要,包括資料保護、加密和存取控制等方面的考慮。
用下某網站做測試 且此網站也有有Ja3指紋加密的
aHR0cHM6Ly9nZ3p5LmppYW5neGkuZ292LmNuL3h3ZHQvMDAxMDAyL3NlYzEuaHRtbA==
!注意 fiddler要想抓Ja3-tls指紋 包
要把CONNECTS選項取消勾選,不然抓不到指紋包
然後我們抓到了很多指紋包,然後我們挨個開啟看看
然後我們看到很多的加密演演算法,還有加密方式
其實這種包其實本質上就是加入黑名單
已經tls的版本也有
相比較fiddler charles抓到的包就很有限了。
但是操作也更加的簡單了
我們直接開啟charles 然後重新整理網站
這裡直接就顯示了tls的資訊
我們接著點開詳細資訊 這裡顯示了tls的加密方式 已經加密的兩種方式.
這兩種抓包方式終究還是圖一樂,真要抓包還得看wireshark
步驟如下
查詢網站IP地址 ======> cmd ======> ping xxx.com =====> 複製IP地址
開啟wireShark抓包,選擇抓取的網路卡
重新整理瀏覽器
在過濾器中輸入 ip.addr == 你要檢視的ip地址 具體如下圖
找到一個Client hello的包
檢視詳細資訊
最下面的是hash指紋 和詳細指紋資訊
把這個指紋fullstring複製出來
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
這個指紋資訊就是網站可以執行的指紋資訊
指紋資訊分析其實很簡單,
我們接下來用三種方式去獲取這個指紋資訊
也就是上文的771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
這裡我們選擇直接用上文抓包抓到的指紋
還有一種方式
https://tls.browserleaks.com/json 直接去網站看自己的瀏覽器指紋也是可以的
由於上面已經獲取了瀏覽器的指紋了,我們直接就拿來用了
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
接著我們使用requests原生庫,即正常存取,攜帶基本的引數去請求即可
我們使用程式碼去存取下這個網站https://tls.browserleaks.com/json
import requests
r = requests.get('https://tls.browserleaks.com/json', verify=True)
print(r.text)
結果
{
"ja3_hash": "8d9f7747675e24454cd9b7ed35c58707",
"ja3_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2",
"ja3n_hash": "a790a1e311289ac1543f411f6ffceddf",
"ja3n_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-10-11-13-16-21-22-23-43-45-49-51,29-23-30-25-24,0-1-2",
"akamai_hash": "",
"akamai_text": ""
}
所以這個指紋是
771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2
我們再試試 Python有關SSL的魔改庫
其實這類庫有很多
簡單舉例兩個吧 一個是 curl_cffi
一個是 tls_client
tls_client : https://pypi.org/project/tls-client/
curl_cffi: https://pypi.org/project/curl-cffi/
我們這裡使用curl_cffi 去存取一下看看這個指紋是什麼
from curl_cffi import requests
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101")
print(r.text)
結果
{
"ja3_hash": "cd08e31494f9531f560d64c695473da9",
"ja3_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0",
"ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc",
"ja3n_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-21-23-27-35-43-45-51-17513-65281,29-23-24,0",
"akamai_hash": "4f04edce68a7ecbe689edce7bf5f23f3",
"akamai_text": "1:65536;3:1000;4:6291456;6:262144|15663105|0|m,a,s,p"
}
而這個指紋是
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0
然後我們把這三個指紋拿出來做個對比
可以清楚地看到 python的魔改庫和瀏覽器的指紋是長度是一樣的。
這樣我們可以知道了,這個指紋長度只要和瀏覽器相同就可以了。
我們使用魔改庫存取開頭所要存取的網站實驗一下
發現可以正常存取
那該如何不借助魔改庫去完成Ja3網站的解密呢
可以通過修改ssl的通訊端 使得防火牆黑名單失效
從而保證指紋長度一致 即可完成解密
臨時方案:
注意 requests庫必須在2.4 以上版本 不然會失敗
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS ='ALL'
修改了requests內部包的 ssI裡面的通訊端設定,使防火牆黑名單失效
動態 DEFAULT CIPHERS :
https://www.openssl.org/docs/man1.1.1/man1/openssl-ciphers.html
https://support.huaweicloud.com/bestpractice-waf/waf_06_0012.html
這種方法國內處理就已經夠了
# 預設 cipher 在這裡定義:https://github.com/encode/httpx/blob/master/httpx/_config.py
import ssl
import httpx
# create an ssl context
ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)
CIPHERS = 'DH+AES:RSA+AES'
ssl_context.set_ciphers(CIPHERS)
r = httpx.get('https://tls.browserleaks.com/json', verify=ssl_context)
print(r.text)
非臨時方案:
自設ssl,並覆寫requests中的類的一些方法
https://stackoverflow.com/questions/60407057/python-requests-being-fingerprinted
深入理解requests中 建立 tls的過程
先抓包看下正常的存取 tls,和requests存取的區別
我們需要單步偵錯requests原始碼,並且想辦法修改 tls存取過程中的UA
按照上面的思路,加上對 ssl的理解,就可以實現一個針對於 tls檢測的高並行方案
JA3指紋是一種通過提取和雜湊TLS握手訊息中的關鍵欄位來標識和識別TLS使用者端的方法。它可以用於識別不同型別的TLS使用者端、檢測惡意軟體、進行威脅情報分析、異常檢測和風險評估等。
然而,JA3指紋也有一些限制和隱私考慮。它受到TLS使用者端設定和環境的影響,可能受到版本和升級的影響。此外,使用JA3指紋可能洩露一些使用者端資訊,存在隱私風險,並且有可能被攻擊者偽造。
在使用JA3指紋時,需要綜合考慮其實用性和隱私風險。適當的資料採集和儲存措施、資料保護、加密和隱私保護措施都是重要的考慮因素。此外,JA3指紋應作為輔助工具和指標,並結合其他安全技術和方法來提高網路安全性。
總之,JA3指紋提供了一種用於標識和識別TLS使用者端的方法,可以在網路安全領域的多個方面發揮作用,但需要在實際應用中權衡其實用性、準確性和隱私風險