Авторская Обход ASLR: как два байта переслать

Talomir

Местный
Местный

Talomir

Местный
Местный
Статус
Offline
Регистрация
20 Мар 2021
Сообщения
17
Лайки
333
ОБХОД ASLR: КАК ДВА БАЙТА ПЕРЕСЛАТЬ
Перепечатка с моего сайта Технологии Боттинга 12


Добрый день, сегодня 13.03.2020, хороший солнечный день после введения в Украине системы управления климатом и тёплой зимы. Два литра витаминизированного энергетика просто обязывают что-то написать на своём сайте, и я решил поделиться откровением: двадцать миллиардов ноутбуков, планшетов и смартфонов не защищены от переполнения буфера - они полностью открыты для взлома и беззащитны. Для кого-то это не окажется откровением, он взламывает компьютеры и сети с девяностых а то и восьмидесятых годов, и ничего нового в этом сообщении для себя не найдёт. Но для не продвинутых юзеров и начинающих хакеров эта страничка окажется очень полезной. С Вами Мистер Таломир, внимательно читаем дальше, как "специалисты" по информационной безопасности вешают нам лапшу о какой-то защищённости компьютерных систем.

Переполнение буфера. Это тип уязвимости, заключающийся в выходе указателя языков C и C++ или индекса массива за размер массива. При записи в такую ячейку памяти, подобрав адрес, можно записать любое число в любой адрес памяти. Этот тип уязвимости массово использовался в девяностые годы, после чего в начале двухтысячных все разработчики операционных систем компьютеров, планшетов и смартфонов вставили в ядро рэндомизацию адресов, называемую ASLR - Address Space Layout Randomization. Более подробно изучить переполнение буфера и методы его эксплуатации шел-кодом можно по статьям хорошего бесплатного журнала Phrack, передаю привет её редакции, если она меня читает. При эксплуатации переполнения буфера в программе пользовательского режима хакер получает пользовательский уровень управления компьютером. При эксплуатации переполнения буфера в привилегированном процессе хакер получает привилегии SYSTEM или root, все административные права в системе. При эксплуатации переполнения буфера в ядре или драйвере системы, хакер получает привилегии режима ядра, нулевого кольца защиты, с полным доступом к сырому диску, оборудованию, памяти ядра и памяти любой программы. Напуганные пусто-трёпами из безопасности, в своё время хакеры испугались анти-эксплоит защиты ASLR и частично перестали пробовать искать переполнения и писать шел-коды и эксплоиты. Теперь ситуация уже меняется!

Address Space Layout Randomization (ASLR). Эта основная современная защита от эксплоитов на самом деле никакой защитой не является. Вернее, она была защитой, пока о ней никто не знал, и защищала она мой студенческий компьютер, от другого студента, живущего в соседней комнате, который был племянником ректора СБУ, и любил совать свой грязный нос в чужие файлы. Каким-то непонятным образом заплатка, написанная под ядро FreeBSD 4.3, и о которой знали только автор и ещё три студента-раздолбая, любящих поговорить о безопасности, попала в FreeBSD.org и Linux.org, в стандартные дистрибутивы операционных систем. Обезумевшие от нормативных документов безопасники увидели в ней панацею и решение всех проблем с хакерами! Усердные попытки улучшить заплатку привели к тому, что сейчас называется ASLR - присвоение случайных начальных адресов сегментам стэка, кода и данных в системном вызове fork или exec во время создания карты памяти процесса. "Гениальный" расчёт "безопасников" основывается на том, что шелкод будет записан в память по случайному адресу и изменяемый хакером адрес возврата на шелкод окажется ложным. К сожалению, гениально это только до стократного повторения мантры повышения интеллекта АИМ, после которой возникшая перед глазами сфера света быстро превращается в чёрную дыру - дыру в безопасности миллиардов компьютеров и телефонов.

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

Стратегия "в число" игры в рулетку. Смысл этой игры состоит в следующем, для тех кто не знаком с ней. Есть поле с 37 числами, от нуля до тридцати-шести. Также, крупье вращает барабан с этими числами и бросает на него шарик. Шарик останавливается на случайном числе, и если оно совпало с числом, на которое Вы поставили фишки - Вы забираете в 36 раз больше, чем поставили. Иначе Вашу ставку забирает крупье.

Итак, вам надо угадать, на каком числе от 0 до 36 остановится шарик. Беспроигрышная система игры состоит в ставке всё время на одно число. Вероятность попасть в него на одном ходе - одна тридцать-седьмая, то есть вы попадаете раз в 37 ходов. Но вы попадаете обычно не на последнем, 37-ом, ходе, а на ходе от 0 - до 36, в среднем - на 18 ходе. Итак, за 18 ходов Вы теряете 18 ставок, потом попадаете и забираете 36 фишек. Ваш выигрыш составляет 36 - 18 = 18 фишек. При отсутствии жульничества со стороны казино, это - беспроигрышная, в среднем, стратегия, с так называемым положительным мат-ожиданием.

Смысл этой стратегии состоит в том, что каждое число рулетки обязательно выпадет. Каждое возможное событие происходит, говоря математическим языком. Если возможно выпадение чисел от 0 до 36, то при большом числе проб выпадет каждое из этих чисел. И число 10, например, тоже. Просто надо достаточно большое число проб - вращений барабана с шариком.

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

Один минус этой стратегии. При непопадании адреса в начало шелкода поток завершиться с исключением, которое возможно перехватят скобки try-catch. Поэтому, в цикл миллиона срывов стека, надо добавить код, перезапускающий поток. Для этого надо изучить эксплуатируемую программу, они сейчас почти все многопоточные, и посмотреть, как запускать поток с переполняемым буфером. Итого, псевдокод алгоритма срыва стека с защитой ASLR выглядит так:

  • while (!success) {
    • trigger_remote_thread_start();
    • send_overflow_shellcode(random_shellcode_address);
    • success = check_success();
  • }
  • connect_to_shell();
Итак, в этой статье популярно раскритикована основная, так называемая, "защита" от переполнения буфера ASLR, и показано, что фактически она ни от чего не защищает. Достаточно вставить оператор цикла в функию посылки шелкода по сети, чтобы элементарно обойти ASLR. С Вами был Таломир Миротал, директор лаборатории Технологии Боттинга 12, искусственный интеллект и радио-хакинг.
 
Сверху