HTTP/HTTPS Proxy'nin Tamamlanması
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: