Bisakah gdb men-debug program root suid?

16

Saya menulis sebuah program yang memanggil setuid(0)dan execve("/bin/bash",NULL,NULL).

Lalu saya lakukan chown root:root a.out && chmod +s a.out

Ketika saya mengeksekusi ./a.outsaya mendapatkan shell root. Namun ketika saya melakukannya gdb a.outmemulai proses sebagai pengguna normal, dan meluncurkan shell pengguna.

Jadi ... bisakah saya men-debug program root setuid?

jyz
sumber

Jawaban:

22

Anda hanya bisa men-debug program setuid atau setgid jika debugger berjalan sebagai root. Kernel tidak akan membiarkan Anda memanggil ptraceprogram yang berjalan dengan hak istimewa ekstra. Jika ya, Anda dapat membuat program mengeksekusi apa pun, yang secara efektif berarti Anda dapat menjalankan mis. Shell dengan memanggil debugger /bin/su.

Jika Anda menjalankan Gdb sebagai root, Anda akan dapat menjalankan program Anda, tetapi Anda hanya akan mengamati perilakunya ketika dijalankan oleh root.

Jika Anda perlu men-debug program ketika itu tidak dimulai oleh root, jalankan program di luar Gdb, buat itu berhenti dengan cara tertentu sebelum sampai ke bagian yang menyusahkan, dan attachproses di dalam Gdb (di at 1234mana 1234 adalah ID proses).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ya saya sudah mencoba itu, tetapi prosesnya dimulai sebagai root, dan gdb harus dimulai sebagai root juga untuk dapat melampirkan proses root.
jyz
@ jyzuz Ya, saat saya menulis Anda harus memulai gdb sebagai root. Atau jika mau, Anda dapat menggunakan debugging jarak jauh dan menjalankannya hanya gdbserversebagai root dan terhubung dengannya sebagai pengguna normal. Dari komentar Anda, sepertinya Anda tidak berhasil melakukannya dengan cara yang sederhana (menjalankan gdb sebagai root) tapi saya tidak mengerti apa yang salah, jadi saya tidak dapat membantu.
Gilles 'SO- berhenti bersikap jahat'
7

Inilah cara untuk memulai proses dalam keadaan terhenti jika Anda mau. Gunakan skrip bash untuk:

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

Jadikan itu berjalan di latar belakang.

Kemudian mulai gdb, dan lampirkan ke pid yang dicetak.

Anda harus melangkah melalui execperintah dengan gdb, tetapi Anda akan dapat men-debug dari awal.

Lionel
sumber