我知道这个问题特别提到了Linux,但由于它是Google上的第一个结果,我只是想补充一下我想找的答案(比如说,如果你和我一样,被雇主强迫使用非GNU/Linux系统的话)。
我有另一种方法,以防你真正想要的只是对可执行文件做一些事情—-而不一定要实际强迫find过滤自己:
for i in `find -type f`; do [-x $i] && echo "$i is executable"; done
我更喜欢这个方法,因为它不依赖于-executable
,因为它不依赖于-perm
,因为它有点玄乎,有点平台的特殊性,而且像上面写的那样,要求文件对每个人(不只是你)都是可执行的。
这个-type f
很重要,因为在*nix中,目录必须是可执行的才能被遍历,而find
命令中的查询越多,你的命令的内存效率就越高。
标有可执行文件的文件不需要是可执行或可加载的文件或对象。
作为一个单行本的粉丝…..
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
使用'xargs'来获取find命令的输出(使用print0来确保带空格的文件名被正确处理)。我们现在有了一个可执行的文件列表,我们把它们逐一提供给'file'命令的参数。然后用grep来忽略二进制文件。请在find命令中用你喜欢的样式(见前面的答案)或你的'NIX操作系统
我要求用上面的方法来查找root用户所拥有的脚本中带有eval的文件,所以创建了下面的命令来帮助查找root用户运行带有不安全参数的脚本的priv escalation弱点…..
echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
我今晚在~/.bashrc
中创建了一个功能来查找不在系统路径和目录中的可执行文件:
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
。