Exploiting / PWN

Exploiting или Pwn ("бинарная эксплуатация", "эксплойтинг", "пвн") — это категория задач, в которых, как правило, нужно искать и эксплуатировать уязвимости в скомпилированных приложениях. Чаще всего это уязвимости повреждения памяти (memory corruption).

Эта категория в каком-то смысле противопоставляется категории Web, в которой обычно стоит задача взломать приложение на языке высокого уровня (типа PHP), т.е. всё происходит на уровне интерпретации скрипта, а не на уровне физической памяти. Однако, порой в категорию Pwn включают и приложения на скриптовых языках. Это может быть, к примеру, обход песочницы (jail) на языке Python. Песочницей называют ограниченную среду, в которой разрешены только определённые команды. Целью решения таска обычно является обойти это ограничение и прочитать какую-то конфиденциальную информацию (флаг).

Надо отметить, что в последние годы тематика CTF-соревнований заметно укоренилась именно в области пвна. На топовых соревнованиях задачи зачастую очень сложные, и их решают известные профессионалы, исследователи, разработчики кибероружия. Например, одним из сильнейших пвнеров (и цтферов вообще) является https://en.wikipedia.org/wiki/George_Hotz, активно участвовавший в цтфах в 2013-2014 годах. Сильнейшей командой является команда PPP (Plaid Parliament of Pwning) родом из университета CMU, которая, как нетрудно догадаться, тоже специализируется в пвне.

Ближе к делу.

Наиболее известным и распространённым случаем повреждения памяти является переполнение буфера. Если объяснить в двух словах, переполнение буфера возникает тогда, когда приложение принимает на вход строку и записывает её в некоторую выделенную область памяти (буфер), недостаточно проверяя её длину.

Таким образом, хакер может выйти за границы буфера и переписать какие-то иные участки памяти, в которых могут быть важные данные. Классический способ эксплуатации — это перетирание адреса возврата (return address). Это адрес памяти, на который программа "перепрыгнет" после завершения выполнения текущей функции.

Суть эксплойта в том, что хакер записывает в буфер любой код, который он хочет выполнить, далее выходит за границу буфера и меняет адрес возврата на адрес буфера. Таким образом, после выхода из текущей функции программа перепрыгнет на буфер, и выполнится код, который хакер туда записал.

Обычно в качестве условия задачи даётся бинарник (скомпилированный исполняемый файл программы) и адрес (хост и порт) сервера, на котором этот бинарник висит. Иногда даётся и исходный код приложения. Участнику нужно проанализировать приложение (дизассемблировать, декомпилировать или читать исходный код) и разработать эксплойт, т.е. программу, которая "заставляет" это уязвимое приложение выполнить произвольный код (вызвать шелл). Далее нужно при помощи этого эксплойта заставить сервер организаторов выдать флаг.

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

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

Есть книга Д. Эриксона "Хакинг. Искусство эксплойта" в русском переводе. В ней очень доступно описано введение в эксплуатацию уязвимостей повреждения памяти. Также затронута сетевая безопасность и криптоанализ.

Простые примеры для понимания:

Хорошие ресурсы для тренировки навыков этой категории:


взято с сайта http://itsecwiki.org/