gdb สามารถดีบัก suid root โปรแกรมได้หรือไม่?


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 ทำให้หยุดชั่วคราวก่อนที่จะเข้าสู่ส่วนที่ลำบากและattachกระบวนการภายใน Gdb ( at 1234โดยที่ 1234 คือรหัสกระบวนการ)


ใช่ฉันได้ลองแล้ว แต่กระบวนการเริ่มต้นเป็นรูทและ gdb ควรเริ่มทำงานในฐานะรูทด้วยเพื่อให้สามารถแนบกระบวนการของรูทได้
jyz

@ jyzuz ใช่ฉันเขียนคุณต้องเริ่ม gdb เป็น root หรือถ้าคุณต้องการคุณสามารถใช้การดีบักแบบรีโมตและรันได้gdbserverเหมือนรูทและเชื่อมต่อกับผู้ใช้ปกติ จากความคิดเห็นของคุณดูเหมือนว่าคุณไม่ได้จัดการวิธีง่ายๆ (ใช้ gdb เป็น root) แต่ฉันไม่เข้าใจว่ามีอะไรผิดพลาดดังนั้นฉันจึงไม่สามารถช่วยได้
Gilles 'SO- หยุดความชั่วร้าย'

7

ต่อไปนี้เป็นวิธีเริ่มกระบวนการในสถานะหยุดทำงานหากคุณต้องการ ใช้สคริปต์ทุบตีทำ:

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.