Если вы читаете брифинги по безопасности, вы каждое утро просыпаетесь и обнаруживаете уязвимости «переполнения буфера», эксплойты «потока управления», спланированные атаки на определенные версии кода и многое другое.

Большинство этих описаний мягкие и сухие. Более того, многое из этого не имеет интуитивного смысла, у каждого есть своя прихоть недели, и легко разочароваться. Что реально, а что такое техно-болтовня? Разве мы не просто заплатили за брандмауэры и развернули бесконечный поток исправлений? Что за ерунда с машинным кодом?

У меня всегда были проблемы с нашей отраслью: первое, что мы придумываем, - это архитектурные башни из слоновой кости. Мы пытаемся вылечить рак в первый же день, а затем через несколько лет мы продали бы свою душу, чтобы иметь возможность надежно сложить два числа. (Да, я все еще держу обиду на UML, CORBA, SOAP, WSDL и, черт возьми, на DTD!)

Давайте пропустим все это и начнем с создания настоящей атаки визуально и в интерактивном режиме! Больше никаких понятий. Нет больше теории. Больше никаких описаний макетов, стопок и куч наборов инструкций! Следуйте за либеральными скриншотами! Готовьтесь! Это настолько красочно, насколько вообще могут быть двоичные файлы!

Давай немного поиграем в атакующего

Введение в инструменты

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

Https://analyze.polyverse.com

(Исходный код здесь: https://github.com/Polyverse/binary-entropy-visualizer)

Теперь вы можете перетащить туда файл, чтобы проанализировать его - да, эта веб-страница будет делать то, что на вашем рабочем столе должны делать продвинутые инструменты для придурковатых ботаников. На данный момент он поддерживает только 64-битные двоичные файлы Linux. Не смотрите слишком внимательно, в моем репозитории на github есть два образца: https://github.com/polyverse/binary-entropy-visualizer/tree/master/samples. Просто скачайте любой из файлов с расширением .so.

Когда вы бросите его туда, он должен показать вам индикатор выполнения с некоторым анализом ...

Если вы хотите знать, что он делает, нажмите на индикатор выполнения, чтобы увидеть полный журнал предпринятых действий.

Когда анализ будет завершен, вы должны увидеть таблицу. Это таблица Устройства ROP. Вы наблюдаете в своем браузере в реальном времени анализ того, что люди с шестью экранами в темных комнатах запускают со сложными командными строками и специальными программами.

Мы не будем вдаваться в подробности, что такое ROP-гаджеты, что делает их гаджетами и так далее. Любой, кто когда-либо проходил программирование 101, узнает в нем код языка ассемблера - еще одну действительно забавную вещь, которая всегда преподносится как сухая и раздражающая. Это тоже повсюду.

Что такое эксплойт?

Выполнение нежелательных инструкций

В соответствии с модой моих святых покровителей, МакГайвера (старого) и Разрушителей мифов, я не собираюсь вдаваться в подробности, как вы обнаруживаете переполнение буфера и вставляете материал в стек и так далее. Прости. Множество онлайн-курсов, чтобы узнать, как это сделать, или вы можете посетить Defcon.

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

Давайте просто согласимся с тем, что «эксплойт» - это набор команд, которые вы отправляете компьютеру, чтобы делать то, что вы (злоумышленник) хотите, но чего-то определенно не хочет владелец / разработчик / администратор (жертва). Независимо от того, под каким именем называется эксплойт, в конечном итоге все сводится к выполнению инструкций, которые хочет злоумышленник, а жертва - нет. Что делает кража / взлом пароля? Разрешить казнь. Что делает вирус? Выполняет инструкции. Что делает SQL-инъекция? Выполняет инструкции SQL.

Помните: выполнение нежелательных инструкций - это плохо.

Всегда знай, чего хочешь

Нам нужен конкретный набор инструкций, приведенный ниже.

Хорошо, теперь давайте создадим эксплойт. Мы собираемся смоделировать это. Все в браузере.

Допустим, по совершенно произвольным причинам выполнение следующих инструкций может привести к чему-то плохому. WOPR начинает игру. Поверьте, это никому не нужно! Вам не обязательно разбираться в ассемблерном коде. По вашему мнению, следующее должно быть переведено как « Позже. Давай поиграем в Глобальную термоядерную войну .

jbe 0x46c18 ; nop ; mov rax, rsi ; pop rbx ;
add byte ptr [rax], al ; add bl, ch ; cmpsb byte ptr [rsi], byte ptr [rdi] ; call rax
and al, 0xf8 ;
mov ecx, edx ; cmp rdx, rcx ; je 0x12cb78 ;
jne 0x1668e0 ; add rsp, 8 ; pop rbx ; pop rbp ;
sub bl, bh ; jmp qword ptr [rax]
add byte ptr [r8–0x77], r9b ; fimul dword ptr [rax — 0x77] ;
or byte ptr [rdi], 0x94 ;
push r15 ; in eax, dx ; jmp qword ptr [rdx]
jg 0x95257 ; jne 0x95828 ;
jb 0x146d9a ; movaps xmmword ptr [rdi], xmm4 ; jmp r9
or byte ptr [rdx], al ; add ah, dl ; div dh ; call rsp
jg 0x97acb ; movdqu xmmword ptr [rdi + 0x10], xmm2 ;
or dword ptr [rax], eax ; add byte ptr [rax], al ; add byte ptr [rax], al ;
add byte ptr [rax], al ; enter 8, 0 ;
xor ch, ch ; mov byte ptr [rdi + 0x1a], ch ;

Так как же нам это сделать? Наиболее эффективные способы сделать это - использовать социальную инженерию, подводную охоту, угадывание паролей и т. Д. И т. Д. Это также способы, которые оставляют следы. Они эффективны и прямолинейны, и при наличии достаточного количества данных их поймают. Также посмотрите на этот код. Как только кто-то выясняет, что этот набор инструкций вызывает плохие вещи, легко сгенерировать подпись, чтобы найти любые биты кода, которые ей соответствуют, и предотвратить его выполнение.

Но я бы не стал писать этот пост, если бы на этом все было кончено.

Тот факт, что вы не можете внедрить этот код другими методами, не означает, что вы не можете внедрить код, который вызовет выполнение этой серии инструкций. AI / аналитика / машинное обучение: у всех есть один большой недостаток - тест Тьюринга.

Программа не является вредоносной, потому что у нее «плохие инструкции». Не бывает плохих инструкций. Почему процессоры, машины, серверы и телефоны поставляются с «плохими инструкциями»? Нет, неверная последовательность инструкций!

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

Как получить желаемое

Теперь вернитесь к инструменту, если вы его еще не закрыли. Воспользуйтесь файлом libc-2.17.so из примеров и загрузите его.

Затем введите эту последовательность чисел в небольшое текстовое поле под надписью «Выполнение цепочки ROP:»

46c1c 7ac3f 46947 12cb5f 166900 183139 cfdcb 12f7ea 191614 95236 146d8a 1889ad 97abb 4392 17390e 98878

Это должно выглядеть примерно так:

Идите вперед и выполните цепочку.

Угадай, что? Точное совпадение с моей инструкцией по активации WOPR!

Библиотека libc, которую вы только что проанализировали, является фундаментальной и фундаментальной библиотекой, связанной практически с любой программой на хосте Linux. Он проверен, подтвержден и исправлен. Каждая из этих инструкций является хорошей инструкцией, одобренной и проверенной производителем процессора, создателем компилятора, менеджером пакетов вплоть до вашего системного администратора.

Что такое НАСТОЯЩАЯ последовательность неверных инструкций?

pop rdi, pop rsi, pop rdx и смещение mprotect - все, что нужно!

Я составил последовательность выше. В полном отходе от условностей я сделал его более сложным, чтобы оно выглядело круто. Настоящие эксплойты требуют таких простых гаджетов, что вы подумаете, что я придумываю эту часть!

Реально известный опасный эксплойт, который мы (смоделировали) в нашей лаборатории, требует только трех местоположений ROP-устройств и смещения mprotect в libc. Мы можем удаленно победить ASLR за секунды, и как только мы вызовем mprotect, мы сможем сделать исполняемым все что угодно.

Вы можете увидеть, насколько просто найти гаджет и создать собственную цепочку для:
pop rdi ; ret
pop rsi ; ret
pop rdx ; ret

Это показывает, как простые эксплойты прячутся за громоздкими инструментами, создавая иллюзию сложности или сложности.

Создавайте свои собственные настоящие серьезные полезные нагрузки

Так почему же этот анализатор ROP так важен? Если вы не сложили два и два, эксплойт обычно работает следующим образом:

  1. Вы понимаете, чего хотите (мы рассмотрели этот шаг выше).
  2. Вам нужно выяснить последовательность групп инструкций, каждая из которых заканчивается каким-то переходом / возвратом / вызовом, который вы можете использовать для получения промежуточных инструкций между выполнением.

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

Этот инструмент экспортирует эти небольшие группы инструкций (называемые гаджетами) из двоичных файлов, которые вы ему скармливаете. Затем вы можете решить, какие устройства в какой последовательности будут достигать вашей цели.

Это сложная вычислительная задача, которую я сегодня не решу.

Обращайте внимание на Часть 2 моего сообщения, которая будет посвящена тому, для чего предназначен другой диалог Сравнить файл… следите за обновлениями! Во всяком случае, это мертвенно тривиально, так что делайте это, если хотите.