JARM parmak izi, bir sunucunun veya proxy'nin TLS yığınını, özel olarak hazırlanmış bir dizi TLS ClientHello sondasına verdiği yanıtı analiz ederek belirlemeye yarayan, istemci tarafında çalışan pasif bir TLS parmak izi yöntemidir. Salesforce tarafından geliştirilen JARM, bir sunucunun TLS uygulamasına ait benzersiz bir parmak izi üretir; böylece operatörler belirli sunucu yazılımlarını tanımlayabilir, proxy'leri tespit edebilir ve altyapıyı izleyebilir.
JARM parmak izlerini anlamak
JARM (Just Another Rather Marvelous) parmak izi çıkarma, hedef sunucuya 10 farklı TLS ClientHello paketi göndererek çalışır. Her ClientHello; desteklenen TLS sürümleri, cipher suite'ler, uzantılar ve eliptik eğriler gibi parametrelerinde belirli ve sıralı farklılıklar taşıyacak biçimde tasarlanmıştır. Sunucunun bu sondalara verdiği yanıtlar — seçtiği TLS sürümü, cipher suite, uzantılar ve diğer el sıkışma parametreleri dahil — birleştirilip özetlenerek (hash) 62 karakterlik bir parmak izi üretilir.
Bu süreç, farklı TLS yığınlarının (örneğin OpenSSL, Microsoft SChannel, Go'nun crypto/tls'i, BoringSSL, LibreSSL) TLS el sıkışmalarını nasıl müzakere ettiğine dair ince farklardan yararlanır. Küçük yapılandırma farkları veya yama seviyeleri bile farklı JARM parmak izlerine yol açabilir.
JARM sondalarının ayrıntıları
10 ClientHello sondası birkaç boyutta farklılık gösterir:
* TLS sürümleri: sondalar belirli TLS sürümlerini hedefler (örneğin TLS 1.0, 1.1, 1.2, 1.3).
* Cipher suite'ler: her sonda farklı bir cipher suite listesi ve sıralaması içerir.
* Uzantılar: farklı TLS uzantı kümeleri ve sıralamaları kullanılır (örneğin SNI, ALPN, renegotiation_info, supported_groups).
* Eliptik eğriler: desteklenen eliptik eğrilerde farklılıklar yer alır.
Sunucunun bu 10 sondanın her birine verdiği ServerHello yanıtı kaydedilir. Bu yanıtlardan çıkarılan başlıca alanlar şunlardır:
* Müzakere edilen TLS sürümü
* Seçilen cipher suite
* Mevcut uzantıların listesi
* SNI uzantısı yanıtının biçimi (varsa)
Çıkarılan bu alanlar tek bir dizede birleştirilir. Bu dize ardından MD5 ile özetlenir; bu özetin bir bölümü, tam yanıt dizesinin SHA-256 özetiyle birlikte 62 karakterlik nihai JARM parmak izini oluşturur. Parmak izi, 10 sondanın her birine verilen yanıtlara ilişkin bilgiyi kodlayacak biçimde yapılandırılmıştır.
JARM proxy hizmetleri için neden yararlı
JARM parmak izleri, proxy hizmetleri işleten veya bu hizmetlerle etkileşen kuruluşlar için birkaç pratik kullanım sunar.
Sunucu ve yazılım tespiti
JARM, bir sunucunun veya proxy'nin altında yatan TLS kütüphanesini ve yapılandırmasını tam olarak belirleyebilir. Bu şunlara olanak tanır:
* Yazılım sınıflandırması: Nginx, Apache HTTP Server, Microsoft IIS, Caddy gibi yaygın web sunucuları ile Tomcat, Jetty gibi uygulama sunucularını birbirinden ayırt etme.
* Sürüm tespiti: aynı yazılımın farklı sürümleri veya yama seviyeleri, TLS yığını uygulamasındaki değişiklikler nedeniyle çoğu zaman farklı JARM parmak izleri üretir.
* Hatalı yapılandırma tespiti: beklenmedik parmak izleri, standart dışı yapılandırmalara veya olası güvenlik sorunlarına işaret edebilir.
Proxy tespiti ve niteleme
Bir proxy hizmeti için ara proxy'leri tespit etmek, ağ yollarını ve güvenlik duruşunu anlamak açısından kritiktir.
* Ters proxy'ler ve CDN'ler: bir istemci, ters proxy, yük dengeleyici veya Content Delivery Network (CDN) arkasındaki bir sunucuya bağlandığında, JARM parmak izi origin sunucusunun değil, proxy/CDN uç düğümünün TLS yığınını yansıtır. Bu sayede Cloudflare, Akamai, AWS CloudFront ya da ters proxy olarak çalışan Nginx/HAProxy gibi hizmetler tespit edilebilir.
* İleri (forward) proxy'ler: bir ileri proxy, TLS araya girme (MITM) yaparken kendi TLS yığınını sunabilir. İstemcinin bağlantısı araya girilerek kesiliyorsa, istemcinin elde ettiği JARM parmak izi hedef sunucuya değil ileri proxy'ye ait olur. Araya girmeyen ileri proxy'ler genellikle ClientHello'yu olduğu gibi iletir ve origin sunucusunun JARM'ını korur.
* WAF'ler (Web Application Firewall): birçok WAF ters proxy olarak çalışır ve kendi JARM parmak izini sunar.
Güvenlik ve tehdit istihbaratı
JARM, güvenlik operasyonlarında değerli bir araçtır:
* Zararlı yazılım C2 tespiti: tehdit aktörleri, komuta ve kontrol (C2) altyapılarında çoğu zaman aynı TLS yığınlarını yeniden kullanır. JARM bu C2 sunucularının parmak izini çıkarabilir; böylece farklı IP adresleri veya alan adları üzerinden bunlar tespit edilip izlenebilir.
* Altyapı haritalama: güvenlik araştırmacıları JARM'ı, saldırgan altyapısını haritalamak, paylaşılan bileşenleri belirlemek ve birbiriyle ilgisiz görünen kampanyaları ilişkilendirmek için kullanır.
* Phishing tespiti: meşru alan adları için beklenmedik JARM parmak izleri görülmesi, saldırganın farklı bir altyapı kullandığı bir phishing girişimine işaret edebilir.
Ağ görünürlüğü
JARM, bir proxy'nin etkileşimde bulunduğu TLS ekosistemine dair daha derin bir kavrayış sağlar:
* Referans değer oluşturma: bilinen hizmetler ve iş ortakları için beklenen JARM parmak izlerinden bir referans (baseline) oluşturmak, anormallikleri tespit etmeye yardımcı olur.
* Hizmet keşfi: uygulama düzeyinde etkileşime gerek kalmadan hizmetlerin altındaki teknolojiyi belirleme.
JARM parmak izi üretme
JARM parmak izi üretmek, belirli sondaları göndermeyi ve yanıtları işlemeyi gerektirir. Bu amaçla araçlar ve kütüphaneler mevcuttur.
Örnek: Python jarm kütüphanesini kullanma
jarm Python kütüphanesi, parmak izi üretmenin doğrudan bir yolunu sunar.
import jarm
def get_jarm_fingerprint(host, port=443):
"""
Verilen host ve port için bir JARM parmak izi üretir.
"""
try:
fingerprint = jarm.string_fingerprint(host, port, timeout=5)
return fingerprint
except Exception as e:
return f"Error generating JARM for {host}:{port}: {e}"
if __name__ == "__main__":
target_host_1 = "www.example.com"
target_host_2 = "cloudflare.com" # Çoğunlukla Cloudflare'in kendi TLS yığını üzerinden sunulur
target_host_3 = "nginx.org"
print(f"JARM for {target_host_1}: {get_jarm_fingerprint(target_host_1)}")
print(f"JARM for {target_host_2}: {get_jarm_fingerprint(target_host_2)}")
print(f"JARM for {target_host_3}: {get_jarm_fingerprint(target_host_3)}")
Bu betik, belirtilen host ve porta bağlanır, JARM sondalarını gönderir ve elde edilen 62 karakterlik parmak izini yazdırır.
JARM parmak izlerini yorumlama
JARM parmak izi tek başına anlamsız bir dizedir. Değeri, bilinen hizmetler veya tehdit aktörleriyle karşılaştırılmasından ve ilişkilendirilmesinden gelir.
* Veritabanı sorgulama: kamuya açık ve özel veritabanları (örneğin JARM.info, Shodan, Censys) JARM parmak izlerini toplar ve bilinen yazılım, hizmet ve kuruluşlarla ilişkilendirir.
* Örüntü tanıma: belirli JARM parmak izleri çoğu zaman belirli TLS kütüphaneleri veya sunucu yazılımlarıyla ilişkilidir. Örneğin:
* 27d40d40d27d40d00045d40d00041d01dd2d4000000000494a000000000000 Nginx için yaygın bir parmak izidir.
* 07d14d14d07d14d00041d14d0000000d1d2d00000000000000000000000000 çoğunlukla Apache HTTP Server (OpenSSL) ile görülür.
* 07d07d07d07d07d00041d07d0000000d1d2d00000000000000000000000000 Cloudflare'e işaret edebilir.
* Anormallik tespiti: bilinen bir hizmet için beklenen parmak izinden herhangi bir sapma incelenmelidir.
JARM ve proxy davranışı
JARM ile proxy hizmetleri arasındaki etkileşim, JARM'ın işlevselliğinin merkezindedir.
İleri (forward) proxy'ler
- Araya girmeyen ileri proxy'ler: bu proxy'ler istemcinin ClientHello'sunu doğrudan hedef sunucuya iletir. Bu durumda istemcinin gözlemleyeceği JARM parmak izi (istemci sunucu için bir JARM üretiyor olsaydı) origin sunucusuna ait olurdu. Ancak proxy hizmetinin kendisi istemci olarak davranıp bir hedef için JARM üretse bile, yine origin sunucusunun JARM'ını elde ederdi.
- Araya giren ileri proxy'ler (TLS denetimi): bir ileri proxy TLS denetimi yaptığında (örneğin güvenlik taraması veya politika uygulaması için) Man-in-the-Middle (MITM) gibi davranır. İstemcinin TLS bağlantısını sonlandırır ve origin sunucusuyla yeni bir bağlantı kurar. Bu durumda istemcinin gözlemlediği JARM parmak izi ileri proxy'nin TLS yığınına ait olur. Aynı şekilde, origin sunucusunun gözlemlediği JARM parmak izi de ileri proxy'nin TLS yığınına ait olur. Bu davranış, TLS denetimini tespit etmek için kilit bir göstergedir.
Ters proxy'ler, yük dengeleyiciler ve CDN'ler
Bu hizmetler bir veya daha fazla origin sunucusunun önünde konumlanır ve gelen istemci bağlantılarını karşılar.
* Ters proxy, yük dengeleyici veya CDN arkasındaki bir hizmete bağlanan istemcinin elde ettiği JARM parmak izi her zaman bu ara katmanın TLS yığınını yansıtır.
* Origin sunucusunun JARM parmak izi dışarıdan gözlemlenemez biçimde maskelenir. Bu, söz konusu hizmet türlerini tespit etmenin başlıca yoludur. Örneğin google.com adresine bağlanmak, isteği işleyen arka uç sunucusunun değil, Google'ın uç altyapısının JARM parmak izini verir.
Sınırlamalar ve dikkat edilmesi gerekenler
JARM güçlü olsa da bazı sınırlamaları vardır:
* Aktif sondalama: JARM, hedefe aktif sonda göndermeyi gerektirir; bu her ortamda mümkün veya izin verilebilir olmayabilir.
* Dinamik değişimler: sunucu yapılandırmaları, yazılım güncellemeleri veya yük dengeleyici değişiklikleri JARM parmak izini değiştirebilir; bu da sürekli izleme ve yeniden parmak izi çıkarma gerektirir.
* Taklit (spoofing): gelişmiş saldırganlar TLS yığınlarını bilinen JARM parmak izlerini taklit edecek şekilde yapılandırabilir, ancak bu özel bir çaba gerektirir.
* Kapsam: JARM, TLS el sıkışmasının belirli yönlerini yakalar ancak tüm TLS yapılandırma ayrıntılarının eksiksiz bir resmini vermez.
JARM ile JA3 karşılaştırması
JARM ve JA3'ün ikisi de TLS parmak izi teknikleridir, ancak farklı amaçlara hizmet ederler.
| Özellik | JARM | JA3 |
|---|---|---|
| Hedef | Sunucu (bir sunucunun veya proxy'nin TLS yığınını belirler) | İstemci (bir istemci uygulamasının TLS yığınını belirler) |
| Yöntem | Özel olarak hazırlanmış 10 farklı ClientHello sondası gönderir ve sunucunun ServerHello yanıtlarını özetler. | İstemcinin gönderdiği tek bir ClientHello paketini analiz eder; TLS sürümü, cipher suite'ler, uzantılar, eliptik eğriler ve eliptik eğri nokta biçimlerinin sıralı listelerini çıkarır ve bunları özetler. |
| Parmak izi türü | Birden fazla ServerHello yanıtından türetilen 62 karakterlik dize. | Birleştirilmiş bir dizenin MD5 özeti (örneğin TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats). |
| Kullanım alanı | Sunucu yazılımını belirleme, proxy/CDN tespiti, C2 altyapısını izleme, ağ haritalama. | Belirli istemci uygulamalarını belirleme (örneğin web tarayıcıları, zararlı yazılımlar, IoT cihazları), botnet tespiti, uygulama profilleme. |
| Gözlem noktası | Hedef sunucuya bağlantı başlatan bir istemci gerektirir. | İstemciden gelen ClientHello'yu gözlemleyen bir sunucu veya ağ cihazı gerektirir. |
| Kaynak | Salesforce (2020) | Salesforce (2017) |
JARM, sunucunun yanıt davranışına odaklanır; bu da onu proxy hizmetleri dahil olmak üzere TLS bağlantılarını sonlandıran bileşenleri belirlemek için ideal kılar.
