SET-UID程序漏洞實驗

20125102

一、實驗描述

Set-UID 是Unix系統中的一個重要的安全機制。當一個Set-UID程序運行的時候,它被假設為具有擁有者的權限。例如,如果程序的擁有者是root,那么任何人運行這個程序時都會獲得程序擁有者的權限。Set-UID允許我們做許多很有趣的事情,但是不幸的是,它也是很多壞事情的罪魁禍首。

因此本次實驗的目標有兩點:

1.欣賞好的方面,理解為什么Set-UID是需要的,以及它是如何被執行的。

2.注意壞的方面,理解它潛在的安全性問題。

二、實驗內容

這是一個探索性的實驗,你的任務是在Linux環境中和Set-UID機制”玩游戲“,你需要在Linux中完成接下來的實驗任務:

2.1 猜測為什么“passwd”,“chsh”,“su”,和“sudo”命令需要Set-UID機制,如果它們沒有這些機制的話,會發生什么,如果你不熟悉這些程序,你可以通話閱讀使用手冊來熟悉它們,如果你拷貝這些命令到自己的目錄下,這些程序就不會是Set-UID程序,運行這些拷貝的程序,觀察將會發生什么。

從上面的截圖可以看出:將passwd拷貝到/tmp/下,權限發生了變化(在原目錄下suid位被設置),復件沒有了修改密碼的權限。

對于“chsh”,“su”,和“sudo”命令,把這些程序拷貝到用戶目錄下,同樣不再具有root權限。

2.2 在linux環境下運行Set-UID 程序,同時描述并且解釋你的觀察結果

2.2.1 以root方式登錄,拷貝/bin/zsh 到/tmp, 同時設置拷貝到tmp目錄下的zsh為set-uid root權限,然后以普通用戶登錄,運行/tmp/zsh。你會得到root權限嗎?請描述你的結果

2.2.2 拷貝/bin/bash到/tmp目錄,同時設置/tmp目錄下的bash為Set-UID root權限,然后以普通用戶登錄,運行/tmp/bash。你會得到root權限嗎?請描述你的結果。

2.3 從上面步驟可以看出,/bin/bash有某種內在的保護機制可以阻止Set-UID機制的濫用。為了能夠體驗這種內在的保護機制出現之前的情形,我們打算使用另外一種shell程序——/bin/zsh。在一些linux的發行版中(比如Redora和Ubuntu),/bin/sh實際上是/bin/bash的符號鏈接。為了使用zsh,我們需要把/bin/sh鏈接到/bin/zsh

2.4 PATH環境變量的設置

system(const char * cmd)系統調用函數被內嵌到一個程序中執行一個命令,system()調用/bin/sh來執行shell程序,然后shell程序去執行cmd命令。但是在一個Set-UID程序中system()函數調用shell是非常危險的,這是因為shell程序的行為可以被環境變量影響,比如PATH;而這些環境變量可以在用戶的控制當中。通過控制這些變量,用心險惡的用戶就可以控制Set-UID程序的行為。

下面的Set-UID程序被用來執行/bin/ls命令;然后程序員可以為ls命令使用相對路徑,而不是絕對路徑。

2.4.1 你能夠設置這個Set-UID程序運行你自己的代碼而不是/bin/ls嗎?如果你能的話,你的代碼具有root權限嗎?描述并解釋你的觀察。

可以具有root權限,把/bin/sh拷貝到/tmp目錄下面重命名為ls(先要確保/bin/目錄下的sh 符號鏈接到zsh,而不是bash),將環境變量PATH設置為當前目錄/tmp,運行編譯的程序test。就可以獲得root權限:

?

2.4.2 修改/bin/sh使得其返回到/bin/bash,重復上面的攻擊,你仍然可以獲得root權限嗎?描述并解釋你的觀察。

2.5 sytem()和execve()的不同

首先確保/bin/sh指向zsh

背景:Bob在為一家審計代理處工作,他正在調查一家公司是否存在詐騙行為。為了這個目的,他需要閱讀這家公司在Unix系統中的所有文件;另一方面,為了保護系統的可靠性,他不能修改任何一個文件。為了達到這個目的,Vince——系統的超級用戶為他寫了一個SET-ROOT-UID程序,并且給了Bob可以執行它的權限。這個程序需要Bob在命令行中打出一個文件名,然后運行/bin/cat命令顯示這個文件。既然這個程序是以root權限運行的,它就可以顯示Bob想看的任何一個文件。然而,既然這個程序沒有寫操作,Vince很確信Bob不能用這個程序修改任何文件

2.5.1 程序中有 q=0。程序會使用system()調用命令行。這個命令安全碼?如果你是Bob,你能對系統的完整性妥協嗎?你能重新移動一個對你沒有寫權限的文件嗎?

這個命令不安全,Bob可能會出于好奇或者個人利益驅使閱讀或者修改只有root用戶才可以運行的一些文件。比如截圖中:file文件只有root用戶有讀寫權限,但普通用戶通過運行該程序,閱讀并重命名了file文件:

2.5.2 如果令q=1;剛才的攻擊還會有效嗎?請描述并解釋你的觀察。

修改為q=1后,不會有效。前面步驟之所以有效,是因為system()函數調用/bin/sh,鏈接至zsh,具有root權限執行了cat file文件后,接著執行mv file file_new命令。

而當令q=1, execve()函數會把file; mv file file_new 看成是一個文件名,系統會提示不存在這個文件

2.6 LD_PRELOAD環境變量

為了保證Set-UID程序在LD_PRELOAD環境的操縱下是安全的,動態鏈接器會忽略環境變量,但是在某些條件下是例外的,在下面的任務中,我們猜測這些特殊的條件到底是什么。

2.6.1 把myprog編譯成一個普通用戶下的程序在普通用戶下運行

可見,它會使用LD_PRELOAD環境變量,重載sleep函數:

2.6.2 把myprog編譯成一個Set-UID root的程序在普通用戶下運行

在這種情況下,忽略LD_PRELOAD環境變量,不重載sleep函數,使用系統自帶的sleep函數:

2.6.3 把myprog編譯成一個Set-UID root的程序在root下運行

在這種情況下,使用LD_PRELOAD環境變量,使用重載的sleep函數

2.6.4在一個普通用戶下把myprog編譯成一個Set-UID 普通用戶的程序在另一個普通用戶下運行

在這種情況下,不會重載sleep函數:

由以上四種情況可見:只有用戶自己創建的程序自己去運行,才會使用LD_PRELOAD環境變量,重載sleep函數,否則的話忽略LD_PRELOAD環境變量,不會重載sleep函數。

2.7 消除和清理特權

為了更加安全,Set-UID程序通常會調用setuid()系統調用函數永久的清除它們的root權限。然而有些時候,這樣做是遠遠不夠的。在root用戶下,在/tmp目錄新建一個空文件zzz。在root用戶下將下面代碼命名為test.c,放在/tmp目錄下,編譯這個程序,給這個程序設置root權限。在一個普通的用戶下,運行這個程序。描述你所觀察到的情況,/tmp/zzz這個文件會被修改嗎?解釋你的觀察。

三、實驗遇到的問題

1、在第2.6.4步驟時,我遇到了更改myprog的權限不夠的問題

2、實驗要求攻擊完之后zzz文件里會有數據,但是自己操作的時候攻擊失敗了

四、實驗體會

? Set-UID?是Unix系統中的一個重要的安全機制。當一個Set-UID程序運行的時候,它被假設為具有擁有者的權限。例如,如果程序的擁有者是root,那么任何人運行這個程序時都會獲得程序擁有者的權限。Set-UID允許我們做許多很有趣的事情,但是不幸的是,它也是很多壞事情的罪魁禍首

??在本實驗中,由2.1及2.2步驟可以看出,/bin/bash有某種內在的保護機制可以阻止Set-UID機制的濫用,在2.3到2.5步驟可以發現,/bin/目錄下的sh?符號鏈接到zsh,將環境變量PATH設置為當前目錄/tmp,運行編譯的程序test,就可以獲得root權限,若修改sh連接回bash,運行test程序不能使普通用戶獲得root權限。

由步驟2.6可知道,只有用戶自己創建的程序自己去運行,才會使用LD_PRELOAD環境變量,重載sleep函數,否則的話忽略LD_PRELOAD環境變量,不會重載sleep函數。今后我一定會更加努力的學習linux相關知識,爭取對它有更好的掌握。

轉載于:https://www.cnblogs.com/20125102wzy/p/4485525.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

統計文件中有多少個單詞amp;c語言實現

假設文件中的單詞都是字母的組合&#xff0c;且單詞間用空格或者“."區分。實驗環境&#xff1a;Dev-C#include<stdio.h> #include<stdlib.h>int main(){FILE *fp;int i;int fr;long fsize;int word0;int sum0;char filename[20];char *buffer;printf("要…

oracle mul,匯編語言乘指令 MUL、IMUL的具體使用

MUL: 無符號乘;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX當乘積的高半部分(AH、DX、EDX、RDX)中存有結…

java實驗二

課程&#xff1a;Java程序設計 班級&#xff1a; 1352 姓名&#xff1a;黃衛   學號&#xff1a;20135221 成績&#xff1a; 指導教師&#xff1a;婁嘉鵬 實驗日期&#xff1a;2015.05.05 實驗密級&#xff1a; 預…

兩數之和c語言實現

題目描述&#xff1a;給定一個整數數組和一個目標值&#xff0c;找出數組中和為目標值的兩個數。你可以假設每個輸入只對應一種答案&#xff0c;且同樣的元素不能被重復利用。示例:給定 nums [2, 7, 11, 15], target 9因為 nums[0] nums[1] 2 7 9 所以返回 [0, 1]解題思路…

【Linux】正確的關機方法

1&#xff09;shutdown命令 我們較常使用的是shutdown這個命令&#xff0c;這個命令可以安全地關閉或重啟Linux系統&#xff0c;它在系統關閉之前給系統上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個時間參數&#xff0c;可以是一個精確的時間&#xff0c;也可以…

oracle 存儲過程寫文件,Oracle寫本地文件

Oracle寫本地文件是指寫到運行Oracle的主機上&#xff0c;而不是運行該腳本的機器上。說起來有點拗口&#xff0c;實際上就是無論在哪里執行這個過程&#xff0c;生成的文件始終都是在服務器上的。下面過程實現了這個功能&#xff1a;logdir是指文件存放路徑。有Oracle的direct…

兩數相加c語言實現

給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲&#xff0c;它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。你可以假設除了數字 0 之外&#xff0c;這兩個數字都不會以零開頭。示例&#xff1a;輸入&#xff1a;(2 -> 4 -> 3) (5 -> 6 -&g…

jQuery獲取Select選擇的Text和Value

一、 jQuery獲取Select選擇的Text和Value:語法解釋&#xff1a; $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項時觸發varcheckText$("#select_id").find("option:selected").tex…

jquery實現導航欄鼠標點擊后實行背景高亮,點擊離開恢復(超級簡單!!!!)...

昨天才寫了一個方法&#xff0c;今天發現一個更簡單的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么處理binray文件,Linux下如何反匯編arm raw binary文件

有一個arm elf文件經過objcopy -O binary 命令處理生成bin文件進行反匯編:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty連虛擬機中Linux出現Access Denied

環境&#xff1a;VMwarekali Linux出現這個問題&#xff0c;肯定是你想嘗試直接通過使用root賬戶連接你的linux&#xff0c;這樣肯定是不行的&#xff0c;why&#xff1f;為了保證服務器安全&#xff0c;幾乎所有的服務器都禁止了超級用戶直接登錄系統&#xff0c;而是通過普通…

Floyd算法應用-醫院選址問題

1)問題描述 n個村莊之間的交通圖可以用有向網圖來表示&#xff0c;圖中邊<vi, vj>上的權值表示從村莊i到村莊j的道路長度。現在要從這n個村莊中選擇一個村莊新建一所醫院&#xff0c;問這所醫院應建在哪個村莊&#xff0c;才能使所有的村莊離醫院都比較近&#xff1f; 2)…

linux ls 命令排序,如何在Linux中使用ls命令按大小對所有文件進行排序

ls命令是列出目錄內容的最流行且非常有用的命令。 在本文中&#xff0c;我們將解釋如何使用ls sort選項按大小列出目錄內容。1)按大小列出目錄中的文件(排序)要列出具有大小排序的特定目錄的內容&#xff0c;我們將使用-lS選項和ls命令。 它將在頂部顯示最大的文件。[linuxidcl…

C?#?獲?取?當?前?時?間?的?各?種?格?式

C#獲取當前時間的各種格式 DateTime.Now.ToShortTimeString() DateTime dt DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString();//127756416859912816 dt.ToFileTimeUtc().ToString();//127756704859912816 dt.ToLocalTime().ToString(…

基于tcp connect的端口掃描程序

原理&#xff1a;connect()函數用于對于每一個感興趣的目標計算機的端口進行連接&#xff0c;如果該端口處于偵聽狀態&#xff0c;那么connect()就會成功&#xff0c;即沒有提供服務。如果對于每一個目標端口以串行的方式使用單獨的connect()調用&#xff0c;需要較長的時間&am…

UIScrollView

一、UIScrollView 1.常見屬性 property(nonatomic) CGPoint contentOffset; // 記錄UIScrollView滾動的位置 property(nonatomic) CGSize contentSize; // 內容尺寸&#xff08;能滾動的范圍&#xff09; property(nonatomic) UIEdgeInsets contentInset; // 額外增加的滾動區域…

linux如何運行多個硬盤,一個硬盤如何裝兩個Linux

1個硬盤已安裝Fedora 8 Linux系統&#xff0c;并安裝grub引導管理程序&#xff0c;現要在這個硬盤的空閑分區中安裝Fedora 9&#xff0c;操作如下&#xff1a;1.將Fedora-9-i386-DVD.iso文件放到一個Windows Fat32分區((hd0,4))的根目錄&#xff0c;將這個iso文件中的isolinux目…

APIO2015 醬油記

Day 0 昨天CTSC才比完&#xff0c;當然是要浪啦&#xff01; 于是浪了一天。。。午飯都沒吃。。。 晚飯。。。貌似也沒吃。。。 晚上的時候覺得這樣子浪不太好&#xff0c;還是要認真一下&#xff0c;打開bzoj&#xff0c;棄療了。。。還是浪吧。。。 Day 1 今天要講課&#xf…

宏定義 #define 和常量 const 的區別

學習筆記&#xff01;參考鏈接 一、類型和安全檢查不同宏定義是字符替換&#xff0c;沒有數據類型的區別&#xff0c;同時這種替換沒有類型安全檢查&#xff0c;可能產生邊際效應等錯誤&#xff1b;const常量是常量的聲明&#xff0c;有類型區別&#xff0c;需要在編譯階段進行…

【ibus】設置ibus輸入法(pinyin sunpinyin)

設置ibus-pinyin 在終端中運行 /usr/lib/ibus-pinyin/ibus-setup-pinyin命令可以調出ibus的完整設置對話框 設置ibus-sunpinyin 可以執行ibus-sunpinyin自帶的python設置腳本ibus-setup-sunpinyin來全面設置它 : $ /usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin 如果執行此腳…