獨角獸暑期訓練營 | 某網紅印表機安全分析(上)
該課題由獨角獸暑期訓練營第二屆學員張熙宸完成,課題完成後, 等待廠商修復相關漏洞,到現在才釋出。
360獨角獸安全團隊每年暑假都會面向在校學生舉辦一次暑期訓練營,申請者投遞簡歷並提交自己想做的課題介紹後,若入選,會在360技術專家的指導下完成課題。
本系列文章會發布第二屆訓練營6位學員在訓練營中的成果。文章相關程式碼後續會在 訓練營github程式碼倉庫 釋出 。
前言
假期研究了一款智慧印表機,後來某廠送來了一系列的待檢測裝置,驚訝的發現,和我研究的印表機工作機制如此類似。因此我覺得這個印表機就有了一定的代表性。寫了這篇文章,總結一下IOT的一些攻擊思路。研究期間,我的同事、朋友和導師給予了我很大幫助,這篇研究總結屬於大家共同成果。
瞭解工作機制
研究物件是咕咕印表機第二代,在閱讀下面內容之前,建議先在網上找一些使用教程瞭解一下。他的長相如下:
他的工作機制如下:
本地模式
單刀雙擲開關撥到本地模式的時候,印表機這時自己會打印出來一個自己發出的熱點的名稱和密碼。密碼很簡單:1234567890,應該是都寫死在韌體裡的。連線熱點是時候,允許多臺裝置連線,但是在我電腦連入熱點之後,卻抓不到他的包,不管是wireshark還是burp裡都是。有興趣的可以嘗試無線網絡卡抓一下,當時我沒有試。這種多裝置連線極容易造成列印內容被竊取。
API模式
官方給了一個API的呼叫文件,通過構造固定格式的URL傳送到伺服器來控制印表機。這個web介面請求伺服器列印的介面和APP請求的介面不一樣。
雲端模式
手機APP向伺服器傳送請求,伺服器再發給印表機控制列印。APP線上繫結裝置詳情網上有很多。第一次配置印表機進行聯網的過程中會產生一個廣播的WiFi,這個WiFi是沒有密碼的,與本地模式的WiFi不一樣。大概是起引導印表機連入家庭網際網路的作用。APP和伺服器的通訊好說,那伺服器怎麼和印表機對接呢?使用時我發現手機發送請求,若裝置沒供電,當再次上電就會全部打出。因此猜測是韌體裡寫了上電掃描之類的,開機就搜尋伺服器網路,掃到之後就連上,之前積壓的也就列印了。此外,官方還有一個網頁版APP。這個網頁版的APP的介面和手機APP的介面也不一樣(這個有大用處)
資訊收集
硬體層面
主控是Marvell88MW300,整合Cortex-M4 MCU與Wi-Fi於單一晶片
Flash晶片是MX25L6433F
藍芽晶片是CC2541,但在G2款中完全沒有用到該晶片
韌體提取思路:
人民幣玩家:用燒錄器(建議買RT809f ),通過上位機一鍵讀取。不想把晶片焊下來可以用銀引腳探針。要搭配燒錄座。可以把晶片焊下來。可以把晶片焊下來。把晶片焊下來的話,需要搭配燒錄座。建議最好焊下來,用探針的話,其他電路會造成干擾(300元左右)
普通玩家:買一塊最小系統板搭配燒錄座。檢視需要提取的flash晶片的手冊中,儲存的起始地址,然後寫一個例程,讓主控晶片把flash下這串資料全部讀取下來。(幾十元左右)
填坑:
像這類的微控制器程式並不像路由器韌體那樣的檔案系統可以通過binwalk直接解壓出來,而是需要通過ida之類平臺的對微控制器的彙編指令來反推出原本的程式邏輯,並且可能需要匯入一些支援該框架的指令碼。如果是預設或者錯選框架的話,會導致無法讀取。出現全是db這樣的情況。
由於我不是二進位制選手,所以我對韌體的探索僅到成功提取就截止了。
web層面
抓包:得到傳送地址、分析傳送內容、尋找注入點、cookies利用等
抓包過程中發現了伺服器ip,發現一個明文傳輸的使用者名稱和密碼(這個在後期的收集中經常出現),是個SOAP協議,但是構造注入並未成功。經過跟官方的交流,得知這webservice通過和客戶端進行認證的,但是洩露了也不會造成很大危害,因為他進行了二次加密。這或許也印證了我為什麼構造注入會不成功。
掃描:掃IP、掃二級域名、掃目錄、掃埠。掃到的越多,收集到的資訊越多,可能暴露的漏洞也就越多。可能存在原始碼洩露、上傳漏洞、庫未授權訪問、xss、csrf、ssrf等諸多常見問題。
審程式碼:分析是否存在身份未校驗、越權等漏洞。對於加密傳輸資訊,是否能找到加解密方式。是否存在反序列化、是否存在不合理的處理機制,造成畸形資料注入導致系統崩潰。
測試中發現網頁版APP網站 http://w.memobird.cn/cn/w/login.aspx
Web API列印官方手冊 open.memobird.cn/upload/webapi.pdf
咕咕機官方API原始碼 https://github.com/memobird/gugu-php
Webservice登入網址(用APP賬號登入,但是選項都沒有許可權): http://139.217.205.76/Login.aspx
發現二級域名掃到一個web介面原始碼 http://im.memobird.cn/wse/wsesmart.asmx
發現ip開放了80、3389、11211等埠,但是都沒有找到突破點。
發現原始碼洩露,這個config洩露了APP發包時加解密的演算法、私鑰。
上傳目錄未找到漏洞
APP層面
先在APP漏洞掃描平臺
https://security.tencent.com/index.php/blog/msg/109
上掃描APP中危險函式或配置。
然後嘗試脫殼:安裝安卓環境:可以在夜神模擬器上按xpoesd,也可以去下Android Studio,再下個sdk,搭建脫殼機,目前市場上很多加固APP都可以被脫。
找“摘要”:AndroidManifest.xml中包含了APP的配置、包名、入口。從這裡可以對整個APP框架大概瞭解,其中可以發現adb backup等風險配置。
找“函式”:手機APP的包和APP原始碼更配哦。想找加解密或者WiFi配置,藍芽配置等的原始碼,搜尋相關函式。在APP反編譯的程式碼中找到了寫在裡面的這個使用者名稱密碼和APP加密傳送資料的私鑰
對於二次打包:二次打包對新手較難,主要是簽名認證難以繞過或仿製。未經認證的app在安裝後無法執行。根據反彙編的程式碼,高仿原應用程式難度也較大。直接複製貼上反彙編程式碼,重新打包,會有很多錯誤。而且新包名若與原包相同,是不能被放到應用市場上的。
攻擊思路整理並實現攻擊
傳輸內容嗅探
不管是本地模式還是雲端模式,可做中間人攻擊來截獲列印內容。這裡我是用手機轉代理到電腦上,攔截了資料包。發現傳輸的時間和傳輸的內容都以base64方式進行編碼,並未進行復雜的加密。
左圖是app中的預覽效果。右圖是網站中解碼的效果,圖片還原注意加上頭
如何控制印表機
批量控制印表機
漏洞成因:
1.AK洩露導致越權:在官方公開的API呼叫例項當中,洩露一可用AK。原本進行API列印需要根據流程申請AK,有效AK洩露導致任何人都可以在未申請的情況下,成為了開發者,擁有網上列印許可權.。
下圖是官方API給的列印所需構造的URL及其中包含的引數:
這裡解釋一下各個引數的含義:
memobirdID是裝置編號,雙擊咕咕機時會自動打印出來
useridEntifying在官方開發群中說的是為咕咕號,是在APP中“我的”中檢視到的6位編號
userid是根據APP裡面註冊之後,就會分配一個固定的userid。因為有些使用者註冊了,但是沒有買裝置,所以會造成一些userid並沒有對應的裝置編號,也會存在一個userid對應多個裝置編號的情況。
所以:AK(形同虛設)+時間(形同虛設)+memobirdID + useridEntifying àuserid
2.伺服器校驗機制不完善:官方在要求繫結的時候,輸入的useridEntifying需為咕咕號,文件中卻說使用者自定義。在官方公開的API原始碼(官方放在GitHub了: https://github.com/memobird/gugu-php )當中分析卻是,useridentifying未做任何處理,相當於架空該引數,在有裝置編號的情況下直接返回userid
所以:AK(形同虛設)+ 時間(形同虛設)+memobirdID → userid
因為:memobirdID(16位元組)+userid(1-6位元組不等)→ 列印
memobirdID → userid
考慮:爆破memobirdID → 得到userid
memobirdID + userid → 列印,但memobirdID太長,爆破困難,並且猜測userid可能是遞增,可能是統計使用者量的值。
嘗試:memobirdID ← userid
爆破userid → 得到 memobirdID
memobirdID + userid → 列印
3.加解密方式洩露:
在APP網頁版中,點選列印
我們抓到了一個與userid有關,能返回smartguid( 值=memobirdID )的包
但是不管是傳送還是響應,都是密文。我們要是想爆破簡短的userid,就需要懂得他的加密方式,傳送我們爆破,加密後的userid,他才會返回給我們smartguid。
這時我們之前掃到的那個config就有用了。這裡面是加密演算法
或者在APP中也可發現蛛絲馬跡
加解密分析:
因為:GetSmartCoreByUserID,返回了加密的Smartguid
猜測:parameter應該是加密的userid。
驗證:抓到的包中標黃的目錄檔案是之前洩露的原始碼,這裡面有request發出前的加解密方式,大意是利用時間戳和私鑰進行DES加解密,而且時間戳只精確到秒的十位,個位不參與。在github上找到一個別人寫的py指令碼
解密驗證了猜想。
所以:userid → 加密的Smartguid
嘗試:加密的Smartguid → 明文Smartguid
因為:userid(明)→ ← userid(密)
猜測: Smartguid (明)→ ← Smartguid (密)
嘗試:用與userid相同的解密方式,解密Smartguid,發現失敗。而且respond的時間戳和加密不是一個系統時段上的,估計演算法可能也不一樣了 。
4.列印所需引數可逆推
在點選檢視已繫結的咕咕機的詳情的時候
抓到這樣一個能返回smartguid的明文的包!就是我們期待已久的:加密的Smartguid à明文Smartguid
這是兩個危害比較嚴重的逆推:
明文和密文可以逆推
userid和smartguid逆推
這樣導致所需列印引數通過爆破全部能獲取
漏洞利用:根據導師寫的指令碼(附在github裡),可在網路中爬到眾多印表機,進而控制他們
釣魚控制印表機
安卓API 8以上,備份設定預設開啟。在開發者未經處理的情況下,會導致使用者名稱和密碼直接被備份。當備份到其他裝置上時,該裝置可直接登入被備份人的身份。
當前主流APP認識到此設定風險,紛紛將備份資料設定為需要重新登入才可以恢復。但眾多小眾APP並未意識到,導致隱私嚴重洩露
漏洞利用:
利用思路:在網上找到了一個指令碼可以在電腦上批量檢測手機中開了allowbackup的APP並批量備份。 https://sobug.com/article/detail/16
預計一部手機中三分之一以上的APP可能會被波及。導致此手機中大量賬號及其他敏感資訊洩露。
嘗試:我們學校的APP存在此配置問題,會導致學生身份證,學號等洩露。亦可以嘗試一些租房APP,可能會有更多洩露。下圖是咕咕機APP中備份檔案中暴露的使用者名稱和密碼。
藍芽控制印表機
此漏洞涉及型號為GT1,為純藍芽通訊模式。以下研究全部屬於我導師:
研究目標
上面有對二代的印表機進行分析,發現旗下還有一款三代用藍芽控制的印表機,與二代不通的是三代是無法進行遠端列印的,只能通過手機的藍芽和印表機連結,印表機無法自己連結伺服器,但是可以通過雲端介面將列印的資料傳給手機,然後手機與印表機進行藍芽連結之後印表機自動列印紙條,我們下篇會對對這款印表機進行安全分析。