JA3核蘸、JA4指紋
1. 環(huán)境準備
1.1使用openssl生成自簽名證書
# centos, roor用戶只需以下操作
# 查看服務器是否支持openssl命令
which openssl
# 創(chuàng)建一個文件夾用來存放機構私鑰及自簽名證書文件
mkdir -p /root/ca
cd /root/ca
# 生成機構的私鑰
openssl genrsa -out ca.key 1024
# 生成機構自己的證書申請文件巍糯,文件內容會包含一些申請人信息,可以隨意填寫
openssl req -new -key ca.key -out ca.csr
# 生成自簽名證書客扎,ca機構用自己的私鑰和證書申請文件生成自己的證書祟峦,俗稱自簽名證書,
# 也可以理解為根證書
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
# 生成服務器私鑰
openssl genrsa -out server.key 1024
# 根據服務器私鑰生成證書請求文件徙鱼,文件內包含申請人信息宅楞,隨意填寫
openssl req -new -key server.key -out server.csr
# 根據CA機構生成的ca.crt根證書、CA機構私鑰ca.key袱吆、服務器證書申請文件
# server.csr生成服務端證書
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
# 最后生成服務端證書文件
# server.crt 服務端證書
# server.key 服務端私鑰
1.2使用nginx配置自簽名證書
# 把服務端證書文件拷貝到nginx conf目錄下
cp /root/ca/server.crt /opt/openresty/nginx/conf
cp /root/ca/server.key /opt/openresty/nginx/conf
# 進入到nginx工作路徑
cd /opt/openresty/nginx
# 配置一個https服務
vim conf/nginx.conf
server {
listen 443 ssl;
server_name ja-fingerprint.test.cn;
ssl_certificate server.crt;
ssl_certificate_key server.key;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("hello, ja3/ja4 fingerprint!")
}
}
}
# 測試厌衙、重啟nginx服務
./sbin/nginx -t
./sbin/nginx -s reload
1.3配置客戶端服務器,訪問自簽名https服務(192.168.187.153)
1.4wireshark抓取自簽名https服務報文
1.5 wireshark將此抓包文件另存為 ja-tcpdump.pcap文件绞绒,文件名自擬
1.6 使用 pyja3 python module從pcap文件中生成ja指紋
pip install pyja3
ja3 --json .\ja-tcpdump.pcap
我們可以看到ja3的哈希值是一樣的
2. 那什么是JA3
2.1 簡介:JA3獲取 SSL\TLS 部分報文數據婶希,讓這些數據以固定格式排列組合,最終計算出哈希值蓬衡。此哈希值是客戶端應用程序的指紋喻杈。無論惡意軟件如何改變報文、目的IP狰晚、命令參數筒饰、或者證書如何,最終該惡意軟件的指紋始終唯一家肯。
我們在兩臺centos7虛擬機上龄砰,安裝nmap的相同版本,對我們的域名 ja-fingerprint.test.cn 進行滲透,可以在wireshark里面發(fā)現這兩臺服務器的JA3指紋都是一樣的换棚。
首先在服務器B進行滲透嘗試
我們在wireshark抓包軟件中根據服務器IP以及tls過濾出Client Hello的報文式镐,可以看到這次的滲透過程中,所有的JA3指紋都是一樣的固蚤。這里筆者選擇第一個娘汞、中間一個、最后一個報文的截圖以供參考夕玩。
然后我們回到服務器C中你弦,對我們的域名進行滲透嘗試。
我們可以看到兩臺服務器對我們ja-fingerprint.test.cn的滲透燎孟,它們的指紋都是一樣的
至此禽作,我們大膽做一個的推論。如果發(fā)現TLS報文JA3和上述一致揩页,那我們就可以得出此人使用的操作系統(tǒng)是Centos7旷偿,工具是nmap這么一個結論
2.2 那么JA3為何如此可靠呢
JA3使用的是SSL Client Hello數據包中的信息來識別的客戶端,此概念在2009年就已有人提出爆侣。后續(xù)2015年 Lee Brotherston 發(fā)布了該主題的研究萍程,并且發(fā)布了FingerprintTLS,這是一款獨立工具兔仰。在后續(xù)就是JA3的作者茫负,在前人的基礎上進行改進,最終得出JA3乎赴。
下圖是Client Hello協(xié)議內的信息忍法,JA3使用紅色箭頭標記處的內容
將紅色箭頭的信息提取出來后,按照一定的順序組合无虚,最后計算得出哈希
SSLVersion缔赠、Ciphers、Extensions友题、EllipticCurves(現在稱為supported_groups)、EllipticCurvePointFormats(現在稱為 ec_point_formats)
這里我們使用自己抓包獲取的信息來做計算戴质,如下圖所示
2.2.1 首先是SSLVersion版本信息度宦,這里是 0x0303,十進制 771告匠,我們記作A戈抄。
2.2.2 再然后是CipherSuites信息,這里我們可以看到客戶端總共支持109種加密套件方法后专,我們全部列以十六進制的形式先列出來划鸽。
0000 00 05 00 04 00 02 00 01 00 16 00 33 00 39 00 3a
0010 00 18 00 35 00 0a 00 1b 00 2f 00 34 c0 10 c0 06
0020 c0 15 c0 0b c0 01 00 3b c0 30 c0 2c c0 28 c0 24
0030 c0 14 c0 0a 00 a5 00 a3 00 a1 00 9f 00 6b 00 6a
0040 00 69 00 68 00 38 00 37 00 36 00 88 00 87 00 86
0050 00 85 c0 19 00 a7 00 6d 00 89 c0 32 c0 2e c0 2a
0060 c0 26 c0 0f c0 05 00 9d 00 3d 00 84 c0 2f c0 2b
0070 c0 27 c0 23 c0 13 c0 09 00 a4 00 a2 00 a0 00 9e
0080 00 67 00 40 00 3f 00 3e 00 32 00 31 00 30 00 9a
0090 00 99 00 98 00 97 00 45 00 44 00 43 00 42 c0 18
00a0 00 a6 00 6c 00 9b 00 46 c0 31 c0 2d c0 29 c0 25
00b0 c0 0e c0 04 00 9c 00 3c 00 96 00 41 c0 12 c0 08
00c0 00 13 00 10 00 0d c0 17 c0 0d c0 03 00 07 c0 11
00d0 c0 07 c0 16 c0 0c c0 02 00 ff
將這些值以短橫線、十進制的方式連接起來,我們記作B
5-4-2-1-22-51-57-58-24-53-10-27-47-52-49168-49158-49173-49163-49153-59-49200-49196-49192-49188-49172-49162-165-163-161-159-107-106-105-104-56-55-54-136-135-134-133-49177-167-109-137-49202-49198-49194-49190-49167-49157-157-61-132-49199-49195-49191-49187-49171-49161-164-162-160-158-103-64-63-62-50-49-48-154-153-152-151-69-68-67-66-49176-166-108-155-70-49201-49197-49193-49189-49166-49156-156-60-150-65-49170-49160-19-16-13-49175-49165-49155-7-49169-49159-49174-49164-49154-255
2.2.3 Extensions里面的所有類型的Type值
將所有值以十進制短橫線的方式連接起來 0-11-10-35-13-15-21
我們記作C
2.2.4 supported_groups裸诽,指定客戶端支持的橢圓曲線或有限域DH組
將值以十進制短橫線連接起來 23-25-24-22
我們記作D
2.2.5 ec_point_formats嫂用,指定客戶端支持的橢圓曲線點格式
將值以十進制短橫線連接起來 0-1-2
我們記作E
最后,我們分別將A丈冬、B嘱函、C、D埂蕊、E使用英文逗號 , 連接往弓,形如
ja3_full_string = A,B,C,D,E
我們使用python計算出 ja3_full_string的MD5,可以看出這個值和Wireshark計算得出的值是一樣的蓄氧。完整代碼代碼如下函似。
import hashlib
def main():
ja3_full_string = "771,5-4-2-1-22-51-57-58-24-53-10-27-47-52-49168-49158-49173-49163-49153-59-49200-49196-49192-49188-49172-49162-165-163-161-159-107-106-105-104-56-55-54-136-135-134-133-49177-167-109-137-49202-49198-49194-49190-49167-49157-157-61-132-49199-49195-49191-49187-49171-49161-164-162-160-158-103-64-63-62-50-49-48-154-153-152-151-69-68-67-66-49176-166-108-155-70-49201-49197-49193-49189-49166-49156-156-60-150-65-49170-49160-19-16-13-49175-49165-49155-7-49169-49159-49174-49164-49154-255,0-11-10-35-13-15-21,23-25-24-22,0-1-2"
md5_hash = hashlib.md5()
md5_hash.update(ja3_full_string.encode("utf-8"))
ja3 = md5_hash.hexdigest()
print("JA3 MD5:", ja3)
if __name__ == '__main__':
main()
運行上述代碼可以得到centos7下nmap工具掃描我們域名 ja-fingerprint.test.cn 的指紋
標準輸出:JA3 MD5: 90083a70e09fb136b7db4d10a115d045
3. JA4
- JA4就是JA3的升級改良版,是用來取代JA3的喉童。JA4包含的內容更加全面撇寞,擴展性更強大,適配度更科學泄朴,算法層面也更復雜重抖。JA3只能對HTTPS的客戶端增加指紋,總共也只有JA3(客戶端指紋)祖灰、JA3S(服務端指紋)钟沛。JA4就全面多了,具體內容可以看下圖了解局扶。
我們把JA4的指紋統(tǒng)一稱為JA4+恨统,因為后續(xù)還不斷有新的協(xié)議會支持。
- 所有JA4+的指紋格式都是固定的三妈,采用a_b_c這種格式畜埋。采用這樣格式的好處就可以方便的進行查詢,例如只需要對ab\ab\c這幾個部分進行搜索即可畴蒲。舉個搜索的例子悠鞍,GeryNoise是一款互聯(lián)網監(jiān)聽器,它能進行互聯(lián)網掃描模燥,它有一個不斷變化的單一的TLS密碼掃描互聯(lián)網咖祭,如果仍然是JA3,那么會有大量完全不同的JA3指紋蔫骂。而對于JA4么翰,只有JA4_b這部分的指紋會發(fā)生變化,a和c保持不變辽旋,因此浩嫌,GeryNoise可以通過查看JA4_ac指紋來追蹤客戶端檐迟。
舉幾個例子來更深入的了解JA4。
JA4:客戶端指紋
JA4S:TLS服務端指紋
JA4H:HTTP客戶端指紋
JA4L:光距離指紋码耐,測量服務端與客戶端之間的距離
JA4X:X509 TLS證書指紋
3.JA4+可以用于掃描威脅行為者追迟、惡意軟件檢測、會話劫持預防伐坏、合規(guī)性自動化怔匣、位置追蹤、DDoS檢測桦沉、方向shell檢測等等每瞒。
4.實際用例中,博客舉出了幾個例子纯露。
4.1 A組織通過SoftEther生成的證書剿骨,大量進行掃描操作,然后很難將正常HTTPS的流量與這些掃描流量進行區(qū)分埠褪,但是通過SoftEther生成的證書方式是編程式的浓利,因此 JA4X是SoftEther所獨有的,如果將JA4X實施到防火墻中钞速,組織這些流量將變得輕而易舉贷掖。
4.2 由于大多數證書機構使用相同的底層程序來生成和簽署其所有證書,因此大部分證書(通過互聯(lián)網收集的數據)的 JA4X是一樣的渴语,但數據收集者發(fā)現了幾個看起來完全不一樣的數據苹威,經過分析發(fā)現都是 Cobalt Strike!
更多的技術細節(jié)驾凶,以及實現文檔牙甫,完全可以參考官方倉庫里的文檔。