2015-10-07 53 views
1

因此,我正在通過Ubuntu虛擬機中的安全實驗室工作,並且遇到了問題。這些說明有時可能有點模糊或不清楚。截至目前,我編寫了一個運行ls的小型C程序。Bash和根權限問題

#include <stdio.h> 
int main() 
{ 
    system("lsBAK -la"); 
    return 0; 
} 

然後,我在名稱lsBAK下創建了/ bin/ls的備份並刪除了原始文件。我用ls的名字鏈接了我編譯的程序,所以當我輸入ls時,這個程序會運行。它最終允許我在文件夾上運行ls,因爲它具有root訪問權限,所以我不應該有權運行它。最終促使我這樣做的問題寫成如下:「你可以讓這個Set-UID程序(由root擁有)運行你的代碼而不是/ bin/ls嗎?如果可以的話,你的代碼是否以root權限運行?描述並解釋你的觀察。「

這樣很好。現在我應該用bin/sh或/ bin/bash來做同樣的事情。

的說明逐字地說:「現在,改變/ bin/sh的,使其指向回來爲/ bin/bash中,並重覆上述攻擊」

我已經嘗試了很多的變化對相同的程序。我似乎沒有得到的是如何運行bash。如果我在終端輸入sh,我立即進入該外殼。如果我輸入bash,即使sh是指向bash的鏈接,也不會有任何反應。它似乎可能實際上是打開一個shell,但它看起來完全一樣,而當我運行sh時,我得到一個明顯不同的shell來玩,顯示sh-4.3#而不是通常的root @ ....有可能sh運行給我一個與運行bash不同的結果,當sh只是一個bash的鏈接?我錯過了什麼?

我的意思是,當我重新SH,我只需運行:LN -s慶典SH

我已經試過之類的東西./bash,慶典等什麼我現在有一個是大部分相同程序在那裏我做下面的系統調用:

system("bash"); 

我刪除SH並創建了一個鏈接到我的新節目,shUID,名稱SH下。所以,我想應該發生的是,當我運行sh時,它運行我的程序shUID,它執行系統調用。每當我運行sh時,終端都會鎖定,直到我點擊ctrl + C。

因此,我顯然在尋找我在這裏失蹤的任何東西。我假設我做了以前的問題,涉及ls,但我似乎無法弄清楚這裏發生了什麼。幫助表示讚賞。編輯:我現在已經在實驗室中移動了,並且發現system()實際上調用了/ bin/sh,所以我的問題在這裏似乎是,如果我要替換它並依靠系統調用,這裏有一個問題。我目前不確定如何處理這些信息,但它給了我一些指導。我仍然很感激幫助,但我很快就會與這個新的信息一起玩。

+0

如果您正在運行'bash',然後運行'bash'再次,它*看起來是相同的,因爲兩個實例使用相同的初始化來配置,例如提示。運行'echo $$',然後運行'bash',再次運行'echo $$':你應該看到不同的輸出,因爲'bash'的前一個和當前實例是獨立的進程。 – chepner

回答

2

下面是一些代碼,這將有助於你看到的是一些蘇格拉底的問題發生如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

int 
main(int argc, char **argv) 
{ 
    int i; 
    printf("uid %d gid %d euid %d egid %d\n", getuid(), getgid(), 
     geteuid(), getegid()); 

    printf("argc %d\n", argc); 
    for(i = 0; i < argc; i++) 
     printf("%d: %s\n", i, argv[i]); 

    if (argc >= 2 && (argv[1][0] != '/')) { 
     fprintf(stderr, "missing initial slash\n"); 
     return 2; 
    } 

    if (execv(argv[1], argv+1)) { 
     perror("execve"); 
     return 1; 
    } 
    return 0; 
} 

什麼是UID,什麼是EUID?爲什麼我要檢查文件的絕對路徑名來運行?爲什麼我用execv而不是systembash-p選項有什麼作用?

爲什麼會出現語句:

if (running_setuid && privileged_mode == 0) 
    disable_priv_mode(); 

startup code of bash around line 496?最後,這段代碼是否受到與您練習中的代碼相同的攻擊?

我還沒有顯示這段代碼的編譯步驟,因爲如果你不知道它做了什麼,你不應該構建它。

1

事實上,/ bin/sh不僅僅是在大多數系統上對bash的符號鏈接。注意:

#include <stdio.h> 
int main() 
{ 
    /* if we were using bash this would not fail */ 
    system("type history"); 
    return 0; 
} 

即使這個片段報告變量$SHELL環境作爲bash這的確不是我們使用的shell:(閱讀:這可能會引起混淆)

#include <stdio.h> 
int main() 
{ 
    system("echo $SHELL"); 
    return 0; 
} 

在Debian,FreeBSD的, NetBSD和Ubuntu這將保持真實。事實上,只有少數操作系統使用bash作爲默認的系統shell,其中許多操作系統正在恢復爲POSIX sh的almquist shell衍生產品。

您可能會發現下面的命令有益的,如果你想從bashsystem()使用:

bash -c "ls" 

或者例如:

#include <stdio.h> 
int main() 
{ 
    system("bash -c 'type history'"); 
    return 0; 
}