對小綿羊的轟炸APP逆向分析
背景
在網絡上意外看到一款叫小綿羊的轟炸機APP,經過下載安裝(這種未知風險的APP建議都在模擬器上去安裝驗證和分析功能,有安全風險問題模擬器刪除即可)后確認,只要在APP界面的編輯框中輸入手機號碼,就可以進行對指定手機號碼進行短信狂轟炸的效果的(已用自己測試號碼驗證過效果)。
下面就以開發(fā)者角度進行解析下這個APP的功能的實現原理。
基礎信息
拿到APP的一般做法,就是先對這個APP進行查殼分析確認,決定是否刪除卸載APP還是繼續(xù)分析APP,還好通過查殼工具(通過識別APP中是否包含市面上的加固產品的特有的so文件特征)一分析這個小綿羊APP是沒有加固保護的,這樣對APP的分析門檻一下子就降低了。
通過使用jadx進行查看APP的整個組成結構和重點查看java功能代碼,通過工具可以查看app主要有java代碼 C++代碼(so文件),資源數據,lua數據,簽名信息組成的。
通過jadx工具查看,該APP的Java層部分代碼采用android studio自帶的proguard插件,進行對個別的類名函數名稱進行做混淆保護,雖然這種混淆強度并不強,但是還是有很多APP采用這種方式進行對java層保護。只因這種保護成本低,只需簡單的進行配置下就可以達到混淆效果。
啟動APP后,通過uiautomatorviewer(SDK中自帶的分析控件的工具)工具進行分析該APP的界面控件信息,通過分析可以看到該APP的界面主要由1個EditText和3個Button控件組成的,也就是下面的截圖信息。
下面是這個轟炸APP的界面背景顏色的設置,這個實現功能主要是以lua腳本方式進行實現的。
簽名信息
通過這jadx工具,可以看到這個APP采用的是V1的簽名方式,我們知道V1簽名是android最早的數字證書簽名,為了提高驗證速度和覆蓋度在android7.0的系統中引入V2的簽名,為了實現密鑰的輪轉載android 9.0系統中引入V3的簽名。
目前APP中大部分都是通過V1和V2簽名相結合的。并且這個在簽名過程中要保證按照V1到V2在到V3的簽名順序,因為V1簽名的改動會修改到ZIP三大部分的內容,先使用V2簽名再V1簽名會破壞V2簽名的完整性。
在android的app開發(fā)過程中,必須對app進行簽名,不然過不了系統驗證也就無法進行對app安裝。
android簽名的數字證書的一般都是采用 X.509的國際標準。
因X.509內容為第三方可信機構CA對公鑰實施數字簽名,故也叫公鑰證書,數字證書在PKI體系中是一個表明身份的載體,除了用戶的公鑰,還包含用戶公開的基本信息,如用戶名、組織、郵箱等。
下圖是android studio工具中可以自己創(chuàng)建用于對APP簽名的證書,可以看到它包含密碼信息、用戶名稱、組織名稱、地區(qū)名稱、國家信息、省份信息、城市信息。
同樣也可以通過jadx工具,在META-INF目錄下的CERT.SF文件中去查看確認簽名信息,V1簽名的主要關鍵字Created-By:, V2簽名的X-Android-APK-Signed的關鍵字。
、
權限信息
在這個AndroidManifest.xml文件中主要包含app中所需要的權限,四大組件信息,app包的相關信息(包名稱、sdk目標版本、sdk最低版本等等)
android的機制下想要讀取相關的信息,都需要向用戶申請權限,這個不僅符合android的安全機制,也符合目前國內的安全合規(guī),同樣也可以通過申請的權限信息了解APP的功能需求。
下面對這個APP的所有權限進行詳解下:
android.permission.INTERNET :訪問網絡連接可能產生GPRS流量
android.permission.ACCESS_NETWORK_STATE:獲取網絡信息狀態(tài),如當前的網絡連接是否有效
android.permission.ACCESS_WIFI_STATE:獲取當前WiFi接入的狀態(tài)以及WLAN熱點的信息
android.permission.WRITE_EXTERNAL_STORAGE:允許程序寫入外部存儲,如SD卡上寫文件
android.permission.WRITE_SMS:允許應用程序寫短信內容
android.permission.READ_SMS:允許應用程序讀取短信內容
android.permission.WRITE_SETTINGS:允許應用程序讀取或寫入系統設置
android.permission.CLEAR_APP_CACHE:允許程序清除應用緩存
android.permission.BLUETOOTH:允許程序連接配對過的藍牙設備
android.permission.VIBRATE:允許振動
android.permission.READ_LOGS:允許程序讀取系統底層日志
android.permission.READ_FRAME_BUFFER:允許程序讀取幀緩存用于屏幕截圖
功能信息
這個APP的主要功能都是在lua上實現的,從界面到轟炸功能都集成到lua上。
Lua是一門用標準C編寫的動態(tài)腳本語言,如果希望在android上使用,則需要解決2個問題。
1、需要用JNI為Lua的C庫進行封裝,這樣才可能在Java中使用。
2、由于Android系統開發(fā)所特有的系統環(huán)境限制,Lua三方庫的動態(tài)加載機制和lua腳本模塊的導入機制將不能正常運行,需要進行特殊處理。
輸入好手機號碼后(不過這個輸入都沒做驗證,隨便輸入數據都進行執(zhí)行一遍功能),通過charles抓包工具進行抓取數據吧,可以很清晰的看到,點擊轟炸后,馬上執(zhí)行發(fā)送406個網絡數據包,這些數據主要集中在作者收集的406個各種類型網站進行發(fā)網絡賬號注冊驗證碼信息的轟炸。
在lua功能中,有對vpn的判斷,通過簡單判斷獲取當前網絡狀態(tài),并且判斷網絡狀態(tài)是否屬于vpn的狀態(tài),如果屬于vpn狀態(tài),那么就往storage的目錄下寫入時間點設定,并且強制關閉APP,當在啟動APP的時候會先判斷文件是否有寫入判斷禁入的信息,如果有就不讓啟動APP。其實破解這個驗證很簡單,直接將文件的禁入信息清空即可。
下圖的這幾個so是網絡上lua和socket通用的so文件,并沒有什么可研究價值。
通過分析libsocket.so這個so文件,可以確認采用的是luaSocket 3.0版本
LuaSocket 它是 Lua 的網絡模塊庫,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多種網絡協議的訪問操作。
這個luasocke一部分是用 C 寫的核心,提供對 TCP 和 UDP 傳輸層的訪問支持。另外一部分是用 Lua 寫的,負責應用功能的網絡接口處理。
開源的luasocket代碼可以參考學習下
https://github.com/lunarmodules/luasocket
https://github.com/fengye/luasocket
總結
縱觀整個轟炸APP的功能,分析這個APP都沒有采取任何保護(加殼、反調試)就沒有門檻了,基本也不需要涉及到脫殼、hook和動態(tài)調試這些操作,只要用幾個(jadx、charles、ida、uiautomatorviewer)工具就可以將功能全部分析清楚。
感嘆這個作者確實很用心的去做這個轟炸的功能,去收集了406個的各類型的網站進行手機注冊功能。
對于這種具有攻擊性的APP還是要慎重下,免費APP功能的前提往往會有給APP植入后門或者病毒的存在。
作者:小道安全
歡迎關注微信公眾號 :小道安全