官术网_书友最值得收藏!

11.5 汽車功能應(yīng)用視角下的攻擊手法

在前面的內(nèi)容中,我們提到了從兩個(gè)維度來(lái)看待汽車網(wǎng)絡(luò)安全攻擊,即架構(gòu)和功能。我們已經(jīng)從汽車網(wǎng)絡(luò)安全架構(gòu)的角度介紹了遠(yuǎn)程攻擊、中程攻擊和近程攻擊。接下來(lái),我們將從核心功能應(yīng)用的角度來(lái)介紹攻擊,幫助讀者更好地理解汽車網(wǎng)絡(luò)安全攻擊。

11.5.1 OTA攻擊

OTA在車聯(lián)網(wǎng)行業(yè),可以說(shuō)是一個(gè)網(wǎng)紅名詞了。智能汽車最大的特色之一就是可以進(jìn)行OTA,即通過(guò)無(wú)線的方式對(duì)整車的軟件進(jìn)行升級(jí)。只要汽車的硬件支持,車輛功能就可以通過(guò)軟件升級(jí)不斷提升、優(yōu)化,讓用戶不斷獲得新體驗(yàn),而不像傳統(tǒng)汽車一經(jīng)交付即固定了最終形態(tài)。本節(jié)知識(shí)點(diǎn)如圖11-113所示。

圖11-113 OTA攻擊知識(shí)點(diǎn)

1.OTA原理

OTA為汽車帶來(lái)了便捷,同時(shí)也會(huì)引入新的攻擊面。我們可以簡(jiǎn)單地思考一下:OTA是可以讓整車軟件升級(jí)的功能,如果攻擊者可以介入該流程,將自己的惡意代碼植入升級(jí)包中,那么后果不堪設(shè)想。

OTA的功能實(shí)現(xiàn)對(duì)于每家廠商都不一樣,但是大致步驟如圖11-114所示。

1)云端生成升級(jí)包:該過(guò)程基本上是在OEM后端完成的。當(dāng)軟件開(kāi)發(fā)完成后,對(duì)最新的版本進(jìn)行打包、簽名、加密等操作。此時(shí),在車輛上就能看到有更新版本可以升級(jí)。

2)升級(jí)包傳輸:在用戶同意升級(jí)后,車端會(huì)從云端下載升級(jí)包。

3)車端升級(jí)包派發(fā)執(zhí)行:當(dāng)升級(jí)包下載完成后,車端會(huì)對(duì)升級(jí)包進(jìn)行安全校驗(yàn),接著開(kāi)始升級(jí)。由于車端不止一個(gè)控制器,因此該過(guò)程還涉及升級(jí)包的分發(fā),以及觸發(fā)各個(gè)控制器進(jìn)行升級(jí)等操作。

圖11-114 車端OTA流程

2.OTA安全風(fēng)險(xiǎn)

從上述步驟可以看出,在第一步云端生產(chǎn)升級(jí)包的過(guò)程中,攻擊者通常無(wú)法介入,除非從供應(yīng)鏈植入惡意程序,或從OEM其他系統(tǒng)滲透到OEM內(nèi)部進(jìn)行植入。

第二步非常關(guān)鍵,通常OTA升級(jí)包都是通過(guò)公網(wǎng)進(jìn)行傳輸?shù)模虼斯粽呔哂薪俪值臋C(jī)會(huì)。一旦劫持成功,如果升級(jí)包未加密,則攻擊者可以輕松獲取車輛固件,無(wú)須提取固件。此外,如果升級(jí)包未進(jìn)行簽名校驗(yàn),攻擊者還可以修改升級(jí)包,將自己的惡意代碼注入其中。

第三步主要在車內(nèi)完成。與第二步原理類似,車內(nèi)也存在各種通信網(wǎng)絡(luò),攻擊者同樣可以在車內(nèi)網(wǎng)絡(luò)上進(jìn)行劫持和篡改,成功后就可以將自己的惡意代碼注入其中。

3.OTA生產(chǎn)階段攻擊

如上所述,OTA升級(jí)包在生產(chǎn)階段主要是在OEM廠商內(nèi)部系統(tǒng)中完成的,攻擊者通常是無(wú)法介入的。但是對(duì)APT組織來(lái)說(shuō),則并非無(wú)孔可入。這涉及傳統(tǒng)的企業(yè)安全攻防和滲透。攻擊者會(huì)通過(guò)釣魚(yú)、公網(wǎng)Web漏洞、網(wǎng)絡(luò)設(shè)備漏洞等各種方式攻入企業(yè)內(nèi)網(wǎng),從而破壞OTA生產(chǎn)階段的系統(tǒng)。

此外,還有一條攻擊線路,即通過(guò)Tier1廠商。由于ECU是這些廠商開(kāi)發(fā)的,升級(jí)包自然也是這些廠商生成好傳給OEM的。所以可以攻擊供應(yīng)鏈,從源頭上直接拿下Tier1廠商,并污染升級(jí)包,也可以達(dá)到攻擊OTA的效果。

4.OTA下載階段攻擊

當(dāng)車輛和OTA服務(wù)端相互都準(zhǔn)備好升級(jí)后,就開(kāi)始下載OTA升級(jí)包了。這通常是通過(guò)無(wú)線蜂窩或Wi-Fi網(wǎng)絡(luò)完成的此時(shí)OTA下載服務(wù)器很有可能就暴露在公網(wǎng)環(huán)境中。當(dāng)攻擊者獲取下載地址后,可以直接訪問(wèn)OTA下載服務(wù)器進(jìn)行下載。如圖11-115所示,我們?cè)诠碳锌吹搅讼螺d地址,直接用瀏覽器就可以訪問(wèn),沒(méi)有鑒權(quán)。

圖11-115 硬編碼OTA升級(jí)包地址

當(dāng)下載了固件后,攻擊者可以對(duì)固件進(jìn)行篡改,然后利用OTA刷寫回去,比如利用DNS劫持等方法。

5.OTA分發(fā)階段攻擊

在分發(fā)階段時(shí),OTA也存在重重風(fēng)險(xiǎn)。由于OTA分發(fā)是在車內(nèi)進(jìn)行的,而開(kāi)發(fā)者往往并不關(guān)心安全性,所以O(shè)TA Master在對(duì)升級(jí)包校驗(yàn)后,可能會(huì)直接將升級(jí)包明文發(fā)送給其他ECU進(jìn)行升級(jí)。這個(gè)過(guò)程如果被攻擊者攔截并篡改,同樣會(huì)對(duì)ECU造成很嚴(yán)重的威脅。例如,我們采用車載以太網(wǎng)嗅探工具抓取OTA Master上的以太網(wǎng)流量,可以發(fā)現(xiàn)它明文傳輸了固件包,從而可以獲取升級(jí)固件,如圖11-116所示。

圖11-116 OTA分發(fā)流量包含未加密固件

11.5.2 車載Android應(yīng)用攻擊

車載Android應(yīng)用與手機(jī)Android應(yīng)用大同小異,本節(jié)我們將介紹針對(duì)這類應(yīng)用的攻擊方法,分為靜態(tài)方法和動(dòng)態(tài)方法。本節(jié)知識(shí)點(diǎn)如圖11-117所示。

圖11-117 車載Android應(yīng)用攻擊知識(shí)點(diǎn)

1.靜態(tài)分析攻擊

(1)逆向工具

如圖11-118所示,jadx是一個(gè)很好用的開(kāi)源跨平臺(tái)反編譯GUI工具,非常推薦,它的下載地址為https://github.com/skylot/jadx。

圖11-118 jadx逆向工具

如圖11-119所示,GDA也是一個(gè)強(qiáng)大的逆向分析工具。它不僅支持基本的反編譯操作,還支持惡意行為檢測(cè)、隱私泄露檢測(cè)、漏洞檢測(cè)、路徑求解、打包者識(shí)別、變量跟蹤分析、解混、Python和Java腳本編寫、設(shè)備內(nèi)存提取、數(shù)據(jù)解密和加密等眾多功能。另外,它只支持Windows。GDA下載地址為https://github.com/charles2gan/GDA-android-reversing-Tool。

圖11-119 GDA逆向工具

(2)是否存在敏感字符串

檢查APK中是否存在一些敏感的明文字符串,比如Passwords、URL、API、Encryption、Backdoors、Tokens、Bluetooth UUID。該過(guò)程可以使用反編譯工具手動(dòng)搜索,也可以使用以下自動(dòng)化工具。

?apkurlgrep,地址為https://github.com/ndelphit/apkurlgrep,可以幫助掃描出APK中使用的URL,使用如下。

?apkleaks,地址為https://github.com/dwisiswant0/apkleaks,可以幫助掃描APK中的密鑰、URI,可以建立自己的規(guī)則文件,使用如下。

?StaCoAn,地址為https://github.com/vincentcox/StaCoAn,可以幫忙掃描硬編碼密鑰、apikey、密碼等信息,如圖11-120所示。

圖11-120 StaCoAn掃描工具

(3)檢查Manifest.xml

在APK中有一個(gè)清單文件,即Manifest.xml。它是這個(gè)APK的配置文件,包含很多內(nèi)容。漏洞往往就出現(xiàn)在該文件中。接下來(lái)我們看看該文件有哪些需要注意的點(diǎn)。

1)檢查應(yīng)用程序是否可調(diào)試。檢查清單文件里是否有debugable="true",這樣的程序可以用jdb調(diào)試。

2)檢查APK是否允許備份。檢查清單文件里是否有android:allowBackup="true",這樣的程序可以通過(guò)ADB備份應(yīng)用,從而有可能泄露隱私數(shù)據(jù)。

3)檢查是否有導(dǎo)出的Activity。檢查清單文件里是否有<activity android:name=".TestActivity"android:exported="true"/>,這樣的Acitivity組件可以被其他應(yīng)用調(diào)用。

4)檢查是否有導(dǎo)出的Content Provider。檢查清單文件里是否有<provider android:name=".DBContentProvider"android:exported="true">,這樣的Provider可以被其他應(yīng)用調(diào)用。

5)檢查是否有導(dǎo)出的Service。檢查清單文件里是否存在<service android:name=".ExampleExportedService"android:exported="true"/>,這樣的Service可以被其他應(yīng)用調(diào)用。

6)檢查是否有廣播接收器。檢查清單文件里是否存在<receiver android:name=".MyBroadcastReceiver"android:exported="true">,這樣其他的應(yīng)用可以發(fā)送廣播給該程序。

7)檢查是否有URL Scheme。檢查清單是否存在Activity中具有URL Scheme:<data android:scheme="app"android:host="open.my.app"/>。這樣的Activity可以被其他應(yīng)用通過(guò)URL打開(kāi),包括瀏覽器。

8)檢查Activity模式是否為singleTask。具有singleTask模式的Activity具有被劫持的風(fēng)險(xiǎn),檢查命令如下。此類漏洞的詳情可以參考https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html。

(4)程序數(shù)據(jù)保存的位置是否安全

首先,默認(rèn)情況下,對(duì)于在內(nèi)部存儲(chǔ)中創(chuàng)建的文件,只有應(yīng)用程序自己才能訪問(wèn)。但有些程序使用MODE_WORLD_READBALE和MODE_WORLD_WRITABLE可以將這些文件公開(kāi)出來(lái)。

在Android設(shè)備的/data/data/中會(huì)有每個(gè)應(yīng)用程序的文件夾,在里面都有一個(gè)Shared_Prefs和databases文件夾以及由應(yīng)用程序所創(chuàng)建的其他文件夾。這些文件夾里的文件都屬于內(nèi)部存儲(chǔ),如果程序使用了MODE_WORLD_READBALE,命令如下,則任意程序都能訪問(wèn)該文件。

如下所示,該文件中存在密碼等敏感信息。

其次,在外部存儲(chǔ)上創(chuàng)建的文件是全局可讀和可寫的,因此是不安全的。外部存儲(chǔ)的路徑通常是/store/emated/0、/sdCard、/mnt/sdCard。如果程序?qū)⒖蓤?zhí)行的文件放在該目錄下,則要檢查一下它是否會(huì)校驗(yàn)簽名等完整性信息。

(5)是否有硬編碼密鑰

有些程序?qū)⒚舾袛?shù)據(jù)存儲(chǔ)在本地,并使用代碼中硬編碼密鑰對(duì)其進(jìn)行加密。這樣可以通過(guò)逆向的方式獲取密鑰,從而解密敏感數(shù)據(jù),如圖11-121所示,存在硬編碼私鑰。

圖11-121 硬編碼私鑰

(6)應(yīng)用使用的加密算法是否安全

程序不應(yīng)該使用過(guò)時(shí)的加密算法,比如RC4、MD4、MD5、SHA1等,可以參考以下鏈接:https://www.ibm.com/docs/en/ibm-mq/8.0?topic=cipherspecs-deprecated。

(7)自動(dòng)化靜態(tài)分析工具

如圖11-122所示,MobSF是一個(gè)很強(qiáng)大的開(kāi)源分析工具,既可以靜態(tài)分析也可以動(dòng)態(tài)分析。它的下載地址為https://github.com/MobSF/Mobile-Security-Framework-MobSF,也支持直接在https://mobsf.live/上進(jìn)行在線試用。

圖11-122 MobSF分析工具

如圖11-123所示,Yaazhini Android也是一個(gè)免費(fèi)易用的靜態(tài)掃描工具,下載地址為https://www.vegabird.com/yaazhini/。

圖11-123 Yaazhini靜態(tài)分析工具

如圖11-124所示,Mariana-trench這個(gè)工具能靜態(tài)掃描程序發(fā)現(xiàn)漏洞。它使用的是污點(diǎn)追蹤的方式,包含一系列Source(污點(diǎn)數(shù)據(jù)的來(lái)源)和Sink(具有危險(xiǎn)的函數(shù)目標(biāo)),能通過(guò)掃描發(fā)現(xiàn)是否存在Source到Sink的路徑,并據(jù)此判斷漏洞。

圖11-124 Mariana-trench靜態(tài)分析工具

(8)需要重點(diǎn)關(guān)注的函數(shù)

重點(diǎn)需要關(guān)注的函數(shù)有兩類。一類是可以從外部獲取數(shù)據(jù)的函數(shù),比如getOutputStream、getParcelable等。另一類是具有風(fēng)險(xiǎn)行為的函數(shù),比如exec、sendBroadcast等。對(duì)此,大家可以參考開(kāi)源靜態(tài)分析工具中的Source、Sink配置,比如flowdroid:https://github.com/secure-software-engineering/FlowDroid/blob/fc5c2c72ea451f6fa54675cf4a44ca4170fc9989/soot-infoflow-android/SourcesAndSinks.txt。

2.動(dòng)態(tài)分析攻擊

(1)搭建動(dòng)態(tài)分析環(huán)境

針對(duì)模擬器,Android有很多模擬器可選。這里推薦一款性能和兼容性不錯(cuò)的模擬器——Genymotion。我們可以通過(guò)https://www.genymotion.com/下載它。同時(shí),最好有一臺(tái)root物理機(jī)并開(kāi)啟開(kāi)發(fā)者模式。

(2)利用MobSF做初始分析

MobSF可以幫助我們發(fā)現(xiàn)應(yīng)用中一些有趣的點(diǎn)。它是全自動(dòng)的,因此我們可以先讓它運(yùn)行起來(lái),然后去做其他的事情。關(guān)于使用方法,請(qǐng)參考官方文檔:https://mobsf.github.io/docs/#/zh-cn/。

(3)檢查日志中是否存在敏感數(shù)據(jù)

應(yīng)用程序在運(yùn)行過(guò)程中會(huì)輸出各種日志,查看這些日志可以幫助我們了解應(yīng)用程序的功能,并找到一些敏感信息。推薦使用Pidcat來(lái)查看應(yīng)用程序的日志,如圖11-125所示。相比于Logcat,Pidcat更容易閱讀。我們可以在https://github.com/JakeWharton/pidcat下載Pidcat。

(4)檢查SQLite數(shù)據(jù)庫(kù)中是否存在機(jī)密信息

許多應(yīng)用程序會(huì)使用SQLite數(shù)據(jù)庫(kù)。我們可以瀏覽數(shù)據(jù)庫(kù),查看其中是否存在敏感信息。數(shù)據(jù)庫(kù)通常位于/data/data/the.package.name/databases目錄下。如果數(shù)據(jù)庫(kù)中的數(shù)據(jù)是加密的,我們可以嘗試在APK中找到密鑰,以便訪問(wèn)并瀏覽數(shù)據(jù)庫(kù)。常用的瀏覽SQLite數(shù)據(jù)庫(kù)的工具包括SQLite 3、Android Studio和Stetho等。由于工具眾多,本節(jié)不再一一介紹。

圖11-125 Pidcat日志查看工具

(5)檢查是否存在可利用的導(dǎo)出Activity

如果我們發(fā)現(xiàn)應(yīng)用程序存在導(dǎo)出的Activity,就需要考慮它是否可利用。通常,我們需要嘗試啟動(dòng)該Activity,查看是否有敏感信息。假設(shè)包名為com.example.demo,Activity名稱為com.example.test.MainActivity,則可以使用以下命令進(jìn)行啟動(dòng)。

(6)是否有可利用的Content Provider

Content Provider就是應(yīng)用程序用來(lái)給其他應(yīng)用提供數(shù)據(jù)的。如果它的權(quán)限限制不嚴(yán)格,就可能從中獲取敏感數(shù)據(jù)。此外還可以嘗試SQL注入或路徑穿越的攻擊方式。如下所示是一個(gè)Content Provider的定義。

Content Provider所提供的數(shù)據(jù)可以存儲(chǔ)在數(shù)據(jù)庫(kù)、文件,甚至網(wǎng)絡(luò)上。接下來(lái)我們將介紹幾種利用方法。此處我們使用一個(gè)可以模擬應(yīng)用程序的工具Drozer,它可以用命令行的方式模擬應(yīng)用程序調(diào)用四大組件,節(jié)省我們寫代碼的時(shí)間。

當(dāng)Content Provider為數(shù)據(jù)庫(kù)存儲(chǔ)時(shí),容易出現(xiàn)SQL注入的問(wèn)題。對(duì)此,我們可以進(jìn)行如下嘗試。

當(dāng)Conent Provider為文件存儲(chǔ)時(shí),也許存在目錄穿越問(wèn)題。對(duì)此,我們可以進(jìn)行以下嘗試。

(7)是否有可利用的服務(wù)

服務(wù)基本上都可以接收數(shù)據(jù)、處理數(shù)據(jù)。如果應(yīng)用程序?qū)С隽朔?wù),則需要仔細(xì)進(jìn)行逆向分析,看看該服務(wù)到底實(shí)現(xiàn)了什么功能、有沒(méi)有身份校驗(yàn)等。

服務(wù)的處理代碼從handleMessage(Message msg)函數(shù)開(kāi)始,因此我們逆向的時(shí)候可以快速定位到關(guān)鍵函數(shù),如下所示。

使用Drozer來(lái)調(diào)用服務(wù),如下所示。

(8)是否有可利用的Broadcast Receiver

Broadcast Receiver是一種處理廣播消息的組件,主要用于查看普通應(yīng)用是否具有發(fā)送該廣播的權(quán)限,而接收器是否有危險(xiǎn)操作。通常接收器會(huì)使用onReceive函數(shù),可以重點(diǎn)關(guān)注該函數(shù)的實(shí)現(xiàn)。

使用Drozer發(fā)送廣播的操作如下。

(9)檢查Deep Link

Deep Link允許通過(guò)URL來(lái)觸發(fā)Intent。應(yīng)用程序會(huì)在Activity中聲明Deep Link。這樣就可以通過(guò)URL來(lái)啟動(dòng)該Activity。代碼如下,存在Deep Link:app://open.my.app。

測(cè)試Deep Link,可以使用如下代碼。

在檢查Deep Link時(shí),需要注意是否存在敏感參數(shù),例如密碼等。如果存在,攻擊者可以模擬這樣的Deep Link,以竊取敏感信息。此外,還應(yīng)檢查Deep Link中是否存在參數(shù)以及這些參數(shù)的作用,是否可以通過(guò)控制參數(shù)來(lái)執(zhí)行危險(xiǎn)操作。

在檢查應(yīng)用程序的網(wǎng)絡(luò)通信時(shí),需要注意以下幾點(diǎn)。

?明文傳輸:某些Android應(yīng)用程序直接使用HTTP進(jìn)行通信,在這種情況下,攻擊者可以直接劫持流量,獲取敏感信息。

?缺少證書(shū)檢查:許多應(yīng)用程序盡管使用HTTPS進(jìn)行通信,但并不驗(yàn)證服務(wù)器證書(shū),會(huì)接受任何自簽名證書(shū)。攻擊者可以利用這種情況進(jìn)行中間人攻擊,竊取敏感信息。

?弱密碼套件:應(yīng)用程序和服務(wù)器進(jìn)行TLS握手時(shí),可能選擇不安全的密碼套件。攻擊者可以利用這種情況破解整個(gè)通信加密過(guò)程。常見(jiàn)的弱密碼列表可以參考https://www.ibm.com/docs/en/ibm-mq/8.0?topic=cipherspecs-deprecated。

?后憑證泄露:有些應(yīng)用程序只在登錄時(shí)進(jìn)行身份驗(yàn)證并采用強(qiáng)安全傳輸,即保護(hù)第一個(gè)憑證(如密碼),但在后續(xù)操作中就放松了警惕,不進(jìn)行傳輸保護(hù)。這會(huì)導(dǎo)致后續(xù)憑證(如Cookie、token等)泄露。攻擊者可以使用這些憑證完成敏感操作。

(10)代理組件攻擊

該漏洞有點(diǎn)像SSRF,即Intent對(duì)象本身也可以作為參數(shù)在四大組件中傳遞。有些應(yīng)用利用此特征開(kāi)發(fā)出了代理組件,它將傳進(jìn)來(lái)的Intent對(duì)象再次傳遞給了startActivity、sendBroadcast等函數(shù),如下所示。

這是很危險(xiǎn)的,因?yàn)楣粽呖梢岳眠@種操作啟動(dòng)非導(dǎo)出的組件,如下所示。

(11)是否存在Android客戶端注入

對(duì)于SQL注入,主要看是否存在與數(shù)據(jù)庫(kù)相關(guān)的操作,以及有沒(méi)有將SQL查詢進(jìn)行參數(shù)化,如下所示。

對(duì)于JavaScript注入(XSS),主要看WebView中是否禁用了JavaScript。該設(shè)置默認(rèn)是關(guān)閉的,如果代碼中調(diào)用了setJavaScriptEnabled函數(shù)則可能開(kāi)啟了。

對(duì)于本地文件包含的情況,主要看WebView中是否禁用了文件訪問(wèn)。該設(shè)置默認(rèn)是開(kāi)啟的,如果代碼中調(diào)用了setAllowFileAccess(false)則表示關(guān)閉了。當(dāng)不存在跨域問(wèn)題時(shí),攻擊者通過(guò)以下代碼可以訪問(wèn)本地文件。

(12)借助Frida獲取感興趣的信息

Frida是在對(duì)Android應(yīng)用進(jìn)行分析時(shí)非常有用的動(dòng)態(tài)Hook工具。在進(jìn)行Android Java層代碼逆向分析時(shí),我們通常并不會(huì)使用調(diào)試的方式。因?yàn)镴ava層的代碼有各種回調(diào),調(diào)試起來(lái)問(wèn)題很多,加上Java自身的反編譯程度已經(jīng)非常高,我們只需利用靜態(tài)逆向分析配合動(dòng)態(tài)Hook打印信息,就可以完成逆向工作了。

本節(jié)就帶大家快速入門Frida的使用方法。掌握之后再配合反編譯工具,對(duì)大多數(shù)Android Java層的應(yīng)用都可以進(jìn)行逆向分析了。

首先,在PC上安裝Frida Client端,如下所示。

然后,在Android里安裝Frida Server端,下載地址為https://github.com/frida/frida/releases。

編寫Frida Hook腳本,掛鉤一個(gè)函數(shù),獲取它的參數(shù)和返回值。

以上介紹了車載Android應(yīng)用程序常見(jiàn)的攻擊思路和方法,由于Android的安全研究相對(duì)成熟而且是開(kāi)源的,大家可以在網(wǎng)絡(luò)上深入學(xué)習(xí)更多的知識(shí)。

11.5.3 車載Linux應(yīng)用攻擊

本節(jié)所講的車載Linux通常是嵌入式的。它不會(huì)像桌面版Linux(Ubuntu之類)那么復(fù)雜,是沒(méi)有UI界面的。但是車載Linux上常見(jiàn)的Service,包括啟動(dòng)方式(Init、Systemd)等還是與桌面版相似的,因此基本上針對(duì)桌面版上的攻擊方式都可以應(yīng)用于車載Linux。此外,與桌面版Linux不同的是車載Linux通常都是ARM架構(gòu)的,因此在利用內(nèi)存漏洞時(shí)會(huì)和桌面版有所不同。

操作系統(tǒng)的提權(quán)通常是指DAC(自主訪問(wèn)控制)提權(quán)與MAC(強(qiáng)制訪問(wèn)控制)提權(quán)。無(wú)論DAC還是MAC,都是為了限制用戶態(tài)的代碼,明確可以做什么以及不可以做什么。而提權(quán)就是在一個(gè)受限的代碼上下文中執(zhí)行超過(guò)自身權(quán)限的行為。本節(jié)將介紹一些針對(duì)車載Linux系統(tǒng)常見(jiàn)的本地提權(quán)攻擊方法。本節(jié)知識(shí)點(diǎn)如圖11-126所示。

圖11-126 Linux應(yīng)用攻擊知識(shí)點(diǎn)

其中,在用戶態(tài)中尋找DAC提權(quán)漏洞的方法是本節(jié)的重點(diǎn)內(nèi)容。

1.Linux系統(tǒng)信息收集

先收集系統(tǒng)上的一些信息用于提權(quán)攻擊面分析。下面列舉了這些信息的獲取方式。

1)查看進(jìn)程信息,查看進(jìn)程都有哪些權(quán)限,關(guān)注root權(quán)限的進(jìn)程。

2)查看網(wǎng)絡(luò)信息,檢查有哪些端口開(kāi)放,還有哪些UNIX socket。

3)檢查SUID程序是否具有提權(quán)的機(jī)會(huì)。

4)檢查任意用戶可寫的文件,是否可以修改文件來(lái)提權(quán)。

5)檢查任意用戶可寫的目錄,是否可以創(chuàng)建符號(hào)鏈接來(lái)提權(quán)。

6)查看設(shè)備,尋找可以訪問(wèn)的設(shè)備。

7)查看文件系統(tǒng),查看哪些目錄是可寫的。

8)查看內(nèi)核模塊,是否存在自定義的內(nèi)核模塊。

9)查看防火墻,是否對(duì)高危端口做了隔離。

10)查看網(wǎng)卡配置,檢查其IP、MAC等信息。

11)查看路由,檢查它的網(wǎng)絡(luò)通信方式。

12)查看內(nèi)核版本,是否有歷史漏洞。

13)檢查環(huán)境變量,是否存在可寫的文件或目錄。

14)檢查crontab,是否存在可寫的文件和目錄。

15)檢查crontab的定時(shí)執(zhí)行文件以及里面執(zhí)行的內(nèi)容,是否具有可寫權(quán)限。

2.用戶態(tài)提權(quán)攻擊

用戶態(tài)攻擊指的是在不使用內(nèi)核漏洞的情況下進(jìn)行提權(quán),通常攻擊的目標(biāo)是用戶態(tài)的高權(quán)限進(jìn)程。常見(jiàn)的用戶態(tài)提權(quán)攻擊方法如下所示。

(1)文件修改

在收集到系統(tǒng)信息后,可以獲得許多可修改的文件,進(jìn)而發(fā)現(xiàn)其中的提權(quán)漏洞。以下是通過(guò)修改文件進(jìn)行提權(quán)的幾種方法。

?可執(zhí)行文件(包括shell腳本、so庫(kù)、EXE文件):這些文件本身包含可執(zhí)行的代碼,如果執(zhí)行該文件的是root用戶,那么我們可以直接修改此文件,在其中加入自己的代碼,然后等待重啟或某些特定操作觸發(fā)代碼執(zhí)行即可。

?配置文件(包括系統(tǒng)配置文件、服務(wù)配置文件):這些文件不包含代碼,但是是系統(tǒng)或程序運(yùn)行需要讀取的文件。例如,/etc/passwd、/etc/ld.so.conf、/etc/httpd.conf等配置文件中可能存在一些敏感字段,比如在ld.so.conf文件中可以添加導(dǎo)入so庫(kù)的目錄,在passwd文件中可以修改用戶登錄時(shí)執(zhí)行的命令,在httpd.conf文件中可以添加自定義插件。

?數(shù)據(jù)庫(kù)文件(包括SQLite、XML等):這些文件不直接包含代碼,而用來(lái)存放程序中使用的數(shù)據(jù)。例如,如果sqlite能修改數(shù)據(jù)庫(kù)文件,就能控制程序所使用的數(shù)據(jù)。此時(shí)需要分析逆向該程序,看它是否存在利用數(shù)據(jù)進(jìn)行一些敏感操作的機(jī)會(huì),比如將數(shù)據(jù)代入system命令執(zhí)行中,或者將數(shù)據(jù)當(dāng)作URL訪問(wèn)之類。

?Service文件:在使用systemd的系統(tǒng)中會(huì)存在.service文件,如果可以修改它,就可以在啟動(dòng)或停止該服務(wù)的時(shí)候加入自己的代碼。例如,修改.service文件中的相應(yīng)內(nèi)容為”ExecStart=/tmp/myscript.sh”,就可以執(zhí)行自己的myscript.sh腳本。對(duì)于systemd的其他文件(比如.timer和.socket文件),也可以通過(guò)同樣的方式來(lái)利用。

(2)文件夾可寫

除了修改文件之外,如果對(duì)文件夾具有可寫權(quán)限,同樣可以用來(lái)提權(quán)。在Linux中,擁有可寫權(quán)限即代表可以在目錄中刪除和創(chuàng)建文件。因此,攻擊者可以刪除目錄中不可修改的文件,再創(chuàng)建一個(gè)自己的文件,從而達(dá)到修改目標(biāo)文件的目的。此外,還可以將創(chuàng)建的文件改為符號(hào)鏈接,并將其鏈接到一個(gè)普通用戶無(wú)法訪問(wèn)的文件上。此時(shí),如果有使用該符號(hào)鏈接的操作,則會(huì)間接控制該文件。

舉個(gè)例子,/var/log/testlog/目錄具有777權(quán)限。test軟件在運(yùn)行時(shí)會(huì)向/var/log/testlog/test.log文件中寫日志,日志中的內(nèi)容有一部分是用戶可控的。攻擊者可以在/var/log/目錄下創(chuàng)建一個(gè)名為test.log的符號(hào)鏈接,并將其鏈接到crontab文件上。利用crontab對(duì)文件格式的弱敏感性,攻擊者可以執(zhí)行自己的任意命令。

(3)Capability濫用

Linux Capability為進(jìn)程提供了有限的root功能,這就導(dǎo)致它即使不是root進(jìn)程,也具有一些高級(jí)權(quán)限。我們可以利用這樣的進(jìn)程進(jìn)行提權(quán)。

首先我們查找具有Capability的進(jìn)程,使用如下所示的命令。

如上所述,該程序如果具有cap_dac_override,則可以寫任意文件。接下來(lái),如果可以控制寫的目標(biāo)文件和目標(biāo)內(nèi)容,我們就能達(dá)到提權(quán)的目的了。

另外,還有很多高危的Capability,比如CAP_SYS_ADMIN、CAP_SYS_PTRACE、CAP_SYS_CHOWN等,都是可以具有提權(quán)風(fēng)險(xiǎn)的。

(4)SUID

具有SUID的程序會(huì)始終以該程序文件的擁有者的用戶身份執(zhí)行,若普通用戶啟動(dòng)具有SUID的root程序,則其權(quán)限最終會(huì)變?yōu)閞oot權(quán)限。最常見(jiàn)的此類程序包括sudo、su等。因此,如果存在具有SUID權(quán)限的程序,攻擊者需要格外關(guān)注,很可能可以利用這個(gè)漏洞來(lái)提升權(quán)限。

(5)socket

這里提到的用于提權(quán)的socket通常指UNIX socket,用于進(jìn)程間通信。當(dāng)然,也可以使用TCP/UDP的socket進(jìn)行通信,因?yàn)橛行┻M(jìn)程使用這種socket進(jìn)行通信。

無(wú)論哪種socket,它們的攻擊方式都是類似的。首先,服務(wù)器端是一個(gè)root進(jìn)程。然后,普通用戶需要能夠與該服務(wù)器進(jìn)行socket通信,從而通過(guò)服務(wù)器端的漏洞實(shí)現(xiàn)提權(quán)的目的。有時(shí),服務(wù)器端只是充當(dāng)中介角色,真正完成通信業(yè)務(wù)的是其他進(jìn)程,比如DBus、MQTT、ZMQ之類的協(xié)議。因此,攻擊面就會(huì)擴(kuò)大到多個(gè)進(jìn)程中。

這種提權(quán)取決于服務(wù)器代碼是否存在漏洞,因此在這里我們只介紹如何使用UNIX socket。與TCP相比,UNIX socket的使用方式類似,只是將IP地址和端口號(hào)替換為文件路徑,代碼如下。

(6)其他Linux IPC

Linux的IPC(Linux Inter Process Communication)有多種,上面提到的socket是常用的一種,其他還有MemoryMap、MessageQueue、NamedPipe、SharedMemory等。這里任何一種都可以作為提權(quán)的攻擊面使用,其原理和socket是一樣的。攻擊者作為普通用戶通過(guò)這些IPC與具有root權(quán)限的進(jìn)程通信,如果該root進(jìn)程在此通信中存在漏洞可被利用,則會(huì)造成提權(quán)。

接下來(lái)列舉一下如何利用這些IPC與root進(jìn)程通信。

?MemoryMap

?消息隊(duì)列(SystemV)

?消息隊(duì)列(Posix)

?NamedPipe

?SharedMemory

(7)總線協(xié)議

在操作系統(tǒng)中,有一些協(xié)議被稱為總線協(xié)議。它們類似于中介,負(fù)責(zé)分發(fā)消息給不同的進(jìn)程。在Linux中,常見(jiàn)的總線協(xié)議包括DBus和MQTT協(xié)議。本節(jié)將介紹DBus協(xié)議的攻擊方法。

DBus協(xié)議的中介是dbus-daemon。各個(gè)服務(wù)端會(huì)首先將自己注冊(cè)到中介那里,然后中介負(fù)責(zé)接受客戶端的請(qǐng)求并將其分發(fā)給不同的服務(wù)端。它既支持UNIX socket也支持TCP socket,一般在進(jìn)程間通信時(shí)會(huì)使用UNIX socket。下面介紹如何利用DBus進(jìn)行攻擊。

首先需要查找系統(tǒng)中注冊(cè)了哪些服務(wù),可以使用busctl list命令獲取。

接著,看這些服務(wù)有哪些接口。

再看這些接口具有哪些方法。

有了以上這些信息,就可以調(diào)用服務(wù)了,如下所示。

3.內(nèi)核態(tài)提權(quán)攻擊

內(nèi)核態(tài)攻擊一直是操作系統(tǒng)的一個(gè)熱門話題。由于內(nèi)核具有系統(tǒng)非常高的權(quán)限,攻擊者往往需要在獲取系統(tǒng)普通應(yīng)用程序權(quán)限后攻擊內(nèi)核以獲取更高的權(quán)限,尤其是在用戶態(tài)提權(quán)不易操作的情況下。因?yàn)長(zhǎng)inux有許多分支版本和模塊更新非常頻繁,所以Linux內(nèi)核的漏洞不斷涌現(xiàn)。而且,Linux漏洞補(bǔ)丁的修復(fù)也比較復(fù)雜,很多分支版本并沒(méi)有跟主線同步更新。因此,新的漏洞補(bǔ)丁需要再次人工合并。此時(shí),如果該補(bǔ)丁在主線上沒(méi)有明確標(biāo)識(shí)為漏洞補(bǔ)丁,則可能會(huì)在分支上被忽略。

本節(jié)將簡(jiǎn)要介紹常見(jiàn)的Linux內(nèi)核態(tài)攻擊方法,并介紹如何觸發(fā)內(nèi)核代碼路徑。

(1)來(lái)自用戶態(tài)程序的輸入

1)syscall系統(tǒng)調(diào)用:這是用戶態(tài)程序與內(nèi)核交互的主要方式,Linux內(nèi)核包含400多個(gè)系統(tǒng)調(diào)用。

2)文件操作:這實(shí)際上也是一組系統(tǒng)調(diào)用(open、read、write、ioctl),但是它會(huì)根據(jù)打開(kāi)的不同文件使用不同的功能。

3)socket操作:這也是一組系統(tǒng)調(diào)用(socket、bind、listen等),與文件操作類似,它根據(jù)打開(kāi)的不同socket類型具有不同的功能。

4)異常中斷:當(dāng)軟件產(chǎn)生錯(cuò)誤時(shí),系統(tǒng)會(huì)跳轉(zhuǎn)到內(nèi)核的中斷處理函數(shù)。這也是一個(gè)攻擊面,比如常見(jiàn)的coredump提權(quán)就是從此路徑來(lái)攻擊的。

(2)來(lái)自底層設(shè)備、硬件等的輸入

1)網(wǎng)絡(luò)設(shè)備:這主要是指與外部通信的設(shè)備有流量輸入,比如以太網(wǎng)、串口、CAN總線等通信設(shè)備。當(dāng)有流量進(jìn)入時(shí),內(nèi)核中對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)會(huì)進(jìn)行解析。

2)存儲(chǔ)設(shè)備:這主要是指一些可插拔的存儲(chǔ)設(shè)備,比如USB、SD卡等。當(dāng)這些設(shè)備插入后,內(nèi)核會(huì)有響應(yīng)的驅(qū)動(dòng)來(lái)執(zhí)行。

3)其他輸入設(shè)備:這主要是指各個(gè)特定用途的設(shè)備,比如鍵盤、鼠標(biāo)、攝像頭等。它們與上述設(shè)備也是類似的,有響應(yīng)的驅(qū)動(dòng)來(lái)處理它們輸入的數(shù)據(jù),通常也是利用標(biāo)準(zhǔn)的接口協(xié)議,比如USB、以太網(wǎng)等。

關(guān)于Linux的攻擊路徑就是上面所介紹的,至于具體的漏洞挖掘和利用,則需要我們深入了解內(nèi)核的實(shí)現(xiàn)原理,包括各個(gè)子系統(tǒng)以及驅(qū)動(dòng)的實(shí)現(xiàn)。通常采用人工審計(jì)和Fuzz的方式。此外,內(nèi)核也像用戶態(tài)一樣存在各種內(nèi)存漏洞利用緩解措施,比如KASLR(地址隨機(jī)化)、StackProtect(棧保護(hù))等,因此還需要掌握繞過(guò)這些緩解措施的利用手段。

更多關(guān)于內(nèi)核態(tài)攻擊的內(nèi)容,大家可以在網(wǎng)上自行學(xué)習(xí),比如https://github.com/xairy/linux-kernel-exploitation就提供了對(duì)內(nèi)核的各種利用方法。

總結(jié)一下,本章根據(jù)筆者和業(yè)內(nèi)專家的滲透測(cè)試經(jīng)驗(yàn)總結(jié)提煉出了許多實(shí)戰(zhàn)技巧思路,對(duì)不同的攻擊面進(jìn)行了詳細(xì)介紹。本章涵蓋了硬件安全和軟件安全兩方面的內(nèi)容,從固件提權(quán)到逆向工程,再到協(xié)議實(shí)戰(zhàn),通過(guò)多個(gè)方面的內(nèi)容帶領(lǐng)讀者進(jìn)入了一個(gè)真實(shí)的車聯(lián)網(wǎng)攻擊的世界。

滲透測(cè)試是最能夠體現(xiàn)汽車安全性的手段之一。我們此次以攻擊者的視角,對(duì)汽車的各個(gè)攻擊面進(jìn)行攻擊測(cè)試,最終將漏洞作為結(jié)果呈現(xiàn)出來(lái)。因此,從正向設(shè)計(jì)、開(kāi)發(fā)、防御的角度來(lái)看,熟悉滲透測(cè)試就了解了攻擊者的思路,知己知彼,以攻促防,才能做到百戰(zhàn)百勝。

主站蜘蛛池模板: 收藏| 本溪市| 西青区| 涞源县| 封开县| 阿巴嘎旗| 彭州市| 清水河县| 九龙县| 安新县| 绥芬河市| 祁东县| 华安县| 浠水县| 岳池县| 璧山县| 靖远县| 阳高县| 徐州市| 兴城市| 绵阳市| 黄平县| 永寿县| 淮滨县| 聊城市| 翁牛特旗| 石景山区| 双鸭山市| 定兴县| 双峰县| 峡江县| 满洲里市| 贡嘎县| 宁德市| 县级市| 宿迁市| 离岛区| 新郑市| 澳门| 玛多县| 辉县市|