Czy gdb może debugować programy typu suid root?

16

Napisałem program, który wzywa setuid(0)i execve("/bin/bash",NULL,NULL).

Potem zrobiłem chown root:root a.out && chmod +s a.out

Kiedy wykonuję ./a.out, otrzymuję powłokę roota. Jednak gdy to zrobię gdb a.out, proces zaczyna się jak zwykły użytkownik i uruchamia powłokę użytkownika.

Więc ... czy mogę debugować program root setuid?

jyz
źródło

Odpowiedzi:

22

Można debugować program setuid lub setgid tylko wtedy, gdy debugger działa jako root. Jądro nie pozwala na wywołanie ptraceprogramu działającego z dodatkowymi uprawnieniami. Gdyby tak się stało, byłbyś w stanie zmusić program do wykonania czegokolwiek, co skutecznie oznaczałoby, że możesz np. Uruchomić powłokę roota, wywołując debugger /bin/su.

Jeśli uruchomisz Gdb jako root, będziesz mógł uruchomić swój program, ale będziesz obserwował jego zachowanie tylko wtedy, gdy uruchomisz go jako root.

Jeśli potrzebujesz debugować program, gdy nie jest uruchamiany przez root, uruchom program poza Gdb, spraw, aby wstrzymał się w pewien sposób, zanim przejdzie do kłopotliwej części, a attachnastępnie proces wewnątrz Gdb ( at 1234gdzie 1234 to identyfikator procesu).

Gilles „SO- przestań być zły”
źródło
Tak, próbowałem tego, ale proces jest uruchamiany jako root, a gdb powinien zostać uruchomiony jako root, aby móc dołączyć proces roota.
jyz
@ jyzuz Tak, jak piszę, musisz uruchomić gdb jako root. Lub jeśli chcesz, możesz użyć zdalnego debugowania i uruchomić go tak samo gdbserverjak root i połączyć się z nim jak zwykły użytkownik. Z twojego komentarza wynika, że ​​nie udało ci się zrobić tego w prosty sposób (uruchamianie gdb jako root), ale nie rozumiem, co poszło nie tak, więc nie mogę pomóc.
Gilles „SO- przestań być zły”
7

Oto sposób, aby rozpocząć proces w stanie zatrzymanym, jeśli chcesz. Użyj skryptu bash, wykonując:

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

Spraw, aby działał w tle.

Następnie zacznij gdbi dołącz do wydrukowanego pid.

Będziesz musiał wykonać execpolecenie za pomocą gdb, ale będziesz mógł debugować od samego początku.

Lionel
źródło