Web安全入门与靶场实战(32)- 利用find提权

时间:2023-02-10 11:18:44

在上篇文章中,我们找到了靶机中的find命令被设置了SUID权限,那么如何利用find来提权呢?这里需要用到find命令的exec处理动作。

之前说过,find属于Linux中比较复杂的一个命令,主要原因就是它的各种选项和用法太多了,其中exec处理动作就属于find命令的一种比较高级的用法。

所谓的“处理动作”是指我们不仅能用find命令来查找,而且还可以对找到的结果进行进一步的处理,比如删除或复制等。

比如要找出/tmp目录中所有后缀为“.txt”的文件并将其删除,就可以执行下面的命令:

[root@localhost  ~]# find /tmp -name  "*.txt" -exec rm -f {} \;

使用exec时在格式上有一些固定要求:

  •   在“-exec”的后面要跟上进一步处理所要执行的命令,这里就是去调用执行rm命令。
  •   符号“{}”用于表示find命令查找到的结果。
  •   在命令的最后必须添加“ \;”表示命令结束(注意前面有个空格)。

再比如要找出/boot目录下所有以“init”开头的文件,并将它们全部复制到/tmp目录中:

[root@localhost  ~]# find /boot -name  "init*" -exec cp {} /tmp \;

如果能理解上面这两条命令,对exec处理动作也就掌握的差不多了。我们继续对靶机进行操作。

因为通过exec可以调用其它命令,而靶机中的find命令又被设置了SUID权限,所以两者结合,我们就可以root身份去调用执行各种命令了。

比如想去查看一下root家目录里的文件,这个操作对于我们当前所使用的www-data用户本来是没有权限的,但是现在通过exec动作去调用ls命令就可以实现:

Web安全入门与靶场实战(32)-  利用find提权

再继续去查看终极flag的内容:

Web安全入门与靶场实战(32)-  利用find提权

在上面这两条命令中,都是先用find找到了一些指定的文件,然后再用exec调用其它命令对其进行处理。但其实exec并非只能对find找到的结果进行处理,exec要调用执行的操作也可以跟找到的结果没有任何关系,当然前提是find要查找的文件必须是存在的,否则就会报错。

比如下面的2条命令,分别让find在当前目录下查找a.txt和b.txt,只要文件能找到,那么exec后面调用的命令就可以执行,无论这个命令与要找的文件之间是否有关系。但如果文件找不到,find就会报错,exec后面的命令也就无法执行。

Web安全入门与靶场实战(32)-  利用find提权

我们的最终目录是利用find来提权。再次回顾一下提权的主要思路:以root身份去执行bash、sh等Shell程序。

所以这里很明显也是要通过exec去调用执行Shell程序,下面的命令就是随便去查找一个在当前目录下存在的文件,保证find命令能正常执行,然后再通过exec去执行sh,从而以root身份打开一个Shell,成功提权。

Web安全入门与靶场实战(32)-  利用find提权

在上面的命令中,我们运行的是sh,为什么不使用传统的bash呢?这是因为 bash在执行时会自动检测euid(即suid),如果发现euid和uid不匹配,就会将euid强制重置为uid。

所以bash对这种利用suid提权的方式做了安全防御,如果不想使用bash的这种防御机制,可以加上-p选项,这样就不会再覆盖uid了。

Web安全入门与靶场实战(32)-  利用find提权

至此我们就成功实现了提权,并拿到了终极flag。