在执行带有密码的C++二进制文件时切换到Linux根帐户,可能

Switch to Linux root account in executing C++ binary with password, POSSIBLE?

本文关键字:Linux 可能 行带 执行 密码 二进制文件 C++      更新时间:2023-10-16

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

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

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

我尝试过C++:

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

setuid(0)//再说一遍,我在哪里传递密码才能获得帐户权限?我得到的只是一个"不允许的手术"。

如果这是一个简单的问题,我深表歉意。我只是想以localadmin的身份运行命令,然后就可以完成了。

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

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

chown root {program}
chmod 4755 {program}

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

在创建setuid根程序时,需要特别注意确保所有输入都经过了正确的消毒,以防止缓冲区溢出或格式字符串漏洞。此外,如果您的程序不仅仅调用另一个程序,那么它应该在开始使用seteuid({callers_uid})时放弃权限,在需要使用seteuid(0)时提高权限,并在完成后再次将其放下。

如果你只想让特定的用户运行这个程序,你可以使用sudo,而不是让程序成为setuid root。根用户需要更新/etc/sudoers文件,为有问题的用户和程序添加一个条目,并包括一个不需要密码的选项。

例如:

user_name ALL = (root) NOPASSWD:program_to_run

然后用户可以运行:

sudo program_to_run

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

我认为您误解了setuid的一般工作方式。不需要在应用程序中存储任何类型的密码:您只需像root一样正常地对其进行编码,即可完成需要执行的操作。一旦您拥有二进制文件(由root拥有),就可以使用chmod将其setuid权限设置为二进制文件的属性。

在执行二进制文件之后,任何被允许执行二进制文件的用户都会将其提升为root用户,以执行二进制文件代码。无需为此提供密码。

请注意,您需要小心使用setuid程序:它们可能会由于其root权限而导致安全问题。最好让它们尽可能简单和集中,尽可能少地执行实际需要root权限的操作,让其他非setuid程序执行任何非特权操作,以最大限度地减少潜在的可利用漏洞。