Perlscript mit Rootrechten
(Lutz Donnerhacke)
lutz at iks-jena.de
Die Mar 7 09:40:01 CET 2000
* Nils Juenemann wrote:
>Ich moechte ein Perlscript auf einem Apache mit Rootrechten laufen lassen.
>Dieses Script benutzt Befehle wie useradd, groupadd, setquota usw.
Du möchtest einen Wrapper für Dein Perl Script schreiben, der folgender-
maßen aussieht und der +s ist.
************************************************************************
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
const char pathtoscript[] = "/usr/local/sbin/";
char * const enviroment[] = {
"PATH=/bin:/sbin:/usr/bin:/usr/sbin",
"IFS=' \t\r\n'",
"SHELL=/bin/sh",
NULL
};
int main (int argc, char ** argv) {
char command[80] = "";
char *pc;
if (argc < 2) {
fprintf (stderr, "Usage: %s Scriptname Args\n", argv[0]);
exit(1);
}
/* Prevent attacks fooling isalnum(3) */
if (NULL == setlocale(LC_CTYPE, "C")) {
perror ("Can't reset locale");
exit(2);
}
for (pc = argv[1]; *pc; pc++) { /* test auf illegale Zeichen */
if(!isalnum(*pc)) {
fprintf (stderr, "Scriptname contain illegal char = %u\n",
(unsigned) *pc);
exit(3);
}
}
/* Buffer Overflow beachten! */
if (pc - argv[1] + sizeof(pathtoscript) >= sizeof(command)) {
fprintf (stderr, "Scriptname too long.\n");
exit(4);
}
/* buffer overflow can not happen */
strcat (strcpy (command, pathtoscript), argv[1]);
/* test, ob ppid() wirklich der Webserver ist, muß hier rein */
execve(command, argv+1, enviroment);/* execve(2), nicht exec(3) */
perror("Executing command failed"); /* adds error message */
exit(5);
}
************************************************************************