เปลี่ยน EUID ของกระบวนการทำงาน


12

บน Linux ฉันจะเปลี่ยน EUID ของกระบวนการทำงานจากบรรทัดคำสั่งได้อย่างไร (หากฉันมีสิทธิ์เข้าถึงรูท)

คำตอบ:


17

หากกระบวนการทำงานด้วยสิทธิพิเศษรูทคุณสามารถแนบ 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

3
+1 สำหรับวิธีการสร้างสรรค์งานที่ประสบความสำเร็จ ...
นักต้มตุ๋น Quixote

ว้าว ... ใช่นั่นคือความคิดสร้างสรรค์ อันที่จริงฉันไม่ได้คิดที่จะแนบกับกระบวนการกับดีบักเกอร์ ด้วยการแฮ็ก "คาดหวัง" ผู้ใช้สามารถใช้ "cheuid <processID> <EUID>" ซึ่งจะทำงานได้ในบางสถานการณ์ โดยเฉพาะฉันเชื่อว่าทั้งตัวประมวลผลของ gdb และกระบวนการที่ได้รับผลกระทบจะต้องเป็นรูท ... ดังนั้นนี่จึงเป็นยูทิลิตี้ที่ จำกัด AFAIK เพียงแค่เรียกใช้ gdb ในฐานะรูทการเชื่อมต่อกับกระบวนการที่ไม่ใช่รูท seteuid จะล้มเหลวเนื่องจากมันจะทำงานกับ privs ของกระบวนการดำเนินการไม่ใช่เป็น privs ของดีบัก
pbr

2

หากคุณกำลังพูดถึงกระบวนการเปลี่ยน EUID ของตัวเองมีหลายวิธีที่จะทำเช่นนั้น

  • setuid () - เป็นผลข้างเคียงตั้งค่า EUID เมื่อใช้โดยกระบวนการที่มี EUID เป็น 0
  • seteuid ()
  • setreuid ()

ขึ้นอยู่กับ UID ที่มีประสิทธิภาพของโปรแกรมและมี UID ที่บันทึกไว้หรือไม่คุณอาจสลับระหว่างค่า EUID สองค่าในโปรแกรมที่ไม่ใช่รูทได้ ด้วยโปรแกรมสิทธิพิเศษรูทคุณต้องระวัง - คุณต้องตัดสินใจว่าการเปลี่ยนแปลงควรจะไม่สามารถย้อนกลับได้และใช้ฟังก์ชันที่ถูกต้องสำหรับงาน (การใช้ setuid () เนื่องจาก root ไม่สามารถย้อนกลับได้)

หากคุณกำลังพยายามเปลี่ยนกระบวนการที่กำลังทำงานอยู่แล้วจากกระบวนการที่แยกต่างหากแสดงว่าไม่มีวิธีมาตรฐานที่จะทำ - และฉันไม่แน่ใจว่ามีหลายวิธีที่ไม่ได้มาตรฐานเช่นกัน คุณอาจจะสามารถคิดข้อมูลใน / dev / kmem แต่การแสดงออก 'น้ำแข็งบาง' ถึงใจ


2

ไม่มีทางที่จะทำเช่นนี้ "จาก commandline" เพื่อเพียงแค่กระบวนการทำงานใด ๆ

ฉันพูดได้อย่างมั่นใจ มีเพียง "บางที" เท่านั้นที่เป็น / proc และฉันแหย่ไปที่นั่น (ตามตัวอักษรและผ่าน google) และวิ่งเข้าไปหาจุดจบเกี่ยวกับอะไรใน / proc ที่อนุญาตให้เปลี่ยน EUID คุณสามารถเรียนรู้สิ่งที่การตั้งค่า UID และ GID อยู่ใน / proc / {pid} / สถานะ - แต่คุณไม่สามารถเปลี่ยนแปลงได้โดยใช้สิ่งใดใน / proc อย่างน้อยที่สุดเท่าที่ฉันสามารถบอกได้

แต่มันง่ายพอที่จะทำให้งานแบบนั้นเป็นวิธีการเปลี่ยน EUID ของกระบวนการจาก commandline หากคุณควบคุมซอร์สโค้ดของกระบวนการที่คุณต้องการเปลี่ยน คุณสามารถใช้ตัวจัดการสัญญาณสำหรับพูด SIGUSR1 และให้กระบวนการเปลี่ยน EUID ของตัวเอง แต่คุณต้องการเมื่อได้รับสัญญาณนั้น จากนั้นคุณเพียงแค่ส่งกระบวนการที่สัญญาณ SIGUSR1 ผ่าน "kill" ... จาก commandline ตามที่คุณถาม ... และมันจะเปลี่ยน EUID ให้คุณ

นี่อาจไม่ใช่สิ่งที่คุณคิด แต่เป็นคำตอบสำหรับคำถามของคุณว่าจะทำอย่างไร ... และเป็นคำตอบเดียวที่ฉันนึกได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.