Статья Переполнение буфера и перезапись значения переменных - Изучение методов эксплуатации на примерах, часть 1

Все части переполнение буфера
Следующая часть Переполнение буфера и перезапись переменных к конкретному значению - разработка эксплойтов, часть 2

Доброго времени суток, посетители портала Codeby =) Решил написать цикл статей посвященный эксплуатации бинарных уязвимостей, в народе это называется чёрной магией. В сети есть куча статей и материалов на эту тему, а четкого пути так и не видно... Потому, что надо обладать огромным багажом знаний... Так как же научиться писать эксплойты? Находить 0дей уязвимости, обходить такие защиты, как DEP\ASLR ? Ответ прост нужна практика, практика и еще раз практика, чем мы с вами сейчас и займемся. Я буду вашим проводником.

В сети был такой учебный ресурс, как .

Exploit Exercises предлагает множество виртуальных машин, документацию и задачи, которые пригодятся в изучении повышения привилегий, анализа уязвимостей, разработки эксплойтов, отладки, реверс-инжиниринга и т.д.

Сейчас этот ресурс не доступен, так, как он переехал и доступен теперь по новому .

Начнем мы свой путь в профессию Exploit-Developer с решения различных ExploitMe на образе . Этот образ хорош тем, что в нем вы изучите основы, азы, переполнения буфера, уязвимости форматирования строки, переполнение кучи... А так же в нем отключены защиты подобные DEP и ASLR, чтобы мы могли сконцентрироваться именно на изучении самих уязвимостей и их эксплуатации. Обходить защиты мы будем, но чуть позже, когда наберемся опыта, а пока, что будем качать наш с вами скилл.

И так перейдем к делу, качаем образ виртуальной машины и запускаем его на VirtualBox'e.

Логин и пароль "user"

Самое первое задание это .

Описание ExploitMe
Этот уровень вводит в концепцию, что доступ к памяти может осуществляться за пределами выделенной области, как размещаются переменные стека, и что изменение за пределами выделенной памяти может изменить выполнение программы.

Переходим в каталог с заданием
cd /opt/protostar/bin/


Исходный код
C:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];

  modified = 0;
  gets(buffer);

  if(modified != 0) {
      printf("you have changed the 'modified' variable\n");
  } else {
      printf("Try again?\n");
  }
}
Решение
Тут всё стандартно, за исключением того, что в коде присутствует ключевое слово volatile. Сказал бы я, но... Рассмотрим более подробно, что представляет из себя переполнение буфера, что это за тип уязвимости такой... Поэтому начнем с разбора исходного кода программы.

Ключевое слово volatile информирует компилятор, что значение переменной может меняться извне. Это может произойти под управлением операционной системы, аппаратных средств или другого потока. Поскольку значение может измениться, компилятор каждый раз загружает его из памяти.

Посмотрим еще раз на исходный код программы, видим, что есть буфер в 64 байта, в этот буфер будет записана строка посредством функции gets().

Посмотрим описание функции.

Функция gets считывает строку из стандартного потока ввода (stdin) и помещает ее в массив указанный аргументом. Чтение строки производится пока не будет встречен символ «переход на новую строку», или не будет достигнут конец файла.

Если чтение строки завершилось по считыванию символа «переход на новую строку», то символ «переход на новую строку» не записывается в массив, а заменяется символом «конец строки»

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

Вернемся к исходному коду и посмотрим на условие в программе. Если переменная modified не равняется нулю тогда печатается текст «you have changed the ‘modified’ variable», иначе «Try again?».

Переменная modified установлена со значением ноль, поэтому всегда будет печататься текст «Try again?».

Если мы запустим программу и передадим, ей строку типа "ААААBBBCCCC" то ничего не произойдет, а если передадим строку большего размера, чем указано в буфере "...AAAABBBBCCCCDDDD" то мы перезапишем переменную. Посмотрите на диаграмму ниже. В памяти в стеке это будет выглядеть примерно так.

27192



Исходя из того, что modified равен нулю, нам надо её изменить, что мы и сделаем. Используем буфер, функцию gets и volatile. Просто передадим в буфер строку не 64 байта, как положено, а 65, чтобы перезаписать значение переменной modified. Чтобы не вводить вручную данные, воспользуемся python’ом и перенаправим вывод в нашу программу.

python -c "print 'A' * 65" | ./stack0

Отлично, переменная перезаписана, а на экране отображается текст «you have changed the ‘modified’ variable», цель достигнута! Когда будете работать над очередным переполнением буфера, важно понимать, где и как находятся данные в стеке, поэтому вспоминайте эту диаграмму. В этом ExploitMe мы научились перезаписывать значение переменной, используя уязвимость переполнения буфера, теперь можно смело переходить на следующий уровень - .
 

fuzzz

Green Team
03.02.2019
249
470
BIT
2
В середине статьи мой мозг уже выключился. Впервые пытаюсь понять вопрос переполнения буфера. Подскажите пожалуйста. Что можно прочитать в качестве базы, чтобы понимать, где перепрлнять буфер нужно. Я кроме кода ничего не понял. Совсем зелёный видимо в этом вопросе. Например, каталог с заданием необходимо искать искать в установленной и запущенной виртуальной машине? Для чего этот код необходим?
Спасибо!
Почитать можно книжку хакинг - искусство эксплойта. Там есть базовая информация по эксплойтостроению.
Пример выполняется в специализированный VM, в каталоге /opt/protostar/bin/ находятся все примеры - задачки. Что делает код? да собственно ничего такого особенного. Он принимает ввод с клавиатуры и печатает две строки. Нужно это для понимания, того, что мы можешь повлиять на код, записать какие-то данные и тд. Если вам интересно советую почитать книгу.
 
Последнее редактирование:
  • Нравится
Реакции: JackRussell

KiberAngel

Green Team
25.01.2020
29
17
BIT
0
Извиняюсь за возможно туповатый вопрос : после практической отработки вашего цикла статей , у меня сложиться представление и будет ли возможность создать эксплойт удалённого выполнения произвольного кода на атакуемой машине ?
К примеру я смогу создать эксплойт (скрипт) на php или на JavaScript ( имею познания этих языков ) для браузеров ? Или возможно для месенжеров .
PS: очень хочется прочесть статью про написание exploit-а удаленного выполнения произвольного кота на OS: Windows через любой браузер !
 
Последнее редактирование:

fuzzz

Green Team
03.02.2019
249
470
BIT
2
Извиняюсь за возможно туповатый вопрос : после практической отработки вашего цикла статей , у меня сложиться представление и будет ли возможность создать эксплойт удалённого выполнения произвольного кода на атакуемой машине ?
К примеру я смогу создать эксплойт (скрипт) на php или на JavaScript ( имею познания этих языков ) для браузеров ? Или возможно для месенжеров .
PS: очень хочется прочесть статью про написание exploit-а удаленного выполнения произвольного кота на OS: Windows через любой браузер !
Смотри суть вот в чем. На VM Protostar отрабатываются так сказать основы азы. + Читается книга "Хакинг - искусство эксплойта". К примеру у Azeria-Lab там те же примеры с протостара, но откомпилированы они на ARM (это для тех кто хочет заниматься Android, iOS). Дальше когда ты понимаешь уже как строятся payload'ы, понимаешь, что можно вот это дело все перезаписывать, указатели, переменные, объекты и прочее (На интуитивном уровне и тд). Нужно выбирать уже таргет на котором ты будешь специализироваться (Chrome, Windows Kernel etc...) . Сейчас эксплуатация бинарных уязвимостей по сути состоит из двух вещей: ядро и браузер. В случае браузера тут надо изучать строение движков этих браузеров. Эти самые движки пишутся на С++. А сам код эксплойта будет на js. При чем уязвимости в браузерах живут от недели до месяца. Может быть даже такое, что ты найдешь уязвимость которая будет приводит к RCE, но у тебя код не выполнится, так все браузеры оснащены песочницей (sandbox), тут тебе на помощь уже прийдет Kernel эксплуатация. Нынешние реалии заключаются в том, что нужен не один эксплойт, а цепочка эксплойтов. Это браузер + ядреный сплойт который поможет выйти из песочницы.

Какой из всего вывод?
После протостара нужно идти либо JavaScript-engines либо драйверы\ядро
 

MichailSolov

New member
18.02.2020
1
0
BIT
0
Смотри суть вот в чем. На VM Protostar отрабатываются так сказать основы азы. + Читается книга "Хакинг - искусство эксплойта". К примеру у Azeria-Lab там те же примеры с протостара, но откомпилированы они на ARM (это для тех кто хочет заниматься Android, iOS). Дальше когда ты понимаешь уже как строятся payload'ы, понимаешь, что можно вот это дело все перезаписывать, указатели, переменные, объекты и прочее (На интуитивном уровне и тд). Нужно выбирать уже таргет на котором ты будешь специализироваться (Chrome, Windows Kernel etc...) . Сейчас эксплуатация бинарных уязвимостей по сути состоит из двух вещей: ядро и браузер. В случае браузера тут надо изучать строение движков этих браузеров. Эти самые движки пишутся на С++. А сам код эксплойта будет на js. При чем уязвимости в браузерах живут от недели до месяца. Может быть даже такое, что ты найдешь уязвимость которая будет приводит к RCE, но у тебя код не выполнится, так все браузеры оснащены песочницей (sandbox), тут тебе на помощь уже прийдет Kernel эксплуатация. Нынешние реалии заключаются в том, что нужен не один эксплойт, а цепочка эксплойтов. Это браузер + ядреный сплойт который поможет выйти из песочницы.

Какой из всего вывод?
После протостара нужно идти либо JavaScript-engines либо драйверы
Привет) Написал в лс, игноришь, пж ответь))
 

B13

Заблокирован
01.01.2020
412
55
BIT
134
В середине статьи мой мозг уже выключился. Впервые пытаюсь понять вопрос переполнения буфера. Подскажите пожалуйста. Что можно прочитать в качестве базы, чтобы понимать, где перепрлнять буфер нужно. Я кроме кода ничего не понял. Совсем зелёный видимо в этом вопросе. Например, каталог с заданием необходимо искать искать в установленной и запущенной виртуальной машине? Для чего этот код необходим?
Спасибо!
можно попробовать почитать вот это.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!