HTTP/HTTPS Proxy'nin Tamamlanması

13:35 Mehmet Kılıç 0 Comments


MBFuzzer için geliştirdiğim ve yalnızca HTTP istekleri üzerinden çalışan proxy kütüphanesine HTTPS desteğini sağlamak üzere ilk olarak trağin nasıl bir yol izlediğini anlamak için wireshark uygulamasını kullanarak analizler yaptım. HTTP için trafik üçlü el sıkışmanın gerçekleşmesinden sonra yalın bir şekilde paket akışı gerçekleşmekte; ancak, MBFuzzer için SSL sertifika hazırlanması başlıklı blog yazımda SSL kavramından da bahsettiğim gibi gelen HTTPS istekleri üçlü el sıkışma gerçekleştikten sonra karşılıklı sertifika kontrolleri ile paket trafiği şifreli bir şekilde devam etmekte.
Burada gelen istekleri  uygulama katmanınamı yoksa daha alt katmanlaramı yönlendirerek trafiği yönetme konusunda bazı sorunlar yaşadım. Bunun sebebi daha önce geliştirdiğim kütüphanede  HTTP isteklerini uygulama katmanı üzerinde yönlendirmemdi; ancak HTTPS istekleri için aynı durum geçerliliğini sağlamadığından çözüme gitme konusunda zorlandım. MBFuzzer proje mentörüm Fatih Özavcı’nın hem bilgi hem de kodlama konusunda yardımları ile öncelikle gelen tüm isteklerin HTTP bir bağlantı isteği olduğunu varsayarak almak  ve gelen bir isteğin tamamını tek seferde aldıktan sonra başlık bilgisinin analinizini yaptıktan sonra isteğin türünü, hedef sunucu bilgilerini çıkarttık.
#istek IO ile okunuyor
content = connection.sysread(63535)
   head = content.split("\n")[0]

   #İsteğin başlık bilgilerini çıkartır
   type = head[/^\w+/]
   url = head[/^\w+\s+(\S+)/, 1]
   http = head[/HTTP\/(1\.\d)\s*$/, 1]


Buradaki önemli bir husus ise gelen istekleri bir IO okuması yaparak almak çünkü HTTP/HTTPS isteklerinde gelen verileri gerekli sunucuya port üzerinden  yönlendirerek trafiğin devam etmesi sağlanmaktadır.

HTTP istekleri için daha önce ki blog yazımda anlattığım gibi gelen isteği sunucuya iletip oradan gelen cevabıda kullanıcıya aktarıyoruz. Burada yaptığımız değişiklik trafiği IO üzerinden akmasının sağlanması oldu. HTTPS istekleri için ilk olarak gelen istekden bağlanılacak uzak sunucu adresi ve portuna bir SSL bağlantısını açtıktan sonra  kullanıcıya bağlantının kurulduğu mesajı “HTTP/1.1 200 Connection Established\r\n”  gönderilerek iletşimin bir sonraki adım olan sertifika kontrolüne geçmesi sağlanıyor. SSL sertifika kontrolünde MBFuzzer için hazırlanmış olan sertifika dosyaları kullanılarak yalnızca sonraki süreçte düzeltilecek olan bir bug haricinde kalan kısımda kullanıcı ve sunucu arasındaki paket trafiğinin proxy üzerinden gerçekleşmesi sağlanmaktadır. HTTPS konusunda yaşadığım sıkıntılı süreçte proje mentörüm Fatih Özavcı’nın katkıları sayesinde proxy’nin HTTPS CONNECT desteği sağlandı.

MBFuzzer için geliştirilen Proxy kütüphanesini kullanmak için GitHub proje sayfasında bulunan test kodunu kullanabilirsiniz. Örnek olarak,

require './lib/proxy.rb'
#proxy adresi ve portu
address = "127.0.0.1"
port = 8080

#proxy’nin başlatılması
create(address, port)

 

   

0 yorum: