OWASP UnCrackable Android App Level 1 Writeup

Kod:
adb install UnCrackable-Level1.apk
Uygulamamızı kurduktan sonra açalım bakalım bizi ne karşılayacak (Android 4.4 üstü olması tavsiye ediliyor. Ben android 7 sürümü üzerinde anlatacağım)

1aef9ca184d9688d4c5256ebfae8fcf7a0680aa4.png


Cihazımız rootluydu ve program bunu farkedip bize bir uyarı çıkardı. OK butonuna bastığımız zaman kendini kapatacak. Yani ilk halletmemiz gereken kısım bu root detect fonksiyonu olacak. Bunun için ben jadx ile açıp inceleyeceğim.

AndroidManifest.xml​

0c3d060c65d59fd91d24cea416056335aedcaa29.png

sg.vantagepoint.uncrackable1.MainActivity​

dee98d8c01e4ae1d122114fcee54c451854a56dc.png

sg.vantagepoint.a.c​

42999c3830ef83d44b855b91939cfe8ff0505469.png


Cihazımızın nasıl root olduğunu tespit ettiğine dair yapı şu şekilde kısaca. Burada isterseniz tek tek frida ile 3 fonksiyonun false dönmesini sağlayabilir, isterseniz gene frida ile System.exit() fonksiyonunu manipüle edebilir veya smali kodu içerisindeki bu if bloğunu / fonksiyonu silip tekrar paketleyebilirsiniz.

1. Yöntem​

Kod:
Java.perform(function() {
    console.log("[+]Root detect bypass !");

    var detect = Java.use("sg.vantagepoint.a.c");

    detect.a.implementation = function() {
        console.log("a() return false");
        return false;
    };
    detect.b.implementation = function() {
        console.log("b() return false");
        return false;
    };
    detect.c.implementation = function() {
        console.log("c() return false");
        return false();
    };
});
Kod:
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause
de6a33e9df1027775f958802fc4b46988941211b.png

2. Yöntem​

Kod:
Java.perform(function() {
    console.log("[+]Root detect bypass !");

    var detect = Java.use("java.lang.System");

    detect.exit.implementation = function() {
        console.log("system.exit nerdesin ?");
    };
});
Kod:
frida -l root-bypass.js -U -f owasp.mstg.uncrackable1 --no-pause
c4f180ef714959cbccf9823884f6c508d4a1ef4a.png


Karşımıza gene root detected! yazısı gelecek. Ancak OK butonuna bastıktan sonra çıkış işlemi çalışmayacaktır.

3. Yöntem​

64a443babb7c51b02e15a97f93c1a2756c5046d0.png


apktool ile apk dosyasını açtıktan sonra (apktool d UnCrackable-Level1.apk) şu dizine gidelim UnCrackable-Level1/smali/sg/vantagepoint/uncrackable1 . Bu dizinde bulunan 'MainActivity$1.smali' dosyasında yukarda jadx ile görmüş olduğumuz satır yer almakta.

75cdaf810ed3c490f2ba0f3eff55d2a7b8b48358.png


Burda bulunan const/4 pl1, 0x0 invoke-static {p1}, Ljava/lang/System;->exit(I)V kod parçasından kurtulup tekrardan paketlersek eğer programın çıkış yapmasını engellemiş oluruz.
Kod:
$ apktool b UnCrackable-Level1 -o UnCrackable-Level1_edited.apk
$ keytool -genkey -v -keystore ctf.keystore -alias ctfKeystore -keyalg RSA -keysize 2048 -validity 10000
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ctf.keystore UnCrackable-Level1_edited.apk ctfKeystore
$ jarsigner -verify -verbose -certs UnCrackable-Level1_edited.apk
$ adb uninstall owasp.mstg.uncrackable1
$ adb install UnCrackable-Level1_edited.apk
568f344e176167c8a8c0288c430184c670efa5a8.png


Eğer soruyu böyle çözmek isterseniz a.smali içerisine de şu satırları ekleyip paketlerseniz eğer programı çalıştırdıktan sonra loglardan istenilen şeyi öğrenebilirmişsiniz.

Ben frida ile devam edeceğim…

NOT: Bu yöntemler dışında farklı yöntemler kullanarak da root kontrolünü atlatabilirsiniz.

Frida Devam​

Bizden istenilen değeri bulalım…

sg.vantagepoint.uncrackable1.MainActivity

e3f127e8c39a1055a0ceb1c02980069081ea87f2.png


sg.vantagepoint.uncrackable1.a

e1dc33151e5b5884a9ad8d07e202f1aaa9e508c9.png


sg.vantagepoint.a.a

8385d5dc51bbd99b6f9d66bf4095156e1434a638.png


Evet gördüğümüz üzere AES kullanılmış. Bu fonksiyondan dönen değer bizim girmiş olduğumuz değer ile karşılaştırılıyor. O halde bu fonksiyonu hooklayıp return ettiği değeri ekrana yazdırırsak aradığımızı bulmuş oluruz.

Not: Burda dikkat etmemiz gereken şey dönen değer string tipinde değil gibi o yüzden ufak bi dönüşüme ihtiyacımız olacak.
Kod:
Java.perform(function() {
    console.log("[+]Root detect bypass !");

    var detect = Java.use("java.lang.System");
    detect.exit.implementation = function() {
        console.log("system.exit nerdesin ?");
    };

    var encrypt = Java.use("sg.vantagepoint.a.a");
    encrypt.a.implementation = function(var0, var1) {
        var ret = this.a(var0, var1);
        var flag = '';
        for(var i = 0; i < ret.length;    i++) {
            flag += String.fromCharCode(ret[i]);
        }
        console.log("[+] Decrypted : " + flag);
        return ret;
    };
});
9b70ef8ba1579c2996b76731fa238db92d3c64cc.png


Bizden istenen değer I want to believe sanırım. Hemen deneyelim.

632f0ea0105f2952446adcd6e84e9b1cf274b553.png


Ve evet bu şekilde bizden isteneni bulmuş olduk :)

Kaynaklar​

 
Üst