棧溢位攻擊系列:shellcode在linux x86 64位攻擊獲得root許可權(三)linux下程序中的多使用者
阿新 • • 發佈:2019-01-22
在linux程序中會存在兩個使用者狀態,一種是實際使用者ID, 一種是有效使用者ID
實際使用者ID
uid, 就是我是誰,也就是你在操作時候的使用者ID, 通常你可以用命令id 來檢視自己的資訊
>id
uid=1005(raintung) gid=100(users) groups=16(dialout),33(video),100(users)
而通常root 的uid 是0
有效使用者ID
euid, 這是控制程序能訪問的資源的id,也就是說資源能否訪問取決於euid, 通常就是這個執行檔案的所有者
通常的情況下,實際使用者ID是和有效使用者ID是一樣的,有效使用者ID 應該等於執行程序的使用者ID,但如果該檔案據有s許可權,一切就變的不同了 |
檔案中的S許可權
一般我們知道檔案的三種許可權,read/write/execute 所對應的是讀寫執行的許可權,但是有的時候會有一些特殊的情況,比如有些操作必須是root許可權,可是root許可權是不會開放給一般的使用者,那這個使用者怎麼去呼叫這些操作呢?前面定義的有效使用者ID, 實際使用者ID就是為了解決這一困境,普通使用者只要擁有程序的有效使用者id 是root, 那麼普通使用者就可以操作root 許可權的操作。
而如何設定這一特殊許可權?就是通過設定檔案的S許可權,也就是setuid,seteuid的許可權
如何設定檔案的S許可權?
chmod u+s uid
我們看到標誌位中多了s,也就是文中一直提到的S許可權ll uid -rwsr-xr-x 1 root root 12313 Feb 15 23:53 uid
使用者案例
讀取root才能讀取的檔案
例子:我們去嘗試讀取一個只有root能訪問的檔案test
uid.c
#include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <errno.h> #include <string.h> int main(void) { printf("uid = %d, gid = %d, euid = %d, egid = %d\n", getuid(), getgid(), geteuid(), getegid()); if ( open("test", O_RDONLY) == -1) { fprintf(stderr, "Open %s Error:%s\n", " file", strerror(errno)); exit(1); } }
root 編譯成可執行檔案 uid
gcc -o uid uid.c
./uid
uid = 0, gid = 0, euid = 0, egid = 0
因為 test 檔案是root 才能訪問,當用root 執行的時候,檔案是可以正常執行的
切換非root使用者,在執行結果如下
./uid
uid = 1005, gid = 100, euid = 1005, egid = 100
Open file Error:Permission denied
切換root給uid執行檔案據有s許可權
chmod u+s uid
切換回非root使用者,繼續執行
./uid
uid = 1005, gid = 100, euid = 0, egid = 100
檔案test 可以正常被非root使用者訪問了,我們看到了euid=0 也就是root, 此時程序的有效使用者是root
把自己變成root
通過函式setuid 可以設定實際使用者ID
root.c檔案
#include <stdio.h>
int main(){
setuid(0);
execve("/bin/sh",NULL,NULL);
}
gcc -o root root.c
chmod u+s root
su use
./root
whoami
root
結果非常強悍,use 使用者輕易變成了root,這個用例很眼熟吧,其實就是在棧溢位攻擊系列:shellcode在linux x86 64位攻擊獲得root許可權(二)shellcode中提到的opcode程式碼,這個程式碼可以讓使用者變成root,當然這個可執行檔案必須據有root 的S許可權。