gpt4 book ai didi

c++ - 使用c++更改任何linux用户密码

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:14 25 4
gpt4 key购买 nike

我想使用 C++ 更改任何 Linux 用户密码,任何解决方案都很棒。

我需要手动执行此操作,这意味着通过打开文件(无法使用 system()):

  • /etc/passwd
  • /etc/shadow
  • /etc/group

我似乎还需要锁定这些文件。有打开.txt文件并读取内容的C代码示例,但无法读取大内容,这也是问题。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <stdlib.h>
#include <string>

const char* path = "/tmp/log.txt";

void read_file()
{
int fd;
char buf[1000];
int i;

fd = open(path, O_RDONLY);
flock(fd, LOCK_SH);

for(i=0; i < 255 ; i++) {
read(fd, &buf[i], 1);
usleep(10 * 10); // 10 ms
}

flock(fd, LOCK_UN);
close(fd);

printf("reader: %#x: %s\n", getpid(), buf);
usleep(10 * 10); // 10 ms
}

void reader()
{
read_file();
exit(0);
}

int main()
{
setlinebuf(stdout);
reader();
return 0;
}

在理想的解决方案中,它必须像这样工作:

  1. 程序要求输入用户名。
  2. 程序要求输入新密码。
  3. 打开必要的文件,更改密码并保存文件,但不要损坏它。

有人可以解释我需要使用哪个文件来更改密码以及如何正确打开它而不损害系统吗?如何准确编辑密码所在的行?

目前我正在使用 Ubuntu 16.04。

编辑

我在评论中看到普通用户无法访问这些文件。其中一条评论是授予每个用户更改任何用户密码的权限。那么,如果一个用户有权编辑这些文件并更改任何用户的密码呢?这就是安全打开和编辑系统文件shadow、保存并关闭它的方法。我需要以某种方式锁定它或者如何访问它?

Thereshadow文件结构,大家都可以看到密码有特殊的哈希或加密,所以如果正确更改它并保存文件,密码必须更改。

我使用用户名获取用户数据的代码:

#include <stdio.h>
#include <pwd.h>
#include <iostream>


using namespace std;

int main()
{
struct passwd *p_entry1, *p_entry2;
char* username;



cout<<"Insert username: ";
cin>>username;
/* Find user data by entered username */
p_entry1 = getpwnam(username);

printf("username = %s = %s"
" userid = %d group id = %d"
" real name = %s directory = %s"
" primary shell = %s",
p_entry1->pw_name, p_entry1->pw_passwd,
p_entry1->pw_uid, p_entry1->pw_gid,
p_entry1->pw_gecos, p_entry1->pw_dir,
p_entry1->pw_shell);

}

最佳答案

要更改用户的密码,您可以使用 putpwent putspent 函数来自 <pwd.h><shadow.h>分别。这样您就不需要显式读取、解析和写入 passwd 和shadow 文件。

关于权限:

如果您不愿意以 root 身份运行程序,另一种方法是输入 setuid 对可执行文件的权限,就像 passwd本身可执行。

chown root.root <executable>
chmod u+s <executable>

一个setuid程序在其所有者的特权/权限下执行(在本例中为 root ),因此您被授予二进制所有者的特权/权限。

如果您的二进制文件归 root 所有它有 suid权限,就可以更改/etc/passwd以及任何其他仅 root 的文件可以访问。这非常方便,但同时也可能非常危险。例如,如果您的程序存在错误或不可预见的情况,恶意用户可能会利用它来获取系统中的 root 权限/访问权限。

编写安全程序看起来很简单,但它有各种陷阱。祝你好运!

关于c++ - 使用c++更改任何linux用户密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37858854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com