1. 程式人生 > >棧溢位攻擊系列:shellcode在linux x86 64位攻擊獲得root許可權(三)linux下程序中的多使用者

棧溢位攻擊系列:shellcode在linux x86 64位攻擊獲得root許可權(三)linux下程序中的多使用者

在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
ll uid
-rwsr-xr-x 1 root root 12313 Feb 15 23:53 uid
我們看到標誌位中多了s,也就是文中一直提到的S許可權

使用者案例

讀取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許可權。