[英]Exploiting c - linux setuid and system commands
我將以下代碼作為可執行文件,希望將其用作課程,以便生成具有提升特權的shell。 我是levelX的用戶,可執行文件的setgid為levelX + 1。 我不允許更改任何代碼。 由於我沒有root權限,因此setguid(0)失敗。 我無法更改函數或主函數的返回地址。 誰能指出正確的方向?
int main (int argc, char** argv)
{
if (exec(argv[1]) != 0)
{
fprintf(stderr, "Cannot execute your command\n");
return -1;
}
return 0;
}
int exec(char *command)
{
FILE *f = NULL;
char entry[64];
char line[256];
f = fopen("log", "a");
if (f == NULL)
{
fprintf(stderr, "Can't open file\n");
return -1;
}
snprintf(entry, 64, "%d: %s\n", getuid(), command);
fprintf(f, entry, NULL);
fclose(f);
f = fopen("sudoers", "r");
if (f == NULL)
{
fprintf(stderr, "Can't open\n");
return -1;
}
while(fgets(line, 256, f) != NULL)
{
if (atoi(line) == getuid())
{
if (setuid(0) == 0) {
system(command);
} else {
fprintf(stderr, "check permissions\n");
}
fclose(f);
return 0;
}
}
fprintf(stderr, "Error\n");
fclose(f);
return -1;
}
從發布的代碼中,您似乎應該將自己的sudoers
文件寫入您具有寫訪問權限的任何目錄,然后在該目錄中運行該程序,以便它讀取您的文件。
因此,只需將您自己的UID寫入此偽造的sudoers
文件中,然后提供命令參數(如bash
即可獲取shell。 無需進行任何緩沖區溢出利用。
大概真正的可利用程序在文件許可權中設置了suid位,因此它可以執行setuid(0)
調用。 我想該練習的目的是演示在處理suid程序時如何清理所有輸入,包括諸如相對路徑(有效地將當前工作目錄作為輸入)之類的東西,例如任何用戶提供的路徑和其他輸入。
但是,由於該程序僅具有setgid位(如注釋中所述),因此您需要僅使用組ID進行查找。 可能是該日志文件寫入了。 您可以使用文件名log
創建一個符號鏈接,指向要添加到該文件組具有寫權限的任何文件。 同樣,該文件需要具有這樣的格式,即日志行格式不會使文件損壞。 請記住,您可以在命令行參數中添加換行符!
畢竟,這是對fprintf(f, entry, NULL);
的格式字符串的利用fprintf(f, entry, NULL);
在int exec(char *command)
,您以%n格式覆蓋返回地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.