Fuzzing Mobile - 101
Fatih Erdoğan

info@ferdogan.net:~# whoami
-
Intern at SignalSEC Ltd.
- Vulnerability Research
- Reverse Engineering
- Exploit Development
- Co-Founder at Mavidurak-IO
-
Student at Sakarya University (2014 - ...)
-
Blogger
- http://ferdogan.net
- http://mavidurak.github.io
-
Contact
- twitter.com/FeCassie

Fuzzing Nedir ?
- Günümüzde kullanılan Fuzz / Fuzzing kavramının ilk olarak 80’li yılların sonlarında kullanıldığı söylenmektedir. IT sektöründe kabul görülen isim Barton Miller’dır.
- Barton Miller, Fuzz terimini şiddetli bir fırtınanın başlamasıyla keşfetmiş. Fırtınalı bir günde dial-up modem ile shell üzerinden Unix bir Sisteme bağlıyken Miller, yağan yağmurun telefon hattına olan etkisinden ötürü çalıştırılan Shell Komutlarının bozduğunu farketmiş. Bundan yola çıkarak rastgele data, unstructured data (yapılandırılmamış data) kavramıyla oluşturacak bir isim vermek istemiş ve fuzz terimi hayat bulmuş.

Fuzzing
- Fuzzing, güvenlik araştırmacılarının uygulamalara yönelik; rastgele veya odaklı olarak oluşturdukları bir test tekniğidir. Bu kapsamda yapılmış olunan teste Fuzzing veya Fuzz Testing denir.
- Test ortamının amacı, sistem veya uygulamaların beklenenin dışında; otomatik, yarı-otomatik veya manuel bir şekilde fuzz edilerek; Uygulama veya sistemin tepkilerini görme ve olası ihtimallerde manipüle etmek suretiyle, istisnai /çökme durumlarını görüntülemektir.

Fuzzer Çeşitleri
- Sistem veya uygulama fuzz edilirken, herhangi bir uygulama veya script için fuzzer terimi kullanılır.
-
Fuzzing çoğu zaman beklenenden daha farklı (uzun veya kısa, eksi yada artı) değer, belki bozuk bir dosya formatı veya hiç ulaşamayacağı bir sinyal adresi gönderilerek yapılır, bu işlemi yapan uygulama/script/kişi için fuzz tester veya fuzzer denir. Fuzzer‘lardan genel olarak beklenen nitelikler şu şekilde sıralanabilir.
- Data Oluşturma
- Data Aktarma
- Loglama / Monitoring

Manuel Fuzzer
- Manuel olarak yapılan test biçimidir. Manuel fuzzing / Manuel Fuzz testing hedef sistemin girdi noktaları manuel olarak kontrol edilerek uygulanır. Datalar Manuel olarak değiştirilir ve gönderilir, sistem veya uygulamanın tepkileri manuel olarak incelenir.

Yarı Otomatik Fuzzer
- Yarı otomatik fuzz testing, manuel‘e göre bir aşama daha basit ve başarılıdır. bir uygulama veya scriptten yararlanılarak hedef sistem veya uygulamaya otomatik bir şekilde data oluşturur ve gönderir ve tepkileri manuel olarak incelenir.

Full Otomatik Fuzzer
- En kullanışlı olan fuzzer‘lar otomatik olanlardır. Hedef sistem veya uygulama üzerinde çalıştırılır ve crash olana dek beklenir. girdi noktalarını ve sonuçlarını kendi kendine otomatik bir şekilde oluşturur, gönderir ve loglar…

Şimdiye kadar bulunmuş bilinen, bilinmeyen(0-day) birçok güvenlik zafiyeti fuzzer kullanılarak keşfedilmiştir. Çünkü insan gücünün ötesinde daha fazla varyasyonda veriyi, çok daha kısa sürede üretebilmekte ve sonuçlarını monitörize edebilmeyi kolaylaştırmaktadırlar.


Fuzzing iOS Safari Browser


Hedefimiz Ne ?
-
Zafiyet arama işleminde hepimizin bildiği üzere ilk aşama input noktalarını tespit etmektir. Neticede yapılacak iş aslında bir input manipülasyonudur. Eğer bir browserı hedef alırsak , o zaman browserın olası input noktalarını belirlememiz gerekir.

Jailbreaked iOS 7 iPhone 4S


Aşağıdaki tablo bir browserın yorumladığı (rendering) , kullanıcı tarafından belirlenebilen dataları göstermektedir. Anlaşılacağı gibi bu tabloda belirtilen her element (PDF, Audio, Image, CSS, JS) browser için bir inputtur . İşte fuzzing’de biz bu inputlardan herhangi birini hedef alıp , input manipülasyonu yapabiliriz.


- Genelde browserlarda , tabloda da görülebileceği üzere Javascript, Html ve CSS ‘ in payı daha büyüktür. Bu yüzden zafiyet avcıları genelde bu elementleri fuzz ederler. Biz ise bu makalede “audio” fuzzing gerçekleştireceğiz. Zaman zaman Safari ve çeşitli uygulamalarda TIFF , PDF, MP4 vb. medya elementlerinin yorumlanması esnasında oluşan zafiyetlerle de karşılaşıyoruz.

Apple Zafiyet Örnekleri
-
Apple Safari ImageIO TIFF Image Handling Heap Buffer Overflow Vulnerability
- http://www.securityfocus.com/bid/48833/info
-
CoreGraphics Memory Corruption - CVE-2014-4377
- http://blog.binamuse.com/2014/09/coregraphics-memory-corruption.html


Biz de AAC (Advanced Audio Coding) ses türlerinden .m4r ve .m4a dosyaları üzerinden mutation based – dumb fuzzing yapacağız.

Mutating Input Values
İlk amacımız bu iş için elimizdeki sample dosyanın içeriğini değiştirecek bir fuzzer kullanmamız lazım. Biz daha önceden geliştirilmiş bir fuzzer’dan yararlandık ancak aynı işlemi siz ufak bir script ile de yapabilirsiniz.
https://github.com/FeCassie/MobileFuzzing/blob/master/fuzzer.c


Alarm.m4r dosyasının orijinalini şimdilik bozmak istemediğimizden ilk olarak dosyayı case1.m4r adında klonladık. “du” komutuyla iki dosyanın da boyutlarının aynı olduğunu görebilirsiniz. Daha sonra fuzzer.c yi derledik ve case1.m4r dosyasının 4.offsetini “0xFF” (255) değeri ile değiştirdik

Gördüğünüz gibi Alarm.m4r dosyasının 4.offseti 00 iken case1.m4r dosyasının 4.offseti FF değerini almış (saymaya 0’dan başlıyoruz). Bizim bu işlemi, fuzzing olabilmesi için sıfırıncı byte’dan başlayıp , son byte’a kadar bu şekilde belirlediğimiz bir fuzzing değeri ile (0xFF)değiştirerek (byte-flip ) otomatize etmemiz ve farklı testcaseler oluşturmamız gerekiyor. 0xFF değeri potansiyel integer overflow ve signedness error hatalarını tespit edebilmek için seçildi , farklı değerler da seçilebilir.

Bu süreci otomatize etmek için autofuzz.sh scriptini kullanacağız. Scriptin kodları şu şekilde, baktığınızda da ne iş yaptığını kolayca anlayabilirsiniz.


testcase dosyalarımızı otomatize bir şekilde oluşturalım..
“case1.m4r” dosyasının ilk 20 offsetine sırasıyla FF değerini yerleştirdik. Örnek olması açısından 20 tane dosya oluşturmayı tercih ettik.Fuzzing yaparken 1000 veya 10000 gibi sayılarla dosyaları oluşturacağız.

-
Fuzzing’de ilk aşamamız yukarıda anlatıldığı gibi çeşitli sample dosyalardan bu şekilde binlerce testcaseler oluşturmak.
- İkinci aşamamız ise oluşturduğumuz bu testcaseleri , hedef uygulamada , örneği Safari browserda açmak.
- Amacımız oluşturduğumuz bu dosyaların Safari tarafından yorumlanmasını sağlamak ve bir crash / potansiyel zafiyet keşfetmek. Fakat oluşturduğumuz mutasyon ses dosyalarının 1000, 10000 gibi sayılar olduğunu düşünürsek, bu işlemi elle yapmak çok vakit alacaktır hatta imkansız bir hale dönüşecektir.
Yol Haritası

- Oluşturduğumuz ses dosyalarının browser üzerinde otomatik çalıştırmak istiyoruz.Bunun için 1.m4a dosyası açıldıktan belli bir süre sonra(1 saniye), 2.m4a 3.m4a ….,1000.m4a şeklinde açılmasını sağlamamız gerekiyor.
- Bu otomatize işlemi yapmak için de ayrı bir script geliştirmemiz gerekiyor. Windows ortamında bunu yapmak ve hatta crash olduğunda otomatik olarak log tutmak oldukça kolay ancak mobil platformlar biraz daha kapalı kutu.
Yol Haritası

- Hedefimiz Safari olduğu için aklımıza oluşturduğumuz mutasyon dosyaları yorumlatmak için oldukça basit ve güzel bir yöntem geldi.Bunun için html meta taglarını kullanmaya karar verdik.
- Yani kullanacağımız yöntem html meta-refresh yöntemi.
- Oluşturduğumuz ses dosyalarının sayısı kadar içinde html meta-refresh metodunu kullanarak yönlendirmeyi sağlayacağımız html dosyaları oluşturacağız.
- Örneğin 1.html dosyasının içinde 1.m4a çalıştırılacak, ardından 1 saniye gibi kısa bir zaman aralığından sonra 2.html dosyasına geçiş yapılacak ve 2.m4a çalıştırılacak. Bu döngü 1000.html 1000.m4a’ya veya sizin belirlediğiniz sınırlara kadar devam edecek.
Peki biz ne düşündük ?
https://github.com/FeCassie/MobileFuzzing/blob/master/signalfuzzer.py

Let the Fuzzing Begin !

Let the Fuzzing Begin !
-
Fuzzing’i bu şekilde yapmak için web server kullanacağız. Hazırladığımız dosyaları web server’a atıp çalıştırınca fuzzing işlemi başlamış olacaktır.
- Scriptleri web server üzerinde çalıştırdık ve m4a dosyalarından testcaselerimizi oluşturduk. Daha sonra yapmamız gereken signalfuzzer.py scriptini gerekli inputları vererek çalıştırmak. Gördüğünüz gibi .m4a ve meta-refresh metotuyla çalışan html dosyaları oluşturuldu



Fuzzing Started !
- Bundan sonra yapmamız gereken, fuzzing yapacağımız mobil browser’da web server IP adresini kullanarak 1.html dosyasını çalıştırmak.
- Örnek: http://ServerIP/1.html
- 1.html sayfası açılınca 1.m4a çalıştırılacak ve 1 saniye sonra 2.html sayfası açılıp 2.m4a çalıştırılacak.Bu döngü böyle 500’e kadar devam edecek. Oluşturduğumuz dosya sayısına ve türüne bağlı olarak eğer fuzzing işlemi işe yararsa browser crash olana kadar bu işlem devam edecektir.


Fuzzing’i başlattıktan sonra son olarak access_log dosyasını izlemeye alabilirsiniz. Crash olursa, Safari browser kapanacaktır, böylece en son hangi dosyaya erişildiğine loglardan bakarak, crash eden dosyayı bulabiliriz. Sizde bu şekilde farklı dosya türlerini kullanarak mobile browser üzerinde fuzzing yapabilirsiniz.


Sorular ?


Kaynaklar
-
İbrahim Baliç Blog
-
SignalSEC Ltd. Blog

Fuzzing Mobile - 101
By fecassie
Fuzzing Mobile - 101
- 1,289