Yakından Eğitim MBFuzzer Projesi Ara Dönem

21:18 Mehmet Kılıç 0 Comments


Yakından Eğitim MBFuzzer projesi başlangıcı 1 Nisan 2013 tarihinden itibaren proje mentörü Fatih Özavcı’nın proje için belirlediği adımlar doğrultusunda geliştirme sürecine devam edilmektedir. MBFuzzer projesinin hedefi bir mobil uygulamanın güvenilirliğin test edilmesini sağlamaktır. Bu kapsamda uygulamaya proxy desteği sunarak uygulama ve sunucu arasındaki iletişimin analiz edilmesiyle beraber içeriğinin değiştirilmesi ve bozuk cevapların incelenerek  mobil uygulamanın güvenilirliğinin test edilmesidir. MBFuzzer projesinin geldiği bir aylık döneminde geliştirme sürecinde tamamlanan kısımları anlatarak, projenin şimdiye kadarki durumu hakkında bilgi verecektir.

  1. HTTP/HTTPS Proxy Desteği
MBFuzzer projesi, ortadaki adam saldırısı yapan bir fuzzing aracı olarak kullanılacağı için uygulamalardan gelen HTTP/HTTPS isteklerini kabul edip sunucuya gönderen ve sunucudan gelen cevapları da uygulamaya iletme işlevini gören bir kütüphane olarak tasarlandı ve bu hedef doğrultusunda kütüphane geliştirildi.

İlk olarak HTTP isteklerinin kabul edilip sunucuya yönlendirilmesi sağlandı ve sunucudan gelen cevaplar uygulama tarafına iletildi. Burada uygulama ve sunucu arasındaki iletişim proxy üzerinden sağlandı. Sonraki adımda HTTPS isteklerinin kabul edilmesi ve sunucu ile bağlantısının sağlanması üzerine çalışıldı. Burada HTTPS isteklerini de HTTP istekleri gibi kabul ederek iletişimin sunucu tarafı ile bağlantısında IO üzerinden bağlanılması sağlandı ve dönen cevapları HTTPS CONNECT çevirimi yapılarak iletişim sürdürüldü.

Kütüphanenin sahip olduğu ve yaptığı işler,
    • Uygulamalardan gelecek olan isteklerin dinlenileceği adres ve port bilgilerini aldıktan sonra ara bir sunucu olarak istekleri bekler ve gelen her isteğin kabul edilmesi ile beraber paralel olarak çalışmasını sağlamaktadır.
    • Gelen isteklerin içeriğinin okunması ve başlık bilgilerinin analizi yapılarak isteğin türünü(HTTP/HTTPS) belirler. Bu doğrultuda istek türüne göre sonraki adımında sunucu ile iletişime geçmesi sağlar.   
    • HTTP isteklerinin bağlanmak istediği uzak sunucu tarafından gelen cevapların okumasını yaparak uygulama tarafına iletilmesini sağlar.
    • HTTPS istekleri için bağlanılacak uzak sunucunun adres ve port bilgileri ile bağlantı oluşturmasını gerçekleştirir.
    • Gelen HTTPS isteklerinin uygulama tarafına bağlantı kuruldu mesajı gönderildikten ve uzak sunucu ile bağlantı kurulduktan sonra uygulama tarafı ile IO üzerinden sunucu olarak iletişim kurulmasını sağlamaktadır.
    • Proxy’nin açık olan tüm bağlantıları kapatılır..

  1. Sertifika Üretme
    Uygulama tarafından gelen HTTPS istekleri için uzak sunucuya bağlandıktan sonra elde edilen bağlantı bilgilerinden mevcut sertifika bilgileri yardımıyla ve uygulama tarafına bağlantının kurulduğu mesajı iletildikten sonra gerçekleşen HTTPS oturumunda gerekli olan sertifikanın hazırlanmasını sağlayan bir kütüphane hazırlandı. Bu kütüphanenin yapmış olduğu işlev,
    • İlk olarak sertifika için kullanılacak olan key üretimini gerçekleştirmektedir. Sonrasında, gelen mevcut sertifikanın bilgilerini kullanarak ve üretilen key ile birlikte sertifikanın imzalanması gereçekleştirilmektedir. Özet olarak, hem sertifikayı hem de key bilgilerini hazırlamaktadır.

  1. Fuzzing İçeriklerinin hazırlanması
    MBFuzzer’ın ana işlevinin mobil uygulamalara çeşitli veriler gönderilerek mobil uygulamalarda oluşan bozulmaları veya geri dönen cevapların yapısına  göre  uygulamanın güvenilirliğini test etmektir. Bu nedenle, fuzzing işlemleri için sonraki adımlarda kullanılacak içerikler hazırlandı. Bu içerikler;
    • BufferOverflow : Mobil uygulamanın kodlama aşamasında hafıza kullanımını test edilmesinde kullanılmak üzere veri setleri hazırlandı.
    • FormatString : Mobil uygulamanın kod yapısında beklediği bir değişken türünün üzerinde değişiklikler yapılarak uygulamanın test edilmesini sağlayacak veri setleri hazırlandı.


Yakından Eğitim MBFuzzer projesinin ara dönemine kadar geçen sürede yukardıda bahsettiğim adımları gerçekleştirdik. Bu süreçte, bir proxy’nin çalışma prensibi, HTTP/HTTPS bağlantı türlerinin nasıl gerçekleştiği, SSL hakkında sıkıntı yaşasamda bu kavram yapısının detayları ile ilgili temel bilgiler edindim. MBFuzzer projesi ile açık kaynak bir proje geliştirirken konuya bağlı olarak atılacak ilk adımlar, izlenmesi gereken yollar, araştırma gibi başlıklarda yanlışlarımla veya doğrularımla deneyimler kazandım.
   

0 yorum:

SSL Sertifika Hazırlanması ve Fuzzing İçerikleri

22:45 Mehmet Kılıç 0 Comments

SSL Sertifika Hazırlanması



MBFuzzer projesinde HTTP/HTTPS destekli proxy’nin geliştirilmesinden sonraki adım olan uygulama ve proxy  arasındaki iletişimin sertifika sorunu yaşamadan devam edebilmesi geçerli bir sertifika oluşturulmasına dayanmaktadır.Bunun için  daha önce hazırlamış olduğum sertifika kütüphanesi üzerinde bazı düzenlemeler yaptım.

Sertifika kütüphanesinde geliştirdiğimiz proxy'deki ssl_open ile baglanilan SSL oturumunun sertifika bilgilerini ruby’nin openssl kütüphanesi sayesinde elde edebiliyoruz.

#serverssl, ssl_open dönen SSL oturum değişkenidir
real_cert = OpenSSL::X509::Certificate.new(serverssl.peer_cert)

#real_cert bilgilerini oluşturduğum Cert isimli kütüphaneye yollayarak 
#yeni sertifika ve key bilgilerini elde eder
ncert, nkey = Cert.new.ssl_cert(real_cert)

Cert kütüphanesinde ilk olarak RSA key oluşturma işlemi gerçekleşiyor. Sonrasında gelen sertifika bilgileri ile birlikte ve oluşturulan key ile bilrlikte sertifikanın gerekli parametreleri sağlanması ile birlikte sertifikanın imzalama aşamasına geçiliyor. Mevcut bilgilerle oluşturulmuş sertifikanın imzalama algoritması olarak SHA1 ve başlangıçtaki RSA key ile birlikte sertifika üzerinde imza oluşturuluyor.

#kullanılan key ve imzalama algoritması
cert.sign(key, OpenSSL::Digest::SHA1.new)

Kütüphaneyi bu şekilde kullanıldığımda sertifika üretimi gerçekleşiyor; ancak proxy ve uygulama üzerinde yapılan iletişimde sertifika imzasından kaynaklanan hata bulunmaktadır. Bu sorunun üzerinde çalışmaktayım ve çözüme ulaştığımda gerekli düzeltmeleri yapacağım.

Fuzzing içerikleri


    MBFuzzer projesinin mobil uygulamaların üzerindeki temel görevi fuzzing yapacak olmasıdır. Bu doğrultuda fuzzing için gerekli alt yapının yani fuzzing içeriklerinin hazır hale getirilmesi gerekmektedir. 
    Mobil uygulamarın kodlama olarak hafıza kontrolünün nasıl olduğunu test etmek için ilk olarak "buffer overflow" olarak adlandırılan içerikler hazırlandı. Detaylı şekilde açıklayacak olursam, uygulama azami 10 karakter uzuluğunda bir veri bekliyor; ancak 1000 karakter uzunluğunda gelen bir veri olursa uygulamanın davranışları ne olur sorusunun cevabını aramak diyebiliriz. Bunun haricinde, "format string" olarak adlandırılan gene uygulamanın beklediği bir verinin değişken türünün değiştirilmesi durumundaki davranışlarını gözlemlemek içinde içerikler hazırlandı.  
Buffer Overlflow için,
    a * 100
    a * 1000
    a * 10000 ....
Format String için,
    %p%p%p%p
    %x%x%x%x ....

MBFuzzer proje sayfası

0 yorum:

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:

MBFuzzer için SSL Sertifika Hazırlanması

23:56 Mehmet Kılıç 0 Comments


MBFuzzer projesinde daha önce kullanıcılar tarafından gönderilen http isteklerini alarak sunucuya ileten ve sunucu tarafından gelen yanıtları tekrar kendi üzerinden kullanıcıya iletmeye yarayan bir proxy kütüphanesi hazırlamıştım. Bu haftaki süreçte HTTPistekleri için hazırlanan bu kütüphanenin geliştirilerek aynı görevi HTTPS isteklerini sunucuya doğrudan yönledirip ve cevapları üzerinde de gerçekleştirmesini sağlamak için Secure Socket Layer(SSL) kavramını inceledim.
 

SSL kavramı temel olarak uygulamalar ile sunucu arasında güvenli olarak iletişim kurmak için gereken bilgileri sağlayan bir sertifikaya dayanmaktadır. Bu katman sayesinde hem kullanıcı hem de sunucu tarafında güvenlik kontrolleri(sertifika, şifreleme algoritmaları) yapılarak trafikte dolaşan verinin güvenliği artmaktadır. MBFuzzer için geliştirilen proxy kütüphanesine SSL desteğinin sağlanması için ilk olarak self-signed SSL sertifikasını oluşturan bir kütüphaneyi ruby dökümantasyonlarındaki openssl kütüphanesi inceleyerek hazırladım. Proxy kütüphanesine eklencek SSL desteği için sertifika kütüphanesi etkili bir yere sahip olacak. 

MBFuzzer için hazırlanmış bu kütüphaneyi kullanarak self-signed SSL sertifikanızı yapmak isterseniz birkaç satırlık kod yardımı ile doğrudan sertifika oluşturabilirsiniz. (Sertifika bilgilerini değiştirmek için kütüphane içerisindeki “OpenSSL::X509::Name” verilerini kendiniz yazmanız gerekmektedir.

File.new('/tmp/cert.pem','w')
cert_file = File.open('/tmp/cert.pem','w')
cert_file << ssl_cert
cert_file.close


MBFuzzer proje takibi : https://github.com/YakindanEgitim/mbfuzzer
Ruby-Doc OpenSSL : http://www.ruby-doc.org/stdlib-2.0/libdoc/openssl/rdoc/OpenSSL.html

0 yorum:

MBFuzzer Projesine Başlangıç

18:24 Mehmet Kılıç 0 Comments




Yakından Eğitim proje süreleri başladıktan sonra MBFuzzer projesi üzerinde daha net fikir sahibi olmak açısından Fatih Özavcı tarafından mobil uygulama denetimi eğitimi aldım. MBFuzzer projesine başvurduğumda benden neler beklendiği, projeyi nasıl geliştiriceğim konularında fikir sahibiydim; ancak mobil uygulama eğitimi sayesinde MBFuzzer projesinin nasıl bir işleyiş ile çalışacağını ve projeyi geliştirirken benden beklenenleri, nasıl bir yol izlemem ve nelere dikkat etmem gerektiği konularında daha net ve faydalı bilgiler edindim.


MBFuzzer projesine hem başlangıç hem de sonraki adımlarda geliştirilerek işlevinin artacağı ve temel bir görev görecek basit bir http proxy desteği sunan bir kütüphane hazırlanması ilk hedef olarak görüldü. Bu proxy kütüphanesinin amacı kullanıcının bağlanmak istediği sunucuya gönderilen http isteklerini alıp kendi üzerinden sunucuya yollamasını ve sunucu tarafından gelen cevaplarıda aynı şekilde alıp kullanıcıya iletmesini sağlamaktır.
 
Kütüphanenin temel olarak kullanacağı bu yapı sayesinde kullanıcı ve sunucu arasındaki iletişimi proxy üzerinden geçirerek arada oluşan tarifğin kontrol altına alınması sağlanmış olucaktır. Bu yapıyı örnek alarak ve Ruby’nin kendi içindeki bazı kütüphaneleri kullanarak http proxy hizmeti sunan bir kütüphane hazırladım. Genel olarak hedeflenen hizmeti sunuyor olsada ileri ki aşamalarda daha verimli bir şekilde hizmet edecektir.


MBFuzzer projesini, https://github.com/YakindanEgitim/mbfuzzer adresinden takip edebilirsiniz.

0 yorum: