Çin Gümrük Polisi APK'sının teknik analizi

Eğ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