SeeTheSharpFlag: Hack The Box Mobil Uygulama Zorluğunun Derinlemesine Analizi
Hack The Box platformunun mobil uygulama zorluklarından biri olan “SeeTheSharpFlag”, Android uygulama güvenliğine ilgi duyanlar için oldukça öğretici bir deneyim sunmaktadır. Bu yazıda, söz konusu mobil challenge’ı çözmek için izlenen adımları, kullanılan araçları ve karşılaşılan teknik zorlukları detaylı bir şekilde ele alacağız. Amacımız, uygulamanın derinliklerine inerek gizlenmiş bayrağı nasıl bulduğumuzu adım adım açıklamak ve mobil uygulama tersine mühendisliği ile güvenlik analizine dair pratik bilgiler sunmaktır.
Uygulamanın Keşfi ve İlk Analizler
Her siber güvenlik challenge’ında olduğu gibi, “SeeTheSharpFlag” ile de ilk adım uygulamayı tanımak ve temel işlevselliğini anlamaktır. Bu aşama, daha sonraki statik ve dinamik analizler için bir yol haritası oluşturmamızı sağlar.
Uygulamanın Elde Edilmesi ve Kurulumu
Challenge, bize bir .apk dosyası olarak sunulur. Bu dosyayı, bir Android emülatörüne (örneğin Genymotion veya Android Studio AVD) veya fiziksel bir Android cihaza kurarak işe başlarız. Kurulum için adb install komutu yeterlidir. Uygulama kurulduktan sonra, arayüzünü ve sağladığı özellikleri hızlıca gözden geçiririz. Genellikle bu tür challenge’larda basit bir arayüz bulunur ve bayrağı bulmak için bir ipucu veya giriş alanı içerebilir.
Temel İşlevselliğin İncelenmesi
Uygulamayı çalıştırdığımızda, genellikle bir giriş ekranı, bir buton veya basit bir metin görüntüleyici gibi temel bileşenlerle karşılaşırız. “SeeTheSharpFlag” özelinde, uygulamanın arayüzü oldukça minimaldir ve genellikle bir “Check Flag” veya benzeri bir butona sahiptir. Bu butonun ne yaptığını, hangi verilere ihtiyaç duyduğunu ve nasıl tepki verdiğini anlamak, ilk ipuçlarını toplamamız için kritiktir. Uygulamanın hata mesajlarını veya logcat çıktılarını izlemek (adb logcat) bu aşamada faydalı olabilir.
AndroidManifest.xml Analizi
Her Android uygulamasının kalbinde AndroidManifest.xml dosyası yer alır. Bu dosya, uygulamanın temel bileşenlerini (aktiviteler, servisler, broadcast receiver’lar, içerik sağlayıcılar), izinlerini ve diğer yapılandırma bilgilerini tanımlar. apktool gibi araçlarla APK dosyasını açtıktan sonra bu dosyayı incelemek, uygulamanın hangi izinlere sahip olduğunu, hangi aktivitelerin dışa aktarıldığını (exported) ve olası giriş noktalarını belirlememize yardımcı olur. Örneğin, dışa aktarılmış bir aktivite, uygulamayı belirli bir intent ile başlatarak dinamik analize başlamak için bir yol sunabilir.
Yukarıdaki örnekte, FlagActivity'nin exported="false" olarak işaretlenmesi, dışarıdan doğrudan erişilemediğini gösterir ve uygulamanın iç mantığı üzerinden ulaşılması gerektiğini ima eder.
Statik Analiz: APK Tersine Mühendislik
Statik analiz, uygulamanın kaynak kodunu çalıştırmadan inceleme sürecidir. Bu aşama, uygulamanın mantığını, gizli işlevlerini ve potansiyel zafiyetleri anlamak için kritik öneme sahiptir.
APK Dosyasının Açılması ve Kaynak Koda Dönüştürülmesi
APK dosyaları aslında birer ZIP arşividir. İçerisinde classes.dex (Dalvik/ART bytecode), kaynaklar, varlıklar ve AndroidManifest.xml gibi dosyaları barındırır. apktool kullanarak APK'yı açmak, kaynakları ve Smali kodunu (Dalvik bytecode'ın insan tarafından okunabilir hali) elde etmemizi sağlar:
apktool d seethesharpflag.apk -o seethesharpflag_decompiled
Ardından, dex2jar aracını kullanarak classes.dex dosyasını Java JAR dosyasına dönüştürürüz:
d2j-dex2jar.sh classes.dex -o seethesharpflag.jar
Bu JAR dosyasını JD-GUI veya Luyten gibi bir Java dekompilatörü ile açarak, uygulamanın Java kaynak kodunu inceleyebiliriz. Bu, uygulamanın iş mantığını anlamak için en verimli yoldur.
Kaynak Kodda Anahtar Kelime Aramaları
Dekomplile edilmiş Java kodunda veya Smali kodunda anahtar kelime aramaları yapmak, bayrak, şifreleme, doğrulama, anahtar veya hassas API çağrıları gibi kritik noktaları hızlıca bulmamızı sağlar. Genellikle "flag", "key", "password", "validate", "check", "encrypt", "decrypt", "secret" gibi terimler aranır. Ayrıca, uygulamanın paket adını veya spesifik sınıf isimlerini hedefleyerek aramalar daraltılabilir.
grep -r "flag" seethesharpflag_decompiled/smali/
grep -r "key" seethesharpflag.jar
Bu aramalar, bayrağın doğrudan bir string olarak saklanıp saklanmadığını veya bir fonksiyonun çıktısı olup olmadığını belirlememize yardımcı olur.
ProGuard/Obfuscation Kontrolü
Bazı mobil uygulamalar, tersine mühendisliği zorlaştırmak için ProGuard veya benzeri araçlarla kod karıştırma (obfuscation) teknikleri kullanır. Eğer dekompile edilmiş kod okunaksız, sınıf ve metod isimleri anlamsız karakterlerden oluşuyorsa (örn. a.b.c.d()), bu bir obfuscation belirtisidir. Bu durumda, statik analiz daha zorlaşır ve dinamik analize daha fazla ağırlık vermek gerekebilir. Ancak, "SeeTheSharpFlag" gibi challenge'larda genellikle bu seviyede bir obfuscation bulunmaz veya aşılabilir düzeydedir.
Dinamik Analiz: Çalışma Zamanı İncelemesi
Dinamik analiz, uygulamanın çalışma zamanındaki davranışını gözlemlemeyi ve manipüle etmeyi içerir. Bu, statik analizde anlaşılamayan veya gizlenmiş mantıkları ortaya çıkarmak için çok güçlü bir yöntemdir.
Frida ile Enjeksiyon
Frida, dinamik analiz için en popüler ve güçlü araçlardan biridir. Çalışan bir uygulamaya kod enjekte ederek metod çağrılarını izleyebilir, argümanları değiştirebilir, dönüş değerlerini manipüle edebilir ve hatta yeni fonksiyonlar ekleyebiliriz. Frida'yı kullanmak için, hedef cihazda Frida sunucusunun çalışıyor olması ve bilgisayarımızda Frida istemcisinin yüklü olması gerekir.
# Frida sunucusunu cihaza itme ve çalıştırma
adb push frida-server /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
# Uygulamanın PID'sini bulma
adb shell ps | grep com.example.seethesharpflag
# Frida ile enjeksiyon (örnek bir script ile)
frida -U -l myscript.js com.example.seethesharpflag
Uygulama Akışının İzlenmesi
Frida scriptleri ile uygulamanın belirli metodlarını hook'layarak, bu metodların ne zaman çağrıldığını, hangi argümanlarla çağrıldığını ve ne döndürdüğünü gözlemleyebiliriz. Özellikle bayrak kontrolü yapan veya hassas verileri işleyen metodları hedef alırız. Örneğin, bir butona tıklandığında hangi metodların çağrıldığını izlemek, uygulamanın iş mantığını anlamamıza yardımcı olur.
// myscript.js örneği: MainActivity'deki bir metodu hook'lama
Java.perform(function () {
var MainActivity = Java.use("com.example.seethesharpflag.MainActivity");
MainActivity.checkFlag.implementation = function (flagInput) {
console.log("checkFlag called with: " + flagInput);
var result = this.checkFlag(flagInput);
console.log("checkFlag returned: " + result);
return result;
};
});
Metod Çağrılarının ve Argümanların Takibi
Frida'nın Java.use() ve .implementation özellikleri sayesinde, istediğimiz Java sınıflarını ve metodlarını hedefleyebiliriz. Bu, özellikle şifreleme/deşifreleme işlemleri, string karşılaştırmaları veya veritabanı sorguları gibi kritik noktalarda çok değerlidir. Metod argümanlarını ve dönüş değerlerini loglayarak, uygulamanın iç işleyişi hakkında derinlemesine bilgi edinebiliriz. Bu sayede, bayrağın nasıl doğrulanması gerektiğini veya hangi değerlerin kritik olduğunu anlayabiliriz.
Kritik Fonksiyonların Anlaşılması
Statik ve dinamik analizlerden elde ettiğimiz bilgilerle, uygulamanın bayrağı kontrol eden veya işleyen kritik fonksiyonlarını daha yakından incelemeye başlarız.
Şifreleme/Dekriptleme Mekanizmaları
Birçok mobil challenge'da bayrak veya kritik veriler şifrelenmiş olarak saklanır. Uygulama içerisinde şifreleme algoritmalarını (AES, RSA vb.) ve anahtarları ararız. Eğer anahtar kodun içinde sabit kodlanmışsa, bu doğrudan bir zafiyet olabilir. Frida ile şifreleme/deşifreleme metodlarını hook'layarak, işlenen açık metin veya şifreli metinleri ve kullanılan anahtarları yakalayabiliriz.
// Örnek: Bir şifreleme metodunu hook'lama
Java.perform(function () {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload('[B').implementation = function (input) {
console.log("Cipher.doFinal input: " + Java.array('byte', input));
var result = this.doFinal(input);
console.log("Cipher.doFinal output: " + Java.array('byte', result));
return result;
};
});
Native Kütüphanelerin İncelenmesi (JNI, C/C++)
Bazı uygulamalar, performans veya güvenlik nedeniyle kritik mantıkları C/C++ gibi native kodda yazar ve Java Native Interface (JNI) aracılığıyla Java katmanından çağırır. Native kod, tersine mühendisliği daha zor hale getirse de, Ghidra veya IDA Pro gibi araçlarla analiz edilebilir. Frida, native fonksiyonları da hook'layabilir, bu da native katmandaki işleyişi anlamamıza yardımcı olur. System.loadLibrary() çağrıları, native kütüphanelerin varlığını işaret eder.
Veri Depolama Yöntemleri
Uygulamalar, verileri çeşitli şekillerde depolayabilir: SharedPreferences, SQLite veritabanları, dahili/harici depolama veya ağ üzerinden. Bayrağın veya ona yol açan ipuçlarının bu depolama alanlarında saklanıp saklanmadığını kontrol ederiz. adb shell ile cihazın dosya sistemine erişerek bu alanları manuel olarak inceleyebiliriz.
| Depolama Yöntemi | İnceleme Yolu | Potansiyel İçerik |
|---|---|---|
| SharedPreferences | /data/data/ |
Ayarlar, küçük veriler, bazen bayrak parçaları |
| SQLite Veritabanı | /data/data/ |
Yapısal veriler, kullanıcı bilgileri, loglar |
| Dahili Depolama | /data/data/ |
Uygulama tarafından oluşturulan dosyalar |
Zafiyetin Tespiti ve İstismar
Topladığımız tüm bilgilerle, uygulamanın bayrağı koruma mekanizmasındaki zafiyeti veya bypass edilebilir bir noktayı tespit etmeye çalışırız. "SeeTheSharpFlag" gibi challenge'lar genellikle basit ama gözden kaçabilecek bir mantık hatası veya zayıf bir güvenlik kontrolü içerir.
Güvenlik Kontrollerinin Bypass Edilmesi
Uygulama, genellikle bayrağı göstermeden önce bir dizi kontrol yapar (örneğin, doğru bir giriş, belirli bir durumun sağlanması). Bu kontrolleri statik analizle tespit ettikten sonra, dinamik analizde Frida kullanarak bypass etmeye çalışırız. Örneğin, bir if (isCorrectFlag(input)) kontrolünde, isCorrectFlag metodunun dönüş değerini her zaman true olarak değiştirebiliriz.
// Örnek: Bir doğrulama metodunu bypass etme
Java.perform(function () {
var FlagValidator = Java.use("com.example.seethesharpflag.FlagValidator");
FlagValidator.isCorrect.implementation = function (input) {
console.log("isCorrect called with: " + input);
// Orijinal metodu çağırmadan doğrudan true döndür
return true;
};
});
Kod Enjeksiyonu ve Manipülasyonu
Frida ile yalnızca mevcut metodları hook'lamakla kalmayıp, uygulamanın çalışma zamanında yeni kod enjekte edebilir veya mevcut kodun davranışını tamamen değiştirebiliriz. Bu, özellikle karmaşık mantıkları aşmak veya gizli fonksiyonları tetiklemek için kullanışlıdır. Örneğin, bir uygulamanın dahili bir metodunu dışarıdan çağırarak, normalde erişilemeyen bir işlemi tetikleyebiliriz.
Bayrak Kontrol Mekanizmasının Aşılması
"SeeTheSharpFlag" challenge'ında, bayrak genellikle uygulamanın bir yerinde gizlenmiş ve belirli bir koşul sağlandığında ortaya çıkan bir stringdir. Bu koşul, bir matematiksel işlem, bir string karşılaştırması veya bir şifre çözme işlemi olabilir. Amacımız, bu koşulu ya doğrudan sağlamak ya da kontrol mekanizmasını atlayarak bayrağa ulaşmaktır. Genellikle, uygulamanın bir metodunun içindeki bir string yapısı veya bir metot çağrısının dönüş değeri bayrağı içerir. Frida ile bu metodları izleyerek veya manipüle ederek bayrağı elde ederiz.
Bayrağın Elde Edilmesi
Tüm bu analizler sonucunda, bayrağın nerede olduğunu ve nasıl elde edileceğini belirlemiş oluruz. Bu genellikle, bir Frida scripti aracılığıyla bir metodun dönüş değerini yakalamak veya bir depolama alanından okumak şeklinde gerçekleşir.
Elde Edilen Bilgilerin Birleştirilmesi
Statik analizden elde ettiğimiz sınıf ve metod isimleri ile dinamik analizde gözlemlediğimiz çalışma zamanı davranışlarını birleştirerek, bayrağı barındıran veya üreten nihai noktayı tespit ederiz. Örneğin, statik analizde getSecretFlag() adında bir metod gördüysek, dinamik analizde bu metodu hook'layarak dönüş değerini yakalamaya çalışırız.
Bayrağın Formatı ve Doğrulanması
Hack The Box challenge'larında bayraklar genellikle belirli bir formatta (örn. HTB{...}) olur. Elde ettiğimiz stringin bu formata uygun olup olmadığını kontrol ederiz. Eğer değilse, elde ettiğimiz bilginin bayrağın bir parçası mı yoksa şifrelenmiş hali mi olduğunu anlamaya çalışırız. Bayrağı doğru formatta elde ettikten sonra, Hack The Box platformuna göndererek challenge'ı tamamlarız.
Çözüm Adımlarının Özeti
- APK'yı kur ve temel işlevselliği anla.
- APK'yı dekompile et (apktool, dex2jar, JD-GUI).
- Kaynak kodda "flag", "key" gibi anahtar kelimeleri ara.
- Frida'yı kur ve uygulamaya enjekte et.
- Kritik metodları (örneğin, bayrak kontrolü yapan metodlar) hook'la.
- Metod çağrılarını, argümanları ve dönüş değerlerini izle.
- Gerekirse güvenlik kontrollerini bypass et veya kodu manipüle et.
- Bayrağı içeren stringi yakala.
Alınan Dersler ve Öneriler
"SeeTheSharpFlag" gibi mobil challenge'lar, siber güvenlik alanında çalışan veya bu alana ilgi duyan herkes için değerli dersler sunar.
Mobil Uygulama Güvenliği İpuçları
- Asla Hassas Verileri Sabit Kodlama: Şifreleme anahtarları, API anahtarları veya bayraklar doğrudan kaynak kodda veya uygulama varlıklarında sabit kodlanmamalıdır.
- Güçlü Şifreleme Kullanımı: Hassas veriler her zaman güçlü ve güncel şifreleme algoritmalarıyla korunmalı, anahtarlar güvenli bir şekilde yönetilmelidir.
- Kod Karıştırma (Obfuscation) Kullanımı: Tersine mühendisliği zorlaştırmak için ProGuard gibi araçlar kullanılmalıdır, ancak bunun tam bir güvenlik çözümü olmadığı unutulmamalıdır.
- JNI ve Native Kodun Akıllıca Kullanımı: Kritik mantıklar native kodda yazılabilir, ancak bu da analizden muaf değildir ve dikkatli bir şekilde uygulanmalıdır.
- Güvenli Veri Depolama: Veriler, Android'in sağladığı güvenli depolama mekanizmaları (örneğin Keystore) kullanılarak saklanmalıdır.
Geliştiriciler İçin Öneriler
Mobil uygulama geliştiricileri, güvenlik testlerini geliştirme sürecinin erken aşamalarında entegre etmelidir. Statik uygulama güvenlik testi (SAST) ve dinamik uygulama güvenlik testi (DAST) araçları kullanmak, bilinen zafiyetleri tespit etmeye yardımcı olabilir. Ayrıca, güvenlik bilincini artırmak ve güvenli kodlama pratiklerini benimsemek, daha sağlam uygulamalar geliştirmek için elzemdir.
Penetrasyon Testi Perspektifinden Bakış
Mobil uygulama penetrasyon testlerinde, "SeeTheSharpFlag" challenge'ında kullanılan teknikler (statik ve dinamik analiz, Frida ile enjeksiyon, dekompilasyon) sıklıkla uygulanır. Bu challenge, gerçek dünya senaryolarında karşılaşılacak mobil uygulama zafiyetlerini tespit etme ve istismar etme becerilerini geliştirmek için harika bir pratik sağlamıştır.
Sonuç
"SeeTheSharpFlag" Hack The Box mobil challenge'ı, Android uygulama tersine mühendisliği ve dinamik analizin temel prensiplerini uygulamalı olarak öğrenmek için mükemmel bir fırsat sundu. Statik analizle kodun genel yapısını anlamak, dinamik analizle (özellikle Frida kullanarak) çalışma zamanı davranışını manipüle etmek ve son olarak bayrağı elde etmek, mobil güvenlik analizinin tipik adımlarını yansıtmaktadır. Bu tür challenge'lar, hem teorik bilgiyi pekiştirmek hem de pratik becerileri geliştirmek adına vazgeçilmezdir. Umarız bu detaylı yazılım, mobil uygulama güvenliği dünyasına adım atmak isteyenlere yol gösterici olmuştur.
SSS (Sık Sorulan Sorular)
- Bu challenge'ın temel zorluğu neydi?
- Temel zorluk, uygulamanın bayrağı doğrulama mantığını statik ve dinamik analiz yöntemleriyle çözmek, ardından bu mantığı aşarak bayrağa ulaşmaktı. Genellikle bu tür challenge'lar, basit ama iyi gizlenmiş bir mantık hatası içerir.
- Hangi araçlar bu challenge'ı çözmek için kritikti?
apktool(APK'yı açmak için),dex2jar(DEX'i JAR'a dönüştürmek için),JD-GUIveyaLuyten(Java kodunu dekompile etmek için) ve özellikleFrida(dinamik analiz ve runtime manipülasyon için) bu challenge'ın çözümünde kritik rol oynamıştır. Ayrıcaadbkomutları da cihaz etkileşimi için önemlidir.- Mobil uygulama güvenliği için en önemli ipucu nedir?
- En önemli ipucu, hassas verileri ve kritik mantığı asla istemci tarafında (uygulamanın kendisinde) güvenliğe almamaktır. Mümkün olduğunca sunucu tarafında işlemek ve istemci tarafında sadece sunucudan gelen verileri güvenli bir şekilde görüntülemek/işlemek gerekir. Ayrıca, kod karıştırma (obfuscation) ve root tespiti gibi ek güvenlik önlemleri de alınabilir, ancak bunlar tam bir çözüm değildir.
- Bu tür challenge'lar siber güvenlik kariyerine nasıl katkı sağlar?
- Bu tür challenge'lar, mobil uygulama penetrasyon testi, tersine mühendislik ve zafiyet analizi gibi alanlarda pratik deneyim kazandırır. Problem çözme yeteneğini geliştirir, farklı araçları kullanma becerisini artırır ve gerçek dünya güvenlik açıklarını anlama konusunda değerli içgörüler sunar.