簡體   English   中英

利用C-Linux setuid和系統命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM