标签: setuid

用于python脚本的setuid/setgid包装器

我有一个Python脚本,我希望能够作为guybrush具有UID 200 的系统用户和guybrush具有GID 200的组运行.

目前我的Python脚本(位于/path/to/script.py)看起来像这样:

#!/usr/bin/env python2
import os

print "uid: %s" % os.getuid()
print "euid: %s" % os.getgid()
print "gid: %s" % os.geteuid()
print "egid: %s" % os.getegid()
Run Code Online (Sandbox Code Playgroud)

我尝试过的C wrapper(scriptwrap.c)看起来像这样:

#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    setuid(geteuid());
    setgid(getegid());
    return execv("/path/to/script.py", argv);
}
Run Code Online (Sandbox Code Playgroud)

然后我按如下方式编译,chown和chmod包装器:

$ gcc scriptwrap.c -o scriptwrap
$ chown guybrush:guybrush scriptwrap
$ chmod 6755 scriptwrap
Run Code Online (Sandbox Code Playgroud)

然而,当我运行scriptwrap时,我得到以下输出:

uid: 1000
euid: 1000
gid: 200
egid: 200
Run Code Online (Sandbox Code Playgroud)

所以出于某种原因只设置了GID(我的普通UID是1000).我该怎么做才能解决这个问题?

编辑: …

python permissions setuid wrapper elevated-privileges

5
推荐指数
1
解决办法
3806
查看次数

setuid vs seteuid功能

setuid和seteuid函数有什么区别.在man page中,两个函数都有类似的描述.

setuid的:

DESCRIPTION

   setuid()  sets  the  effective user ID of the calling process.  If the effective UID of the caller is root, the real UID and saved
   set-user-ID are also set.
Run Code Online (Sandbox Code Playgroud)

个seteuid:

DESCRIPTION

   seteuid()  sets  the  effective user ID of the calling process.  Unprivileged user processes may only set the effective user ID to
   the real user ID, the effective user ID or the saved set-user-ID.
Run Code Online (Sandbox Code Playgroud)

在两个描述中都包含sets the effective user ID of the calling process.那么这两者之间的区别是什么以及这些功能之间的功能如何不同.

还有一个疑问是,只使用chmod(chmod u …

c unix linux setuid

5
推荐指数
1
解决办法
2065
查看次数

iPhone应用程序可以作为Root运行吗?

我正在考虑设计一个我想创建的iPhone应用程序.一个可能的问题是该应用程序必须以root身份运行(以访问某些网络端口).在一个典型的UNIX应用程序中,我只是让应用程序与setuid一起运行,但我想知道是否可以使用iPhone应用程序.

我在Apple的论坛上看到了这个问题,这令人沮丧:

http://discussions.apple.com/thread.jspa?threadID=1664575

我知道Apple希望限制程序可以执行的操作,但是有很多好的,合理的理由让用户以提升的权限运行程序.我不打算在这里创建一个黑客工具.

我确信我可以在一个破牢的iPhone上解决这个问题,但这不是我追求的.有没有办法在不间断的iPhone上运行具有提升权限的应用程序?

(顺便说一句,没有必要警告我NDA.)

iphone permissions setuid

4
推荐指数
1
解决办法
3428
查看次数

Linux在伪代码中有效,真实,保存,文件系统UID操作

我花了一些时间在Groovy中的一些代码来使Linux UID操作对我自己有点不那么困惑,因为手册页很乱.结果是一个TestCase,用于显示在setuid,seteuid,setfsuid,setreuid和setresuid调用的引擎下发生的事情.不考虑有关返回的错误代码(或不包含)的详细信息.

问题基本上是:我错过了什么吗?

/**
 * This is some Groovy code to explain Linux privilege handling
 * The manipulable data structure is "PermVector", and it is manipulated through a
 * TestCase.
 */

class PermissionTestCase extends GroovyTestCase {

  class PermVector {

    int ruid  // real UID; affects the permissions for sending signals 
    int euid  // effective UID; affects file creation and access
    int suid  // saved UID
    int fsuid // filesystem UID; access control to the file system for NFS in Linux …
Run Code Online (Sandbox Code Playgroud)

unix linux setuid

4
推荐指数
1
解决办法
2960
查看次数

使用 setuid 调试 setuid 程序/“权限被拒绝”

这实际上是一个由三部分组成的问题,我将在下面解释,但问题是:

  • 使用gdb,如何以root权限运行程序的一部分,而其余部分正常运行?
  • 为什么我在 setuid(root)程序中使用 mkstemp 在 /tmp 中创建文件时会出现“权限被拒绝”的情况?
  • 为什么“sudo program_name”的执行效果与 setuid 为 root 的 ./program_name 有何不同?

我有一个在 Linux(多个发行版)上运行的 C 程序,通常由具有普通权限的用户运行,但程序的某些部分必须以 root 权限运行。为此,我使用了 set-UID 标志,就目前而言,效果很好。

然而,现在我想用普通用户权限调试程序,我发现我有一个catch-22。我刚刚添加了一个函数来创建临时文件 (/tmp/my_name-XXXXXX),并且该函数是从程序内的许多点调用的。无论出于何种原因,该函数在运行时都会发出以下消息:

sh: /tmp/my_name-hhnNuM: Permission denied
Run Code Online (Sandbox Code Playgroud)

(当然,实际名称有所不同。)然而,该程序能够执行原始套接字函数,我绝对知道除 root 之外的用户无法执行该函数。(如果我删除 setuid 标志,程序就会严重失败。)

如果我在没有 sudo 的情况下通过 gdb 运行这个程序,它会在原始套接字上死掉(因为 gdb 显然不——或者可能不能——尊重程序上的 setuid 标志)。如果我在“sudo gdb”下运行它,那么一切正常。如果我将其运行为“sudo ./my_name,一切正常。

这是该程序的 ls -l 输出:

-rwsr-xr-x 1 root root 48222 Jun 23 08:14 my_name
Run Code Online (Sandbox Code Playgroud)

所以我的问题(排名不分先后):

  • (如何)我可以在gdb下运行具有不同有效UID的程序的不同部分吗?
  • 当 ./program 将 uid 设置为 root 时,为什么“sudo ./program”与“./program”不同?
  • 为什么普通用户在 setuid(root)程序中调用 mkstemp 时会失败?

c permissions gdb setuid

4
推荐指数
1
解决办法
7454
查看次数

我可以为perl脚本setuid吗?

我制作了一个perl脚本来更改其他用户拥有的文件的所有者.脚本完成了.我的管理员将其保存在/ sbin目录中,并使用chmod u + s name_of_script为其设置uid.但是当我运行这个脚本时,它给我一个错误,即不允许chown操作.我做了一个C程序,它按照相同的步骤工作.所以我的问题是如果setuid正在为perl工作,那么我不应该得到那个错误,因为C代码没有给我任何错误.所以我可以为perl脚本setuid,或者我应该使用c代码.

不要告诉我每次都要求管理员更改所有者.实际上在服务器我有用户名暂存,我在其中托管一个joomla网站.现在,当我安装一些插件时,与该插件相关的文件归www-data所有.这就是为什么我不想每次都去管理员.或者你也可以给我一些关于我的问题的其他解决方案.

谢谢.

c unix apache perl setuid

4
推荐指数
2
解决办法
7991
查看次数

Go [lang]二进制文件上的SetGID / SetUID是否安全?

我已经使用YAML和MySQL驱动程序编写了一个简单的程序,目的是提供一个简单的实用程序来更新数据库,而不会向执行该程序的用户暴露用户名和密码凭据。

(我很清楚,我也可以用Python或其他脚本语言编写此代码,并使用管理权限委托,但出于我自己的喜好,我想在这里尝试其他方法)。

构建程序后,我使用了chgrp sys dbcreds.yaml && chmod 0640 dbcreds.yamlchgrp sys ./myprog && chmod g+s ./myprog(作为root)...,一切似乎都正常了。(我还测试了在setGID步骤之前应拒绝的访问)。

我也进行了测试strace,结果导致权限被拒绝(应该如此)。(为了好玩,我还运行ltrace -S了它;这是在Linux下运行的。正如预期的那样,我没有看到很多普通的libc函数调用...通过我很惊讶地看到了一些pthread _....()和一个malloc()调用我猜想GO运行时确实链接到某些系统库函数)。

我的问题:这样安全吗?有什么已知的方法可以导致Go程序,例如(下面)这样的Go程序在读取了这些私有凭据之后进行核心转储或公开其内存?阅读凭据后,是否可以删除SGID特权?Go二进制文件上是否有SUID / SGID漏洞利用的示例?有一个更好的方法吗?有没有一种方法可以主动防止核心转储或确保敏感数据(凭证)不会出现在核心转储中?

另一个注意事项:我发现gopkg.in/yaml.v2语义有点令人不安。在我的YAML文件中,我有类似以下内容:

---
user me
pw mypassword
Run Code Online (Sandbox Code Playgroud)

但是在我的代码中,我必须使用UserPw(大写),而不是像我期望的那样使用小写字母。我认为这是Goyaml的作者的实施决定。是这样吗?

#!go
package main

import (
    "fmt"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "gopkg.in/yaml.v2"
    "io/ioutil"
    "os"
    "strconv"
)

type Creds struct {
    User string
    Pw   string
}

func main() {

    filename := …
Run Code Online (Sandbox Code Playgroud)

sudo setuid go

4
推荐指数
1
解决办法
1832
查看次数

Golang 删除权限 (v1.7)

我想通过 golang 制作一个自定义的网络服务器。它需要 root 才能绑定到端口 80。但是我想尽快删除 root。 syscall.SetUid()根据票证 #1435返回“不支持” 。

我总是可以通过 iptables 将端口 80 重新路由到其他地方,但是这会打开任何非 root 进程以伪装成我的网络服务器 - 我不希望这是可能的。

我如何放弃我的应用程序的权限(或者干净地解决这个问题)。

security setuid go

4
推荐指数
2
解决办法
4039
查看次数

我可以在不使用 sudo 的情况下运行包含 setuid() 的 C 程序吗?

我正在尝试从多个用户执行一个 C 程序,并尝试以程序中的其他用户身份登录来访问文件。但我收到错误

setuid:不允许操作

我可以做一些不需要每次都使用 sudo 的事情吗?比如,授予程序完全访问权限以按需要使用 setuid,而无需每次都调用 sudo?

c setuid

4
推荐指数
1
解决办法
598
查看次数

Setuid二进制文件通过覆盖%n来生成根外壳,不适用于漏洞利用,但在不需要漏洞利用时起作用

我有一个Setuid二进制文件,该文件具有一个printf格式字符串漏洞,应该与“%n”一起利用它来覆盖authenticated全局变量的值。使用/ bin / bash时authenticated = 1,使用root Setuid权限可以执行/ bin / bash ,但authenticated = 0使用exploit时则不能。

我已经尝试过ls并且可以正常工作,所以exec正在发生。我也尝试过authenticated = 1在源代码中进行制作,因此它可以自动运行bash而不会被利用。这适用于生成根外壳。使用漏洞利用程序时,程序将按预期方式调用授予访问权限的功能,但在exec处结束,并且永远不会达到错误。但是,父进程死了,这意味着bash的执行程序一定已经发生。Bash必须正在执行,但是它在启动时崩溃/退出。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

int authenticated = 0;


void read_flag() {
  if (!authenticated) {
    printf("Sorry, you are not *authenticated*!\n");
  }
  else {
    printf("Access Granted.\n");
    int cpid = fork();
    if(cpid == 0){
      printf("child!\n");
      execlp("/bin/bash", "bash", NULL);
      perror("error");
    }
    else{
      wait(NULL);
    } …
Run Code Online (Sandbox Code Playgroud)

c linux bash setuid ctf

4
推荐指数
1
解决办法
189
查看次数

标签 统计

setuid ×10

c ×5

linux ×3

permissions ×3

unix ×3

go ×2

apache ×1

bash ×1

ctf ×1

elevated-privileges ×1

gdb ×1

iphone ×1

perl ×1

python ×1

security ×1

sudo ×1

wrapper ×1