Çin Gümrük Polisi APK'sının teknik analizi
05 Jul 2019Eğer duymadıysanız, geçmiş zamanlarda çin hükümetinin turistlerin telefonuna bir uygulama yüklediğine, ve bu uygulamanın telefondaki yüklü dosyaların/uygulamaların terörle ilişkili olup olmadığını kontrol ettiğine dair dedikodular vardı.
3 gün önce, VICE’ın teknoloji bölümü olan Motherboard bu apk yı paylaştı. Apk’yı burada bulabilirsiniz.
Readme 2 adet teknik analiz içeriyor, bunları kesinlikle tavsiye ederim, çünkü benim bu konudaki seviyemin çok üzerindeki ekipler tarafından hazırlanmış raporları içermekte.
Statik Analiz
Neyse, haydi başlayalım. Öncelikle nested file’ları ağaç formunda görmek için ghidrayı, ve bu dosyaları çıkarmak için binwalk’ı kullanıyorum.
İşte binwalk sonuçları:
Fakat ağaç formunu incelemesi bana daha kolay geliyor.
Daha başlamadan bazı ilginç dosya isimleri görmek mümkün, record_microphone gibi
Onun dışında, tüm önemli dosyalar /assets/xbin/* içinde gibi gözüküyor. İçerisinde (bk_samples ve getVirAccount hariç) tüm binary’lerin iki versiyonu var, biri pie ve diğeri pie olmayan cihazlar için. Öncelikle binary içermeyen dosyalardan başlamak istiyorum. terrorism_apps.csv
nin raporlarda bahsedilen 73.000 dosyanın listesi olduğunu düşünerek oradan başlıyorum.
İlginç, csv dosyası boş gibi gözüküyor. id.conf a bakarak devam edelim.
#包名\t路径名\t获取方式
#获取方式DIR FILE FILE_CONTENT
com.tencent.mobileqq tencent/MobileQQ/ DIR (^[1-9][0-9]+)
com.tencent.mobileqq Tencent/MobileQQ/ DIR (^[1-9][0-9]+)
com.tencent.mobileqq tencent/QWallet/ DIR (^[1-9][0-9]+)
com.tencent.mobileqq Tencent/QWallet/ DIR (^[1-9][0-9]+)
com.renren.mobile.android Android/data/com.renren.mobile.android/cache/talk_log/ FILE talk_log_([0-9]+)_.*
com.duowan.mobile yymobile/logs/sdklog/ FILE_CONTENT logs-yypush_.*txt safeParseInt ([0-9]*)
com.immomo.momo immomo/users/ DIR (^[1-9][0-9]+)
cn.com.fetion Fetion/Fetion/ DIR (^[1-9][0-9]+)
com.alibaba.android.babylon Android/data/com.alibaba.android.babylon/cache/dataCache/ FILE (^[1-9][0-9]+)
#"phone":"18551411***"
com.sdu.didi.psnger Android/data/com.sdu.didi.psnger/files/omega FILE_CONTENT e.cache "phone":"([0-9]*)"
#aaaa
com.sankuai.meituan Android/data/com.sankuai.meituan/files/elephent/im/ DIR (^[1-9][0-9]+)
com.sogou.map.android.maps Android/data/com.sogou.map.android.maps/cache/ FILE_CONTENT cache "a":"([^"]*)"
#com.sina.weibo loginname=red***@163.com&
com.sina.weibo sina/weibo/weibolog/ FILE_CONTENT sinalog.*txt loginname=([^&]*)&
Hmmm, bundan ne çıkarmam gerektiğini tam olarak bilemiyorum, ve devam ediyorum.
Burdan binary’lere geçelim. Öncelikli olarak onları radareorg/cutter ile inceleyeceğim. Özellikle bu tür statik analizlerde çok kötüyüm, o nedenle önceden uyarıyorum, büyük ihtimalle sadece kendimi küçük düşüreceğim.
getVirAccount
Öncelikle, nereden ne bakarak başlayacağımı bilmediğim için her zamanki gibi stringlere bakıyorum. Sıradışı olarak tek gördüğüm bir-iki adet çince string, ve dosya yerleri. Google translate zamanı!
` Birinci parametre config dosyasının yeri, ve ikinci parametre output dosyasının yeri `
Uuuuuuuh, sanırım bu yardımcı olabilirdi fakat o stringe hiçbir yerde referans göremiyor, yani bir yerde kullanılmamış, tam hangi fonksiyonu kastediyor bilemiyorum.
Bu stringlere olan referansları takip ederek, bu binary’nin çekirdek fonksiyonalitesini içeren yere geldiğimi düşünüyorum.
Blok, fopen ile başlıyor. Soldaki branch sadece error handling, o yüzden orayı atlıyorum.
Onu takipe edince bir unalligned blok görüyorum (Oh no). Bu genelde disassembly de bir hataya işaret ediyor, ve de zaten sonrasındaki kodu takip ederek pek bir şey çıkaramıyorum. Tamamen spekülasyon yaparak ve binary isminden ve binary’nin kalanından yola çıkarak, bunun kullanıcıların (eğer varsa) tencent hesaplarını bulduğunu düşünüyorum. Fakat ne kadar batırdım bilmiyorum, o yüzden sözüme pek de güvenmeyin.
getVirAccount’un statik analizini tamamen batırdığımı görerek wifiscan’e geçiyorum.
wifiscan
Burda ilk gözüme çarpan şey bk_samples.bin’e referans, ve dosya uzantıları oluyor.
Gördüğüm kadarıyla, bunun dosyaların içeriğini inceleyen parça olduğunu düşünüyorum. Bu nedenle subsectionlarda opendir
içeren bir subsection gördüğüm anda ona atlıyorum. Grafiği aşağıya bırakacağım, eğer reverselemek isterseniz buyurun, fakat bende o güç yok.
Eğer decompiled bir kod yoksa elimde bir şey beceremediğimi kabullenip, dinamik analiz kısmına geçiyorum. Android VM imizi başlatıp, bu çöplüğü yükleyelim!
Apktool
Daha sonra yapılacak
Dinamik Analiz
Osboxes‘dan android vhd’sini indirdim, hadi kurup başlatalım!
Uuuuuh, devam?
Uuuuuuuuuuuuuuuuuuuuh, bariz ki bi hata yaptık, debugda tekrar başlatalım.
Yani exit
?
Galiba hayır, sadece bootloop’a girdi böyle
Birkaç deneme sonrasında, nomodeset ile debug başlatıp exit’lemek işe yaramış gibi duruyor.
Benim yaptığım bişeyden dolayı mı yoksa osboxes’dan dolayı mı bu kadar saçma oldu bilmiyorum, ama sonunda bi anasayfa görebildim.
Şimdi apk yı androidimize indirelim, ve kurmadan önce bi vm durumunu kaydedelim ki geri dönebilelim. Birçok kez browser’dan apk’yı indirmeyi denedim, fakat her seferinde indirmeye çalıştığımda browser çöküyordu, ben de bu yöntemden vazgeçtim. Sanırım downloadProvider ethernet gibi bir sistemi tanımıyor o nedenle sanırım çöküyor. Ben de klasik yönteme dönüp guest de wget ve host da python -m SimpleHTTPServer
kullanarak transfer ettim.
Bir yandan wireshark ı açık tutup, herhangi bir ağ trafiği var mı kontrol edeceğim.
Gördüğüm tek trafik 172.217.18.*
adresine ve o da android-safebrowsing.google.com a ait olsa gerek.
devam edecek