Ubah EUID dari proses yang berjalan

12

Di Linux, bagaimana saya bisa mengubah proses menjalankan EUID dari baris perintah (asalkan saya memiliki akses root)?

jackhab
sumber

Jawaban:

17

Jika proses berjalan dengan hak akses root , Anda bisa melampirkan gdb ke proses dan memanggil seteuid dari dalam proses itu.

Contoh:

[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
Kjetil Jørgensen
sumber
3
+1 untuk pendekatan kreatif dalam menyelesaikan tugas ...
quack quixote
Wow ... ya, itu kreatif. Memang saya tidak berpikir untuk melampirkan proses dengan debugger. Dengan sedikit peretasan "ekspektasi", seseorang dapat mengimplementasikan "cheuid <processID> <EUID>" yang dapat digunakan untuk BEBERAPA situasi. Secara khusus saya percaya bahwa kedua eksekutator gdb DAN proses yang terpengaruh harus menjadi root ... jadi ini adalah utilitas terbatas. AFAIK hanya menjalankan gdb sebagai root, menghubungkan ke proses non-root, seteuid akan gagal, karena itu akan berjalan dengan privs dari proses eksekusi, bukan privs dari debugger.
pbr
2

Jika Anda berbicara tentang proses mengubah EUID-nya sendiri, ada banyak cara untuk melakukan itu.

  • setuid () - sebagai efek samping menetapkan EUID saat digunakan oleh proses dengan EUID 0
  • seteuid ()
  • setreuid ()

Bergantung pada UID efektif program, dan apakah ada UID yang disimpan, Anda mungkin dapat beralih di antara dua nilai EUID dalam program non-root. Dengan program istimewa root, Anda harus berhati-hati - Anda harus memutuskan apakah perubahan itu tidak dapat dibalikkan, dan menggunakan fungsi yang benar untuk pekerjaan itu. (Menggunakan setuid () sebagai root tidak dapat dikembalikan.)

Jika Anda mencoba mengubah proses yang sudah berjalan dari proses yang terpisah, maka tidak ada cara standar untuk melakukannya - dan saya tidak yakin ada banyak cara yang tidak standar. Anda mungkin dapat menghilangkan informasi di / dev / kmem, tetapi ungkapan 'es tipis' muncul di benak Anda.

Jonathan Leffler
sumber
2

Tidak ada cara untuk melakukan ini "dari commandline" ke sembarang proses yang berjalan.

Saya bisa mengatakan itu dengan sedikit yakin; satu-satunya "mungkin" adalah / proc dan saya menyodok di sana (secara harfiah dan melalui google) dan menemui jalan buntu mengenai apa pun di / proc yang memungkinkan untuk mengubah EUID. Anda dapat PELAJARI apa pengaturan UID dan GID berada di / proc / {pid} / status - tetapi Anda tidak dapat mengubahnya menggunakan apa pun di / proc, setidaknya sejauh yang saya tahu.

Tetapi cukup mudah untuk membuat sesuatu seperti itu berfungsi - cara untuk mengubah EUID suatu proses, dari baris perintah - jika Anda mengontrol kode sumber dari proses yang ingin Anda ubah. Anda dapat menerapkan penangan sinyal untuk mengatakan SIGUSR1 dan meminta prosesnya untuk mengubah EUIDnya sendiri namun Anda butuhkan saat menerima sinyal itu. Maka Anda cukup mengirimkan proses yang SIGUSR1 memberi sinyal, melalui "kill" ... dari commandline, seperti yang Anda minta ... dan itu akan mengubah EUID untuk Anda.

Ini mungkin bukan yang Anda pikirkan, tapi ... itu adalah jawaban untuk pertanyaan Anda tentang bagaimana melakukannya ... dan itu satu-satunya jawaban yang dapat saya pikirkan.

hal
sumber