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 stopoder 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 insudo
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-serverbeim 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-serverSomit 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 rootDas 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)