| Kevin Mitnick 說沒有攻不破的系統,應用尤其這樣。而滲透測試則是通過去模擬黑客使用的漏洞發現技術和攻擊手段,從一個攻擊者可能存在的位置來進行分析,並且從這個位置有條件的主動利用安全漏洞,找到系統最脆弱的環節。那么滲透測試方法有哪些,具體分析策略如何?下面由技術專家張中文為大家進行精彩的技術解析。 |
滲透是一門比較獨立和特定領域的一門技術,可清晰地分為靜態分析和動態分析。
靜態分析方法
推薦分析工具:JEB
靜態分析的常見類別:
-
獲取敏感數據
-
可利用的代碼執行
-
網絡/本地Socket
-
路徑/URI/URL校驗
-
數據文件的權限配置
-
SQL注入
-
密碼秘鑰
-
暗碼/后門
-
證書校驗/中間人攻擊
-
Webview 專項
下面將針對每一項進行詳細分析:
1.獲取敏感數據
敏感數據包括:短信,聯系人,位置,秘鑰/口令,IMEI,瀏覽器歷史記錄,粘貼板數據,安裝的APP列表等。不同場景下可能包含其他的敏感數據類型。
敏感數據–API/Keyword
分析思路:
追蹤敏感數據流向:位於Sdcard 的數據;寫到 logcat 里的數據;數據被發送至外部的通道,如短信、網絡、WIFI、WIFI(3G&4G)藍牙、NFC等。
2、可利用的代碼執行
隨着應用的體量越來越大,插件化成為一個趨勢。插件化帶來很多優點,如易於升級,易於擴展等功能,但同時也帶來了攻擊點。除了插件,還有傳統的 Java exec 的代碼執行方式。
可利用的代碼執行–API/Keyword
分析思路:
對於 dex 插件
- 查看插件的來源是否可控
查看插件的來源是否來自 SDCard,如果是直接替換;查看是否來自網絡下載,可否被中間人替換。
- 查看是否進行了完整性校驗
是否校驗了 dex 插件的 hash value。
- 如果來源可控且沒有完整性校驗,則可以用於代碼執行。
對於 exec
查看參數來源是否可控;
是否來自 intent,intent 是否可控;
是否來自 localsocket,localsocket 是否有訪問控制;
是否來自網絡流量(C&C),流量是否可以截獲並篡改。
3.網絡/本地Socket
網絡Socket/HTTP/HTTPS 是手機與外界數據交換的重要通道,手機中大量的數據都通過網絡流量傳輸。
本地Socket類似網絡Socket,不同的是本地Socket是本地兩個進程進行數據交換,不涉及到網絡流量。
網絡/本地Socket–API/Keyword
分析思路
- 網絡Socket
分析發送的數據是否是敏感數據;
查看是否發送到指定的IP/端口;
是否有 Command and Control 的行為;
判斷是否是后門。
- 本地Socket
是否有訪問控制,如果沒有訪問控制或者訪問控制可以被繞過則繼續分析;
如果是client,查看server是否存在,是否可以被仿冒;
如果是server,查看server提供的功能,是否有利用價值。
4.路徑/URI/URL校驗
應用/SDK大量使用路徑/Url作為參數,如果不校驗路徑的合法性,容易導致路徑遍歷攻擊。Android 平台最典型的路徑遍歷漏洞是ZipEntry,URL路徑遍歷問題與傳統的web相同。
路徑/URI/URL校驗–API/Keyword
分析思路
路徑遍歷問題較為普遍且涉及到眾多API,若僅僅用 API 作為關鍵字搜索精確度會降低。比較推薦的做法是先分析是否有利用價值,如加載一個配置文件,寫一些敏感數據等;再進一步分析路徑參數是否可以控制。因此,通常路徑遍歷漏洞需結合其他漏洞才能發揮比較大的價值。
防御方法:
通過../過濾后判斷合法性
獲取絕對路徑后判斷路徑合法性
5.數據文件的權限配置
數據文件有很多類型,最典型的是SharedPreference.xml和Provider.db,以及
存在 sdcard上的配置文件等。
分析思路:
如果測試手機有Root權限,直接 ls -l 查看文件權限,否則查看源代碼。
6.SQL注入
Android使用 SQLite 數據庫,也會遭受 SQL 注入攻擊。如果暴露的Provider組件在query()中使用拼接字符串組成SQL語句的形式去查詢數據庫,容易發生SQL注入攻擊。
SQL注入–API/Keyword
SQL注入示例
用 “_id’”探測,如果應用出錯,則存在注入;如果修改projection的內容為
"* from sqlite_master where type='table';--",SQL語句就會變成select "* from sqlite_master where type='table';--“,“;--”之后的SQL語句就作為注釋被忽略掉了。
Drozer 工具可以幫助檢測和利用SQL注入漏洞。
7.密碼秘鑰
應用的秘鑰管理一直沒有完美的解決方案,有安全意識的開發者會把重要的秘鑰數據存儲在keystore里,但也有相當多開發者將秘鑰硬編碼寫在應用里,反編譯后就可以輕易獲取到。
密碼秘鑰– API/Keyword
案例分享:CVE-2017-2704
密鑰硬編碼在代碼中,逆向分析可以破解出明文。
8.暗碼/后門
暗碼通常是在撥號盤界面輸入##secret_code##,就會得到很多信息。如常見的進入工程菜單的暗碼,在撥號盤輸入##2846579##就可以進入華為手機的工程菜單,暗碼的這種特性被一些人用作后門。檢測暗碼可以在 AndroidManifest.xml 中搜索如下action,找到對應的處理代碼,查詢是否存在后門行為。
暗碼/后門– API/Keyword
代碼示例:
使用暗碼功能要在AndroidManifest.xml里聲明,在組件接收到暗碼消息后進行相應的處理。
9.Webview 專項
Webview 作為廣泛使用的一個控件,其地位足以和四大組件相媲美。Webview 讓應用變得更加豐富多彩,也提供了不用來回切換界面的良好用戶體驗。但是便利總是需要付出一些代價,使用Webview付出的代價是應用的安全性變差。
Webview 專項–API/Keyword
Webview 攻擊面分析
- 遠程代碼執行
CVE-2012-6636 addJavascriptInterface 利用該漏洞執行任意Java對象的方法
CVE-2013-4710 openFile 同源繞過
- File 域控制不嚴
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs
setAllowFileAccess + setJavaScriptEnabled(true)
- 信息泄露
密碼明文存儲 setSavePassword (true)
地理位置泄露 setGeolocationEnabled
- Url 外部可控
loadUrl (String url)
loadUrl (String url, Map additionalHttpHeaders)
loadData(String data, String mimeType, String encoding)
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
動態分析方法
動態分析的常用方法:
-
動態調試
-
運行時Hook
-
實時流量包抓取/分析
-
搭建簡易HTTP服務器挖掘RCE問題
通過靜態分析獲取了風險點后再進行動態分析,才能確定系統是否真的有問題。
1、動態調試:
Android Studio下載smalidea(https://bitbucket.org/JesusFreke/smali/downloads/Android),打開 Studio,點擊 File -- Settings – Plugins,即可安裝成功。
2.運行時Hook
Hook框架 – Frida
Android有很多Hook框架,比如大名鼎鼎的Xposed,還有Cydia,Frida,ADBI, Dexposed,DroidPlugin,Legend等。這些Hook框架各有千秋,可以按照自己的喜好選擇使用。現在給大家推薦使用的 Hook 框架是 Frida。
• 安裝指導:
https://www.frida.re/docs/functions/
• 資源下載:
https://github.com/frida/frida/releases
使用示例 – Hook 應用
Part I: java script
Part II: python script
加載Java script 腳本
在終端輸入以下命令
3.實時流量包抓取/分析
流量分析工具 – Burp
常見的流量分析工具有 burp 和 fiddler,二者差別不大,可自由選擇。
Burp 的社區版是免費的,並且滿足絕大部分滲透要求。
下載鏈接:
https://portswigger.net/burp/communitydownload
使用示例:
HTTPS有證書校驗,如果想抓到HTTPS的包,就需要妥善處理證書問題。一般來講HTTPS的抓包與證書的關系大致有三類:
1 不配置證書可以抓獲的,這類是客戶端忽略證書錯誤。
2 需要導入到信任證書才能抓獲的,這類是客戶端信任所有證書域。
3 需要hook才能抓獲的,這類是內置服務端證書在應用內。
示例:
針對第二種情形進行處理– 配置證書
PC端配置要點
1、打開Burp,配置Burp監聽本地所有的 8080 端口。
2、打開瀏覽器,訪問7localhost:8080,點擊右上角 CA Certificate,下載Burp證書
3、把下載的 Burp 證書導入到PC上受信任的根證書。
4、把上一步導入的證書(PortSwiggerCA) 導出,並安裝到手機上。安裝時要輸入手機的解鎖碼。
手機端配置方法
1、 配置代理
如圖主機名 127.0.0.1,端口 8080 跟 burp 保持一致。
2、把手機上的端口轉發到PC端
adb reverse tcp:8080 tcp:8080,Burp已經可以抓取手機上HTTPS流量包。
使用示例 – 中間人修改JS代碼竊取信息
背景:靜態分析發現Webview對外暴露了Java對象。
目的:調用對象接口,獲取敏感信息。
方法:用中間人的方法修改返回包的js腳本
1、打開 Intercept,攔截所有流量
2、抓到請求包,攔截響應包
3、攔截到響應包,修改響應包內容,插入竊取信息的腳本。
4、用戶信息被竊取
4.搭建簡易HTTP服務器挖掘RCE問題
方法一:
最簡易的HTTP服務器搭建方法只需要輸入一條命令
python -m SimpleHTTPServer %PORT%
方法二:
安裝XAMPP,配置如下 3 個信息
Listen 8080
ServerName localhost:8080
DocumentRoot "E:ulnerabilitiesclone"
如果啟動成功后Apache背景會變成綠色。
簡易HTTP服務器在滲透測試中的應用
背景:應用對外暴露了 BROWSABLE 的 Activity,且Activity對外暴露了Java對象,此對象提供了敏感功能。
目的:利用此Activity啟動任意應用。
方法:搭建HTTP服務器,在頁面中嵌入攻擊腳本
環境配置步驟
-
PC端用 XAMPP 搭建服務器,端口配置成 8080
-
轉發端口,把手機上的8080端口映射成PC上的8080端口 adb reverse tcp:8080 tcp:8080
-
手機端不需要配置代理
-
配置成功后,在手機瀏覽器上訪問 127.0.0.1:8080 能夠看到目錄下的文件 ( E:ulnerabilitiesclone )
用靜態分析的方法分析出攻擊路徑,構造攻擊腳本。