目录
- 概述
- 常用命令
- file-探测给定文件的类型
- 选项
- 常用选项组合
- stat-查看文件信息
- find-不止查找文件
- 选项
- 测试
- 操作
- 常用选项
- locate-比find好用的查找命令
- 选项
- 常用选项组合
- chmod-修改文件权限
- suid
- sbit
- chown、chgrp 修改文件所有者/所在组
- umask-显示或设置创建文件的权限掩码
- 常用选项
- chattr-root也无法修改文件,防篡改
- 选项
- setfacl-设置文件访问控制列表,比chmod更细
- 选项
- getfacl-查看文件访问控制列表
- 选项
- diff-比较文件,找出不同
- 选项
- 应急常看目录
- /proc-进程排查
- /etc/-配置排查
- passwd-用户密码(密码隐藏)
- shadow-密码
- gshadow-组的shadow
- systemd-自启动系统服务
- sudoers、sudoers.d-sudo配置
- resolv.conf-dns服务器配置
- hosts-域名ip映射
- crontab、cron.d/*、cron.*/*-定时任务配置
- hosts.deny、hosts.allow-对本机访问黑白名单
- environment、profile、bashrc-环境变量
- apt/sources.list、apt/source.d-Debian系仓库源
- yum.repos.d/-RHEL系仓库源
- /var/log/-日志排查
- audit/audit.log-系统日志
- cron-计划任务执行记录
- maillog-邮件系统日志
- messages-常见系统和服务错误信息
- secure-系统安全日志,输入账户信息后登录情况
- lastlog、btmp、wtmp、utmp-登录日志
- dmesg-内核日志
- boot-启动日志
- /var/spool/cron-定时任务排查
- 参考
概述
本文介绍一下主机安全中目录、文件相关的命令,一些常用命令不详细介绍,仅仅列出,主要介绍的是安全相关的命令,方便做排查和防御。最后列出应急常看的目录。
常用命令
- 查看:cd、pwd、cat、more、less、head、tail、grep、du、df
- 修改:mkdir、cp、mv、touch、tar、zip、unzip
- 删除:rmdir、rm
file-探测给定文件的类型
选项
常用选项组合
file 直接后面加文件
-i 来查看MIME类型
-L 跟随链接
stat-查看文件信息
Access:atime,文件最后访问时间
Modify:mtime,文件最后修改时间
Change: ctime,文件最后状态(元数据,如所有者、位置、权限)改变时间
字段解释如下:
- umask.txt:文件名或路径名,这里是文件名 umask.txt。
- 0:设备编号(major device number),通常用于块设备或字符设备。
- 0:inode号码,标识文件在文件系统中的唯一索引节点号。
- 81a0:文件类型和权限标志,以八进制表示。在这里,81a0表示文件是普通文件,且具有特定的权限设置。
- 0:硬链接数目,即指向同一索引节点的硬链接数量。
- 0:文件所有者的用户ID(UID)。
- fd01:文件所有者的组ID(GID)。
- 394950:文件大小,以字节为单位。
- 1:文件分配的块数,通常以 512 字节块为单位。
- 0:文件存储在设备上的设备号码(device number),通常是磁盘分区的标识。
- 1722245293:文件的最后访问时间(atime),UNIX时间戳格式,表示从1970年1月1日开始经过的秒数。
- 1722245293:文件的最后修改时间(mtime),UNIX时间戳格式。
- 1722245974:文件的最后状态改变时间(ctime),UNIX时间戳格式。
- 0:block size,块大小,通常为文件系统的块大小。
- 4096:文件系统IO块大小。
find-不止查找文件
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
path默认当前目录,expression默认-print
find 命令远比你想象的还要强大,后续suid提权时还会用到。
选项
主要是测试、操作、全局、位置选项,这里仅看两个。
测试
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-executable 匹配当前用户可执行的文件和可搜索的目录。
-false:将find指令的回传值皆设为False;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-iwholename 模式参见`-ipath`。此选项的可移植性较`-ipath`差。
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-lname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-newerXY<引用>:如果正在考虑的文件的时间戳 X 比文件引用的时间戳 Y 更新则成功。
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-readable:匹配当前用户可读的文件
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-samefile 名称 文件与名称指向相同的 inode。
-size<文件大小>:查找符合指定的文件大小的文件;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-writable:匹配当前用户可写入的文件。
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
-context<表达式>:仅限 SELinux。文件的安全上下文与全局模式匹配
操作
-delete 删除文件或目录。
-exec 执行命令
-execdir 在包含匹配文件的子目录中执行命令
-ok 执行命令前询问用户
-okdir 在包含匹配文件的子目录中执行命令前询问用户
-fls 创建文件并将结果写入文件
-fprint 将完整文件名打印到指定文件中
常用选项
查找目录下指定名称的文件
find . -name "*.txt" -o -name "*.pdf"
匹配路径或文件
find /usr/ -path "*local*" | head -n 5
查询指定类型文件
find . -type f
参数列表:
- f 普通文件
- l 符号连接
- d 目录
- c 字符设备
- b 块设备
- s 套接字
- p Fifo
深度限制
find . -maxdepth 3 -type f
根据时间查找
find . -type f -atime -7
- 访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
根据文件大小查找
查到大于10k的文件
find . -type f -size +10k
- b —— 块(512字节)
- c —— 字节
- w —— 字(2字节)
- k —— 千字节
- M —— 兆字节
- G —— 吉字节
根据权限查找
find . -type f -perm 644
找出当前目录用户lady_killer拥有的所有文件
find . -type f -user lady_killer
否定参数
通过!来否定后面的参数,找出当前目录用户lady_killer拥有的所有文件,并且权限不是644
find . -type f -user lady_killer ! -perm 644
对找到的文件执行命令
对找到的文件,查看下前两行
find . -type f -user lady_killer ! -perm 644 -exec head -n 2 {} \;
locate-比find好用的查找命令
存在数据库里面,主打一个快
选项
常用选项组合
locate 查找相关文件
-i 忽略大小写
-r 正则匹配
chmod-修改文件权限
之前学linux基础时讲过,参考:kali-chmod修改权限
补充一下特殊权限:
- suid:文件所有者权限执行
- sgid:文件所属组权限执行
- sbit:对目录来说,只有创建者和root能够重命名目录或删除这个目录下的文件或子目录
suid
给find添加suid权限
chmod u+s find
之后可以利用find在执行时或使用root权限来提权
find . -name suid.txt -exec cat /etc/shadow \;
可以看到lady_killer用户没有查看/etc/shadow的权限,通过find可以提权查看
可以用以下命令查找设置suid权限的二进制文件
find / -type f -perm /4000
sbit
一般tmp目录会设置Sticky Bit(粘着位)
chown、chgrp 修改文件所有者/所在组
参考:kali-chown修改文件所有者/所在组
umask-显示或设置创建文件的权限掩码
umask一般是0022或0002,目录就是减去对应权限,文件的话再去掉执行
0022 的作用:022 的八进制表示为 000010010,它表示在默认权限中关闭了组和其他用户的写权限。因此,新文件的默认权限将会是 rw-r–r–,新目录的默认权限是 rwxr-xr-x。
0002 的作用:002 的八进制表示为 000000010,它只关闭了其他用户的写权限。因此,新文件的默认权限将会是 rw-rw-r–,新目录的默认权限是 rwxrwxr-x。
常用选项
-p 查看当前掩码
直接加掩码是修改,-S是以符号的方式查看
chattr-root也无法修改文件,防篡改
选项
a:让文件或目录仅供附加用途;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
chattr +i umask.txt
通过这个命令可以保护目录或文件不可修改,在应急过程中可以设置。
setfacl-设置文件访问控制列表,比chmod更细
选项
-m, --modify=acl: 修改文件的当前 ACL(s)
-M, --modify-file=file: 从文件中读取要修改的 ACL 条目
-x, --remove=acl: 从文件的 ACL(s) 中移除条目
-X, --remove-file=file: 从文件中读取要移除的 ACL 条目
-b, --remove-all: 移除所有扩展 ACL 条目
-k, --remove-default: 移除默认 ACL
–set=acl: 设置文件的 ACL(s),替换当前 ACL
–set-file=file: 从文件中读取要设置的 ACL 条目
–mask: 重新计算有效权限掩码
-n, --no-mask: 不重新计算有效权限掩码
–restore=file: 恢复 ACL(与 getfacl -R 的相反操作)
–test: 测试模式(不修改 ACL)
-v, --version: 打印版本信息并退出
-h, --help: 显示帮助文本
- 选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。
- 选项–set和–set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
- 选项-m(–modify)和-M(–modify-file)选项修改文件或目录的acl规则。
- 选项-x(–remove)和-X(–remove-file)选项删除acl规则。
setfacl命令可以识别以下的规则格式:
[d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。
[d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定)
[d[efault]:] m[ask][:] [:perms] 有效权限掩码
[d[efault]:] o[ther] [:perms] 其他的权限
在文件permission的最后多了一个+号,当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。
getfacl-查看文件访问控制列表
选项
-a, --access: 仅显示文件访问控制列表
-d, --default: 仅显示默认访问控制列表
-c, --omit-header: 不显示注释头部
-e, --all-effective: 显示所有有效权限
-E, --no-effective: 不显示任何有效权限
-s, --skip-base: 跳过只有基本条目的文件
-R, --recursive: 递归进入子目录
-L, --logical: 逻辑遍历,跟随符号链接
-P, --physical: 物理遍历,不跟随符号链接
-t, --tabular: 使用表格式输出
-n, --numeric: 打印数值用户/组标识符
-p, --absolute-names: 在路径名中不去掉前导的 ‘/’
-v, --version: 打印版本信息并退出
-h, --help: 显示帮助文本
一般直接加文件就行了
getfacl ./suid.txt
diff-比较文件,找出不同
选项
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
-a或--text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或--minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或--ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或--paginate:将结果交由pr程序来分页;
-n或--rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-r或--recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或--version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--help:显示帮助;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。
直接比较两个文件
diff /etc/shadow /etc/shadow-
可以看到增加了test用户
上下文形式
diff -c /etc/shadow /etc/shadow-
diff -u /etc/shadow /etc/shadow-
应急常看目录
/proc-进程排查
pid目录
cmdline 执行的命令
cwd 启动进程时所处的目录
exe 进程依赖的软链接
environ 运行时的环境变量
fd 进程申请的所有文件描述符,包括普通文件,标准输入输出,管道,socket。
/etc/-配置排查
passwd-用户密码(密码隐藏)
cat /etc/passwd
- root: 这是用户名,表示这是一个超级用户(root用户)的账号。在Unix和类Unix系统中,root是拥有系统上所有权限的特殊用户。
- x: 这里通常是密码占位符。在过去,密码的加密形式存储在这里,但现代系统通常使用 /etc/shadow 文件来存储密码信息,而不是在 /etc/passwd 中存储。
- 0: 这是用户ID(UID),也称为数字用户ID(UID)。在Unix系统中,root用户的UID通常为0。
- 0: 这是组ID(GID),也称为数字组ID(GID)。在Unix系统中,root用户通常属于组ID为0的组,即超级用户组(通常称为root组)。
- root: 这是用户的真实姓名或描述。
- /root: 这是用户的家目录路径。对于root用户来说,通常是/root。
- /bin/bash: 这是用户的默认shell程序。当root用户登录时,默认使用Bash作为交互式shell。
passwd- passwd最后一次修改前的备份
diff passwd passwd-
shadow-密码
cat /etc/shadow
-
root: 这是用户名,对应于 /etc/passwd 文件中的root用户。
-
$1$1AkgnRsNo$ngnWLhF8j5g4mZ6k1ZjAs/: 这部分是加密后的密码。在这个例子中,密码的加密形式是使用MD5算法加密的。具体来说:
- 1 1 1 表示使用MD5算法进行加密。
- AkgnRsNo 是所用盐(salt)的一部分,用于增加密码的随机性和安全性。
- ngnWLhF8j5g4mZ6k1ZjAs/ 是经过MD5加密后的密码。
实际的密码是经过盐和MD5算法处理后的结果,而不是直接可读的密码。
-
19911: 这是密码最后修改日期(Epoch时间戳),表示自1970年1月1日以来的天数。这个字段指示密码最后一次被更改的时间。
-
0: 这是密码需要重新更改的最短天数。如果为0,则表示没有最短时间限制。
-
99999: 这是密码有效期的最长天数。在这个例子中,密码有效期为99999天,表示密码在不被强制修改的情况下可以使用很长时间。
-
7: 这是密码到期前的警告天数。当密码到期前的天数少于等于7天时,系统会开始发送警告通知用户密码即将过期。
-
空字段: 这些是未使用的字段,以前的Unix版本可能会在这些位置存储一些额外的信息,但在现代系统中通常是空的。
shadow- shadow最后一次修改前的备份
diff shadow shadow-
gshadow-组的shadow
同上,不再展示
systemd-自启动系统服务
system下是系统级自启服务
sudoers、sudoers.d-sudo配置
cat /etc/sudoers
用户规则
user host=(runas) command
- root: 这是指定的用户或用户组。在这种情况下,指定了用户 root,也就是系统的超级用户。
- ALL: 第一个 ALL 表示允许 root 用户在任何主机执行命令。这意味着 root 可以在任何主机上使用 sudo 执行命令,而不仅仅是本地主机。
- (ALL): 第二个 ALL 表示允许 root 用户作为任何用户(即任何目标用户)执行命令。这允许 root 用户以系统上的任何其他用户的身份运行命令,而不仅仅是自己的身份。
- ALL: 第三个 ALL 表示允许 root 用户在任何终端(任何终端设备)上执行命令。这表示 root 用户可以通过任何终端登录并使用 sudo。
组规则
%group host=(runas) command
- %wheel:wheel组
- NOPASSWD:sudo时不需要密码
resolv.conf-dns服务器配置
攻击者可能篡改这个dns服务器配置来劫持流量
cat /etc/resolv.conf
hosts-域名ip映射
域名解析ip,优先级更高
cat /etc/hosts
crontab、cron.d/、cron./*-定时任务配置
crontab在应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)中说过了
- cron.deny 该文件中所列用户不允许使用crontab命令
- cron.allow 该文件中所列用户允许使用crontab命令(可能没有此文件)
- cron.hourly 每小时执行
- cron.daily 每天执行
- cron.weekly 每周执行
- cron.monthly 每月执行
除了这个系统定时任务,后面还有用户自定义的。
hosts.deny、hosts.allow-对本机访问黑白名单
environment、profile、bashrc-环境变量
- /etc/environment:在系统启动时加载,设置全局环境变量。
- /etc/profile 是系统级的配置文件,它对系统上所有用户都有效。在用户登录时被读取。
- ~/.profile 是用户级的配置文件,对每个用户来说都可以单独配置。在用户登录时被读取。
这些文件通常用于设置全局的环境变量和执行与用户环境相关的初始化脚本。 - ~/.bash_profile:用于Bash shell的登录shell配置文件,类似于 .profile,但仅在登录时加载一次。
- .bashrc 是Bash shell的配置文件,用于每个用户的交互式非登录shell。这意味着它在用户每次新开一个终端窗口时都会加载,但不会在用户登录时加载。通常位于用户的家目录下,路径为 ~/.bashrc。
.bashrc 文件用于定义个性化的shell行为、别名、函数以及其他与交互式shell相关的配置。 - ~/.bash_login:另一个Bash shell的登录shell配置文件,类似于 .bash_profile,在登录时加载一次。
- ~/.bash_logout:Bash shell的登录shell退出时加载的脚本,用于清理和设置环境。
cat /etc/profile
apt/sources.list、apt/source.d-Debian系仓库源
yum.repos.d/-RHEL系仓库源
/var/log/-日志排查
audit/audit.log-系统日志
audit.log 中记录了许多系统事件,包括:
- 用户登录和退出的信息。
- 文件和目录的创建、删除、修改等操作。
- 系统调用的执行情况。
- 网络活动,如连接和断开。
- 权限更改,如用户切换到超级用户(su)的记录。
cron-计划任务执行记录
tail -n 10 /var/log/cron
maillog-邮件系统日志
cat /var/log/maillog
messages-常见系统和服务错误信息
tail -n 10 /var/log/messages
secure-系统安全日志,输入账户信息后登录情况
tail -n 10 /var/log/secure
常用于SSH爆破排查
lastlog、btmp、wtmp、utmp-登录日志
使用lastlog、lastb、last、who命令来查看,直接查看文件存在乱码等不方便的情况。
dmesg-内核日志
tail -n 30 dmesg
boot-启动日志
tail -n 10 boot.log
/var/spool/cron-定时任务排查
根据用户来查看
cat /var/spool/cron/root
这里以lady_killer用户为例
其他排查命令学习:
应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇
参考
《网络安全应急响应技术实战指南》
/var/log下日志文件详解
linux提权大赏