2015_лекции / Переполнение буфера
.pdfИспользование переполнения буфера
1.для определения нахождения кучи в адресном пространстве Apache;
2.для вставки shell-кода и буфера;
Причины
1.буфер с shell-код, должен иметь абсолютный адрес, что практически недостижимо, если его располагать в динамически выделяемой памяти
2.при переполнении буфера затирается также информация об используемом шифре при соединении, и сессия будет быстро завершена
Получение адреса кучи (1ое использование
переполнения буфера)
1.Червь посылает 56 байт для переполнения key_arg[], в результате перезаписывается память,
выделенная под session_id[] и session_id_length
2.Червь высылает сообщение «client finished».
3.Сервер отвечает «server finished» и высылает в том числе session_id[].
Вставка shell-кода(2ое переполнение буфера)
3 этапа вставки shell-кода
1.Повреждение структуры с управляющей информацией о куче
2.Изменение библиотеки free(), чтобы прописать адрес GOT
3.Вызов повтор free() для передачи управления shell-коду
Вставка shell-кода(2ое переполнение буфера)
1. Slapper → специальный буфер:
данные, |
Числовые поля ← «А» |
перезаписывающие |
Указатели ← NULL |
структуру |
Кроме cipher, взятый из предыдщей сессии |
SSL_SESSION |
|
|
|
24 байт специально |
Перезаписывают служебную информацию об управлении |
подобранного кода |
кучей: |
|
Размер выделяемого блока := минимально возможный |
|
Указатель на следующий блок := адрес функции free() в |
|
таблице GOT – 12 |
|
Указатель на предыдущий блок := адрес shell-кода + 16 |
|
адрес shell-кода = адрес поля шифрования из 1-ой фазы |
|
атаки |
|
16 байт - размер содержимого фальшивого блока + |
|
служебная информация |
|
|
124 байт shell-кода |
|
|
|
Вставка shell-кода(2ое переполнение буфера)
1.Slapper → “client finished”
2.сервер → SSL_SESSION_free() → free() из glibc, в
качестве аргумента передаётся указатель на структуру SSL_SESSION.
Результат: в таблице GOT на месте записи функции free() адрес shell-кода
Функциональная нагрузка shell-кода
поиск TCP соединения с атакующей машиной (сравнение getpeername() со значением прошитым в shell-коде;
загрузки «тела» червя с определённого сервера в закодированной форме;
расшифровка кода червя;
компиляция;
запуск.
Операции выполняются в папке /tmp под именами
*uubugtraq
*bugtraq.c
*bugtraq
Функциональность червя:
подключение к UDP-порту для организации P2P сети;
рассылает широковещательно адрес нового зараженного червя;
поиск уязвимых машин, случайно меняя адреса класс В-сетей;
используемый протокол, построенный на основе UDP для обеспечения надежности использует:
контрольные суммы (1)
номера последовательностей (2)
пакеты подтверждениями (3).
Трудности, возникающие при создании шелл-кода:
строковые переполняющиеся буфера не позволяют внедрять символ нуля в середину буфера и препятствуют вводу некоторых символов, которые программа интерпретирует особым образом;
размер переполняющихся буферов обычно очень мал для вмещения в них даже простейшего загрузчика или затирания сколь ни будь значимых структур данных;
абсолютный адрес переполняющегося буфера атакующему чаще всего неизвестен, поэтому приходится оперировать относительными адресами, что очень непросто с технической точки зрения;
адреса системных и библиотечных функций меняются от одной операционной системы к другой – это раз. ни на какие адреса уязвимой программы так же нельзя закладываться, поскольку они непостоянны;
наконец, от атакующего требуется глубокое значение команд процессора, архитектуры операционной системы, особенности различных компиляторов языка.
Переполнение буфера: чтение секретных переменных
CVE-2014-0160
пакет OpenSSL 1.0.1 (до OpenSSL 1.0.1g )
реализация протоколов TLS /DTLS
расширение Heartbeat
Результат атаки
доступ к
•секретным ключам,
•именам и паролям пользователей и
•сертификатам X.509
• всему контенту, который должен передаваться в зашифрованном виде (e-mails, мгновенные сообщения)
http://habrahabr.ru/post/219151/