|
|
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.