用密码执行C ++二进制文件切换到Linux root帐户,可能吗?

时间:2016-08-02 15:41:53

标签: c++ linux shell setuid

我正在尝试将某些文件从非常低(几乎没有权限)的用户复制到root用户。我需要允许有权访问低帐户的人将某些文件复制到更高的帐户。我曾考虑使用bin / Bash脚本,但我不希望文件中的任何密码被查看。

我决定创建一个C ++应用程序,其中包含我想传递给su / setuid命令的帐户的密码。我知道密码可以在二进制文件中查看,但不是问题。密码不是纯文本就足够了。

我的问题是我无法弄清楚如何登录"作为用户,我需要更新该帐户中运行的服务的文件。我有用户帐户名,即localadmin,以及该帐户的密码。但是如何将这些文件传递给Linux以将文件从C ++应用程序复制到localadmin account home /子目录?

我在C ++中尝试过:

系统(" su localadmin"); //提示输入密码,但不知道如何传递密码。

setuid(0); //再次,我在哪里传递密码才能获得帐户权限?我得到的只是"操作不被允许"。

如果这是一个简单的问题,我道歉。我只是尝试将命令作为localadmin运行并完成。

2 个答案:

答案 0 :(得分:6)

您不需要提供密码。使您的应用程序setuid root,以便它以root权限运行。

使用root权限,请执行以下操作:

chown root {program}
chmod 4755 {program}

现在您的可执行文件由root拥有并且设置了setuid位。因此,当任何用户运行它时,它以root身份运行。然后程序可以做它需要做的事情。

在创建setuid根程序时,需要特别注意确保所有输入都已正确清理,以防止缓冲区溢出或格式化字符串漏洞。此外,如果您的程序不只是调用另一个程序,它应该在开始使用seteuid({callers_uid})时删除权限,在seteuid(0)需要时提高权限,并在您重新启动时再将其删除完成。

如果您只希望特定用户运行此程序,您可以使用sudo而不是使程序setuid root。 root用户需要更新/ etc / sudoers文件并为相关用户和程序添加条目,并包含不需要密码的选项。

例如:

user_name ALL = (root) NOPASSWD:program_to_run

然后用户可以运行:

sudo program_to_run

然后这个用户(只有这个用户)可以运行具有root权限的程序来执行它需要做的任何事情。

答案 1 :(得分:0)

我认为你误解了setuid通常如何运作。您无需在应用程序中存储任何类型的密码:您只需按正常编码即可执行您需要执行的操作,就像您root一样。获得二进制文件(由root拥有)后,使用setuid将其chmod权限设置为二进制文件的属性。

执行二进制文件后,任何允许执行它的用户都会将它们提升为root用于执行二进制代码。不需要为此提供密码。

请注意,您需要小心setuid个程序:由于root权限,它们可能会导致安全问题。最好保持它们尽可能简单和集中,做到实际需要root权限的绝对最小值,让其他非setuid程序执行任何非特权工作,以最大限度地减少潜在的可利用错误。