Kann gdb suid root-Programme debuggen?

16

Ich habe ein Programm geschrieben, das setuid(0)und aufruft execve("/bin/bash",NULL,NULL).

Dann habe ich getan chown root:root a.out && chmod +s a.out

Beim Ausführen ./a.outerhalte ich eine Root-Shell. Wenn ich dies tue gdb a.out, wird der Prozess jedoch als normaler Benutzer gestartet und eine Benutzer-Shell gestartet.

Also ... kann ich ein setuid-Root-Programm debuggen?

jyz
quelle

Antworten:

22

Sie können ein setuid- oder setgid-Programm nur debuggen, wenn der Debugger als root ausgeführt wird. Mit dem Kernel können Sie ptracekein Programm aufrufen , das mit zusätzlichen Berechtigungen ausgeführt wird. Wenn dies der Fall wäre, könnten Sie das Programm veranlassen, alles auszuführen, was effektiv bedeuten würde, dass Sie z. B. eine Root-Shell ausführen könnten, indem Sie einen Debugger aufrufen /bin/su.

Wenn Sie Gdb als root ausführen, können Sie Ihr Programm ausführen, aber Sie werden sein Verhalten nur beobachten, wenn es von root ausgeführt wird.

Wenn Sie das Programm debuggen müssen, wenn es nicht von root gestartet wurde, starten Sie das Programm außerhalb von Gdb, lassen Sie es in gewisser Weise anhalten, bevor Sie zum problematischen Teil und attachzum Prozess innerhalb von Gdb gelangen ( at 1234wobei 1234 die Prozess-ID ist).

Gilles 'SO - hör auf böse zu sein'
quelle
Ja, das habe ich versucht, aber der Prozess wird als root gestartet, und gdb sollte auch als root gestartet werden, um den root-Prozess anhängen zu können.
Jyz
@jyzuz Ja, während ich schreibe, musst du gdb als root starten. Oder wenn Sie möchten, können Sie das Remote-Debugging verwenden und nur gdbserverals Root ausführen und als normaler Benutzer eine Verbindung dazu herstellen. Aus Ihrem Kommentar geht hervor, dass Sie es nicht auf einfache Weise geschafft haben (gdb als root ausführen), aber ich verstehe nicht, was schief gelaufen ist, deshalb kann ich nicht helfen.
Gilles 'SO- hör auf, böse zu sein'
7

Hier ist eine Möglichkeit, den Prozess im angehaltenen Zustand zu starten. Verwenden Sie ein Bash-Skript, um Folgendes zu tun:

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

Lass das im Hintergrund laufen.

Starten Sie dann gdbund hängen Sie an die PID an, die gedruckt wurde.

Sie müssen den execBefehl mit schrittweise gdbausführen, können jedoch von Anfang an debuggen.

Lionel
quelle