บน Linux ฉันจะเปลี่ยน EUID ของกระบวนการทำงานจากบรรทัดคำสั่งได้อย่างไร (หากฉันมีสิทธิ์เข้าถึงรูท)
บน Linux ฉันจะเปลี่ยน EUID ของกระบวนการทำงานจากบรรทัดคำสั่งได้อย่างไร (หากฉันมีสิทธิ์เข้าถึงรูท)
คำตอบ:
หากกระบวนการทำงานด้วยสิทธิพิเศษรูทคุณสามารถแนบ gdb กับกระบวนการและเรียก seteuid จากภายในกระบวนการนั้น
ตัวอย่าง:
[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0
(gdb) quit
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017
[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
หากคุณกำลังพูดถึงกระบวนการเปลี่ยน EUID ของตัวเองมีหลายวิธีที่จะทำเช่นนั้น
ขึ้นอยู่กับ UID ที่มีประสิทธิภาพของโปรแกรมและมี UID ที่บันทึกไว้หรือไม่คุณอาจสลับระหว่างค่า EUID สองค่าในโปรแกรมที่ไม่ใช่รูทได้ ด้วยโปรแกรมสิทธิพิเศษรูทคุณต้องระวัง - คุณต้องตัดสินใจว่าการเปลี่ยนแปลงควรจะไม่สามารถย้อนกลับได้และใช้ฟังก์ชันที่ถูกต้องสำหรับงาน (การใช้ setuid () เนื่องจาก root ไม่สามารถย้อนกลับได้)
หากคุณกำลังพยายามเปลี่ยนกระบวนการที่กำลังทำงานอยู่แล้วจากกระบวนการที่แยกต่างหากแสดงว่าไม่มีวิธีมาตรฐานที่จะทำ - และฉันไม่แน่ใจว่ามีหลายวิธีที่ไม่ได้มาตรฐานเช่นกัน คุณอาจจะสามารถคิดข้อมูลใน / dev / kmem แต่การแสดงออก 'น้ำแข็งบาง' ถึงใจ
ไม่มีทางที่จะทำเช่นนี้ "จาก commandline" เพื่อเพียงแค่กระบวนการทำงานใด ๆ
ฉันพูดได้อย่างมั่นใจ มีเพียง "บางที" เท่านั้นที่เป็น / proc และฉันแหย่ไปที่นั่น (ตามตัวอักษรและผ่าน google) และวิ่งเข้าไปหาจุดจบเกี่ยวกับอะไรใน / proc ที่อนุญาตให้เปลี่ยน EUID คุณสามารถเรียนรู้สิ่งที่การตั้งค่า UID และ GID อยู่ใน / proc / {pid} / สถานะ - แต่คุณไม่สามารถเปลี่ยนแปลงได้โดยใช้สิ่งใดใน / proc อย่างน้อยที่สุดเท่าที่ฉันสามารถบอกได้
แต่มันง่ายพอที่จะทำให้งานแบบนั้นเป็นวิธีการเปลี่ยน EUID ของกระบวนการจาก commandline หากคุณควบคุมซอร์สโค้ดของกระบวนการที่คุณต้องการเปลี่ยน คุณสามารถใช้ตัวจัดการสัญญาณสำหรับพูด SIGUSR1 และให้กระบวนการเปลี่ยน EUID ของตัวเอง แต่คุณต้องการเมื่อได้รับสัญญาณนั้น จากนั้นคุณเพียงแค่ส่งกระบวนการที่สัญญาณ SIGUSR1 ผ่าน "kill" ... จาก commandline ตามที่คุณถาม ... และมันจะเปลี่ยน EUID ให้คุณ
นี่อาจไม่ใช่สิ่งที่คุณคิด แต่เป็นคำตอบสำหรับคำถามของคุณว่าจะทำอย่างไร ... และเป็นคำตอบเดียวที่ฉันนึกได้