一 背景
曾经在相当长的一段时间内认为抓包就必须是root用户,直到后面了解到了setsid和capability,这篇文章算是个总结。
二 特殊权限位
2.1 SET位权限
在linux中,有些命令,比如passwd
修改密码命令,本身是属于root用户的,执行的时候需要操作只有root才可以操作的文件或使用的资源,那普通用户怎么办?这就是SET权限位的作用,即“没有取得特权用户要完成一项必须要有特权才可以执行的任务”,比较绕的一句话,passwd
修改密码,本身的执行过程是需要特权的,但是我们只是普通用户,却需要使用这个命令来完成修改密码的功能,解决办法就是设置SET位权限。
先看下passwd命令,如下:
ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27856 Aug 9 2019 /usr/bin/passwd
注意到权限位中的小s了吗?说明passwd这个可执行文件设置了SET权限位。执行文件设置了SUID或SGUID后,任何用户执行该文件,就将获取该执行文件属主,或属主组对应的身份执行。
suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。sgid(set Group ID,set GID)意思也是一样,只是把上面的进程拥有者改成进程组就好了。
命令如下:
chmod u+s filename #设置setuid位 等同chmod 4777 filename 777表示ugo的权限
chmod u-s filename # 去掉setuid位 等同chmod 0777 filename 777表示ugo的权限
chmod g+s filename #设置sgid位 也可以chmod 2777 filename 777表示ugo的权限
chmod g-s filename #去掉sgid位 也可以chmod 0777 filename 777表示ugo的权限
在ls -al
下会有如下的显示:
-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限
-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限
-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限
-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
GID设置
去掉UID和GID
2.2 粘滞位权限
粘滞位权限即sticky,目录设置粘滞位权限位后,即使用户对这个目录具有写的权限,但是仍然不能删除这个目录里面其他用户创建的文件,当然root用户可以删除任何目录。适用场景就是我们常见到的/tmp
目录,这个目录需要任何用户都可以进行写日志,但是每个用户又只能删除自己用户下的日志,不能删除其他用户的日志。
注意到,设置粘滞位的目录,最后一位从x变成了t。命令如下:
chmod +t dirname #即可设置 粘滞位
chmod -t dirname #即可以去掉粘滞位设置
用四位八进制来表示粘滞位的话,第一位为1表示粘滞位。遵循12位权限表示法:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
S表示SUID权限;G表示GUID权限;T表示Ticky即粘滞位权限。可以对照下面的权限理解下:
-rwsr-sr-x 的值为:1 1 0 1 1 1 1 0 1 1 0 1
2.3 其他特殊权限
在一些场景下,比如你的linux机器中病毒了,有时候病毒文件竟然无法用root用户删除,这时候要看下是否有i属性,查看办法:
lsattr filename #查看是否有i属性
chattr +i filename #添加i属性
chattr -i filename #去掉i属性
i属性,设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。只有root用户可以添加i属性,非root用户不能添加i属性。
有时候我们希望可以追加,但是无法删除,这时候可以用a属性,演示如下:
chattr +a filename #添加a属性
chattr -a filename #删除a属性
演示如下
2.4 抓包设置SET权限
如果我们用普通用户执行tcpdump,由于程序执行需要的权限普通用户不具备,所以报错,如下:
执行如下权限:
chmod u+s /usr/sbin/tcpdump
再运行抓包程序,正常了:
三 capability 是什么
上面看,好像已经解决了抓包问题,干嘛还需要capability,这是什么东东?首先SET位设置权限比较粗,如果万一被设置SET位权限的程序有安全漏洞,就有很大的风险。根本原因在于没有把root的权限细分。linux的2.2内核增加了capability,可以对权限进行细分。 例如:能力CAP_SYS_MODULE表示用户能够加载(或卸载)内核模块的特权操作。我们可以根据程序的需要,通过root用户赋予程序相应的权限。
比如我们刚才可以给tcpdump程序赋予抓包需要的权限:
setcap cap_net_admin,cap_net_raw=eip /usr/sbin/tcpdump
这样设置后,我们没有设置set位,tcpdump普通用户仍然可以使用它来进行抓包:
具体权限可以参考:
CAP_CHOWN:修改文件属主的权限
CAP_DAC_OVERRIDE:忽略文件的DAC访问限制
CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制
CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制
CAP_FSETID:允许设置文件的setuid位
CAP_KILL:允许对不属于自己的进程发送信号
CAP_SETGID:允许改变进程的组ID
CAP_SETUID:允许改变进程的用户ID
CAP_SETPCAP:允许向其他进程转移能力以及删除其他进程的能力
CAP_LINUX_IMMUTABLE:允许修改文件的IMMUTABLE和APPEND属性标志
CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口
CAP_NET_BROADCAST:允许网络广播和多播访问
CAP_NET_ADMIN:允许执行网络管理任务
CAP_NET_RAW:允许使用原始套接字
CAP_IPC_LOCK:允许锁定共享内存片段
CAP_IPC_OWNER:忽略IPC所有权检查
CAP_SYS_MODULE:允许插入和删除内核模块
CAP_SYS_RAWIO:允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备
CAP_SYS_CHROOT:允许使用chroot()系统调用
CAP_SYS_PTRACE:允许跟踪任何进程
CAP_SYS_PACCT:允许执行进程的BSD式审计
CAP_SYS_ADMIN:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT:允许重新启动系统
CAP_SYS_NICE:允许提升优先级及设置其他进程的优先级
CAP_SYS_RESOURCE:忽略资源限制
CAP_SYS_TIME:允许改变系统时钟
CAP_SYS_TTY_CONFIG:允许配置TTY设备
CAP_MKNOD:允许使用mknod()系统调用
CAP_LEASE:允许修改文件锁的FL_LEASE标志
后面的=eip
表示可继承的,准许的和有效的,可以看下英文解释:
http://www.andy-pearce.com/blog/posts/2013/Mar/file-capabilities-in-linux/