在上篇文章中,我们找到了靶机中的find命令被设置了SUID权限,那么如何利用find来提权呢?这里需要用到find命令的exec处理动作。
之前说过,find属于Linux中比较复杂的一个命令,主要原因就是它的各种选项和用法太多了,其中exec处理动作就属于find命令的一种比较高级的用法。
所谓的“处理动作”是指我们不仅能用find命令来查找,而且还可以对找到的结果进行进一步的处理,比如删除或复制等。
比如要找出/tmp目录中所有后缀为“.txt”的文件并将其删除,就可以执行下面的命令:
使用exec时在格式上有一些固定要求:
- 在“-exec”的后面要跟上进一步处理所要执行的命令,这里就是去调用执行rm命令。
- 符号“{}”用于表示find命令查找到的结果。
- 在命令的最后必须添加“ \;”表示命令结束(注意前面有个空格)。
再比如要找出/boot目录下所有以“init”开头的文件,并将它们全部复制到/tmp目录中:
如果能理解上面这两条命令,对exec处理动作也就掌握的差不多了。我们继续对靶机进行操作。
因为通过exec可以调用其它命令,而靶机中的find命令又被设置了SUID权限,所以两者结合,我们就可以root身份去调用执行各种命令了。
比如想去查看一下root家目录里的文件,这个操作对于我们当前所使用的www-data用户本来是没有权限的,但是现在通过exec动作去调用ls命令就可以实现:
再继续去查看终极flag的内容:
在上面这两条命令中,都是先用find找到了一些指定的文件,然后再用exec调用其它命令对其进行处理。但其实exec并非只能对find找到的结果进行处理,exec要调用执行的操作也可以跟找到的结果没有任何关系,当然前提是find要查找的文件必须是存在的,否则就会报错。
比如下面的2条命令,分别让find在当前目录下查找a.txt和b.txt,只要文件能找到,那么exec后面调用的命令就可以执行,无论这个命令与要找的文件之间是否有关系。但如果文件找不到,find就会报错,exec后面的命令也就无法执行。
我们的最终目录是利用find来提权。再次回顾一下提权的主要思路:以root身份去执行bash、sh等Shell程序。
所以这里很明显也是要通过exec去调用执行Shell程序,下面的命令就是随便去查找一个在当前目录下存在的文件,保证find命令能正常执行,然后再通过exec去执行sh,从而以root身份打开一个Shell,成功提权。
在上面的命令中,我们运行的是sh,为什么不使用传统的bash呢?这是因为 bash在执行时会自动检测euid(即suid),如果发现euid和uid不匹配,就会将euid强制重置为uid。
所以bash对这种利用suid提权的方式做了安全防御,如果不想使用bash的这种防御机制,可以加上-p选项,这样就不会再覆盖uid了。
至此我们就成功实现了提权,并拿到了终极flag。