Pic stego — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м (→Обыкновенное изображение) |
||
(не показано 25 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
В этой статье мы поговорим о способе определения метода сокрытия информации в изображениях. | В этой статье мы поговорим о способе определения метода сокрытия информации в изображениях. | ||
+ | |||
+ | ==Общие проверки для BMP/PNG/JMP и других== | ||
+ | |||
+ | ===Получение exif файлов=== | ||
+ | |||
+ | Первое что обычно я делаю, если не знаю с чего начать - получаю exif файла. | ||
+ | Пример: | ||
+ | |||
+ | Дана картинка: | ||
+ | [[File:EXIF.jpg|frameless]] | ||
+ | |||
+ | |||
+ | Последовательность действий: | ||
+ | |||
+ | 1. Переходим на сайт http://regex.info/exif.cgi | ||
+ | 2. Отсылаем картинку. | ||
+ | 3. Замечаем текст Youarethebesthackerihaveeverseen!1337 - это и есть флаг к заданию! | ||
+ | |||
+ | [[File:Getexif.png|frameless]] | ||
+ | |||
+ | ===Получение GEO-тегов=== | ||
+ | |||
+ | Аналогичное с EXIF решение, но отсылается файлик на сайт http://www.geoimgr.com/ | ||
+ | |||
+ | В итоге получаем координаты: | ||
+ | |||
+ | [[File:geotags.png|frameless]] | ||
+ | |||
+ | |||
+ | Обычно данные действия требуются в заданиях на форенсику, например популярное задание по фотографии с телефона найти город, где находится воришка. | ||
+ | |||
+ | ===Приписанный в конец файла текст=== | ||
+ | |||
+ | Для определения воспользуемся текстовым редактором или hex редактором. | ||
+ | |||
+ | Пример строки в конце файла: | ||
+ | |||
+ | [[File:TextInTheEndOfImage.png|TEXT IN THE END]] | ||
+ | |||
+ | |||
+ | |||
+ | ===Архив=== | ||
+ | Изображение может оказаться архивом. Чаще всего это заметно, если картинка весит больше, чем доолжна весить при таких размерах. | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | Дано изображение: [[File:RARImage.jpg|frameless]] | ||
+ | |||
+ | Последовательность действий: | ||
+ | |||
+ | 1. Переименовать оканчание в .rar/.zip/.7z или в любой другой тип архивов (перебор). | ||
+ | 2. Попробовать распаковать. | ||
+ | 3. При оканчании .rar данный файл разархивируется. Получаем файл flag.txt | ||
+ | 4. Открываем txt файл и получаем флаг "BESTFLAGIHAVEEVERSEEN!" | ||
+ | 5. Profit! | ||
+ | |||
+ | |||
+ | Все признаки по которым можно это заподозрить/убедиться: | ||
+ | |||
+ | * Большой вес изображения при данном разрешении | ||
+ | * В hexedit увидеть заголовки двух склеенных файлов - изображения и архива | ||
+ | * Перебор оканчаний с последующим разархивированием | ||
==PNG/BMP изображения== | ==PNG/BMP изображения== | ||
Строка 7: | Строка 69: | ||
===Монотонное изображение=== | ===Монотонное изображение=== | ||
− | [[File:WaterStego.png| | + | [[File:WaterStego.png|frameless]] |
Если вам дали монотонное изображение, то чаще всего в ней находятся водяные знаки. | Если вам дали монотонное изображение, то чаще всего в ней находятся водяные знаки. | ||
Строка 24: | Строка 86: | ||
− | [[File:WaterSolved.png| | + | [[File:WaterSolved.png|frameless]] |
=====Информация об изображении===== | =====Информация об изображении===== | ||
Строка 34: | Строка 96: | ||
(Картинка) | (Картинка) | ||
− | На этом этапе суть в том, чтобы определить следующий этап:) Тут может быть как морзянка, так и бинарный код (1001010). | + | На этом этапе суть в том, чтобы определить следующий этап:) Тут может быть как морзянка, так и бинарный код (1001010), о чем пойдет в соответствующей последующей главе. |
=====Другое===== | =====Другое===== | ||
Строка 42: | Строка 104: | ||
===Обыкновенное изображение=== | ===Обыкновенное изображение=== | ||
− | + | ||
Нам дано обыкновенное ничем не выделяющееся изображение. | Нам дано обыкновенное ничем не выделяющееся изображение. | ||
− | [[File:StegoXORimage.png]] | + | [[File:StegoXORimage.png|frameless]] |
====Попиксельное вычитание из оригинала==== | ====Попиксельное вычитание из оригинала==== | ||
Строка 61: | Строка 123: | ||
Воспользуемся google поиском: | Воспользуемся google поиском: | ||
− | [[File:SearchStegoOriginal.png]] | + | [[File:SearchStegoOriginal.png|frameless]] |
Строка 69: | Строка 131: | ||
Лично я сделал со StegSolve, речь о котором пойдет в конце страницы. | Лично я сделал со StegSolve, речь о котором пойдет в конце страницы. | ||
+ | |||
+ | '''Рассмотрим случаи исхода попиксельного вычитания.''' | ||
+ | |||
+ | =====Равномерно распределенные пиксели===== | ||
+ | |||
+ | |||
+ | =====Hallucinate===== | ||
+ | |||
+ | Если при XOR оригинала и исходного изображений вы видите ярко выражены равномерно распределенные измененные пиксели, значит используется утилита Hallucinate. | ||
+ | |||
+ | http://sourceforge.net/projects/hallucinate/ | ||
+ | |||
+ | =====JHide===== | ||
+ | |||
+ | Если при XOR оригинала и исходного изображений вы видите еле виднеющиеся пиксели синего цвета, то используется утилита JHide. | ||
+ | |||
+ | https://sourceforge.net/projects/jhideapp/ | ||
+ | |||
+ | =====OpenPuff===== | ||
+ | |||
+ | Отличается от JHide только тем, что задействует большее количество байт. | ||
+ | |||
+ | http://download.cnet.com/windows/openpuff-team/3260-20_4-10146585-1.html | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====Чередующиеся пиксели двух изображений==== | ||
+ | |||
+ | Чтобы это определить, нам требуется воспользоваться программой StegSolve, о которой будет сказано в отдельном пункте. | ||
+ | |||
+ | Если перед вами обыкновенное изображение (например пейзаж) и у него у какого то из цветных фильтров шум, то это означает, | ||
+ | что перед вами изображение в которое встроено еще одно изображение путем замены каждого n-ого пикселя пикселем изображения-флага. | ||
+ | |||
+ | ====Anubis==== | ||
+ | |||
+ | Если в файле присутствуют строки limiter1, limiter2, inserted length begins, то используется стеганографическая утилита Anubis | ||
+ | |||
+ | https://sourceforge.net/projects/anubisstegano/files/ | ||
+ | |||
+ | |||
+ | ====DeEgger Embedder==== | ||
+ | |||
+ | Если в файле используется hex-строка | ||
+ | |||
+ | 24 23 26 29 2A 40 26 28 23 5E 2A 00 D1 8B 87 8B FF | ||
+ | |||
+ | то используется утилита DeEgger Embedder | ||
+ | |||
+ | http://www.softpedia.com/get/Security/Encrypting/DeEgger-Embedder.shtml#download | ||
+ | |||
+ | |||
+ | ====Вдобавок присутствует файл .sig==== | ||
+ | |||
+ | Если у вас есть файл .sig, то используется утилита OpenStego. | ||
+ | |||
+ | http://www.openstego.com/ | ||
+ | |||
+ | ===Разноцветные пиксели=== | ||
+ | |||
+ | ====Пиксели двух цветов==== | ||
+ | |||
+ | Если у вас предоставлено изображение с пикселями двух цветов, то первое что попробуем сделать - это перевести пиксели в байты. | ||
+ | |||
+ | Приведу пример с прошедших соревнований Break In CTF 2016 - таск You Can(t) See Me. | ||
+ | |||
+ | Нам дана картинка color.png: | ||
+ | [[File:Color.png|frameless]] | ||
+ | <pre style="overflow:auto; width:auto;"> | ||
+ | Последовательность действий: | ||
+ | 1. Пишем программу на Python+PIL/Pygame, которая проходит по строкам и создает свою строку f, в которой заменяет черный пиксель | ||
+ | на 0 и красный пиксель на 1. Стоит заметить что при переходе на новую строку пикселей во время считывания, мы добавляем пробел в | ||
+ | нашу строку f. В итоге получаем строку из 7 разных повторяющихся цифр. | ||
+ | 2. Идем на сайт https://www.branah.com/ascii-converter и вбиваем нашу строку в поле "Binary" и тыкаем на "Convert". | ||
+ | Видим в поле "ASCII" текст | ||
+ | "3xXKkFstTUpsG2IFDirE6xDrcAF8DSx4iWxd5f9IQ9T205izN8lS2MQUlsF11gT4TFXHHlLHVHprNTtrh6lURfdUW7Lpuzgu1VKzwb1bg1oq6Ae3GnykkLZZsnze3HVLxHlfCYtzyrcV2Oxp0Gb0Z2ELphR4Oxo7TyvHCuWKWlN8t8KIfHysZK7jBNPu6wRVEUPIwVra." | ||
+ | 4. Флаг найден! | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | ====Пиксели восьми разных цветов==== | ||
+ | |||
+ | В случае с 8 пикселями разных цветов сразу же вспоминается Brainloller (http://esolangs.org/wiki/Brainloller). | ||
+ | |||
+ | Может быть не только brainloller в чистом виде - например сделать замену пикселям. | ||
+ | |||
+ | Пример изображения brainloller: | ||
+ | |||
+ | [[File:Brainloller.png]] | ||
+ | |||
+ | Последовательность действий: | ||
+ | |||
+ | 1. Скачиваем интерпретатор по ссылке - https://github.com/hhhonzik/python-brainfuck | ||
+ | 2. Запускаем: python3 brainx.py -l Brainloller.png | ||
+ | 3. Видим HelloWorld. Profit! | ||
+ | |||
+ | ====Множество разных цветов==== | ||
+ | |||
+ | =====ASCII->RGB===== | ||
+ | |||
+ | Если у вас параметры цветов колеблются между 50 и 150 (включая 32) - вероятнее всего каждый из параметров цвета (red, green и blue) был заменен ASCII-кодами символов. | ||
+ | |||
+ | |||
+ | |||
+ | Пример изображения: | ||
+ | |||
+ | [[File:Many_colors.png]] | ||
+ | |||
+ | Последовательность действий: | ||
+ | |||
+ | 1. Пишем программу, которая проходится по всем пикселям | ||
+ | 2. Переводим все параметры пикселей Red, Green и Blue в ASCII символы с такими же номерами. | ||
+ | 3. Обьединяем все символы в строку | ||
+ | |||
+ | Важно! В некоторых CTF символы пикселей обьединяются не по строкам, а по столбцам! | ||
+ | |||
+ | |||
+ | =====PIET===== | ||
+ | Так же эта картинка может являться программой на языке PIET. | ||
+ | |||
+ | Пример изображения (NeoQuest 2015): | ||
+ | |||
+ | [[File:piet.jpg]] | ||
+ | |||
+ | |||
+ | |||
+ | ===Обрезанное изображение=== | ||
+ | |||
+ | Если перед вами изображение, которое вероятнее всего было обрезано, как например это | ||
+ | (таск с training.hackerdom.ru): | ||
+ | |||
+ | [[File:Keepcalm.png]] | ||
+ | |||
+ | То значит кто то принудительно изменил размер изображения. | ||
+ | |||
+ | Единственный способ, которым можно восстановить изображение, это подбирать изначальные размеры. | ||
+ | |||
+ | Чаще всего изменяется именно высота (иначе могут быть повреждения изображения). | ||
+ | |||
+ | Поэтому начнем подбирать высоту изображения. | ||
+ | |||
+ | Для этого откроем его в программе SynalyzeIt (или в hexinator) и включим парсинг содержимого: | ||
+ | |||
+ | [[File:SynalyzeIt_PNG.png]] | ||
+ | |||
+ | И меняем значение высоты (height) в правой колонке. | ||
+ | |||
+ | Не забываем, что нам требуется восстанавливать чексумму для корректного открытия. | ||
+ | |||
+ | Поэтому после каждого изменения запускаем программу pngcsum (http://schaik.com/png/pngcsum.html): | ||
+ | |||
+ | [[File:pngcsum.png]] | ||
+ | |||
+ | Лично я подбираю бинарным поиском - если у меня слишком много захвачено по высоте, то изображение не будет показано. | ||
+ | |||
+ | В итоге был найден точный размер изображения 600x728: | ||
+ | |||
+ | И непосредственно ответ: | ||
+ | |||
+ | [[File:Keepcalm1.png]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==Утилиты== | ||
+ | |||
+ | ===tweakpng=== | ||
+ | |||
+ | позже | ||
+ | |||
+ | ===StegSolver=== | ||
+ | |||
+ | ===CheckPNG=== | ||
+ | |||
+ | |||
+ | |||
+ | ==Райтапы== | ||
+ | |||
+ | http://countersite.org/articles/steganography/71-qrcode-qctf-2016.html - QRcode QCTF 2016 | ||
+ | |||
+ | https://0x90r00t.com/2015/09/07/mma-2015-stegano-nagoya-castle-write-up/ - MMA 2015 Nagoya Castle | ||
+ | |||
+ | http://blog.w3challs.com/index.php?post/2012/10/13/HackYou-CTF-Stego100%2C-Stego200%2C-Stego300-Writeups - go through the tunnel | ||
+ | |||
+ | http://blog.squareroots.de/en/2012/11/polictf-write-up-forensics-200/ - PoliCTF Write-Up Forensics 200 | ||
+ | |||
+ | http://countersite.org/articles/steganography/98-curses-and-hexes-stego-tjctf-2016.html - Curses and Hexes TJCTF 2016 | ||
+ | |||
+ | http://countersite.org/articles/steganography/97-grey-shades-tjctf2016.html - Basic Images TJCTF2016 |
Текущая версия на 22:50, 4 февраля 2017
В этой статье мы поговорим о способе определения метода сокрытия информации в изображениях.
Содержание
Общие проверки для BMP/PNG/JMP и других
Получение exif файлов
Первое что обычно я делаю, если не знаю с чего начать - получаю exif файла. Пример:
Последовательность действий:
1. Переходим на сайт http://regex.info/exif.cgi 2. Отсылаем картинку. 3. Замечаем текст Youarethebesthackerihaveeverseen!1337 - это и есть флаг к заданию!
Получение GEO-тегов
Аналогичное с EXIF решение, но отсылается файлик на сайт http://www.geoimgr.com/
В итоге получаем координаты:
Обычно данные действия требуются в заданиях на форенсику, например популярное задание по фотографии с телефона найти город, где находится воришка.
Приписанный в конец файла текст
Для определения воспользуемся текстовым редактором или hex редактором.
Пример строки в конце файла:
Архив
Изображение может оказаться архивом. Чаще всего это заметно, если картинка весит больше, чем доолжна весить при таких размерах.
Пример:
Последовательность действий:
1. Переименовать оканчание в .rar/.zip/.7z или в любой другой тип архивов (перебор). 2. Попробовать распаковать. 3. При оканчании .rar данный файл разархивируется. Получаем файл flag.txt 4. Открываем txt файл и получаем флаг "BESTFLAGIHAVEEVERSEEN!" 5. Profit!
Все признаки по которым можно это заподозрить/убедиться:
- Большой вес изображения при данном разрешении
- В hexedit увидеть заголовки двух склеенных файлов - изображения и архива
- Перебор оканчаний с последующим разархивированием
PNG/BMP изображения
Нам дано изображение. Попробуем по некоторым факторам определить, как нам решить этот таск.
Монотонное изображение
Если вам дали монотонное изображение, то чаще всего в ней находятся водяные знаки.
Водяные знаки
Чтобы узнать, есть ли на ней водяные знаки, есть несколько вариантов
Painter
Самый простой вариант - открыть изображение в Painter (или любом другом редакторе изображений).
Далее заливкой тыкнуть каким-нибудь контрастным цветом. В данном случае лучше всего белым.
Информация об изображении
В некоторых программах-просмотрах картинок есть статистика по цветам/пикселям.
Таким образом мы можем узнать, что картинка не монотонна и на ней присутствуют пиксели разных цветов.
(Картинка)
На этом этапе суть в том, чтобы определить следующий этап:) Тут может быть как морзянка, так и бинарный код (1001010), о чем пойдет в соответствующей последующей главе.
Другое
Есть еще утилиты, помогающие в поиске водяных знаков, такая как StegSolve. Их мы рассмотрим в соответствующей теме.
Обыкновенное изображение
Нам дано обыкновенное ничем не выделяющееся изображение.
Попиксельное вычитание из оригинала
Тут нам следует найти оригинал изображения.
Поиск оригинала изображения
Для этого есть несколько способов.
Сретства для поиска изображений:
https://images.google.com/ https://yandex.ru/images/
Воспользуемся google поиском:
Находим в картинках изображение такого же размера и скачиваем его.
Далее нам остается с помощью какой-либо библиотеки написать программу,которая пройдется по двум изображениям и выделит отличающиеся пиксели.
Лично я сделал со StegSolve, речь о котором пойдет в конце страницы.
Рассмотрим случаи исхода попиксельного вычитания.
Равномерно распределенные пиксели
Hallucinate
Если при XOR оригинала и исходного изображений вы видите ярко выражены равномерно распределенные измененные пиксели, значит используется утилита Hallucinate.
http://sourceforge.net/projects/hallucinate/
JHide
Если при XOR оригинала и исходного изображений вы видите еле виднеющиеся пиксели синего цвета, то используется утилита JHide.
https://sourceforge.net/projects/jhideapp/
OpenPuff
Отличается от JHide только тем, что задействует большее количество байт.
http://download.cnet.com/windows/openpuff-team/3260-20_4-10146585-1.html
Чередующиеся пиксели двух изображений
Чтобы это определить, нам требуется воспользоваться программой StegSolve, о которой будет сказано в отдельном пункте.
Если перед вами обыкновенное изображение (например пейзаж) и у него у какого то из цветных фильтров шум, то это означает, что перед вами изображение в которое встроено еще одно изображение путем замены каждого n-ого пикселя пикселем изображения-флага.
Anubis
Если в файле присутствуют строки limiter1, limiter2, inserted length begins, то используется стеганографическая утилита Anubis
https://sourceforge.net/projects/anubisstegano/files/
DeEgger Embedder
Если в файле используется hex-строка
24 23 26 29 2A 40 26 28 23 5E 2A 00 D1 8B 87 8B FF
то используется утилита DeEgger Embedder
http://www.softpedia.com/get/Security/Encrypting/DeEgger-Embedder.shtml#download
Вдобавок присутствует файл .sig
Если у вас есть файл .sig, то используется утилита OpenStego.
Разноцветные пиксели
Пиксели двух цветов
Если у вас предоставлено изображение с пикселями двух цветов, то первое что попробуем сделать - это перевести пиксели в байты.
Приведу пример с прошедших соревнований Break In CTF 2016 - таск You Can(t) See Me.
Последовательность действий: 1. Пишем программу на Python+PIL/Pygame, которая проходит по строкам и создает свою строку f, в которой заменяет черный пиксель на 0 и красный пиксель на 1. Стоит заметить что при переходе на новую строку пикселей во время считывания, мы добавляем пробел в нашу строку f. В итоге получаем строку из 7 разных повторяющихся цифр. 2. Идем на сайт https://www.branah.com/ascii-converter и вбиваем нашу строку в поле "Binary" и тыкаем на "Convert". Видим в поле "ASCII" текст "3xXKkFstTUpsG2IFDirE6xDrcAF8DSx4iWxd5f9IQ9T205izN8lS2MQUlsF11gT4TFXHHlLHVHprNTtrh6lURfdUW7Lpuzgu1VKzwb1bg1oq6Ae3GnykkLZZsnze3HVLxHlfCYtzyrcV2Oxp0Gb0Z2ELphR4Oxo7TyvHCuWKWlN8t8KIfHysZK7jBNPu6wRVEUPIwVra." 4. Флаг найден!
Пиксели восьми разных цветов
В случае с 8 пикселями разных цветов сразу же вспоминается Brainloller (http://esolangs.org/wiki/Brainloller).
Может быть не только brainloller в чистом виде - например сделать замену пикселям.
Пример изображения brainloller:
Последовательность действий:
1. Скачиваем интерпретатор по ссылке - https://github.com/hhhonzik/python-brainfuck 2. Запускаем: python3 brainx.py -l Brainloller.png 3. Видим HelloWorld. Profit!
Множество разных цветов
ASCII->RGB
Если у вас параметры цветов колеблются между 50 и 150 (включая 32) - вероятнее всего каждый из параметров цвета (red, green и blue) был заменен ASCII-кодами символов.
Пример изображения:
Последовательность действий:
1. Пишем программу, которая проходится по всем пикселям 2. Переводим все параметры пикселей Red, Green и Blue в ASCII символы с такими же номерами. 3. Обьединяем все символы в строку
Важно! В некоторых CTF символы пикселей обьединяются не по строкам, а по столбцам!
PIET
Так же эта картинка может являться программой на языке PIET.
Пример изображения (NeoQuest 2015):
Обрезанное изображение
Если перед вами изображение, которое вероятнее всего было обрезано, как например это (таск с training.hackerdom.ru):
То значит кто то принудительно изменил размер изображения.
Единственный способ, которым можно восстановить изображение, это подбирать изначальные размеры.
Чаще всего изменяется именно высота (иначе могут быть повреждения изображения).
Поэтому начнем подбирать высоту изображения.
Для этого откроем его в программе SynalyzeIt (или в hexinator) и включим парсинг содержимого:
И меняем значение высоты (height) в правой колонке.
Не забываем, что нам требуется восстанавливать чексумму для корректного открытия.
Поэтому после каждого изменения запускаем программу pngcsum (http://schaik.com/png/pngcsum.html):
Лично я подбираю бинарным поиском - если у меня слишком много захвачено по высоте, то изображение не будет показано.
В итоге был найден точный размер изображения 600x728:
И непосредственно ответ:
Утилиты
tweakpng
позже
StegSolver
CheckPNG
Райтапы
http://countersite.org/articles/steganography/71-qrcode-qctf-2016.html - QRcode QCTF 2016
https://0x90r00t.com/2015/09/07/mma-2015-stegano-nagoya-castle-write-up/ - MMA 2015 Nagoya Castle
http://blog.w3challs.com/index.php?post/2012/10/13/HackYou-CTF-Stego100%2C-Stego200%2C-Stego300-Writeups - go through the tunnel
http://blog.squareroots.de/en/2012/11/polictf-write-up-forensics-200/ - PoliCTF Write-Up Forensics 200
http://countersite.org/articles/steganography/98-curses-and-hexes-stego-tjctf-2016.html - Curses and Hexes TJCTF 2016
http://countersite.org/articles/steganography/97-grey-shades-tjctf2016.html - Basic Images TJCTF2016