Jash_LinuxC ~ [Linux C]- 一行指令建立帳號、更新密碼 (需setuid) 於 Ubuntu 12.04
Jash_LinuxC ~ [Linux C]- 一行指令建立帳號、更新密碼 (需setuid) 於 Ubuntu 12.04
GITHUB: https://github.com/jash-git/Jash_LinuxC/tree/master/%5BLinux%20C%5D-%20%E4%B8%80%E8%A1%8C%E6%8C%87%E4%BB%A4%E5%BB%BA%E7%AB%8B%E5%B8%B3%E8%99%9F%E3%80%81%E6%9B%B4%E6%96%B0%E5%AF%86%E7%A2%BC%20(%E9%9C%80setuid)%20%E6%96%BC%20Ubuntu%2012.04
code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #define CMD_ADDUSER "sudo adduser --quiet --gecos \"\" --disabled-login --no-create-home --shell \"/usr/sbin/nologin\" " #define CMD_CHECK_USER_EXISTS "getent passwd" #define MAX_BUFFER_LINE 1024 int main(int argc, char *argv[]) { char buf[MAX_BUFFER_LINE+1], pass[MAX_BUFFER_LINE+1], *cmd; FILE *fp; setuid(0); // use root //system("id"); if( argc < 3 ) { fprintf( stderr, "Usage> %s username [ - | password]\n\t%s username -\t\t(read password from stdin)\n\t%s username password\n\n\tothers: sudo chown root %s && sudo chmod 4755 %s\n" , argv[0], argv[0], argv[0] , argv[0], argv[0] ); exit(1); } memset( buf, 0, MAX_BUFFER_LINE + 1); memset( pass, 0, MAX_BUFFER_LINE + 1); if( argv[2][0] != '-' ) { strncpy( pass, argv[2], MAX_BUFFER_LINE ); pass[MAX_BUFFER_LINE] = '\0'; } else if( !feof( stdin ) && fgets( pass, MAX_BUFFER_LINE, stdin ) > 0 ) { //printf("Pass:[%s]\n",pass); } if( strlen(pass) < 1 ) { fprintf( stderr, "Error @ Init: password is empty\n" ); exit(1); } // check account exists cmd = buf; snprintf( buf, MAX_BUFFER_LINE, "%s %s", CMD_CHECK_USER_EXISTS, argv[1] ); fp = popen( cmd , "r" ); memset( buf, 0, MAX_BUFFER_LINE + 1); fgets( buf, MAX_BUFFER_LINE, fp ); pclose(fp); if( !strlen(buf) ) // create the account if not exists { // add account memset( buf, 0, MAX_BUFFER_LINE + 1); cmd = buf; snprintf( buf, MAX_BUFFER_LINE, "%s %s", CMD_ADDUSER, argv[1] ); pclose( popen( cmd , "r" ) ); // query the account memset( buf, 0, MAX_BUFFER_LINE + 1); cmd = buf; snprintf( buf, MAX_BUFFER_LINE, "%s %s", CMD_CHECK_USER_EXISTS, argv[1] ); fp = popen( cmd , "r" ); memset( buf, 0, MAX_BUFFER_LINE + 1); fgets( buf, MAX_BUFFER_LINE, fp ); pclose(fp); if( !strstr( buf, argv[1] ) ) // user is not created { printf("Error @ create an account: user cannot be created\n"); exit(1); } // change password memset( buf, 0, MAX_BUFFER_LINE + 1); cmd = buf; snprintf( buf, MAX_BUFFER_LINE, "echo \"%s:%s\" | chpasswd ", argv[1] , pass ); fp = popen( cmd , "r" ); memset( buf, 0, MAX_BUFFER_LINE + 1); fgets( buf, MAX_BUFFER_LINE, fp ); pclose(fp); if( !strlen(buf) ) printf("OK\n"); } else if( strstr( buf, "/bin/false" ) || strstr( buf, "/nologin" ) ) // change password { // change password memset( buf, 0, MAX_BUFFER_LINE + 1); cmd = buf; snprintf( buf, MAX_BUFFER_LINE, "echo \"%s:%s\" | chpasswd ", argv[1] , pass ); fp = popen( cmd , "r" ); memset( buf, 0, MAX_BUFFER_LINE + 1); fgets( buf, MAX_BUFFER_LINE, fp ); pclose(fp); if( !strlen(buf) ) printf("OK\n"); } else { printf("SKIP @ cannot change the password for '%s'.\n", argv[1]); } return 0; }