竊聽風雲:扒掉你的最後一條“胖次”
“每個人的手機都是一部竊聽器,不管你開不開機,都能被竊聽。”在2009年上映的《竊聽風雲手機捕魚外掛》中吳彥祖飾演的人物有這樣一句臺詞,隨著影片熱映,“手機竊聽”的問題被更多的人顧慮,網路商家也大肆推出各種竊聽軟體和裝置,甚至某寶上也可以買到“GSM阻截器”,但是GSM阻截器需要相關儀器功率巨大,一般幾百至幾千的售賣多為騙人的假貨,相關的技術分析網上有很多,這並不是我們今天談論的主題。一般的竊聽分為物理竊聽和軟體竊聽,而軟體竊聽的成本相較較低,但是一般的竊聽軟體買賣資訊也為假貨。
近日碰到一個讓人細思極恐的真實的竊聽軟體,可以說是把使用者扒的一條“胖次”都不剩,這裡手機麻將作弊軟體針對其竊聽的隱私內容和實現技術進行簡要分析,讓大家感受一波,旨在提高自身的安全意識。
一、竊聽詞雲
本次分析的惡意軟體偽裝成“百度”應用,病毒名稱定義為“ A.Privacy.OverHeard.a”,在使用者使用時安裝之後,手機捕魚外掛會隱藏啟動圖示,不明所以的使用者會認為未安裝成功,之後就置之不理了。惡意軟體在此之後就會註冊廣播,監聽系統廣播開啟自身服務,並使用遠端控制技術向手機發送各種指令,達到竊聽的目的。我們研究的重點在於竊取隱私技術,直接爆破樣本,從原始碼維度對此樣本進行追蹤分析,看我們日常使用的手機都包含了我們哪些的私密資訊,而此惡意軟體又能拿我們這些資訊對我們造成什麼傷害,相信等你看完此報告,一定是一地雞毛。
下面我們通過一張詞雲圖來直觀的感受一下“
二、竊聽技術逐個擊破
惡意軟體在竊取隱私資料時使用UDP協議進行傳送加密資料,手機捕魚輔助外掛分析其竊取隱私資訊最好的方式就是直接找到其協議包傳送的原始碼,對其加密前的資料進行分析。此樣本近乎把使用者常見的隱私資料全部獲取了,而android系統中大部分資料獲取都有其相應的API,所以在這裡我們針對主要竊取行為進行詳細分析,常見竊取行為進行簡要分析,簡單竊取行為一筆帶過或直接忽略。
2.1 使用者通話錄音及日常錄音
OverHeard手機捕魚輔助竊聽軟體,最重要的功能就是對使用者實施監聽,但是這種監聽的方式並不是實時的,而是通過
兩種監聽都有一個前提,在android系統中要使用錄音功能,需要向用戶申請相應的錄音許可權。錄音許可權的申請如圖2-1所示:
圖2-1 竊取隱私詞雲
取得使用者授權之後,就可以使用相應API執行操作。竊聽行為的第一種對使用者通話實施監聽。首先是在其開啟的服務TimerService中,例項化物件Audio,並進行初始化init,傳入TelephonyManager物件,初始化Audio的程式碼如圖2-2所示:
圖2-2 初始化Audio
在Audio初始化時,TelephonyManager設定了一個電話狀態的監聽PhoneStateListener,在通話狀態改變時,分別呼叫開啟錄音和關閉錄音的方法,如圖2-3、圖2-4所示:
圖2-3 設定電話監聽器
圖2-4 通話狀態改變控制錄音
下面我們看一下開啟錄音的方法,就是呼叫了Android提供的MediaRecorder進行了錄音,將錄音檔案儲存在SD卡下的隱藏檔案.tmp/audio中(在linux系統中以“.”開頭的是隱藏目錄),回撥的startRec方法如圖2-5所示:
圖2-5 開啟錄音
在使用者結束通話時,回撥stopRec方法,結束錄音,並將錄音檔案地址傳送到伺服器。如圖2-6所示:
圖2-6 關閉錄音傳送錄音檔案路徑
竊聽行為的第二種是實行遙控錄音。本次分析分惡意應用會通過網路傳送指令,控制手機的各種操作,但本次重點在討論其隱私竊取行為,不對其udp指令的執行結構做說明。下面是其接收開啟錄音的指令及相應指令值,如圖2-7所示:
圖2-7 根據指令控制錄音操作
從程式碼中我們很易看出,通過指令environmentaudio來控制錄音行為,此指令下再含有“1”時開啟錄音,不含時結束錄音。開啟錄音和結束錄音的操作也同樣是呼叫了MediaRecorder來執行,在結束錄音時同樣將錄音檔案路徑傳送至伺服器,這裡不再進行贅述,我們直接看其錄音檔案儲存路徑,儲存在SD卡目錄下一個時間戳命名的3gp中,如圖2-8所示:
圖2-8 錄音檔案儲存路徑
2.2 Wechat資料及聊天記錄
微信現在已經成為我們日常交流的必備軟體,每個人都有至少一個微信賬號,我們常常會碰到這樣的問題,微信聊天記錄不小心刪除了,想恢復怎麼辦?微信的資料和聊天資料儲存在哪裡?竊聽軟體告訴你,如何獲取你的微信資料和聊天記錄。
首先是接收到伺服器的指令獲取微信資訊,伺服器的指令及呼叫獲取微信資訊的操作如圖2-9所示:
圖2-9 獲取微信資料指令
跳轉下一步GetFile方法,在方法中判斷是否含有標記欄位“weixindb”,含有此欄位時則呼叫CopyWeiXinData方法拷貝微信資料,並將微信資料傳送到伺服器。如圖2-10所示:
圖2-10 傳送微信資料路徑到伺服器
那麼它是如何拷貝微信資料的呢,我們進入拷貝方法追蹤,可以發現它執行了一系統的linux命令。將“/data/data/com.tencent.mm/MicroMsg”中的資料拷貝到SD卡下自己設定的目錄中,是的,你猜對了,此目錄下就儲存著你的微信資料包含聊天記錄。雖然是加密的,本軟體未在本地執行解密操作,我們不在論述,感興趣的人總能找到。拷貝微信資料的方法如圖2-11所示:
圖2-11 拷貝微信資料
那麼事情是否就是這麼簡單呢?當然不是,android系統中只允許應用訪問自己的檔案儲存區間,要想執行命令到“/data/data/com.tencent.mm/” 第三方應用的資料區間去拷貝東西,還需要超級許可權ROOT許可權。此惡意軟體在開啟服務之後,經進行了嘗試獲取ROOT許可權的操作,嘗試將自身的一個su檔案寫入系統目錄中。嘗試獲取ROOT許可權的操作如圖2-12所示:
圖2-12 嘗試獲取ROOT許可權
2.3 QQ隱私資料
QQ資料的獲取與微信的獲取原理相同,而且QQ號具有的記錄密碼功能,使得你的QQ號更加的危險,不僅你的聊天記錄可以被獲取,而且通過“應用資料克隆”的方式,別人還可以直接登入到你的賬號。下面我們來討論此病毒應用對QQ資料的竊取。
惡意樣本在服務中直接初始化mobiqq的物件,之後呼叫GetAllInfor方法獲取QQ的應用資料,因為方式與微信資料竊取都一樣,我們直接進入GetAllInfor檢視。如圖2-13所示:
圖2-13 GetAllInfor獲取QQ資料
從程式碼中我們可以看到,先進行了QQ資料庫檔案的移動,之後獲取一個ArrayList的檔名列表,從中擷取去QQ號碼,因為其在移動QQ資料庫時已經進行過正則校驗,其中”0x002E”就是十進位制的“46”,對比ASCII碼錶可知就是檔案分隔符“.”。獲取資料庫和QQ號之後通過解析資料庫獲取QQ聊天記錄,群組和朋友。我們先來看MoveDbFile方法,檢視其如何移動QQ資料庫。如圖2-14所示:
圖2-14 複製QQ資料
從中我們可以看到其也是使用cp命令從“/data/data/com.tencent.mobileqq/databases/”中複製的QQ資料。獲取QQ的資料庫之後,從中擷取獲得QQ號,之後建立DBOpenHelper類DBmqq獲得資料庫,對資料庫進行操作。
首先是從資料庫中獲取QQ聊天記錄,我們檢視其Getchat方法,如圖2-15所示:
圖2-15 遍歷資料庫表
Getchat方法直接從資料庫中獲取表,之後遍歷表,使用GetQQchat方法對錶進行查詢。跳轉到GetQQchat方法中,我們發現它先從表中通過SQL查詢獲取相應的聊天PageIndex,在使用getPrivateScrollchatData方法進行解析,將聊天資料儲存到資料物件Qqchatunit中。這裡由於安全問題不對其解密方法進行貼上,旨在瞭解其流程。GetQQchat在解析之後將聊天資料使用udp利用迴圈傳送至伺服器,分別如圖2-16、圖2-17所示:
圖2-16 解析QQ聊天資料庫表
圖2-17 傳送QQ聊天資料
其次是從資料庫中獲取QQ群組資訊,我們檢視其GetGroups方法,如圖2-18所示:
圖2-18 獲取QQ群組資料
之後在GetQQgroupName執行SQL查詢QQ群組資訊,獲取群暱稱,群號,群主號等等資訊,如圖2-19所示:
圖2-19 查詢QQ群組資訊
在GetGroups方法中,通過群號從GetQQgroupName獲得的群組資訊的Map集合中遍歷出來,儲存在物件Qqgrouppunit中,傳送至伺服器。上傳QQ群組資訊如圖2-20所示:
圖2-20 上傳QQ群組資訊
在GetAllInfor中還有一項資料,就是獲取QQ好友資訊,在方法GetFriends中執行,而獲取好友資訊相對簡單,在方法getCount中查詢“”表,獲取好友數,之後傳送到伺服器,與上述兩個資料都一樣,我們直接看查詢資料庫表的SQL語句,GetFriends方法和getCount方法分別如圖2-21、圖2-22所示:
圖2-21 GetFriends方法
圖2-22 getCount方法
2.4 手機截圖
在做應用的安全評估時,尤其是對銀行類和金融類應用評估時,有一項很重要的評估,就是介面劫持的防護,如果沒有做介面劫持的防護的話,很有可能會被劫持,洩露使用者的金融資訊甚至是賬號密碼。本次的竊聽軟體就有竊取使用者手機截圖的行為,通過開源的截圖工具定時擷取手機螢幕,然後傳送至伺服器。
在服務開啟之後,應用會建立一個定時器Timer,設定定時任務,從本地暫存器的儲存值可以看到,在定時任務開啟之後延遲5000毫秒每隔30000毫秒執行一次獲取截圖,定時器的設定如圖2-23所示:
圖2-23 定時器Timer
截圖任務的類是Screen類,在其初始化方法中,我們可以看到其實現方式,使用開源的android截圖工具fb2png進行截圖,初始化中載入fb2png的命令列進行了加密,其實就是將資原始檔中的工具使用輸出流重新寫到“/data/local/tmp”中,原始碼如圖2-24所示:
圖2-24 載入fb2png
初始化完成之後,在shot方法中呼叫fb2png進行截圖,將截圖圖片儲存在“.tmp/screen”目錄下。如圖2-25所示:
圖2-25 fb2png工具截圖
2.5 使用者通訊錄
使用者的通訊錄對我們來說是很重要的,現在服務軟體眾多,獲取通訊錄的許可權申請也比較常見了,但是如果不能保護自己的通訊錄,很有可能給身邊的家人朋友和同事造成困擾。Android系統中使用者的通訊錄是存在在資料庫中,用通訊錄軟體來進行管理,使用內容提供者對外提供通訊錄內容,第三方應用使用內容解析者,指定特定的URI對其進行解析獲取使用者的通訊錄。此病毒應用中,通過遠端指令來控制獲取使用者的通訊錄資訊。我們直接來看其呼叫內容解析者對使用者通訊錄進行竊取行為的原始碼,如圖2-26所示:
圖2-26 獲取使用者通訊錄
2.6 使用者簡訊箱
Android系統中簡訊與通訊錄是一個原理,也是儲存在資料庫中使用內容提供者提供給第三方應用使用,在此病毒中,在接收到遠端控制指令時,就會執行竊取使用者簡訊箱中的簡訊的行為。獲取簡訊的URI為“content://sms/”,竊取使用者簡訊資訊的原始碼如圖2-27所示:
圖2-27 獲取使用者簡訊
2.7 使用者應用程式及本地目錄資訊
隨著移動市場的發展,很多的統計平臺和第三方外掛都會整合到應用中,這些應用不只是獲取自身應用的使用行為,也會對使用者手機上使用的應用資訊進行收集和統計。使用者手機中使用的應用程式在android系統中也能夠從相應的Manager中獲取,此應用在獲取此資料的同時,還會對使用者手機下的所有目錄進行收集,這些應用會洩露使用者的使用習慣和行為,一來可以對使用者手機進行監測,獲取需要的目錄資訊,二可以對使用者進行使用者畫像,推演使用者的個人資訊。
獲取使用者手機中使用的應用程式,需要使用PackageManager進行獲取,惡意應用在接收指令之後,獲取和上傳使用者應用資料的原始碼如圖2-28所示:
圖2-28 獲取使用者安裝應用程式
獲取使用者記憶體目錄檔案列表的地方有兩處,一是在服務開啟時,建立子執行緒開啟任務獲取SD卡目錄列表;二是在進行嘗試ROOT許可權之後,如果能夠獲取ROOT許可權,就通過指令遠端控制應用獲取根目錄下的檔案目錄列表。
獲取SD卡目錄列表的原始碼如圖2-29所示:
圖2-29 獲取SD卡目錄列表
從原始碼中我們看到它將目錄列表儲存在“.tmp/dir”下的“/dir.data”檔案中,我們可以直接檢視一下此檔案,如圖2-30所示:
圖2-30 dir.data檔案
獲取ROOT許可權之後,獲取根目錄“/”下的檔案列表,直接通過udp傳送到伺服器,如圖2-31所示:
圖2-31 獲取根目錄檔案列表
2.8 手機號及裝置資訊
Android系統中Imei、Imsi、手機號和一些裝置資訊獲取都比較簡單,在這裡不在一一論述,直接來看一下通過TelephonyManager獲取電話號碼,如圖2-32所示:
圖2-32 獲取使用者手機號
三、穿上防護服
瞭解了OverHeard病毒,是不是有一種“胖次”被扒走的感覺,原來我們離電影的距離只差了一個“竊聽風雲”的軟體。當然對於此類軟體在日益完善的android系統中,慢慢的越來越難直接奏效,在資訊爆炸的網際網路時代,最重要的還是提高每個網民的安全意識和自我防範技能。針對這類病毒,我們需要注意幾點:
1.在安裝應用進行授權時,針對敏感性高又與軟體功能使用無關的許可權謹慎授予或拒絕賦權;
2.在非必須的情況下,不要ROOT自己的手機,即使能夠獲取ROOT許可權,也要使用超級許可權管理軟體對應用謹慎授權;
3.安裝安全防護軟體,對有風險的應用拒絕使用。