Scriptaufruf mit root Rechten.



  • Wenn es nur noch ein, zwei Zeilen sind. Dann zeig doch mal den Quelltext.



  • Zu Testzwecken hab ich den ja gekürzt:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      popen("whoami", "w");
      popen("/etc/init.d/dhcp3-server start"); //oder stop
      return 0;
    }
    


  • upps hab mich vertippt:
    popen("/etc/init.d/dhcp3-server start", "w"); //oder stop

    oder man verwendet gleich system() aber das hab ich z.Z. nicht.



  • Evolu schrieb:

    popen("/etc/init.d/dhcp3-server start");
    

    Ich rede von dem Skript /etc/init.d/dhcp3-server . Was steht da drin? Kann es sein, dass da entsprechende Aufrufe drin sind, die Probleme machen?

    Ich habe gerade noch ein paar Tests gemacht. Offensichtlich machen Programme, wie su noch weitere Dinge, um den Nutzer zu wechseln. Z.b. ein Terminal für ihn anlegen. Ich habe es mit der Folgenden Zeile probiert:

    system("su -c \"/etc/init.d/dhcp3-server restart\"");
    

    . Und trotz SUID wurde ich nach einem Passwort gefragt.



  • Ja das mit su -c habe ich auch schon getestet. Leider funktioniert das nicht so wie es soll.

    Achso du wolltest wissen was in der dhcp3-server steht:

    #!/bin/sh
    #
    # $Id: dhcp3-server.init.d,v 1.4 2003/07/13 19:12:41 mdz Exp $
    #
    
    ### BEGIN INIT INFO
    # Provides:          dhcp3-server
    # Required-Start:    $network
    # Required-Stop:     $network
    # Should-Start:      $local_fs
    # Should-Stop:       $local_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: DHCP server
    # Description:       Dynamic Host Configuration Protocol Server
    ### END INIT INFO
    
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    test -f /usr/sbin/dhcpd3 || exit 0
    
    # It is not safe to start if we don't have a default configuration...
    if [ ! -f /etc/default/dhcp3-server ]; then
    	echo "/etc/default/dhcp3-server does not exist! - Aborting..."
    	echo "Run 'dpkg-reconfigure dhcp3-server' to fix the problem."
    	exit 0
    fi
    
    # Read init script configuration (so far only interfaces the daemon
    # should listen on.)
    . /etc/default/dhcp3-server
    
    NAME=dhcpd3
    DESC="DHCP server"
    DHCPDPID=/var/run/dhcpd.pid
    
    test_config()
    {
    	if ! /usr/sbin/dhcpd3 -t > /dev/null 2>&1; then
    		echo "dhcpd self-test failed. Please fix the config file."
    		echo "The error was: "
    		/usr/sbin/dhcpd3 -t
    		exit 1
    	fi
    }
    
    # single arg is -v for messages, -q for none
    check_status()
    {
        if [ ! -r "$DHCPDPID" ]; then
    	test "$1" != -v || echo "$NAME is not running."
    	return 3
        fi
        if read pid < "$DHCPDPID" && ps -p "$pid" > /dev/null 2>&1; then
    	test "$1" != -v || echo "$NAME is running."
    	return 0
        else
    	test "$1" != -v || echo "$NAME is not running but $DHCPDPID exists."
    	return 1
        fi
    }
    
    case "$1" in
    	start)
    		test_config
    		echo -n "Starting $DESC: "
    		start-stop-daemon --start --quiet --pidfile $DHCPDPID \
    			--exec /usr/sbin/dhcpd3 -- -q $INTERFACES
    		sleep 2
    
    		if check_status -q; then
    			echo "$NAME."
    		else
    			echo "$NAME failed to start - check syslog for diagnostics."
    			exit 1
    		fi
    		;;
    	stop)
    		echo -n "Stopping $DESC: $NAME"
    		start-stop-daemon --stop --quiet --pidfile $DHCPDPID
    		rm -f "$DHCPDPID"
    		echo "."
    		;;
    	restart | force-reload)
    		test_config
    		$0 stop
    		sleep 2
    		$0 start
    		if [ "$?" != "0" ]; then
    			exit 1
    		fi
    		;;
    	status)
    		echo -n "Status of $DESC: "
    		check_status -v
    		exit "$?"
    		;;
    	*)
    		echo "Usage: $0 {start|stop|restart|force-reload|status}"
    		exit 1 
    esac
    
    exit 0
    

    Aber das ist ja momentan ja nur ein dienst ... wir können uns nicht alle Dienste anschauen. Aber vielleicht fällt dir was generelles auf.

    PS: Ich habe jetzt mal Parallel sudo herüberkopiert. Und der verlangt auch eine Passwortabfrage nicht von root sondern vom User selber. Ich muss ehrlich sagen, dass es jetzt viele unbenutzte Dateien rumliegen aber das mach ich später ...
    Wenn man sudo richtig einstellt, umgehe ich mein Problem einfach ... aber das funktioniert auch nicht so richtig.



  • Evolu schrieb:

    Ja das mit su -c habe ich auch schon getestet. Leider funktioniert das nicht so wie es soll.
    [...]

    Aber das ist ja momentan ja nur ein dienst ... wir können uns nicht alle Dienste anschauen. Aber vielleicht fällt dir was generelles auf.

    Mir fällt jetzt spontan nichts auf. Die Pfad-Variable wird in dem Skript ja nochmals gesetzt.

    Was mir halt aufgefallen ist, ist der unterschied zwischen su und SUID-Rechten. Da scheint noch was zu tun zu sein. Du kannst dir die Quellen von su anschauen und gucken, wie es funktioniert. Damit sollte dein Problem gelöst sein.

    Evolu schrieb:

    PS: Ich habe jetzt mal Parallel sudo herüberkopiert. Und der verlangt auch eine Passwortabfrage nicht von root sondern vom User selber. Ich muss ehrlich sagen, dass es jetzt viele unbenutzte Dateien rumliegen aber das mach ich später ...
    Wenn man sudo richtig einstellt, umgehe ich mein Problem einfach ... aber das funktioniert auch nicht so richtig.

    sudo fragt nach dem Passwort, wenn du in sudo eingestellt hast, dass es fragen soll. Das kannst du auch ausschalten.



  • Du kannst dir die Quellen von su anschauen

    Meinst du den Quelltext von su?

    Zu sudo (da kenne ich mich eigentlich nicht aus):
    Kein ja sein das ich mich irre, aber bei mir habe ich es so eingestellt:

    visudo:
    reconn RECONNECTNETZ=(root) NOPASSWD:/etc/init.d/dhcp3-server

    beim ausführen kommt keine nachfrage von root passwort, aber dafür die nachfrage den users reconn.

    Fehlermeldung:

    We trust you have received the usual lecture from the local System
    Administrator. It usually boils down to these three things:
    
        #1) Respect the privacy of others.
        #2) Think before you type.
        #3) With great power comes great responsibility.
    
    Sorry, try again.
    Sorry, try again.
    Sorry, try again.
    sudo: 3 incorrect password attempts
    

    Kann man die Abfrage des user-Passwortes auch abschalten?



  • Du hast eingestellt, dass der Nutzer

    $ sudo /etc/init.d/dhcp3-server
    

    aufrufen kann. Aber das willst du nicht. Du willst ja, dass er

    $ sudo /etc/init.d/dhcp3-server start
    

    aufrufen kann. Das ist so das erste, was mir auffällt.



  • Irgendwo habe ich gelesen das man bei kleine Parameterangabe alle Parameter nutzen kann.
    Oder etwa nicht?



  • Ich glaub es ja nicht ... mit sudo habe ich das jetzt hinbekommen.
    Ich darf nur nicht denn Host einschränken.

    Das heißt es muss so aussehen:

    visudo:
    reconn ALL=(root) NOPASSWD:/etc/init.d/dhcp3-server

    Somit kommt auch beim User keine Passwortabfrage .. damit kann ich leben.



  • Übelste mehrfachpost ich weiß ..
    aber ich wollte mich nur noch bei allen Bedanken. Vor allem bei ProgChild für sein Durchhaltevermögen.
    Sollte euch aber noch was einfallen, dann lasst es mich hören. Ist ja nicht so das ich nie wieder hier vorbeischaue.



  • Evolu schrieb:

    Übelste mehrfachpost ich weiß ..
    aber ich wollte mich nur noch bei allen Bedanken. Vor allem bei ProgChild für sein Durchhaltevermögen.
    Sollte euch aber noch was einfallen, dann lasst es mich hören. Ist ja nicht so das ich nie wieder hier vorbeischaue.

    Mir ist noch folgendes eingefallen. Kann es sein, dass noch bestimmte Umgebungsvariablen gesetzt werden müssen, damit das funktioniert?



  • ProgChild schrieb:

    Evolu schrieb:

    Kompiliere und setzt die Rechte dementsprechend:
    -rws---r-x 1 root root

    Das Sticky-Bit ist dafür verantwortlich das ich das mit root-rechten ausführe. Wie wir wissen funktioniert Sticky-Bit nur mit Binärdateien (um es mit Userrechten auszuführen). Das macht die Fehlermeldung um so komischer:
    sh: line 1: /etc/init.d/dhcpd: Permission denied

    ...

    Aber das Sticky-Bit funktioniert auch für Shell-Skripte. Deine Aussage ist diesbezüglich einfach falsch. Die Datei muss nur ausführbar sein. Aber Shell-Skripte mit root-Rechten sind sehr gefährlich.

    verwechselt ihr da nicht Sticky-Bit mit setuid bit? setuid geht nämlich mit Skripten nicht (jedenfalls unter GNU/Linux)


Anmelden zum Antworten