HACKYOU.CTF.SU STEGANO 300 Gemorroy

Alexandr Vishniakov
Hackerstan CTF Team
4 min readNov 24, 2016

--

И так перед нами задача:

И кстати, как потом окажется, надписи на картинке вполне себе оправданы :), но мне повезло, так как сразу выбрал нужный инструмент и с нахождением информации не заморочился.

И так, нас ждет, в полном смысле слова, “Геморрой” :). Но ничего, не расстраиваемся, качаем картинку и начинаем эпопею. Просмотрев на наличие каких либо текстовых данных, ничего не обнаруживаем. Просмотр при помощи stegsolve, также ничего не дает, в этот момент я вспомнил про программку, написанную на ruby и называется она zsteg https://github.com/zed-0xff/zsteg

Запустив команду zsteg steg300_where_8c7f6f7.png, на картинке, получил следующий вывод:

Меня сразу же заинтересовал текст Whoop, here's the next part! ну в общем-то, я не поверил глазам, возможно есть первая зацепка. Но не стоит думать, что тут что-то сразу нам на блюдечке выдадут. У zsteg, есть замечательная возможность извлекать нужные обнаруженные секции, чем мы и воспользуемся.

Выполняем команду zsteg -E extradata:imagedata steg300_where_8c7f6f7.png > part1.txt и получаем текст скрытый в данной секции. И что мы видим! А видим мы - ASCII ART, которым написан URL.

B этот url http://ctf.su/EggNog. Видимо, продолжение нас ждет по этому URL. Давайте посмотрим что там? Перейдя по URL, видим видео файл, состоящий из различных QR кодов.

В принципе, тут сразу же, пришла мысль о разбиении данного файла на составляющие jpeg картинки. И в этом, нам поможет ffmpeg . Но для начала, качаем файл и запускаем следующую команду (перед выполнением команды, лучше создать папку и перейти в нее, потому что получится огромное кол-во файлов картинок):

ffmpeg -i steg300_video_375bee2.mp4 img%4d.jpg

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

Теперь встал вопрос, а как это всю гору проанализировать? Конечно же автоматизация рулит! И так, нужно значит написать скрипт, который в правильном порядке сможет нам выдать информацию, скрытую в этих картинках. Для этого, воспользуемся библиотеками, которые работают с QR кодами. Они позволяют указать картинку и получить на выходе данные, закодированные в ней. У меня получился вот такой скрипт:

import qrtools, os
import sys, io, Image
import glob
line = ""
d = list()
for idx, file in enumerate(sorted(glob.glob("*.jpg"))):
if idx % 4 == 0:
qr = qrtools.QR()
qr.decode(file)
d.append(qr.data)
line += chr(int(qr.data.replace('\\','0'),16))
print line

Это окончательный вид скрипта. Перед этим я попробовал посмотреть, что же содержится в одном из QR кодов. И увидел, что там набор байт, но вот тогда пришла идея собрать их воедино и посмотреть что получается. Но я просчитался в том, что в питоне не гарантируется порядок элементов в массиве и нужно отсортировать в нем значения, перед использованием. По этой причине, когда собрал байты воедино, то не смог понять, что передо мной. После того как я собрал байты в правильной последовательности, при помощи выше представленного скрипта, передо мной сложилась правильная картинка, на основе содержимого файла.

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

Это был Rar архив, его сигнатура 52 61 72 21, а тут как видно, на картинке, на каждый байт получилось 3 дублирующих. Для того чтобы взять каждый байт, через 4 пришлось добавить условие if idx % 4 == 0:. В итоге у меня получилась следующая картинка:

Вот такой маленький архив. Ну теперь дело за малым, нужно поставить программку unrar и переименовав данный дамп в out3.rar (как вам угодно), распаковать и увидеть содержимое. Хотя, тут сразу мы видим, что внутри архива, находится файл флага flag.txt. Вот так вот!

Выполняем команду unrar e out3.rar и получаем наш заветный файл флага!

--

--

«Переписывание с нуля гарантирует лишь одно — ноль!» — Мартин Фаулер