|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <pwd.h> ! 3: #include <time.h> ! 4: #include <signal.h> ! 5: #define SULOG "/dev/console" ! 6: ! 7: struct passwd *pwd,*getpwnam(); ! 8: char *crypt(); ! 9: char *getpass(); ! 10: char **environ; ! 11: ! 12: main(argc,argv) ! 13: int argc; ! 14: char **argv; ! 15: { ! 16: register char **p; ! 17: char *nptr; ! 18: char *password; ! 19: int badsw = 0; ! 20: int newgid, newuid; ! 21: char *shell = "/bin/sh"; ! 22: ! 23: ! 24: if(argv[0][0] != '/'){ ! 25: fprintf(stderr, "su must be invoked with a full path\n"); ! 26: exit(1); ! 27: } ! 28: ! 29: if(argc > 1) ! 30: nptr = argv[1]; ! 31: else ! 32: nptr = "root"; ! 33: if((pwd=getpwnam(nptr)) == NULL) { ! 34: printf("Unknown id: %s\n",nptr); ! 35: exit(1); ! 36: } ! 37: if(pwd->pw_passwd[0] == '\0' || getuid() == 0) ! 38: goto ok; ! 39: password = getpass("Password:"); ! 40: if(badsw || (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) != 0)) { ! 41: log(SULOG,nptr,0); ! 42: printf("Sorry\n"); ! 43: exit(2); ! 44: } ! 45: ! 46: ok: ! 47: newgid = pwd->pw_gid; ! 48: newuid = pwd->pw_uid; ! 49: log(SULOG,nptr,1); ! 50: endpwent(); ! 51: setgid(newgid); ! 52: setuid(newuid); ! 53: if (pwd->pw_shell && *pwd->pw_shell) ! 54: shell = pwd->pw_shell; ! 55: if (newuid == 0) ! 56: for (p=environ; *p; p++) { ! 57: if (strncmp("PS1=", *p, 4) == 0) ! 58: *p = "PS1=# "; ! 59: else if (strncmp("PATH=", *p, 5) == 0) ! 60: *p = "PATH=/bin:/usr/bin:/etc"; ! 61: } ! 62: execl(shell, "su", "-p", 0); ! 63: printf("No shell\n"); ! 64: exit(3); ! 65: } ! 66: log(where, towho, how) ! 67: char *where, *towho; ! 68: int how; ! 69: { ! 70: int catch(); ! 71: FILE *logf; ! 72: long now, time(); ! 73: char *cuserid(), *strrchr(); ! 74: char *ttyn, *ttyname(); ! 75: struct tm *tmp, *localtime(); ! 76: ! 77: if((ttyn=ttyname(0))==NULL) ! 78: if((ttyn=ttyname(1))==NULL) ! 79: if((ttyn=ttyname(2))==NULL) ! 80: if((ttyn=ttyname(3))==NULL) ! 81: ttyn="/dev/tty??"; ! 82: now = time((long *)0); ! 83: tmp = localtime(&now); ! 84: signal(SIGALRM, catch); ! 85: alarm(5); ! 86: if((logf=fopen(where,"a")) == NULL) return; ! 87: fprintf(logf,"\r\nSU %.2d/%.2d %.2d:%.2d %c %s %s-%s\r\n", ! 88: tmp->tm_mon+1,tmp->tm_mday,tmp->tm_hour,tmp->tm_min, ! 89: how?'+':'-',(strrchr(ttyn,'/')+1),cuserid((char *)0),towho); ! 90: fclose(logf); ! 91: alarm(0); ! 92: } ! 93: char *cuserid(x) ! 94: char *x; ! 95: { ! 96: struct passwd *getpwuid(); ! 97: ! 98: return getpwuid(getuid())->pw_name; ! 99: } ! 100: catch(){}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.