android安全問題日益驗證,作為一名移動安全滲透人員,有時需要對移動apk進行全面的滲透測試,而不能僅僅局限于apk本身,此時往往就需要結合靜态分析和動态分析進行。 靜态分析在不運作代碼的方式下,通過觀察進行分析發現;動态分析在運作代碼的情況下,通過跟蹤分析相關的記憶體,如寄存器内容,函數執行結果,記憶體使用情況等等,分析函數功能,明确代碼邏輯,挖掘可能存在的漏洞。在某些情況下,需要動态分析才能夠進行後續的滲透測試。 在進行apk分析時,有時需要分析資料包,可是有些資料包已經被加了防護,例如增加了完整性校驗參數,這個參數能夠阻止資料被篡改。針對這種情況,如果想直接進行分析就變得困難了,若想繼續滲透測試可能就需要結合動态分析。是以接下來,我将以一個完整的分析思路進行介紹。 一、 背景在對某個apk滲透測試的時候,發現該apk在發送資料包時,都傳的有一個資料完整性參數。這樣造成的結果是,如果滲透測試人員想對參數進行分析時無法對其進行修改。那麼為了能成功的進行後續的滲透測試,就需要嘗試逆向出資料包的簽名算法。 二、 逆向目的通過靜态分析和動态分析擷取資料包的簽名算法,進而實作對apk後繼的滲透測試。 三、 解決思路首先,作為滲透測試人員肯定會思考程式是如何進行簽名的?理論上數字簽名就是給出加密後的資訊以及資訊摘要。服務端對接收到的資料進行摘要,然後對摘要的資訊進行比對,進而判斷接收到資料包是否是完整且正确的資訊。但是在實際實戰中,可能會有些差别,這些差别需要通過觀察資料包的格式進行一個簡單的判斷。是以,接下來就需要抓包看一下發送的資料包的樣式。 抓包使用的工具有很多,可以使用Burpsuite,也可以使用Fillder。這裡我使用Fillder抓包工具進行分析。 1. 抓包 抓包目的是對資料包進行分析,判斷資料包的内容。圖1和圖2是抓包擷取的資訊,從圖中可以看到sign字段,同時還有其他字段,username,method,t,smscode等。 圖1 fillder抓到資料包樣式 ![]() 圖2 fillder抓到資料包樣式 看到上圖形式,大緻可以猜測如下:sign字段的構造可能與v,userName,method,t,password中的一個或者多個參數有關。當然這裡隻是猜測,接下來還需要繼續進行分析。 2. 分析apk擷取sign構造方法。 反彙編apk進行分析,目的是通過檢視smail代碼判斷是否能找到sign構造的地方。使用工具有AndroidKiller或者APKide。 圖3 反彙編apk擷取到程式smail代碼資訊 将apk加載進AndroidKiller,可以看到apk的smail代碼資訊,如圖3所示。接下來就可以進行分析了。起初想着靜态分析,通過搜尋關鍵字sign進行查找,要是能夠找到那就容易的多了,可是後來發現能出來非常多的相關資訊,根本無法參考使用,如圖4所示。 圖4 搜尋sign關鍵字結果 是以,不得不更換一下思路。經過分析,覺得在登入的地方要發送資料包,而資料包中有sign簽名參數,那麼就一定有建構sign的地方。是以我嘗試開始查找,終于在 LoginActivity中找到快速登入的函數,如圖5所示 圖5 登入函數smail實作代碼 看到這裡沒有發現sign構造的地方,是以繼續進行深入分析。分析loginQuickRequest類:這裡面包含了四個請求時要顯示的參數資訊。如圖6所示。 圖6 loginQuickRequest類對應的smail代碼 依然沒有發現想要的sign參數,繼續深入跟進BasicRequest類。非常幸運在BasicRequest.class裡面終于成功的找到了sign參數。在裡面可以看到如下資訊: 圖7 sign構造對應的java代碼 在這裡我們成功的看到了期望已久的sign字段,接下來就可以分析該段代碼。 localHashMap.put("sign",a.a(localHashMap, (String)localHashMap.get("method"))); 看到localhashmap就大緻知道這裡使用了map容器,該函數的第二個參數對應的就是sign的值。繼續跟蹤,最終追溯到so庫-libNoodleMD5.so,在這裡面進行MD5的加密。如圖8、9所示。 圖9 sign調用native代碼執行的地方 走到這一步就很明顯了,順理成章的需要分析so代碼。圖10是apk所用到的so庫。 圖10apk使用到的一些so庫 分析so庫,需要用到IDA工具。IDA是一個強大的逆向分析工具,該工具支援動态分析。使用IDA加載對應的加密庫,然後設定好斷點,動态跟蹤分析,找到加密函數。So檔案中的加密函數如圖11所示:正常情況下看到應該是smail代碼,為了友善,這裡使用了IDA的一個轉換功能。IDA按F5可以實作将smail代碼轉換為類c程式。此時還需要導入JNI函數,方可得到如下所示結果。 圖11 so庫中對應的加密函數 對這段代碼進行簡單分析,可以看到一些關鍵函數,strjoin(ptr,” 6C57AB91A1308E26B797F4CD382AC79D”),該函數字面意思是拼接字元串。緊接着跟着是MD5Init,MD5Update,MD5Final等函數。這些函數是構成MD5加密的完整過程。分析到這裡基本已經可以知道資料包簽名的算法了,最後一步就是進行驗證了。 最後按照單步跟蹤,觀察寄存器資訊,就可以成功的找到規律得到sign的構造方法。利用該方法可以寫一個自動化工具,快速生成任意自己想要的資料的簽名。 四、簽名算法簽名算法的原理是:首先擷取URI的參數資訊(method,userName,t,password,v等),然後拼接一個字元串:6C57AB91A1308E26B797F4CD382AC79D(該字元串是固定的)。得到一個長字元串,最後對這個長的字元串進行MD5值加密,即可成功的擷取簽名資訊sign。 五、總結APK的關鍵代碼僅僅寫在SO檔案中并不能有效的防護,還需要使用其他的防護機制,比如代碼反調試機制,混淆機制等等。隻有将多種防護方案運用起來才能真正有效的防止逆向攻擊。 |
專注于安全領域 解決網站安全 解決網站被黑 網站被挂馬 網站被篡改 網站安全、伺服器安全提供商-www.sinesafe.com --專門解決其他人解決不了的網站安全問題.