Posted on October 3rd, 2012

SignalSEC olarak  kaynak kod analizi yerine daha çok black-box / binary analiz hizmet talepleri ile karşılaşıyoruz. Bu tarz hizmetler verirken edindiğimiz tecrübelerden yola çıkarak  , black-box app pentestlerinde uyguladığımız ilk adımları sizlerle paylaşmak istedik.

Uygulama güvenliği testlerinde genelde iki method izlemekteyiz, aslında iki method da birbiriyle iç içe diyebilirz;

1-) Fuzz Testing (fuzzing)

2-) Reversing

Bu testlerde popüler/public araçlar kullandığımız gibi kendi geliştirdiğimiz araçlardan da yararlanmaktayız.

Elimize analiz için geçen çalıştırılabilir dosyada ilk olarak yaptığımız; uygulama hakkında kısaca bilgi edinmek. Uygulamanın iletişimde olduğu client/server var mı ? Dinlemekte olduğu port ? Loglama vb. özellikleri ? Dosya okuma , yazma özelliği ?

Oldies but Goodies!

Bu belirlemeleri yaptıktan sonra ilk olarak uygulamada güvensiz C fonksiyonları kullanılıp kullanılmadığına bakmaktayız.  Uygulamada kullanılan güvensiz fonksiyonların listesini Halvar Flake’in yazdığı  BugScam adlı IDA Script’i ile belirliyoruz.

BugScam scriptini  “Program File\IDA Free/Pro\idc” dizinine kopyaladıktan sonra IDA’da File menüsünden IDC File ‘ a tıklayıp,  run_analysis.idc dosyasını seçmeniz scripti çalıştırmak için yeterli olacaktır.  Script çalıştığında aşağıdaki gibi bir görüntüyle karşılaşacaksınız:

Script binary içerisindeki bütün güvensiz fonksiyonları tarayıp bulduktan sonra , html olarak reports klasörü içerisine uygulamanın adıyla kaydedecek.  Script orjinal haliyle binary içerisinde _strcpy , _sprintf , _strcat , lstrcpyA, lstrcatA, MultiByteToWideChar ve wsprintf fonksiyonlarını aramakta. Scriptde çok ufak bir düzenlemeyle strcpy,  strcat, vsprintf, lstrcpyW, _vsprintf gibi fonksiyonları da bu taramaya dahil edebiliriz.

www.signalsec.com/publications/scam.rar adresinden indireceğiniz rar arşivi içindeki analysis_scripts klasörü altındaki idc scriptlerini  IDA Free\idc\bugscam\analyse_scripts içerisine çıkarıp yine aynı rar arşivi içerisindeki bugscam.conf dosyasını \idc\bugscam\   içerisine kopyalamanız bu değişiklik için yeterli.

Scripti çalıştırdığınızda örnek bir rapor aşağıdaki gibi olacaktır;

 

Rapor, tek tek bulunan güvensiz fonksiyonları adresleriyle beraber gösterir. Bu şekilde programın nasıl bir geliştiricinin elinden çıktığı , yazılım geliştirme sürecinde SSDLC  var mı yok mu aşağı yukarı genel bir fikir edinmiş oluruz.

Tabi her bulunan güvensiz fonksiyon bir güvenlik açığına sebebiyet vermeyebilir. Önemli olan bu fonksiyonun aldığı “src” vb. değişkenin kullanıcı tarafından kontrol/manipüle  edilip – edilemediğidir. Bunun için raporda yer alan her adresi IDA’da manuel olarak incelemek gerekecektir.  BugScam aracı , güvensiz fonksiyonların tespitini ve uygulama hakkında bilgi alma aşamasını bizler için kolaylaştırmaktadır.

Other Common Errors

Güvensiz fonksiyonlara göz attıktan ve inceledikten sonra, bir üst seviyeye geçebiliriz.  Genelde biz bu aşamada yanlış hafıza tahsisleri , kullanıcı tanımlı hafıza tahsisi ve signedness hatalarını bulmaya çalışıyoruz.

Signedness hatalarını statik olarak bulmak için ilk aşamada  binary içerisindeki signed ve unsigned karşılaştırmaların listesini çıkarmakla işe başlıyoruz. (Not: signedness hatalarını bulmanın en iyi ve kolay yolu fuzzing!)

Bunun için BugScam ‘ den de faydalanarak yazdığımız  IDA scriptimizi kullanıyoruz. Scriptimizin çalışma mantığı aşağıdaki şekilde görülebilir;

Signed/Unsigned karşılaştırmaları listeyelen scriptimizin örnek raporu aşağıdaki gibidir;

Yine bu adresler manuel olarak incelenip signedness hataları yakalanmaya çalışmalıdır. Aslında  signed/unsigned comparision tespitini , yazılacak bir windbg scripti/extension ı ile debug/tracing esnasında yapmak , signedness hatalarının tespit sürecini hızlandırıp , kolaylaştırabilir.

Bir sonraki yazımızda , black-box uygulama güvenlik denetimlerinde “Fuzz Testing”  metoduna değineceğiz.

 

Reply