find命令

基本格式

find where what

例如在当前目录中查找任意文件和目录
find ./ *

搜索当前目录 yml后缀的文件
find ./ -name "*.yml"

非常有用的几个参数

  • -type 指定类型
  • -name 指定名字
  • -user 指定文件归属于指定用户
  • -size 指定文件大小
  • -perm 指定权限位
  • -exec 用于执行命令
  • 时间戳(具体看下面)

-type

  • -type d 只查找目录
    • find / -type d 查找根目录下的所有目录
  • -type f 只查找文件
    • find / -type f 查找根目录下的所有文件

-name

  • -name 指定搜索文件的姓名
  • --iname -iname 参数与 -name 相同,但是区别在于 -iname 不区分大小写

-name "*.yml"

-name "*.sh"

使用通配符查找文件时要使用双引号括起来。

-size

文件大小单元:

  • b 块
  • c 字节
  • w 字
  • k 千
  • M 兆
  • G 吉

搜索当前目录下大于10KB的文件

1
find ./ -type f -size +10k

搜索当前目录下小于10MB的文件

1
find ./ -type f -size -10M

搜索当前目录下大小为10KB的文件

1
find ./ -type f -size 10k

-user

指定用户名去查找,这在进入目标系统后进行提权后经常的操作。

查找根目录下属于root用户的文件

1
find / -type f -user root

-perm

查找指定权限位的文件,指定权限位可以使用八进制表示

r=4,w=2,x=1

就和修改权限位一样的操作

查找根目录下其他人可读的文件,不考虑所有者

1
find / -type -perm -o=r

查找根目录下usid位权限 -u=s

1
find / -type f -perm -u=s

查找根目录下所有人可读可写可执行的文件

1
find / -type f -perm 777

查找根目录下文件为所属者可读可写,所属组可读,其他人可读的文件

1
find / -type f -perm 644

-time

文件有三种时间戳格式

  • 访问时间,用户最后一次访问时间
    • -atime 天
    • -amin 分钟
  • 修改时间,用户最后一次修改时间
    • -mtime 天
    • -mmin 分钟
  • 变化时间,文件数据元(例如权限等)最后一次修改时间
    • -ctime 天
    • -cmin 分钟
  • 1天内部 -1
  • 1天之前 +1
  • 刚好在一天前 1

搜索七天内被访问过的所有文件

1
find / -type f -atime -7

搜索七天前被访问过的所有文件

1
find / -type f -atime +7

搜索刚好七天前被访问过的所有文件

1
find / -type f -atime 7

分钟同理

-exec

这个参数可以执行一个命令

1
find / -type f -exec whoami \;

需要注意的是,每查找到一个文件,命令就会执行一次。

就像这样
find-exec

我当前的目录下有两个文件,所有whoami这条命令被执行了两次。

所以这条命令也能被用于提权(看情况

-prune -path

-path是指定目录,-prune排除前面所匹配的目录。

意思是当我们不想要find 搜索某个目录的时候用。直接来看区别,没有用上-path和-prune参数的时候,搜索出了875个php文件。用上了只搜索了2个php文件,完全跳过了disk这个文件夹下的php文件。

image-20210517232003797 image-20210517232053497

重要的用法

搜索suid位的文件

1
find / -type f -perm -u=s 2>/dev/null

给所有php文件添加个头

1
2
3
ls *.php|xargs sed -i "1i<?php require_once "/tmp/waf.php";?>"

find /var/www -path /var/www/disk -prune -o -type f -name '*.php'|xargs sed -i "1i<?php require_once "/tmp/waf.php";?>"