HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Этичный хакинг или пентестинг > Кухня
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 11.03.2019, 21:45
Franky_T
Guest
Сообщений: n/a
Провел на форуме:
5696

Репутация: 58
По умолчанию

В продолжение предыдущего треда в этом разделе, приведу частичный перевод и разбор подробностей статьи о том, как генерируются PNG файлы с нагрузкой. Сама статья доступна здесь:https://www.idontplaydarts.com/2012/...g-idat-chunks/,

ссылка на нее однажды мелькала в одном из тредов на RDot. Речь все также идет о пробросе PHP-нагрузки посредством изображения в условиях, когда на стороне сервера изображение может быть пережато библиотекой GD при сохранении. Статья, вероятно, не представляет слишком большого практического интереса, но а) завершает тему и б) кому-то может быть интересно посмотреть на устройство изображений изнутри. Туда и XSS пэйлоад вставить можно

Предварительно пара слов о том, почему для PNG это уже не так просто, как для JPEG. За хранение пикселей в этом формате отвечает сегмент (чанк в терминологии PNG) IDAT. Именно в него будет сохраняться нагрузка. При сохранении изображения в этом формате каждая строка предварительно фильтруется одним из пяти фильтров (http://www.libpng.org/pub/png/spec/1.2/PNG-Filters.html

), а тип использованного фильтра записывается в ее начале (от 0x01 до 0x05), причем фильтр выбирается, исходя из соображений оптимальности, то есть разные строки могут проходить через разные фильтры. После фильтрации все строки сжимаются алгоритмом DEFLATE, в результате чего и формируется сегмент IDAT.

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

Шаг 1. Сжатие.

Необходимо придумать строку, в результате сжатия которой получится нужный нам текст веб-шелла. Нам нужно, чтобы эта строка не содержала цепочек символов длины больше двух, которые бы повторялись. Иначе они будут подвержены сжатию. Чем строка короче, тем вероятность наличия совпадающих подстрок меньше, поэтому постараемся сохранить строку короткой. Например, такой:

Код:
Code:
(для тех, кто такую конструкцию не видел, или видел, но забыл: в php то же самое, что и )

Мы ищем строчку, которая после сжатия даст нужную нам. Для этого вспомним, как отрабатывает DEFLATE. Сперва он ищет в строках повторения, а потом использует алгоритм Хаффмана для того, чтобы произвести непосредственно сжатие с точки зрения частоты встречающихся символов. И все бы ничего, но эта конкретная строчка оказывается неподходящей: алгоритм устроен таким образом, что ни при каком раскладе в сжатой строке не может оказаться конфигурации, где подряд идут символы "=`".

Автор статьи предлагает другую строчку:

Код:
Code:
С ней не возникает таких проблем, как с предыдущей. В этом случае при выполнении кода нужно в качестве параметра GET запроса передать наименование функции, которую хотим выполнить, например, shell_exec, а в качестве параметра POST - саму команду, которую хотим в эту функцию передать.

Строчка, которая, будучи сжатой, дает нужный нам текст, оказалась еще и очень удобной: ее первый байт может варьироваться в диапазоне от 0x00 до 0x04. Это сыграет хорошую роль в следующих наших шагах при обходе фильтров формата PNG.

Код:
Code:
03a39f67546f2c24152b116712546f112e29152b2167226b6f5f5310
Убедиться в том, что она действительно подходит, можно легко:

Код:
Code:
php > $a = gzdeflate(pack("H*", 'a39f67546f2c24152b116712546f112e29152b2167226b6f5f5310'));
php > echo $a;
[X
Но, к сожалению, просто запихнуть эту строку в чанк IDAT будет недостаточно, поскольку перед тем, как применять DEFLATE, PNG сперва обрабатывает строки фильтрами.

Шаг 2. Фильтры.

В PNG используется пять разных типов фильтров. Для каждой строки во внутреннем представлении картинки может использоваться разный фильтр. Цель фильтра - подготовить картинку так, чтобы она сжималась наилучшим образом. Наша задача теперь в том, чтобы создать строчку, которая, даже проходя через фильтры, даст в результате строку из первого пункта.

Сгенерированная картинка будет содержать нагрузку только в одной строке, вся остальная информация, связанная непосредственно с картинкой, будет соответствовать просто набору черных пикселей, то есть все строки, кроме первой, будут одинаковыми и будут содержать константу, соответствующую черному цвету. Поскольку отличной от черного будет только одна строка, алгоритм будет выбирать для нее либо фильтр с номером 1, либо фильтр с номером три. Эти два фильтра для сжатия ориентируются на байты в рамках строки, в то время как другие - на соседей в строках выше или ниже. С подробностями работы фильтров можно ознакомиться в спецификации формата PNG. В рамках задачи фильтры легко оборачиваются:

Код:
Code:
// Reverse Filter 1
for ($i = 0; $i
В результате построения картинки, получится вот такая полоса в левом верхнем углу изображения:



А в хекс-редакторе будет видна нагрузка:



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

Нагрузка в GIF: https://github.com/fakhrizulkifli/De...ecreatefromgif

Сама статья на RDot, где была ссылка на эту: https://rdot.org/forum/showthread.ph...age=2&langid=1
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ