hacktricks/pentesting-web/h2c-smuggling.md

9.4 KiB
Raw Blame History

Yükseltme Başlığı Kaçakçılığı

AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Try Hard Güvenlik Grubu

{% embed url="https://discord.gg/tryhardsecurity" %}


H2C Kaçakçılığı

ık Metin Üzerinden HTTP2 (H2C)

H2C veya ık metin üzerinden http2, geçici HTTP bağlantılarının normundan saparak standart bir HTTP bağlantısını kalıcı bir bağlantıya yükseltir. Bu yükseltilmiş bağlantı, düz metin HTTP'nin tek istek doğasına karşı, sürekli iletişim için http2 ikili protokolünü kullanır.

Kaçakçılık sorununun özü, bir ters proxy'nin kullanımıyla ortaya çıkar. Normalde, ters proxy HTTP isteklerini işler ve arka uca ileterek, ardından arka uç yanıtını döndürür. Ancak, bir HTTP isteğinde Connection: Upgrade başlığı bulunduğunda (genellikle websocket bağlantılarıyla görülür), ters proxy istemci ve sunucu arasında kalıcı bir bağlantı sürdürür, belirli protokoller tarafından gereken sürekli değişimi kolaylaştırır. H2C bağlantıları için, RFC'ye uyum, üç belirli başlığın varlığını gerektirir:

Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings

H2C Smuggling

Zafiyet, bir bağlantıyı yükselttikten sonra ters vekilin, yönlendirme işleminin bağlantı kurulduktan sonra tamamlandığını varsayarak bireysel istekleri yönetmeyi durdurması durumunda ortaya çıkar. H2C Smuggling'in sömürülmesi, başarılı bir H2C bağlantısı başlatıldığında, istek işleme sırasında uygulanan ters vekil kurallarını atlamayı sağlar; bu kurallar arasında yol tabanlı yönlendirme, kimlik doğrulama ve WAF işleme bulunmaktadır.

Zafiyetli Vekiller

Zafiyet, ters vekilin Upgrade ve bazen Connection başlıklarını nasıl işlediğine bağlıdır. Aşağıdaki vekiller, proxy geçişi sırasında bu başlıkları doğal olarak ileten ve böylece H2C smuggling'i doğal olarak etkinleştiren vekillerdir:

  • HAProxy
  • Traefik
  • Nuster

Öte yandan, aşağıdaki hizmetler, proxy geçişi sırasında her iki başlığı da doğal olarak iletmemektedir. Bununla birlikte, Upgrade ve Connection başlıklarının filtresiz iletilmesine izin veren güvensiz şekilde yapılandırılmış olabilirler:

  • AWS ALB/CLB
  • NGINX
  • Apache
  • Squid
  • Varnish
  • Kong
  • Envoy
  • Apache Traffic Server

Sömürü

Uyumlu bir H2C bağlantı yükseltmesi için gereken başlıkları doğal olarak ileten tüm sunucuların olmadığını belirtmek önemlidir. Bu nedenle, AWS ALB/CLB, NGINX ve Apache Traffic Server gibi sunucular, H2C bağlantılarını doğal olarak engeller. Bununla birlikte, bazı arka uçların standartlara uymayabileceği için, uyumsuz Connection: Upgrade varyantı ile test etmek yararlı olabilir.

{% hint style="danger" %} proxy_pass URL'sinde belirtilen belirli yol (örneğin, http://backend:9999/socket.io) bağlantının varsayılan olarak http://backend:9999 olmasına neden olur. Bu, bu tekniği kullanarak dahili uç noktadaki herhangi bir yola etkileşim sağlar. Dolayısıyla, proxy_pass URL'sinde bir yol belirtmek erişimi kısıtlamaz. {% endhint %}

BishopFox tarafından h2csmuggler ve assetnote tarafından h2csmuggler araçları, H2C bağlantısı kurarak proxy tarafından uygulanan korumaları atlamaya yönelik girişimleri kolaylaştırır ve bu sayede proxy tarafından korunan kaynaklara erişim sağlar.

Bu zafiyetle ilgili daha fazla bilgi için özellikle NGINX hakkında bu detaylı kaynağa başvurun.

Websocket Smuggling

Websocket smuggling, bir HTTP2 tüneli oluşturmanın aksine, bir Websocket tüneli kurarak potansiyel proxy kısıtlamalarını atlamayı ve uca doğrudan iletişim sağlamayı amaçlar.

Senaryo 1

Bu senaryoda, bir iç REST API'ye erişilemeyen bir arka uç, bir halka açık WebSocket API sunmaktadır ve kötü niyetli bir istemcinin iç REST API'ye erişim arayışında hedef alınmaktadır. Saldırı şu adımlarda gerçekleşir:

  1. İstemci, başlıkta yanlış bir Sec-WebSocket-Version protokol sürümü ile bir Upgrade isteği göndererek ters vekile başlar. Ters vekil, Sec-WebSocket-Version başlığını doğrulayamadığı için Upgrade isteğini geçerli olarak kabul eder ve arka uca iletilmesini sağlar.
  2. Arka uç, Sec-WebSocket-Version başlığındaki yanlış protokol sürümünü belirten 426 durum kodu ile yanıt verir. Ters vekil, arka ucun yanıt durumunu göz ardı ederek WebSocket iletişimi için hazır olduğunu varsayar ve yanıtı istemciye iletir.
  3. Sonuç olarak, ters vekil, istemci ile arka uç arasında bir WebSocket bağlantısı kurulmuş gibi yanıltılırken, aslında arka uç, Upgrade isteğini reddetmiştir. Bununla birlikte, vekil, istemci ile arka uç arasında açık bir TCP veya TLS bağlantısını sürdürür ve istemcinin bu bağlantı aracılığıyla özel REST API'ye kısıtlamasız erişim sağlamasına olanak tanır.

Etkilenen ters vekiller arasında, sorunu ele almaktan kaçınan Varnish ve Envoy proxy sürümü 1.8.0 veya daha eski olanlar, daha sonraki sürümlerde yükseltme mekanizmasını değiştirmiş olmalarına rağmen, bulunmaktadır. Diğer vekiller de savunmasız olabilir.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png

Senaryo 2

Bu senaryo, hem halka açık bir WebSocket API hem de bir sağlık kontrolü için halka açık bir REST API'ye sahip bir arka uçu içerir ve bir iç REST API'ye erişilemeyen bir arka uç hedef alınır. Daha karmaşık olan saldırı, aşağıdaki adımları içerir:

  1. İstemci, sağlık kontrol API'sini tetiklemek için bir POST isteği gönderirken, ek bir HTTP başlık olan Upgrade: websocketi içerir. Ters vekil olarak hizmet veren NGINX, yalnızca Upgrade başlığına dayanarak bu isteği standart bir Upgrade isteği olarak yorumlar ve isteğin diğer yönlerini göz ardı eder ve arka uca iletir.
  2. Arka uç, sağlık kontrol API'sini yürütürken, saldırgan tarafından kontrol edilen bir harici kaynağa ulaşır ve 101 durum kodu ile bir HTTP yanıtı döndürür. Bu yanıt, arka uca ulaştığında ve NGINX'e iletilirken, yalnızca durum kodunu doğruladığı için vekili, bir WebSocket bağlantısının kurulduğuna inandırır.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png

Uyarı: Bu tekniğin karmaşıklığı, genellikle düşük önem derecesi olarak kabul edilen bir dış SSRF zafiyetinin varlığını gerektirmesi nedeniyle artar.

Sonuç olarak, NGINX, istemci ile arka uç arasında bir WebSocket bağlantısı olduğuna inanır. Aslında böyle bir bağlantı yoktur; sağlık kontrol REST API'si hedef alınmıştır. Bununla birlikte, ters vekil bağlantıyıık tutar ve istemcinin bu aracılığıyla özel REST API'ye erişmesine olanak tanır.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png

Çoğu ters vekil bu senaryoya karşı savunmasız olabilir, ancak sömürü, genellikle düşük önem derecesi olarak kabul edilen bir dış SSRF zafiyetinin varlığına bağlıdır.

Lablar

Her iki senaryoyu test etmek için lablara https://github.com/0ang3el/websocket-smuggle.git adresinden erişebilirsiniz.

Referanslar