ApkServInject [Java]

k3~

Özel Üye
5 Eki 2015
2,980
21


~ Code Injection ~

Kavramın ispatına geçmeden önce Code Injection zafiyetinden ve bu zafiyetin ortaya çıkış noktalarından bahsetmek istiyorum.

Code Injection: Türkçeye kod enjeksiyonu şeklinde çevirebileceğimiz bu zafiyeti kısaca açıklamak istersek saldırganın istediği kodu sisteme enjekte etmesi ve bu zararlı kodun saldırı sonucunda çalıştırılmasıdır. Saldırganın enjekte edeceği zararlı kodlar sistemde kullanılan programlama diline bağlı olarak değişecektir ve yine buna bağlı olarak sınırlıdır. Bu sınırlamalar nedeniyle Command Injection zafiyetinden ayrı olarak incelenir.
Zafiyetin çıkış noktası diğer pek çok injection/execution zafiyetinde olduğu gibi kullanıcıdan alınan verinin doğrulanmadan işleme alınmasıdır. Kısaca veri kontrolü eksikliği bu zafiyeti doğuran en büyük etkendir diyebiliriz. Zafiyet exploit edilirse saldırgan istediği zararlı kodu sistemde çalıştırabilecek hale gelecektir, bunun etkisinin büyük olabileceği ve büyük zararlara yol açabileceğini söylemek pek de zor olmayacaktır. Bu açıdan Code İnjection zafiyetinin en tehlikeli zafiyetler arasında yer aldığını söylemek mümkündür.

Küçük bir senaryo üzerinden zafiyetin ortaya çıkışını ve nasıl saldırganın bu zafiyeti lehine kullandığını anlatmak istiyorum.
Bir web uygulaması yazdınız ve bir yerinde aşağıdaki şekilde bir yapı kullanmanız gerekti. Örneklemek için basitleştirdiğimiz bu yapıyı kullanıcıdan alınan verinin md5'e dönüştürülmesi için eval() fonksiyonu içerisinde md5() fonksiyonunu çalıştıran bir uygulamada kullanıldığını düşünebilirsiniz. Burada sadece alınan veriyi bir değişkene eşitledik.

Kod:
[COLOR="silver"]$var;
$x = $_GET['text'];
[COLOR="white"]eval([/COLOR]"\$var = \$x;"[COLOR="silver"]);[/COLOR][/COLOR]

Kod:
[COLOR="Silver"]/index.php?text=1[/COLOR]

Sayfaya bu isteği attığımızda var değişkeni GET parametresinden alınan x değişkenine eşitlenmiş olacak. Peki saldırgan burada alınan parametrelere başka php kodları da ekleyip testler yaparsa?

Kod:
[COLOR="silver"]/index.php?text=1[COLOR="White"]; phpinfo()[/COLOR][/COLOR]

Burada eval() fonksiyonuna kontrolsüz parametre verilmesi zafiyeti ortaya çıkarmaktadır. Yazılım camiasında bu duruma "eval() fonksiyonunun evil olması" adı verilir.
Sonuçta uygulamanın php versiyon bilgileri ekrana basılmış olacak, saldırgan açısından bilgi toplamaya yönelik bir adım olarak düşünülebilir. Ancak bunun gibi pek çok komutu çalıştırabileceğini unutmayın.

Kod:
[COLOR="Silver"]/index.php?text=1; system('id')[/COLOR]

Bir linux shell komutu çalıştırılarak Code İnjection zafiyetinden Command Injection zafiyetine geçmiş olduk. Verilen örneklere göre sistemde bu zafiyetin keşfi genellikle zor olmakla beraber bulunduğunda etkisi büyük olmaktadır.

Peki nasıl önlem alacağız? Alınacak önlemler zafiyetin çıkış noktasında yatıyor. Alınan veriler her zaman kontrol edilmeli, blacklist yerine whitelist tekniği uygulanmalıdır. Örnek olarak alınan veride kontrol edilecek birkaç özellik aşağıda listelenmiştir:

veri içerisinde izin verilen karakterler (regex kullanımı)
veri formatı
beklenen veri boyutu


Code Injection zafiyeti kapsamlı bir zafiyet olduğundan ötürü pek çok sistemde karşımıza çıkabilir. Sadece web uygulamalarıyla sınırlı değildir, aksine desktop ve mobil uygulamalarda da karşımıza çıkmaktadır.
Konunun devamında Android işletim sistemindeki aplikasyonlarda kod enjeksiyonu zafiyetine değinileceğinden dolayı bundan önce terminolojiye hakim olmanız adına Android uygulamalarıyla ilgili birkaç başlık altında bilgi vereceğim.


~ APK Structure ~

Android Package Kit (Android paket kiti) Android işletim sisteminde uygulamalarının dağıtımı ve yüklenmesinde kullanılan öntanımlı paket dosyası formatıdır. APK dosyaları aynı zamanda zip formatındadır, herhangi bir arşiv yöneticisiyle dosyaları çıkarıp inceleyebilirsiniz.
Bir APK dosyası 3 ana bölümden oluşmaktadır: Uygulamanın kodları, resources ve manifest. Aşağıda bu bölümlerin detayları ve açıklamaları verilmiştir.

2Ka13W.png


AndroidManifest.xml -> Uygulamanın paket ismini, versiyon bileşenlerini ve diğer me-ta datayı tutan XML formatındaki manifest dosyasıdır.
classes.dex -> Uygulamanın derlenmiş kodlarını dex formatında tutar.
resources.arsc -> Derlenmiş resource dosyaları
res/ -> Derlenmemiş resource dosyaları
assets/ -> Asset dosyalarını (örn: font, html) tutar
lib/ -> Native şekilde derlenmiş kodları/kütüphaneleri tutar
ME.TA-INF/ -> Jar hakkında me-ta datayı tutar, Manifest.mf dosyasını ve APK imzasını içerir.

* Bir APK dosyasında yukarıda sıralanan ilk üç dosyadan sonraki klasör/dosyaların bulunması zorunlu değildir.

Bir APK dosyasını arşiv şeklinde açıp dosyaları çıkardıktan sonra incelemeye kalktığınızda karşınıza pek okunabilir bir manzara çıkmamaktadır. Bu nedenle sizi bu süreçten kurtaracak ve dosyaları daha okunabilir hale getirecek (decode edebilecek) ve dosyalarda yaptığınız değişikliklerden sonra tekrar size bir APK dosyası oluşturabilecek bir araç geliştirilmiştir. (Tekrar APK oluşturduktan sonra başarılı şekilde yüklenmesi için APK dosyasını imzalamanız gerekmektedir.)

https://ibotpeaches.github.io/Apktool/

ApkTool adlı araç sayesinde terminalden sadece aşağıdaki komut ile Apk dosyasını decode edebilirsiniz.

Kod:
[COLOR="Silver"]apktool d testapp.apk[/COLOR]

Tekrar build etmek istediğinizde ise aşağıdaki komut işinizi görecektir.

Kod:
[COLOR="silver"]apktool b testapp[/COLOR]

Peki ApkTool nasıl Apk dosyalarını bu şekilde decode edebilmektedir? Her Android uygulaması Android işletim sistemde bulunan kod ve resource'ları kullanabilmektedir. Bu kod ve resource dosyaları framework olarak bilinmekle beraber Apktool da bu framework dosyalarından yararlanarak decode/build işlemlerini yapabilmektedir.

ApkTool'un en güncel sürümünü indirdiğinizde kendi içerisinde en güncel framework dosyalarını bulundurmaktadır. Eğer decompile ederken hata alıyorsanız ekstra framework belirtmeniz gerekebilir. ApkTool'un kendi dökümantasyonu: Örnek olarak HtcContacts.apk adlı bir dosyayı decompile etmeye çalışıyorsunuz ve hata aldınız. Bu durumda HTC Framework dosyalarını ApkTool'a eklemek için `apktool if com.htc.resources.apk` komutunu çalıştırmanız yeterlidir.

Framework dosyaları genellikle işletim sisteminin /system/framework kısmında bulunmaktadır. Bazı cihazlarda ise /data/system-framework, /system/app veya /system/priv-app dizininde bulunabilmektedir. Cihazdan framework dosyasını çekmek için adb console'undan `adb pull /path/to/file` komutunu çalıştırmanız gerekmektedir.

~ Compilation & Execution Process ~

APK'nın yapısından bahsettikten sonra bir de APK'nın derlenme ve çalışma aşamalarına değinmek istiyorum.
Sanal Makine: Yüksek seviyeli yazılımları donanım ve işletim sisteminden bağımsız hale getirmek için kullanılan aşağı seviyeli yazılımlardır.
Sanal makine olmadan çalışan yazılımlar belirli bir donanım mimarisi ve işletim sistemini hedef alacak şekilde geliştirilir. Öte yandan örnek olarak Java ile yazılmış uygulamalar belirli bir işletim sistemine göre yazılmamıştır, Java platformu - sanal makinesi üzerinde çalışmak için yazılmıştır. Diğer bir deyişle bu tür uygulamalar sanal makineleri sayesinde donanım ve işletim sisteminden soyutlanarak bağımsız hale getirilmektedir.

Donanım ve işletim sistemi üzerinde doğrudan çalışan C dilinin çalışma aşamaları şu şekildedir:

Kaynak Kod -> Compiler -> .obj -> Linker -> İşletim sisteminin yorumlayabileceği kod (örn: .exe)

Java dilinde ise kodlar işletim sistemi tarafından değil sanal makine tarafından yorumlanabilecek ve çalıştırılabilecek koda dönüştürülür. Bu dönüştürme işlemi sırasında bir ara kod oluşur. (Bytecode)

AOU998.png


Kaynak Kod -> Compiler -> Ara Kod (ByteCode) -> [Java Platformu] Java Virtual Machine (JVM) içerisindeki Just-in Time(JIT) Compiler -> Native Kod

* native kod: Native kelimesi gerçek anlamıyla kullanılmamıştır. (donanıma ve işletim sistemine bağlı) Android işletim sisteminde çalıştırılabilecek kod anlamına gelir.

Sanal makine ve ara kod sisteminin tek dezavantajı performans sorunudur. Ancak günümüz bilgisayarları %20'lik bu açığı genellikle kapatabilmektedirler.

Android üzerinde çalışan 2 tür sanal makine mevcuttur. Bunlar Dalvik ve ART sanal makineleridir.

Dalvik
Native Android uygulamaları DVM (Dalvik Virtual Machine) adlı tamamen Android'e özgü bir sanal makine sayesinde çalıştırılmaktadır. Android işletim sisteminde JVM kullanılmamasının nedeni düşük kapasiteli cihazlar için uygun olmamasıdır. Android 4.4 sürümüne kadar sadece DVM kullanılmıştır, daha sonra alternatif olarak ART oluşturulmuştur. DVM ve ART düşük donanım kaynaklarına sahip cihazlarda yüksek verimle çalışmaları için tasarlanmıştır.

ART (Another Runtime)
Android KitKat versiyonunda Dalvik'e alternatif olarak sunulmuştur. Android 5.0 versiyonunda standart haline getirilmiştir; garbage collection, debugging ve tracing konusunda DVM'e göre daha gelişmiştir.

Dalvik vs ART
~ Dalvik sanal makinesi bytecode'u JIT sayesinde fonksiyon bazında makine koduna dönüştürür. Bu arka planda sürekli talep üzerine derleme işleminin gerçekleşmesine neden olur. Bu nedenle bellek açısından avantajlı olsa da performans açısından olumsuz sonuçlar ortaya çıkmaktadır.
~ ART sanal makinesinde ise bytecode bir kere derlenir-makine koduna dönüştürülüp saklanır. Bu sayede her seferinde derleme işlemi yapılmaz. Bu tekniğe Ahead of Time (AOT) denmiştir. Bu yöntem performans açısından oldukça iyi sonuçlar vermektedir. Her ne kadar depolama alanı kullanımını arttırsa da modern cihazlar sayesinde günümüzde bunun pek bir önemi kalmamıştır.

6zWeec.png


Kaynak Kod -> Compiler -> ByteCode -> dx -> .dex uzantılı çalıştırılabilir dosya -> [Java Platformu] DVM veya ART içerisindeki Just-in Time(JIT) Compiler -> Native Kod

Android platformunda java platformunda olduğu gibi ByteCode'a dönüştürmeye kadar olan işlemler aynıdır ancak Android platformu üretilen bytecode içerikli .class dosyalarını direkt olarak çalıştıramaz. Çalıştırılan dosya formatı .dex (Dalvik Executable) olup bytecode'un `dx` isimli araçla dönüştürülmesi sonucu elde edilir.

Bir kez daha kısaca özetlemek gerekirse Android işletim sisteminde uygulamaların derlenmesi ve çalışması:
1- Kaynak Kod oluşturulur. (.java içerikli dosyalar, dizinler. örn:app/src/main/MainActivity.java)
2- Kaynak kod derlenir.
3- Derlenen kod ByteCode'a dönüştürülür. (.class uzantılı dosyalar)
4- dx aracı sayesinde .class uzantılı dosyalar Dalvik sanal makinesinin anlayıp çalıştırabileceği .dex formatına dönüştürülür.
5- DVM veya ART sanal makinelerindeki JIT derleyicisi kodu işletim sisteminin anlayabileceği şekilde derler.
6- Bu derlenen native kod çalıştırılır.

Smali Dosyası: .dex dosyalarının içeriğinin okunabilir hale getirilmesi için smali adında bir dil tasarlanmıştır. `baksmali` denilen işlem sayesinde dex formatındaki dosya smali dosyasına dönüştürülür.
https://github.com/JesusFreke/smali

ApkTool da smali/baksmali işlemleri uygulayarak classes.dex dosyasını daha anlaşılır bir hale dönüştürmekte ve daha sonra tekrar build edebilmektedir.

~ APK Code Injection ~

Zafiyetten ve Android'in teknik detaylarından bahsettikten sonra artık APK Code İnjection konusuna geçebiliriz. Pek çok kaynakta APK dosyasını değiştirmek ve kendi kodlarımızı eklemek genelde şu yöntemle açıklanmaktadır:

ApkTool ile APK dosyası decode edilir.
dex formatından dönüştürülmüş smali dosyaları bulunur. (örn: smali/com/test/testapp dizini)
Bu dosyalar smali dili kullanılarak değiştirilir.
APK tekrar build edilir.
Ve son olarak uygulama imzalanır. Bu adım APK dosyasının doğru bir şekilde cihaza kurulabilmesi için gereklidir.

APK'nın `modlanmasında` da bu yöntem kullanılmaktadır.

Örnek olarak basit bir android uygulamasına kendi kodumuzu enjekte edip çalıştırmasını sağlayalım. Farklı dosyalar için bu senaryo değişecektir.
Dosyamızı apktool ile decode ediyoruz.

Kod:
[COLOR="Silver"]apktool d test.apk[/COLOR]

Daha sonra smali dosyalarımızın bulunduğu klasöre gelip uygulamanın başlangıç noktası olan MainActivity.smali dosyasını bir text editörü ile açıyoruz.
Örneklemek için burada onCreate metodunu bulup bir Toast mesajı kodu enjekte edeceğiz

Kod:
[COLOR="silver"].method protected onCreate(Landroid/os/Bundle;)V[/COLOR]

onCreate metodu her activity'nin varsayılan oluşturma metodudur. Bu metod çağırılınca layout dosyasını inflate etmek gibi birkaç farklı iş yapılır. Kodumuzu buraya yazarsak activity başlatıldığında kodumuz çalışacaktır.
Smali dilinde Toast mesajı:

Kod:
[COLOR="silver"]const/4 v0, 0x1

const-string v1, [I]"This is a Toast message"[/I]

invoke-static {p0, v1, v0}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object v0

invoke-virtual {v0}, Landroid/widget/Toast;->show()V[/COLOR]

Bunu onCreate metodunun parametrelerinden hemen sonra yazabiliriz. Burada dikkat edilmesi gereken nokta smali dilinde satır numalarının belirtilmiş olmasıdır. (`.line x`) Eğer 18. satırdan sonra bir kod enjekte edeceksek kodumuzun başına .line 19 ekleyip smali yapısını bozmamak için bundan sonra gelen satır numalarını bir arttırıyoruz.
Dosyalarımızı değiştirdikten sonra ApkTool ile tekrar build ediyoruz.

Kod:
[COLOR="silver"]apktool b test[/COLOR]

Build edilen apk bu durumda -o parametresi ile output belirtmediğimiz için test/dist dizini altında oluşacaktır.

Bu APK'yı yüklemeye çalıştığınızda bir hata ile karşılaşacaksınız. Bunun nedeni dosyanın dijital olarak imzalanmamasından kaynaklanmaktadır. APK imzalamak için geliştirilen bir tool olan https://github.com/appium/sign'dan yararlanacağız.

Kod:
[COLOR="silver"]java -jar sign.jar test.apk[/COLOR]

veya

Kod:
[COLOR="silver"]java -jar SignApk.jar testkey.x509.pem testkey.pk8 test.apk test.s.apk[/COLOR]

Komutu ile dosyamızı imzalıyoruz. Yükleyip çalıştırdığınızda uygulamanın başlatılması ile beraber Toast mesajınızı göreceksiniz.

HPK695.jpg


~ ApkServInject ~

Smali formatındaki Android Service dosyasını uygulamaya enjekte etmenize yarayan bir araçtır. Yukarıdaki kısımda bahsedilen adımları yapmanıza gerek kalmadan sadece APK ve Smali dosyasını belirterek bu dosyanın enjekte edilmesini sağlayabilirsiniz.

Hedef uygulamaya enjekte edilecek kodun sadece bir kez mi çalışmasını istersiniz yoksa her açılışta bir kez bunun dışında da arkaplanda sürekli çalışmasını, bu sayede zararlı koda bir Client-Server bağlantısı eklediğiniz taktirde hedef uygulama ve kullanıcı ile sürekli bağlantı halinde kalmasını mı? İkinci seçenek daha makul geliyor bu nedenle ApkServInject ile sadece Service dosyalarının enjekte edilmesi amaçlanmıştır. Programa parametre olarak verdiğiniz smali dosyasının bir Android servis dosyası olması gerekmektedir. Neden bahsedildiğini uygulama ile gelen Serv2Inject.smali dosyasını inceleyerek anlayabilirsiniz.

Peki istediğimiz zararlı service dosyasının smali halini nasıl elde edeceğiz? ApkTool yardımı ile elde edebilirsiniz. Üzerinde herhangi bir değişiklik yapmanıza gerek kalmadan bu service ve apk dosyasını programa vererek zararlı bir apk oluşturabilirsiniz. Service dosyasında eğer internet izini gerektiren bir işlem yapıyorsanız bu izinleri parametre olarak vereceğiniz smali dosyasının en altına https://github.com/orhun/ApkServInject/blob/master/Serv2Inject.smalida olduğu gibi ekleyebilirsiniz.

Proje kaynak kodu ve gerekli jar dosyaları: https://github.com/orhun/ApkServInject

Enjekte etmek için şu kodu çalıştırmanız yeterlidir. APK dosyası aynı dizinde <apkadı>_x.apk şeklinde oluşmaktadır.

Kod:
[COLOR="Silver"][B]java -jar ApkServInject.jar [-a APK] [-s SMALI][/B][/COLOR]

Biraz da programın mantığından bahsetmek istiyorum. Mantık olarak az önceki bölümdeki smali dosyalarını manipüle etme yolundan gitmektedir. Ancak bu sefer service dosyasını enjekte edeceğimiz için durum birazcık farklılaşmaktadır.

1- Decode apk
2- Manifest dosyasını değiştir. Service'in tanımlanması için gereken kodu ekle.
3- Smali dosyasındaki package ve context'leri manifest dosyasından alınan package ismiyle değiştir.
4- Parametre olarak verilen smali dosyasının en altında gerekli izinler belirtilmişse bunları manifest'e ekle.
5- EntryPoint (başlangıç noktası) diye tabir edilen programın başlatılacağı smali dosyasını bul ve buraya service'i başlatmak için gereken kodu enjekte et.
6- Build & Sign

Detaylı bilgi için https://github.com/orhun/ApkServInject/blob/master/src/inj/InjectThread.java dosyasındaki prosedürü takip edebilirsiniz.

OIKQPN.png


Dosyalarda yapılan kritik değişiklikler:
Manifest dosyasında activity tag'ından sonra servisin tanımlanması için
Kod:
[COLOR="Silver"]<service android:enabled="true" android:exported="true" android:name="servis_paketi"/>[/COLOR]
kodu eklenir.

onCreate metodundan sonra servisin başlatılması için gereken kod bloğu eklenir. (bkz: https://github.com/orhun/ApkServInject/blob/master/src/utils/Constants.java -> service_starter_smali adlı değişken)

APK'nın çalıştırılması ile beraber bizim arkaplan servisimiz de çalışmaya başlayacaktır.
Program ile verilen test.apk ve Serv2Inject.smali dosyalarıyla bir demo yapmak için şu kodu kullanabilirsiniz:

Kod:
[COLOR="silver"]java -jar ApkServInject.jar -a test.apk -s Serv2Inject.smali[/COLOR]

Son olarak proje taslağımız =>
Link: https://github.com/orhun/ApkServInject

Kullanılan programlama dili: Java

Programın ve kaynak kodunun adresi: https://github.com/orhun/ApkServInject

Açıklama : Smali formatındaki Android Service dosyasını uygulamaya enjekte etmenize yarayan bir araç.

Proje Platformu: Cross-Platform (Windows - Linux)
Açıklama: Tool for injecting (smali) service to Android apk files

Ekran Görüntüsü:
z3fyUK.jpeg

 
Moderatör tarafında düzenlendi:

CH4M3

Uzman üye
19 Ağu 2017
1,926
16
php island
Şuan konuya ne kadar boş baksam da bu sene her şekilde Java öğreneceğim için bu konular servet değerinde. Ellerinize sağlık komutanım :))
 

AsetilkoLiN

Yeni üye
30 Haz 2018
16
0
Top 15de hep böyle güzel, emek kokan ve kaliteli konular görmek dileği ile ellerinize sağlık hocam.
KeyLo99
 
Moderatör tarafında düzenlendi:

xOlimpos

Katılımcı Üye
7 Ocak 2016
950
0
C:\
Yine döktürmüşsün reiz okumaya başlıyorum emeğine sağlık her konun altın değerinde.
 

Pistontht

Üye
30 Haz 2018
62
0
Ben okumaya üşenirken siz üşenmeden yazmışsınız. Bu yüzden benden üstünsünüz. :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.