|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <grp.h> ! 3: #include <pwd.h> ! 4: #include <sys/param.h> ! 5: ! 6: struct group *getgrnam(), *grp; ! 7: struct passwd *getpwuid(), *pwd; ! 8: char *getpass(), *crypt(); ! 9: ! 10: main(argc,argv) ! 11: int argc; ! 12: char **argv; ! 13: { ! 14: register i; ! 15: if(argc < 2) { ! 16: fprintf(stderr, "usage: newgrp groupname [command]\n"); ! 17: exit(1); ! 18: } ! 19: if((grp=getgrnam(argv[1])) == NULL) { ! 20: fprintf(stderr, "%s: no such group\n", argv[1]); ! 21: exit(1); ! 22: } ! 23: if((pwd=getpwuid(getuid())) == NULL) { ! 24: fprintf(stderr, "You do not exist!\n"); ! 25: exit(1); ! 26: } ! 27: for(i=0;grp->gr_mem[i];i++) ! 28: if(strcmp(grp->gr_mem[i], pwd->pw_name) == 0) ! 29: break; ! 30: if(grp->gr_mem[i] == 0 && strcmp(grp->gr_name,"other")) { ! 31: fprintf(stderr, "Sorry\n"); ! 32: exit(1); ! 33: } ! 34: ! 35: if(grp->gr_passwd[0] != '\0' && pwd->pw_passwd[0] == '\0') { ! 36: if(strcmp(grp->gr_passwd, crypt(getpass("Password:"),grp->gr_passwd)) != 0) { ! 37: fprintf(stderr, "Sorry\n"); ! 38: exit(1); ! 39: } ! 40: } ! 41: if(setgid(grp->gr_gid) < 0) { ! 42: perror("setgid"); ! 43: exit(1); ! 44: } ! 45: done(argc, argv); ! 46: } ! 47: ! 48: done(argc, argv) ! 49: int argc; ! 50: char **argv; ! 51: { ! 52: register i; ! 53: ! 54: setuid(getuid()); ! 55: for (i=NSYSFILE; i<NOFILE; i++) ! 56: close(i); ! 57: if(argc < 3) { ! 58: execl(((pwd && pwd->pw_shell[0])? pwd->pw_shell: "/bin/sh"), "sh", 0); ! 59: fprintf(stderr, "No shell!\n"); ! 60: } else { ! 61: execvp(argv[2], &argv[2]); ! 62: perror(argv[2]); ! 63: exit(1); ! 64: } ! 65: exit(1); ! 66: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.