`
gaopenghigh
  • 浏览: 246375 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

传递euid和egid给脚本,使脚本具有特殊用户的权限

阅读更多
传递euid和egid给脚本,使脚本具有特殊用户的权限

使脚本实现类似于设置了stick位的效果

作者:高鹏 <gaopenghigh@gmail.com>

shell, python, perl等脚本、程序不能取得suid,因为这些脚本程序需要解释器-/bin/bash, /usr/bin/python等来执行,而这些解释器本身没有suid也不方便设置suid。碰到这种情况可以用c写一个外壳,对这个外壳设置suid,而在c程序里面把自身的uid,gid传递给实际执行任务的脚本。(这个方法是在读周鹏(Roc Zhou <roczhou.zhoup@alibaba-inc.com>)写的工具时学到的)

c程序如下:
/* # 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
/home:
.  ..  data  .directory  gp_old  jh  jh_old  lost+found

/root:
.  ..  .bash_history  .bashrc  .cache  .dbus  .profile  .pulse  .pulse-cookie  .viminfo
1
1
分享到:
评论

相关推荐

    linux 权限 c,Linux下获取root权限的c程序

    Linux下获取root权限的c程序 传递euid和egid给脚本,使脚本具有特殊用户的权限 使脚本实现类于设置了stick位的效果 shell, python, perl等脚本、程序不能取得suid,因为这些脚本程序需要解释器-/bin/bash, /usr/bin/...

    Linux中高效编写Bash脚本的9个技巧

    通过使用函数可以使脚本更加模块化,易于维护和扩展。函数不仅可以提高代码的可读性,还可以在多个地方重复使用相同的逻辑。例如: ```bash # 定义函数 function check_root { if [[ $EUID -ne 0 ]]; then echo ...

    【2018hit计算机系统安全】实验一:文件权限管理及搭建虚拟环境

    例如,当一个普通用户执行了具有SetUID权限的程序,euid会临时变为root,以完成需要root权限的任务。在任务完成后,euid会恢复为原始用户ID,以限制root权限的滥用。 在搭建虚拟环境方面,实验提到了使用`chroot`...

    Linux文件访问控制技术.pdf

    Linux采用自主访问控制(Discretionary Access Control, DAC)模式,这种模式允许用户根据自身的身份和权限来决定是否可以访问特定的资源,如文件。 在Linux中,文件访问权限主要通过三个基本权限位来控制:读(r)...

    CleanUpMac:用于清理macOS计算机的Bash脚本

    Bash脚本清理macOS计算机。 # Maintenance script for macOS #! /usr/bin/env bash # Ask for the administrator password upfront if [ " $EUID " -ne 0 ] ; then echo " Please run as root " exit fi echo ' ...

    哈工大计算机系统安全实验报告-1

    总之,本实验报告详尽地阐述了Linux系统中的文件权限管理和setuid程序的使用,这些都是系统安全和权限控制的基础。通过理解和实践这些概念,可以更好地保护系统资源,防止未经授权的访问,同时也能灵活地实现用户间...

    Linux 下的su 源代码

    `su`命令的基本功能是改变当前进程的有效用户ID(EUID)和组ID(EGID),从而获取目标用户的所有权限。在没有提供密码的情况下,如果当前用户已经是root,`su`可以直接切换到任何其他用户;否则,通常需要输入目标...

    1190201308-陈东鑫-实验一1

    - **fork进程**:父进程和子进程在fork之后,ruid(实际用户ID)、euid(有效用户ID)和suid(保存的设置用户ID)都是相同的,除非后续进行权限调整。 - **execl执行setuid程序**:在execl执行setuid程序前,权限...

    Linux 深入理解进程权限

    本文将深入探讨Linux进程权限的几个关键概念,包括ruid(实际用户ID)、euid(有效用户ID)、suid(保存用户ID)和fuid(文件系统用户ID),以及它们如何在不同场景下影响进程的行为。 首先,ruid(实际用户ID)...

    Linux内核结构与进程管理.ppt

    1. 身份信息:pid, uid, gid, euid, egid 等 2. 状态信息:running, interruptible, non-interruptible, stopped, zombie 3. 调度信息:policy, priority, rt_priorty, need_resched 4. IPC 信息:如定义对某些信号...

    计算机系统安全实验报告-实验一1

    通过`chmod`命令可以改变这些权限,如`chmod 664 file`会给所有者和同组用户读写权限,其他用户只有读权限。 3. 沙盒环境构建: 沙盒环境是一种隔离机制,用于限制程序的访问权限。在沙盒中,程序只能访问特定的...

    哈工大计算机系统安全复习总结

    1. 运行二进制文件和脚本文件时,需要设置权限 2. 目录的执行位有何用途?执行位能控制目录的遍历,能查找到目录下文件的 inode 信息 3. 读取文件所需权限?删除文件需要什么权限? 进程和文件系统安全 在 fork ...

    alpine:带有基于glibc的映像的Alpine Linux或最小Alpine Linux,该映像捆绑了tzdata,su-exec和一些有用的入口点脚本

    这是或基于的映像,该映像捆绑了tzdata , su-exec和一些有用的入口点脚本。使用userid , group , groupid和主目录创建/更新用户。 将组和主目录分配给用户,并根据环境变量ENOLOGIN值设置外壳ENOLOGIN (有关更...

    Linux系统下C语言编程--进程的创建

    在多用户环境中,进程的所有者和权限控制是至关重要的。Linux系统通过用户ID(UID)和组ID(GID)来限制对资源的访问,有效用户ID(EUID)和有效组ID(EGID)则在某些情况下(如setuid和setgid程序)用于改变进程的...

    操作系统实验报告-实验四.docx

    - 真实用户组ID(Real Group ID, RGID)和有效用户组ID(Effective Group ID, EGID):与用户ID类似,但涉及用户组的权限。 2. **进程执行时间分析**: - 使用`times()`函数获取进程的用户CPU时间(tms_utime)和...

    linux进程创建.doc

    当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存、设备等),然后进行一系列的复杂操作,使程序变成进程以供系统调用。在系统里面只有进程,没有程序,为了区分各个不同的进程,系统给每一个进程分配...

    Linux内核结构与进程管理PPT课件.ppt

    1. 身份信息:pid,uid,gid,euid,egid等; 2. 状态信息:running, interruptible, non-interruptible, stopped, zombie; 3. 调度信息:policy, priority, rt_priorty, need_resched; 4. IPC信息:如定义对某些信号...

    基于能力机制的Linux进程行为控制.pdf

    总结来说,该文深入研究了基于能力机制的Linux进程行为控制,提出了改进的安全措施,旨在解决传统超级用户机制的缺陷,提高系统安全性,防止未经授权的权限提升,确保系统资源的合理和安全使用。这些研究成果对于...

    cat /etc/passwd 查看linux用户

    - 可以使用`echo $USER / $EUID`来查看当前用户和其有效用户ID。 6. **内核参数**: - `echo 1&gt;/proc/sys/net/ipv4/ip_forward`:启用IP转发功能,将内核中的`ip_forward`设置为1,允许数据包转发。 - `vim /...

Global site tag (gtag.js) - Google Analytics