用linux的capabilities机制替换系统中的所有setuid/gid程序

如题,
首先写个小脚本找出系统中所有的setuid/git程序

#!/bin/bash

path=$(echo $PATH | tr ':' '\n')

for i in $path ; do
    echo $i
    cd $i
    file=$(ls)
    for j in $file ; do
        quanxian=$(ls -l $j | cut -d' ' -f 1)
        echo $quanxian | grep s > /dev/null
        if  $? == '0' ] ; then
            echo $j : $quanxian
        fi
    done
done

程序输入如下:
exim4 : -rwsr-xr-x
pppd : -rwsr-xr–
at : -rwsr-sr-x
bsd-write : -rwxr-sr-x
chage : -rwxr-sr-x
chfn : -rwsr-xr-x
chsh : -rwsr-xr-x
crontab : -rwxr-sr-x
dotlockfile : -rwxr-sr-x
expiry : -rwxr-sr-x
gpasswd : -rwsr-xr-x
newgrp : -rwsr-xr-x
passwd : -rwsr-xr-x
pkexec : -rwsr-xr-x
ssh-agent : -rwxr-sr-x
sudo : -rwsr-xr-x
wall : -rwxr-sr-x
X : -rwsr-sr-x
unix_chkpwd : -rwxr-sr-x
fusermount : -rwsr-xr-x
mount : -rwsr-xr-x
ntfs-3g : -rwsr-xr-x
su : -rwsr-xr-x
umount : -rwsr-xr-x

以上是系统中所有的setuid/gid程序,不过不是以上所有的程序都能用capabilities来替换的,su和sudo就不可以,因为这两个程序的功能是进行验证并且使普通用户提权到root。

1 个赞

接下来的任务是找出以上各个程序所需要的特定能力,这个比较复杂,需要一定的技巧才能准确达到目的

本来打算用 Kprobe 做个内核探针来检测某个程序在运行时请求检查了那些 capabilities ,结果因为内核函数 cap_capable() 的接口发生变化,传入的参数不够判断请求进程,所以没法法精确地检查这些 setuid/gid 程序运行所需的 capabilities 了 :T^T: