Linux普通用户操作root资源

本文探讨了在Linux环境下,通过SUID和SGID机制,普通用户如何能够执行需要root权限的命令,例如修改密码。通过设置可执行文件的属主为root并启用SUID权限,即使在普通用户下运行程序,也能实现对root资源的操作,如重启PC等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解了Linux下文件的SUID和SGID后我们就可以解释为什么普通用户也能调用/usr/bin/passwd命令来修改/etc/passwd了。

[root@RD224 uid_gid]# ll /usr/bin/passwd /etc/passwd
-rw-r--r--  1 root root  1738 Dec 10 08:40 /etc/passwd
-r-s--x--x  1 root root 27728 Jun 17  2005 /usr/bin/passwd
如上/etc/passwd文件只有root用户才有写权限,其他用户只有读权限,但普通用户却可以passwd修改自己的密码。原因就在/usr/bin/passwd的属性s,见我另一篇博文 Linux uid gid

一般情况下,如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置。比如我们自己开发的一个程序,里头有用到root才会操控的资源,比如让PC重启。我们可以在普通用户下开发编译,然后切到root用户下将可执行文件属主改为root,将其权限加上SUID,这样切到普通用户下运行这个程序就可以得到我们想要的功能了。

    /* # ScriptName: transeuid.c 
    # Author: JH Gao <gaopenghigh@gmail.com> 
    # Create Date: 2012-06-05 
    # Function: transmit euid and egid to other scripts 
    #   since shell/python/... scripts can't get suid permission in Linux 
    #   usage: transeuid xxx.sh par1 par2 par3 
    #          xxx.sh will get the euid and egid from transeuid 
    # ******************************************************************** */  
      
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <unistd.h>  
    #define BUFFSIZE 1024  
      
    /* 
     * usually euid is the uid who run the program 
     * but when stick is setted to the program 
     * euid is the uid or the program's owner 
     */  
    int main(int argc, char *argv[]) {  
        char *cmd = malloc(BUFFSIZE);  
        // set uid and gid to euid and egid  
        setuid(geteuid());  
        setgid(getegid());  
        cmd = argv[1];  
        int i = 0;  
        for(i = 0;i < argc - 1;i++) {  
            argv[i] = argv[i+1];  
        }  
        argv[argc-1] = NULL  
        // search $PATH find this cmd and run it with pars:argv  
        if (execvp(cmd, argv)) {  
            printf("error");  
            free(cmd);  
            exit(1);  
        }  
        free(cmd);  
    }  

编译这个程序,在给这个程序设置希望取得的用户,再设置suid,然后就可以用这个用户的权限执行脚本或命令了:

$ gcc -t transeuid transeuid.c
$ sudo chown root transeuid
$ sudo chmod +s transeuid
$ ./transeuid ls /root /home
详见 Linux下获取root权限的c程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值