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