Использование c-linux setuid и системных команд - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий код в качестве исполняемого файла, который я хочу использовать для курса, чтобы порождать оболочку с повышенными привилегиями.Я пользователь 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;
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В конце концов это был эксплойт строки формата в fprintf(f, entry, NULL); внутри int exec(char *command), где вы перезаписали адрес возврата форматом% n.

0 голосов
/ 22 ноября 2018

Из кода, который вы разместили, похоже, что вы должны записать свой собственный файл sudoers в любой каталог, к которому у вас есть права на запись, а затем запустить эту программу в этом каталоге, чтобы он прочитал ваш файл.

Итак, просто напишите свой собственный UID в этот поддельный файл sudoers, а затем укажите параметр команды, например bash, чтобы получить оболочку.Нет необходимости использовать переполнение буфера.

Предположительно, настоящая эксплуатируемая программа имеет бит suid, установленный в правах доступа к файлу, поэтому она может выполнять вызов setuid(0).Я предполагаю, что целью этого упражнения является демонстрация того, как весь ввод необходимо дезинфицировать, когда вы имеете дело с suid-программами, включая такие вещи, как относительные пути (которые фактически принимают текущий рабочий каталог в качестве ввода), как и любой пользовательскийпредоставленные пути и другие входные данные.


Но, поскольку программа имеет только бит setgid (как сказано в комментарии), вам нужно найти что-то, что вы делаете только с идентификатором группы.Это что-то может быть, что запись в файл журнала.Вы можете создать символическую ссылку с именем файла log, указывающую на любой файл, к которому вы хотите добавить, для которого эта группа имеет права на запись.Кроме того, этот файл должен иметь такой формат, чтобы формат строки журнала не приводил к повреждению файла.Помните, что вы можете помещать символы новой строки и т.д. в аргументы командной строки!

...