26 Ekim 2015

Burp Extension Geliştirme - 1

Bildiğiniz üzere Burp’ü manuel web uygulama denetimlerinde kullanıyoruz. Burp Suite temel imkanların yanı sıra bazı sofistike ihtiyaçlarımıza da cevap verebiliyor. Bunlardan birisi de şöyle bir senaryo olabilir; diyelim ki bir kaba kuvvet saldırısı yapmak, bir parolayı kırmak veya çok miktarda veri sızdırmak istiyorsunuz. Bunun için elbette kaba kuvvet saldırısını yapacağınız alanı belirlemeniz ve Intruder modülünde bu alan için ihtiyacınıza uygun payload çeşidini ve kaynaklarını belirlemelisiniz. Ancak bazen uygulama bu isteği iki adımda yapmanıza izin veriyor ve bir önceki adımda size gönderdiği tekil bir token’ı kaba kuvvet isteği içinde bir parametre olarak göndermenizi istiyor olabilir. Bu durumda Burp’ün Macro imkanı ile her bir Intruder isteği öncesinde birinci aşama istek gerçekleştirilebilir, Session Handling Rule imkanı ile de bu Macro kullanıldıktan sonra Intruder isteklerinin içinde giden parametre güncellenerek saldırı gerçekleştirilebilir. Bu kullanımın bu kadar açıklanması elbette konuya aşina olmayanlar için yeterli olmayacaktır. Bu konuya farklı bir makalemizde de değinebiliriz.


Burp, manuel testler için elbette yukarıda örneği de verilen çok faydalı fonksiyonları barındırıyor. Ancak ender de olsa bazı durumlarda karşılaşılabilecek problemler için işi kullanıcıya bırakıyor. Sağladığı Extender imkanı ve hazır API’leri sayesinde Java, Python ve Ruby dillerinde daha kompleks ihtiyaçları gidermemize olanak sağlıyor. Söz konusu API’lerin dokümantasyonu da mevcut (bkz. https://portswigger.net/burp/extender/api/index.html) . Bununla birlikte API’lerin kullanımına ilişkin örnek kod imkanı çok sınırlı. API dokümantasyonu olsa bile deneme yanılma yöntemi ile Extension geliştirmek oldukça zor. Bu nedenle örnek bir ihtiyaç üzerinden Burp’ün Extension imkanının kullanımına ilişkin bir makale yazmak istedik. Böylece hem biz (yani BTRisk pentest ekibi) ilerideki ihtiyaçlarımızda hızlıca tekrar hatırlama imkanına sahip olacağız hem de sizlerle de deneyimimizi paylaşmış olacağız.

Burp’ün hazır fonksiyonalitesi ile gerçekleştirilemeyecek şöyle bir senaryodan bahsedebiliriz. Diyelim ki bir sorgulama yapmak istiyoruz ve çok sayıda bilgi elde etmek istiyoruz. Ancak uygulama bir oturum parametresinden faydalanarak yapılabilecek sorgu sayısını sınırlandırıyor, yani kötüye kullanımı engellemeye çalışıyor. Bu durumda her istek öncesinde tekrar yeni bir oturum başlatarak oturum parametresini tazelemek zorundayız. Fakat uygulama oturum parametresini bir cookie olarak iletirken kaba kuvvet saldırısında bu parametreyi bir HTTP başlık değeri olarak iletmemiz gerekebilir. Bu acayip durum nasıl olabilir derseniz, mobil uygulamalar bazen oturum parametresini HTTP başlıkları içinde özel bir başlık olarak iletebilmektedir. iOS uygulamalarında NSURLConnection API’si aynı web browser’larda olduğu gibi Set-Cookie başlığı ile gelen cookie’leri sonraki isteklerde programcının herhangi bir kod yazmasına gerek bırakmadan sunucuya iletmektedir. Fakat Android uygulamalarında bu makalenin yazıldığı tarih itibarıyla bu imkan bulunmuyor. Bu yüzden programcılar Set-Cookie başlığı ile atanan oturum cookie’lerini programatik olarak sonraki isteklerde bir Cookie başlığının içinde veya farklı herhangi bir şekilde (tabi sunucunun da beklediği bir biçimde) iletmelidir. Bu durumda bazen programcılar oturum parametresini özel bir HTTP başlık değeri olarak, örneğin “OturumParametresi” diye bir HTTP başlığı oluşturarak iletmektedir. Ne yazık ki bu özel senaryo için Burp’ün sağladığı hazır bir fonksiyonalite yok. Ama Extension geliştirme imkanımız var.

Tekrar özetlersek birinci isteğin sonucunda iletilen cookie değerini ikinci isteğin “OturumParametresi” HTTP başlığının değeri olarak iletme ihtiyacımız var. Burada Burp’ün Cookie Jar (kurabiye kavanozu) özelliğini de hatırlamakta fayda var. Burp öntanımlı olarak Proxy modülünden geçen istek ve yanıtlar sonucu elde edilen cookie’leri kurabiye kavanozunda saklar ve bu değerleri sürekli günceller. Dolayısıyla taze cookie’leri bu Burp fonksiyonalitesinden faydalanarak kavanozdan elde edebiliriz. Ancak Cookie Jar’ı kullandığımızda dikkat etmemiz gereken bir başka nokta daha var. Intruder modülü, yani kaba kuvvet saldırılarında kullandığımız modül, çoklu thread desteği sağlar ve öntanımlı olarak paralel olarak birden fazla thread çalıştırır. Bu durum da bazen birden fazla thread üzerinden yapılan isteklerin aynı cookie değerini kullanmasıyla sonuçlanabilir. Bu durumu önlemek için, her ne kadar hızımızı oldukça azaltsa da, thread sayısını 1’e indirmemiz gerekir. Bunu da bir kenara not edelim.

Artık extension geliştirme işimize başlayabiliriz. Daha öncede belirttiğim gibi Burp extension geliştirmek için Java, Python ve Ruby dillerini destekliyor. Bunlardan Burp açısından native olan dil Java. Biz de bu yüzden Java diliyle extension geliştireceğiz.

İlk olarak Eclipse IDE’sini kurmamız gerekiyor. Kurulum sonrasında yeni bir proje oluşturuyoruz:



Projemizin içinde “burp” isimli bir package oluşturuyoruz.


Burp Extender API’lerini kullanabilmek için projemize bu API’lerin interface dosyalarını dahil etmemiz lazım. Interface dosyaları API’lerin implementation’larını değil decleration’larını içeriyor. Sadece geliştireceğimiz Java kodumuzu derleyebilmemiz için gerekliler.

Interface dosyalarını şu linkten indirebilirsiniz: http://portswigger.net/burp/extender/api/burp_extender_api.zip (güncel link adresi için Portswigger firmasının kaynaklarından faydalanınız).


İndirdiğimiz dosyaları burp package dizinimize kopyalıyoruz:



Şimdi extension’ımızı kodlayacağımız java class dosyamızı oluşturacağız. Bu class’ın adı BurpExtender olmalı.




Bu noktadan itibaren ihtiyacımıza uygun fonksiyonaliteye sahip olan API’leri tanımaya başlamamız lazım. Bu makaledeki amacımız tüm API’leri açıklamak değil ancak yukarıda belirttiğimiz senaryoya uygun bir çözüm üzerinden örnek bir extension’ı incelemek. Son olarak da extension’ımızı Burp’e Extender modülü ile tanıtacağız ve bu extension’ın kullanılabileceği Session Handling Rule bölümünden bahsedeceğiz.

Burp Extension Geliştirme Makalemizin 2. bölümünde buluşmak üzere.

Not: BTRisk tarafından geliştirilen makalelerin kısmen veya tamamen kopyalanarak yayınlanması durumunda intihal suçu duyurusu yapılacak ve yasal süreç başlatılacaktır.