cgi-prog macht garnix



  • Hi ich habe folgendes Programm geschrieben

    int main(){
    
     int pid = fork();
    
     if(pid==0){
      char* parameter[]={"-F", "eth0", "-c", "/home/eiskalt/sniffitconf"};
      execve("/usr/sbin/sniffit", parameter, NULL);
     }
     else{
      cout << "<HTML>" << endl;
      cout << "<BODY>" << endl;
      cout << "sniffer gestartet" << endl;
      cout << "</BODY>" << endl;
      cout << "</HTML>" << endl;
     }
    
     return 0;
    }
    

    wenn ich das programm ausführe auf der Komandozeile gehts einwandfrei. sniffit wird gestartet und der text wird ausgegeben. Aber wenn ich dieses Programm als cgi-script laufen lasse passiert garnix. Ich hab das programm suid root gesetzt und andere Programme die ich auf dem Server über das Webfrontend ausführe funktionieren auch.

    int main(){
      system("/sbin/init 6");
      return 0;
    }
    

    wenn ich das compiliere und über mein Webfrontend ausführe dann startet der Server neu also wirds wohl kaum an der Apache konfiguration liegen.

    MFG eiskalt



  • Der erste Parameter von argv, muss auch nochmal der Pfad sein.

    Welche Rechte das Programm hat, sollte egal sein. Eher wichtig ist, ob der Apache das Recht hat, dass Programm auszuführen. Generell ist es eine gute Idee, sich mal den Rückgabewert von exec* anzuschauen.



  • es geht auch nicht wenn ich die dateibrechtigungen auf rwsrwxrwx setzte. Ich hab ja noch das programm zum neustarten des servers mit den selben Dateirechten wie das snifferprogramm und das wird ausgeführt und funktioniert der Server startet neu.

    MFG eiskalt



  • @DrGreenthumb

    also ich hab als ersten parameter jetzt den Pfad angegeben aber das hat keine Wirkung gezeigt. Auserdem wie soll ich mir den den Rückgabewert von exec* angucken wenn ich das programm aus einer Webseite herraus starte?? Wenn ich das programm auf der Konsole starte gehts ja

    MFG eiskalt



  • Öhm - sollte als erstes nicht "Content-type: text/html\r\n\r\n" ausgegeben werden?!



  • eiskalt schrieb:

    Auserdem wie soll ich mir den den Rückgabewert von exec* angucken wenn ich das programm aus einer Webseite herraus starte??

    Naja, irgendwo läuft das Programm ja und gibt Sachen aus...

    perror("hallo");



  • Ok also irgendwie lags evtl doch an den rechten.
    Allerdings habe ich jetzt mit sudo dem Apache die Rechte gegeben sniffit auszuführen.
    Nur hab ich immernoch ein kleines Problem mit dem Code.

    funktionierender code

    system("sudo sniffit -F eth0 -s 192.168.0.3");
    

    nur möchte ich system vermeiden ich habs dann mit folgendem Code versucht nur tut sich da garnix auch net wenn ich das script auf der Konsole aufrufe.

    char *parameter[]={"sudo" "sniffit -F eth0 -c /home/eiskalt/sniffitconf",    NULL};
     execve("sudo" parameter, NULL);
    

    Kann mir mal einer sagen was daran bitte falsch ist?? Kompilieren läst sichs.

    MFG eiskalt



  • lies dir nochmal DrGreenthumbs Beitrag durch

    die Stelle meine ich

    DrGreenthumb schrieb:

    Der erste Parameter von argv, muss auch nochmal der Pfad sein.



  • @ Kingruedi

    char *parameter[]={"sudo" "sniffit -F eth0 -c /home/eiskalt/sniffitconf",NULL}; 
     execve("/usr/bin/sudo" parameter, NULL);
    
    char *parameter[]={"/usr/sbin/sudo" "sniffit -F eth0 -c home/eiskalt/sniffitconf",    NULL}; 
     execve("/usr/sbin/sudo" parameter, NULL);
    

    bei mir haben beide Codes die selbe wirkung und ich bilde mir ein das bei dem oberen Code argv[0] nicht der Pfad ist. Allerdings funktioniert garnix wenn ich bei execve das "/usr/sbin/sudo" weglasse.

    [edit2]
    ok aber das löst mein problem nicht nachdem ich bei execve "/usr/sbin/sudo" higeschrieben habe kommt wenn ich das script aufrufe die kurzhilfe zu sudo
    [/edit2]

    MFG eiskalt



  • Nicht mehrere Argumente in ein Array-Element quetschen..

    char* parameter = { "/usr/sbin/sudo", "sniffit", "-F", "eth0", ... };

    Und wenn du bei dir 'garnix passiert', dann heißt das wohl nur, dass du es immer noch nicht geschafft hast, mal den Rückgabewert von exec zu prüfen.



  • du verstehst es nicht 🙂

    die Argument Parameter, die du übergibst müssen als 1. den Aufruf String enthalten

    man 2 execve



  • Ok ich habs jetzt begriffen sorry war wohl gestern etwas aufm Schlauch gestanden

    THX eiskalt


Anmelden zum Antworten