我們將在本文分析iOS的文件系統,了解其目錄是如何組織的,查看一些重要的文件,然後看看如何才能夠從數據庫文件和plist文件導出數據。我們將學習應用是如何在特定目錄(沙盒)內存放數據的,以及怎樣才能提取這些數據。
有一個很重要的事情需要注意,在前面的文章中,我們都是以root身份登錄進設備的。設備上有另一個用戶名叫mobile, 一個mobile用戶擁有的權限是少於root用戶的。除了Cydia和少數的應用以root權限應用之外,其他應用都是以mobile的身份應用的。有些蘋果內部的daemon服務也以root權限運行。執行ps aux就可以查看清楚。在最左邊,我們可以看到用戶列。可以看到Cydia以root身份運行,所有其他應用都以mobile身份運行, 例如/Applications/AppStore.app/AppStore,有些demon也以root身份運行,如/usr/sbin/wifid。一些你通過Cydia安裝的應用也可能會以root身份運行。 一旦你的設備一越獄,默認root和mobile的密碼都是alpine.
可以配置一個應用以root權限運行。你可以看看Stack Overflow上的這篇文章來了解更多細節。
我們ssh進設備。到/Applications目錄。你可以在該文件夾下看到一些應用。它們中的大多是都是iOS預裝的,有些應用是通過Cydia安裝的,比如Ternimal 應用。請注意,所有運行在/Applications的應用並不運行在沙盒環境,而所有在/var/mobile/Applications目錄下的應用都運行在一個沙盒環境下。文章後面會討論沙盒。不過,它們默認依然以mobile用戶運行,除非專門做了配置。
所有從App Store下載的應用都位於/var/mobile/Applications目錄。這個目錄也包含用installipa或者其他外部源如Cydia安裝的應用。所有這些應用都運行在沙盒環境下。
請注意,從iOS4及以後,每個應用都駐留的環境叫做沙盒(Sandbox)。這樣做的主要目的是不允許應用訪問它自己沙盒外的任何數據。這樣做會更安全。不過,應用用合適的權限是可以訪問用戶某些特定的用戶數據的。例如要用戶允許去訪問聯系人,照片等等。不過,對這些也有不少爭論。 例如從iOS6開始,應用在得到用戶允許之後才能訪問用戶的聯系人。在這之前,應用不需要獲得任何權限就能訪問用戶的聯系人,這導致了較大的爭議,例如Path應用。
通過使用Entitlements,你可以訪問沙盒外的好些東西。你可以讀讀這裡的文檔。例如,要獲得一個用戶的calender的讀權限,.entitlements文件中的entitlement key com.apple.security.personal-information.calendars必須標志為YES。
讓我們看看某個特定應用的目錄結構。首先到Snapchat的目錄看看。對於所有應用都是類似的結構。
"把用戶數據放到/Documents/。用戶數據是你的應用不能再創建的任意數據,比如用戶的文檔或者任何其它用戶產生的內容“。
你可以從下面的蘋果文檔的截圖知道更多信息。
蘋果用sqlite數據庫存了很多信息。這些數據庫數據庫通常以.db或者.sqlitedb結尾。對於開發者來說,許多功能比如Core Data, NSUserDefaults都從一個較低的層次操作這些sqlite數據庫。可以從這些數據庫抽取出特定應用,甚至操作系統級別的許多信息。可能包括電話歷史或者應用內保存的郵件等等。要找到所有的.db文件, 可以用命令 find . -name *.db
你可以得到在設備上保存的所有數據庫文件。讓我們先看下其中的一些重要數據庫文件。
我在設備上安裝了gmail應用。下面這個文件對我來說看起來很有趣。
看起來這個文件包含了一些重要的信息。讓我們先用sqlite客戶端分析一下這個文件。請注意,你需要在你的設備上安裝sqlite客戶端,比如sqlite3。 我們先打開設備,然後用命令sqlite3 file_name打開數據庫文件。
請注意,你會得到一個sqlite解釋器。讓我們打開headers,這樣我們就可以看到所有的列表名稱。你可以用.tables命令看看數據庫存放的所有表。
有些表看起來很有趣,比如cachedcontacts, cachedqueries 和 cachedmessages。讓我們從cachedmessages導出所有信息。
正如我們看到的那樣,導出了所有緩存了的郵件。
類似的,我們也可以導出所有的短信(SMS)數據庫,位於/private/var/mobile/Library/SMS.你可以從導出文件中看到一條消息, 其文本是Test message for ios security tutorial
另一個例子是聯系人數據庫,其位置是 /var/mobile/Library/AddressBook
你也可以查看電話歷史記錄,位於 /private/var/wireless/Library/CallHistory
有時候用命令行做這些事情確實很費時間。一個更好的分析方法就是導出這些信息到你電腦上,(然後用工具打開)。例如, 下載 Address Book Sqlite database
我們可以用GUI Sqlite客戶端工具來分析這個文件。我這裡用的是MesaSQLite。免費且易用。 在MesaSQLite中,先到File,然後點擊Open Database,選擇db文件,然後在Content tab,選擇一個表然後點擊查看所有(Show All)
如你所見,許多信息都可以從這些數據庫文件中獲取。我推薦你自己去探索下,找找其他應用甚至操作系統的數據庫文件看看。
plist是用戶存放許多不同設置和配置的結構化文本文件。因為這些信息都是以key-value這種鍵值對來存放信息的,所以要改變這些信息非常容易。因此,許多開發者有時會在這些文件中存放許多不該存放在這的信息。
即使在一個沒有越獄的設備上,plist文件也可以通過工具iExplorer獲取。你可以用iExlorer看看plist文件。例如如下圖是一個Defcon iOS應用的plist 中存放的信息。
下圖是Snapchat應用的Documents目錄中保存的plist文件截圖。第一個高亮的區塊實際上是特定用戶的認證標識(authentication token),第二個高亮的區塊是 Snapchat的用戶名稱。
Plist文件也可能包含機密信息,比如用戶名和密碼。有一個事情需要特別注意的就是,任何人都可以從設備中導出plist文件,即使這個設備沒有越獄。
你也可以從用戶的iTunes 備份中導出這些plist文件。過去數年,有開發者把機密數據存放在plist文件中,這是不正確的做法。Linkedin iOS應用被發現的一個漏洞就是它把用戶的認證信息存放在plist文件中,你可以到這找到更多信息。
如果你想在terminal看這些plist文件,你可以先用工具plutil把它轉化為xml格式,命令是 plutil -covert xml1 [filename]。首先用下面的2個命令找到設備上所有的plist文件。
然後把它轉成xml格式
現在文件是結構化的格式了,我們可以用vim打開它。
如你所見,我們現在能夠分析plist文件的內容。
在本文中,我們查看了iOS的文件系統,學習到其目錄結果是如何組織的,查看了一些重要文件,並且學習了如何從數據庫和plist文件中導出重要數據。