gdb는 suid 루트 프로그램을 디버깅 할 수 있습니까?


16

나는 호출하는 프로그램을 작성 setuid(0)하고 execve("/bin/bash",NULL,NULL).

그런 다음 chown root:root a.out && chmod +s a.out

내가 실행할 때 나는 ./a.out루트 쉘을 얻는다. 그러나 내가하면 gdb a.out일반 사용자로 프로세스를 시작하고 사용자 셸을 시작합니다.

그러면 ... setuid 루트 프로그램을 디버깅 할 수 있습니까?

답변:


22

디버거가 루트로 실행중인 경우 setuid 또는 setgid 프로그램 만 디버그 할 수 있습니다. 커널은 ptrace추가 권한으로 실행되는 프로그램 을 호출 할 수 없습니다 . 만약 그렇다면 프로그램이 무엇이든 실행하도록 만들 수있다. 이것은 사실상 디버거를 호출하여 루트 쉘을 실행할 수 있음을 의미한다 /bin/su.

루트로 Gdb를 실행하면 프로그램을 실행할 수 있지만 루트로 실행할 때만 동작을 관찰하게됩니다.

루트로 시작하지 않았을 때 프로그램을 디버깅해야하는 경우 Gdb 외부에서 프로그램을 시작하고 문제가있는 부분에 도달하기 전에 어떤 방식 으로든 일시 중지하고 attachGdb 내부의 프로세스 ( at 1234여기서 1234는 프로세스 ID)를 사용하십시오.


예, 시도했지만 루트로 프로세스가 시작되었으며 gdb도 루트로 시작하여 루트 프로세스를 연결할 수 있습니다.
jyz

@jyzuz 예, 글을 쓸 때 gdb를 루트로 시작해야합니다. 또는 원하는 경우 원격 디버깅을 사용 gdbserver하고 루트로 실행 하고 일반 사용자로 연결할 수 있습니다. 귀하의 의견에 따르면 간단한 방법으로 (gdb를 루트로 실행) 관리하지 못했지만 무엇이 잘못되었는지 이해하지 못하므로 도움이되지 않습니다.
Gilles 'SO- 악 그만해라'

7

원한다면 프로세스를 중지 된 상태로 시작하는 방법이 있습니다. bash 스크립트를 사용하십시오.

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

백그라운드에서 실행하십시오.

그런 다음 시작 gdb하고 인쇄 된 pid에 첨부하십시오.

을 사용하여 exec명령 을 단계별로 수행해야 gdb하지만 처음부터 디버깅 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.