Mertcan GÖKGÖZ
Takip Et
Horus Teknoloji, Sistem Uzmanı & DevOps & Python
· 5 dak. Okunur

Erişim Engelleme Yöntemleri Bölüm 1 - HTTP Header Manipülasyonu

Bugün sizlere dünya üzerinde uygulanan erişim engellemelerinin hangi şart ve koşullarda yapıldığını ve bu gibi yaptırımların nasıl işlediğini dilimin döndüğünce anlatmaya çalışacağım.

HTTP Header Manipülasyonu Nedir?

HTTP Header Manipülasyonu, doğrulanmayan kötü amaçlı verilerin HTTP Header'a eklenmesidir. Buna yanıt bölme saldırısı da denmektedir. HTTP Header Manipülasyonu ayrıca siteler arası komut dosyası oluşturma, tarayıcıları ele geçirme, çerez işleme, yönlendirme saldırıları ve kullanıcı hataları ile karşılaşılabilir.

Bu tip saldırıları uzaktaki bir saldırganın yapabilmesi hiçte kolay değildir. Ancak bu gibi manipülasyon işlemleri ISP'ler ve network güvenlik cihazları tarafından oldukça kolay bir şekilde yapılabilmektedir.

Bizi ilgilendiren kısım neresi ?

Observation Cihazları belirli veri türlerini işlemek için özel olarak tasarlanmış komut ve fonksiyonlar içerir. Bu durum veri işleme, başlıkların(header) ve çerezlerin(cookie) içinde bulunan belirli değerlerin ayarlanmasının yanı sıra verilerin eklenmesi, değiştirilmesi ve kaldırılmasını da mümkün kılar.

Asıl ilgilenmemiz gereken nokta ekosistem içerisinde gözlemleme işlemlerinin nasıl yapıldığı. Bu noktada yukarıdaki açıklamalar ışığında edindiğimiz bilgiden sadece yönlendirme saldırılarına ve kullanıcı hatalarına göz atacağız.

HTTP, verileri İnternet üzerinden aktaran veya değiş tokuş yapan bir protokol. Bunu yapmak için bir kişi sunucuya gönderdiği bağlanma isteğine bakarız ve bu kişinin isteğine istek atılan sunucunun yanıtı vermesi beklenir. Standart protokol bu şekildedir.

header-field-http

Ancak erişim engeli ile karşı karşıya kalınan durumlarda işler biraz farklıdır.

Siteye giriş yapmak için istek attığınızda hiçbir şey olmamış gibi size aşağıdaki örnekte de gözüken bir header bilgisi karşılık verir. Bu başlıkta yer alan bilgilere kısa bir göz atalım;

HTTP/1.1 301 Moved Permanently
Date: Sun, 08 Apr 2018 13:44:07 GMT
Server: Varnish
X-Varnish: 594660927
X-Cache: cp3031 int
X-Cache-Status: int-front
Set-Cookie: WMF-Last-Access=08-Apr-2018;Path=/;HttpOnly;secure;Expires=Thu, 10 May 2018 12:00:00 GMT
Set-Cookie: WMF-Last-Access-Global=08-Apr-2018;Path=/;Domain=.wikipedia.org;HttpOnly;secure;Expires=Thu, 10 May 2018 12:00:00 GMT
X-Client-IP: 10.0.0.1
Location: https://wikipedia.org/
Content-Length: 0
Connection: keep-alive

envaiçeşit bilgi yer alıyor bunlardan bazıları bizim siteye erişimimiz sağlar ve tarayıcımızın tepki vermesi için pek çoğu gereklidir.

Tanımlar

Location: Konum yanıtlama alan alanı, alıcıyı tamamlanmak üzere Request-URI'den başka bir konuma yönlendirmek için kullanılır. HTTPS kullanılan sitelerde bu headeri görmeniz oldukça normaldir.

Host: request-header alanı, talep edilen kaynağın Internet ana bilgisayarını ve bağlantı noktası numarasını belirtmek için kullanılır.

Set-Cookie: Çerez istek başlık alanı, söz konusu URL için depolanmış bir ad/değer çiftini içerir.

Transfer-Encoding: Aktarım Kodlama genel başlık alanı, gönderen ve alıcı arasında güvenli bir şekilde veri aktarmak için mesaj gövdesine ne tür bir dönüşüm uygulandığını gösterir. Bu, içerik kodlamasıyla aynı değildir çünkü aktarım kodlamaları, entity-body'den değilde, iletinin bir özelliğidir.

Manipülasyon Zamanı Geldi de Geçiyor

HTTP header bilgilerinin ne işe yaradığına ve kısa bir açıklamasını yaptıktan sonra şimdi sıra geldi test için kullanılacak header bilgisini oluşturmaya atacağımız isteğin header bilgisinde birtakım alanları değiştireceğiz. Aşağıdaki kod parçacığı ile random olarak bu işlemi yapabilirsiniz.

def random_capitalization(string):
    output = ""
    original_string = string
    string = string.swapcase()
    for i in range(len(string)):
        if random.randint(0, 1):
            output += string[i].swapcase()
        else:
            output += string[i]
    if original_string == output:
        return random_capitalization(output)
    else:
        return output

Değiştirilmiş hali ise şu şekilde olmuş olacak

ACcEpt-LaNGuAGE
AccEpT
AcCept-eNCODINg
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Connection
UsER-AgENt
User-Agent
aCCEpt-ChARsET
HOSt

İstek için gereken değerleri oluşturduk. Bu isteği daha önceden hazırladığınız bir web sunucusuna gönderiyoruz gönderdiğimiz istek aşağıdaki gibi

"ACCEpT-cHarSET": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
                        "AccEPT-LAngUAge": "en-US,en;q=0.8",
                        "HOSt": "kFR32amwImcc3Kwc0ivv.com",
                        "aCCePT": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                        "acCEpt-encOdING": "gzip,deflate,sdch",
                        "useR-agEnT": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20110115 Firefox/3.6"

Biz bu bilgiyi servise hiçbir şey olmamış gibi iletiyoruz. Bunu yaparken özellikle ip adresi üzerinden istek göndermeyi de ihmal etmeyin. (host bilgisi temsilidir) SSL bağlantısı olmayan servisleri kullanın ki sağlayıcınız isteği görebilsin ve tepki verebilsin.

İsteği attığımızda bize geri dönen dataya ufak bir göz atıyoruz.

    "headers_dict": {
        "Accept-Language": ["en-US,en;q=0.8"],
        "Accept-Encoding": ["gzip,deflate,sdch"],
        "Connection": ["keep-alive"],
        "Accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],
        "User-Agent": ["Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20110115 Firefox/3.6"],
        "Accept-Charset": ["ISO-8859-1,utf-8;q=0.7,*;q=0.3"],
        "Host": ["kFR32amwImcc3Kwc0ivv.com"]

Bu isteği atacağınız nokta ise servis olarak kullanılacak olan 37.218.247.95 ip adresi. Örnek olarak isteği şse aşağıdaki gibi atabilirsiniz. headers={} süslü parentez içerisine header bilgisini dict olarak girmeniz gerekiyor. Örnek olarak yukarıdaki verdiklerimden bir kaçını kullanabilirsiniz.

import urllib2
headers={}
url="http://37.218.247.95/"
request = urllib2.Request(url, headers=headers)
contents = urllib2.urlopen(request).read()

Birde ne görelim bizim sağını solunu değiştirip gönderdiğimiz istek bize düzgün bir şekilde geri geldi ve gelirken de yanında bizim göndermediğimiz header başlıkları ile birlikte geldi buda arada observation cihazının olduğuna işarettir.

Değiştirilme işlemi yapılarak bize geldiğinin işaretidir. Ve yolda gönderdiğimiz paketin açılıp içerisine bakıldığını bu yöntem ile anlayabilmemiz bir nebzede olsa mümkündür.

flow-semasi-yeni1

Normal şartlar altında eğer internet üzerinde herhangi bir observation cihazı yok ise gönderilen isteğin aynı şekilde bize geri dönmesi gerekmektedir.

Bunların dışında önemli bir takım hatırlatmalarda bulunacağım.

  • Bahsi geçen bu observation cihazları her zaman açık tutulabilecek ve üzerinden geçen trafiği inceleyebilecek türdedirler.
  • Varsayılan olarak sağlayıcılar bu tür basit değişiklikleri algılayabilecek yapılarda sistemler kullanıyor ise False Pozitif dediğimiz sonuçlara sebebiyet verir
  • Observation cihazının mevcudiyeti sansürleme yapılmıyor olsa bile, önbellekleme amacı için kullanılıyor olabilir bu durumda yukarıdaki anlattıklarım geçerli olmamakla birlikte, yanıltıcıdır.

Peki Bu Bahsettiklerin Normal Mi?

Aslında evet, tüm network cihazlarında bu tarz özellikler sunuluyor. Network Güvenliği konusunda oldukça hayati bir öneme sahip, önceden tehditleri anlama ve anlamlandırma, alınacak önlemlerin önceden tespit edilmesi vb diyebiliriz.


Exploring HTTP Header Manipulation In-The-Wild
HTTP Header Manipulation