// Start eines anderen Kommandos mit EUID = 0 (root) // // Damit kann man den privilegierten Modus der Bash gut demonstrieren. // Die Kommandos werden über ihre Nummer aus einer Liste ausgewählt. // // Generierung und Installation als Setuid-Root-Programm: // // gcc -O2 -Wall run_as_root.c -o run_as_root // chmod 4755 run_as_root // // 31.12.2005 #include #include #include #include // Liste der zulässigen Kommandos static char *commands[] = { "priv_mode.sh", }; int main(int argc, char **argv, char **env) { char *PROG, **ARGS, **ENV, **src, **target; unsigned int i, n_commands; // Anzahl der zulässigen Kommandos ermitteln n_commands = sizeof(commands)/sizeof(commands[0]); if (argc < 2) { // keine Argumente angegeben, dann geben wir die Liste der Kommandos aus printf("Kommandoliste:\n"); for (i = 0; i < n_commands; i++) { printf("%d - %s\n", i+1, commands[i]); } return 0; } if (((i = (unsigned int) atoi(argv[1])) > n_commands) || !i) { // ungültige Kommando-Nummer angegeben return 1; } if (index(argv[1], 'r')) { // im Argument 1 kommt ein 'r' vor (irgendwo hinter der Kommando-Nummer); // dann setzen wir die reale auf die effektive UID setuid(geteuid()); } // wir löschen das Argument 1 aus dem Argument-Vektor, da es nur für uns, // nicht aber das zu startende Kommando bestimmt ist for (src = argv+2, target = argv+1; (*target++ = *src++); ); // Programmname, Argumentliste und Umgebung einstellen PROG = commands[i-1]; // Argumentliste und Umgebung einfach durchreichen ARGS = argv; ENV = env; // UID/GID/EUID/EGID ausgeben printf("uid : %d\n", getuid()); printf("gid : %d\n", getgid()); printf("euid: %d\n", geteuid()); printf("egid: %d\n", getegid()); // Programm starten execve(PROG, ARGS, ENV); return 0; }