首页 > 代码库 > Root-Me之App-Script类型题解

Root-Me之App-Script类型题解

App-Script是Root-Me第一类型的题目,共有六道,该类型题目的说明是“These challenges will help you understand scripting vulnerabilities(这些题目可以帮助你理解脚本漏洞)”。下文笔者将一一介绍此六道题目及其解题思路,但不会给出其中所用到的工具名称/链接以及相应的FLAG。

一、文件——弱权限(File – Weak permissions)

该题仅提供了题目需要的SSH连接信息,事实上Root-Me中几乎所有的App类型题目都仅提供连接信息,关于此点下文不再复述。通过SSH连接到相应的虚拟机系统,通过“ls -al”命令可以看到两个文件:

-r--r-----  1 shell1        shell1          78 Jun  1  2013 .netrc
-r--r-----  1 shell1cracked shell1cracked   18 Feb  6  2012 .passwd

本题的FLAG即在.passwd文件中,同样,Root-Me中的App类型题目的FLAG几乎都存在于.passwd文件中。而因为是以shell1用户连接,所以直接访问.passwd文件内容是不可行的,从文件权限及用户/用户组分配可见,当前登陆的用户无法对.passwd做任何操作。所以解决该题就只能操作.netrc文件了,因此该题的例外之处就在于获取FLAG并非通过直接或间接操作.passwd。

二、文件——不安全存储1(File – Insecure storage 1)

该题的说明是“Mozilla Firefox 14”,因此是和火狐浏览器相关,通过连接访问题目目录文件,可看到一个火狐浏览器用户数据目录:

dr-xr-x--x   4   shell2   shell2   4096   Feb  6  2012   .mozilla

所以该题的目的在于拿到火狐浏览器下不安全的密码存储,关于浏览器的密码存储安全问题可以参考IDF实验室翻译的文章《浏览器是如何存储密码的》,从中可以了解到,火狐浏览器在存储用户密码时经过了加盐和多重加密,而其最关键的在于主密码(Master Password)的设置(许多火狐用户并不知道或不在意主密码的设置,但设置与否的存储安全性有天壤之别)。同样,在本题的用户存储目录下,可以找到火狐浏览器存储密码的两个文件:key3.db和signons.sqlite。很多人通过Sqlite数据库访问工具访问signons.sqlite,看到有BASE64编码字符串便以为胜利在望,实际上该字符串仅仅是加密后数据的BASE64编码。

firefox password store所以,该题有两种思路解决,一种较为直观有效、简单暴力的方式是直接拷贝用户目录下的“.mozilla”目录至个人的火狐浏览器用户数据目录,并做替换,然后重启火狐浏览器查看密码存储,另一种方式则显得稍微有点技术含量,即搜索火狐密码文件(key3.db和signons.sqlite)破解工具进行破解。

三、文件——不安全存储2(File – Insecure storage 2)

该题的说明是“Virtual Network Computing”,但与上题的解题思路是类似的,并借鉴了第一道题的出题方式进行了干扰,在题目根目录下仅有两个文件:

-r--r-----  1 shell3cracked shell3cracked    9 Feb  6  2012 .passwd
dr-xr-x--x  2 shell3        shell3        4096 Oct 30  2010 .vnc

根据第一道题的思路,这里的.passwd文件只是一个干扰因素,不必在意。重点在.vnc目录,既然名字为vnc,则必然和vnc相关,因此采用第二题的解体思路,解决方式同样有两种:要么搜索vnc密码破解工具进行破解,要么覆盖自有vnc的配置文件。实际上,GitHub就有开源的破解程序。

四、Bash – cron

这是一道令人纠结的题目,题目说明只有一个词——“Crontab”,显然是与Linux任务计划相关的题目。在题目目录下有两个文件和一个软连接:

-r--r-----  1 shell4cracked shell4cracked   16 Jun  1  2013 .passwd
lrwxrwxrwx  1 shell4        shell4          11 Jun  1  2013 cron.d -> /tmp/._cron
-r-xr-x---  1 shell4cracked shell4         579 Nov 17 00:02 shell4

在以shell4用户登陆的情况下,仅可以进行的操作就是软连接和shell4文件,因此读取shell4文件,可以看到bash脚本,脚本内容不便给出,其意是没五分钟执行一次cron.d目录下的所有任务,执行后再删除该目录下的所有文件。而cron.d作为软连接当前登陆用户是可以进行任何操作的,所以该题的解决思路也就一目了然——写个脚本读取.passwd文件。

因为有五分钟的定时执行限制,所以要五分钟的耐心等待……

五、Python – input()

该题的说明是“Feed the python!”,大意就是要对python进行注入、输入之类。而目标是通过利用Python脚本的漏洞获取到.passwd文件的内容,即FLAG。SSH连接后可以看到题目根目录下的文件:

-r--r-----  1 shell6cracked shell6cracked   33 May 20  2014 .passwd
-r-sr-x--x  1 shell6cracked shell6        7170 May 21  2014 setuid-wrapper
-r--r-----  1 shell6        shell6         129 May 21  2014 setuid-wrapper.c
-r-xr-x--x  1 shell6        shell6         365 Jun 12 14:46 shell6.py

可以看到只有shell6cracked用户及用户组可以读取.passwd文件,而这些文件中只有setuid-wrapper程序拥有该用户权限,所以基本的思路是通过setuid-wrapper程序的用户权限读取.passwd文件。幸好setuid-wrapper是有源码的,所以一一查看仅能查看的两个文件setuid-wrapper.c和shell6.py,可知前者是通过system()调用shell6.py,而后者是通过读取.passwd文件内容与输入的密码做对比,如果一致则打印一句“Well done ! You can validate with this password !”,否则会打印“Try again ;-)”。

如此,解题的思路就清晰了,即通过setuid-wrapper程序的执行调用shell6.py读取.passwd文件内容,漏洞就在shell6.py的比较语句中,由于未将用户输入做处理直接进行比较,因此存在一个注入漏洞,那么只需要构建一句python的注入语句作为setuid-wrapper执行后的输入即可。

之所以不能直接执行shell6.py进行注入,是因为shell6.py自身的用户权限并不足以读取.passwd,所以需要将setuid-wrapper作为外壳程序进行间接调用:Linux下的父子进程除了PID不同之外,其他部分都由子进程继承,包括用户权限。

六、Python – pickle

该题的描述是“Home-Made HTTP service(自作HTTP服务)”,要求以管理员身份登陆并获取.passwd文件内容。查看题目根目录下的文件:

-rwxr-x---  1 shell5cracked shell5cracked   83 May 19  2013 ._run
-r-xr-x--x  1 shell5cracked shell5cracked   17 Mar  7  2013 .passwd
-r--r-----  1 shell5        shell5         138 Nov 18  2012 README
-r-x--x---  1 shell5cracked shell5        4763 Jun  1 17:11 shell5

作为shell5用户登陆,仅可以读取README文件和执行shell5文件,查看README文件可知自作的HTTP服务端口是56025(Root-Me作为法国站点,其内容都会以法文撰写,多数有英文版本,该文件即是纯粹的两句法语,所以需要Google翻译)。执行shell5文件则会报错,所以只能从端口是56025的HTTP服务入手,可以通过curl,也可以通过telnet,也可以自己写程序访问。

根据HTTP请求格式,在连接本地56025端口后可以按常规输入类似“GET / HTTP/1.1”这样的内容,但很不幸的是服务响应会失败,并提醒错误所在。根据提醒可知是需要进行HTTP身份验证,HTTP身份验证分为基本验证和摘要验证,其中基本验证需要输入用户名和BASE64编码的“用户名:密码”格式字符串,摘要验证则更为复杂一些。

先用基本验证进行尝试,响应依然会失败,并提示错误,如此根据一次一次尝试所得到的错误提示可确定正确的HTTP请求格式。既然题目是与python的pickle相关,自然需要先了解pickle的作用,所以该题与上题一样,都是需要利用注入漏洞,只是注入的方式不同。所以最终的解题思路依然是构建python语句进行注入,只不过根据HTTP服务请求格式要求,需要进行BASE64编码罢了。

漏网之余


在Linux下,以“.”起始命名文件可以起到隐藏文件的作用,常规的“ls”命令并无法直接看到此类文件,因此也常常用作数据/文件隐藏的手段,但通过添加“-a”选项即可使其原形毕露。与之类似的另外一种隐藏目录的方式是创建以“.”或“..”开头,空格为名的目录,比如“mkdir ‘. ‘”,这样即便执行“ls -a”命令,从视觉上也往往容易与Linux目录下的“.”或者“..”目录混淆,甚至忽视。

(全文完)

Root-Me之App-Script类型题解