Web安全入门与靶场实战(31)- 如何查找被设置了suid的文件

时间:2023-02-09 13:04:45

虽然通常不建议我们自己去设置SUID,但有时为了完成某些需求,可能确实需要设置SUID,那么在工作结束后,也应该再把临时设置的SUID给及时去掉,否则的话就容易产生漏洞。

从shentou测试的角度,由于SUID可以用root用户的身份运行指定程序,所以经常被用来提权。但是要想用SUID成功提权,必须要具备前提条件:系统中必须有除了默认设置之外的,其它被设置了SUID的程序,而且这些程序还要具备运行其它程序的功能。因为实现提权的主要方法,就是要设法以root身份去执行/bin/bash这些Shell程序。

已知的可以被用来进行SUID提权的程序主要有:nmap、vim、find、bash、more、less、nano、cp等,所以我们可以重点去查看一下这些程序是否被设置了SUID权限。但是挨个去查看的话,效率太低,所以这里推荐采用搜索的方式去查找系统中所有设置了SUID的程序。

搜索肯定要用到find命令,这是Linux中的一个比较复杂的命令,当然功能也非常强大。find命令之所以复杂,原因之一就是拥有众多选项。我们这里按文件权限查找,需要用到它的-perm选项。

-perm选项的基本用法很简单,格式为“-perm mode”,其中mode为所要匹配的权限。

我们通常见到的权限数字组合都是类似于755或644这种形式,其实完整的权限数字组合应该是四位数,左侧最高位就是用于表示特殊权限。只不过特殊权限并不常用,所以我们平常见到的才主要是三位数字组合。

我们现在要查找的是SUID这种特殊权限,所以要使用的必然是四位数字组合。SUID对应的权限数字是4,特殊权限被放在数字组合左侧最高位,所以mode通常用4000表示。

注意,数字0表示忽略相应位置的权限,也就是说不考虑rwx权限,所以4000就表示查找被设置了SUID权限的文件,至于其它的rwx权限则根本不考虑。

执行“find / -perm -4000”就可以查找出系统中所有被设置了SUID权限的文件。下面所使用的命令中2> /dev/null,表示屏蔽错误信息。因为find命令在执行过程中可能会出现一些错误信息,加上这个功能可以让显示结果更加清晰。

Web安全入门与靶场实战(31)- 如何查找被设置了suid的文件

另外执行“find / -perm -u=s”命令也可以实现同样的效果,“u”代表所有者,“s”代表suid,所以“u=s”同样表示查找所有者被设置了suid权限的文件。

另外再解释一下为什么要在权限4000或u=s之前加上“-”?

  • 如果不加“-”,表示精确匹配,也就是查找的文件权限就是“4000”,除了suid权限之外,其它的rwx权限通通没有,这明显不符合要求。
  • 加“-”表示模糊匹配,此时对于没有指定的权限就不予考虑,所以“4000”就表示不考虑rwx权限。

模糊匹配除了可以使用“-”表示之外,还可以使用“/”,当然它们之间也是有区别的,这里就不再进一步展开说明了。

关于find命令的用法就介绍到这里,我们回来分析一下查找结果。对照之前给出的可以利用的程序列表,除了系统默认的程序之外,很明显被设置了SUID权限的程序正是find。

查看一下find程序文件的权限,发现确实被设置了SUID:

Web安全入门与靶场实战(31)- 如何查找被设置了suid的文件

这也解释了我们之前在用find命令查找系统中的flag文件时,为什么可以将root家目录中的flag文件也查找出来:

Web安全入门与靶场实战(31)- 如何查找被设置了suid的文件

按理说这个操作是无法实现的,因为root家目录默认只有root用户才有rwx权限,当前我们所使用的www-data用户没有任何权限。

Web安全入门与靶场实战(31)- 如何查找被设置了suid的文件

由于这里的find命令被设置了SUID权限,所以任何用户在执行find命令时其实都成为了root。