HackYou 2017 Write-Ups

HackYou 2017 Write-Ups

StAlKeR7779

Reverse 10 - Old School

В задании нам даётся исходный код. После гугления команд языка, можно понять что это Logo.

Теперь нужно найти любой интерпретатор этого языка. Однако то, что выводится при запуске не похоже на флаг, поэтому заходим в исходный код. После некоторого разбора находим, что надо изменить пару инструкций: «pe» заменить на «pd»(поднять перо), а перед «setpc» добавить «pd»(опустить перо). После исполнения исправленного кода, на экране будет флаг.

FLAGISOLDSCHOOL

PS: некоторые интерпретаторы требуют переноса вызова функций(give me the flag) в конец файла, после их объявления.

PSS: у некоторых слово 'flag' также является зарезервированным и надо переименовать функцию


Network 10 - Weirdie

Нам сказано, что мы можем получить флаг по ссылке: http-over-sctp://109.233.56.90:15879/. Как видно из названия протокола в названии ссылки "http-pver-sctp", нам надо послать http запрос используя протокол sctp вместо стандартного tcp. Для подключения по sctp можно воспользоваться командой "ncat --sctp 109.233.56.90 15879".

И посылаем GET запрос.

GET / HTTP/1.0
Host: 109.233.56.90

 

Получаем в ответ:

<html>
               <head>
                              <meta charset="utf-8" />
                              <title>Weirdie Flag</title>
               </head>
               <body>
                              <h1>Weirdie Flag</h1>
                              <p>Hello! Please proceed to the <a href="http-over-sctp://109.233.56.90:11111/flag.html">flag page</a> to get your flag.</p>
               </body>
</html>

Подключение на порт 11111 ни к чему не приводит, однако запрос "/flag.html" на исходном порту выдаёт страницу, на которой видно, что флаг - картинка flag.png. Аналогичным образом посылаем запрос к "/flag.png", но вывод перенаправляем в файл «ncat --sctp 109.233.56.90 15879 > flag.png», и получаем флаг.


csiM 200 - Decrypt

Дан файл и сказано, что ключ для его шифрования, это флаг.

Предположим что это xor. Проанализируем файл с помощью cryptool(Analysis -> Symmetric Encryption(classic) -> Chiphertext-Only -> Xor/Vernam). В качестве часто встречающегося символа указываем пробел(20):

Можно увидеть, что текст достаточно неплохо расшифровался и можно увидеть, что это вывод по использованию xortool.py. Для того чтобы получить ключ идём на их github и скопировав вывод из исходников, xor'им с исходным файлом, получая при этом ключ.


CTB 100 – BC

Нам дана ссылка на калькулятор: https://hy17-bc.spb.ctf.su/.

Зайдя на главную страницу, видим ссылку на исходный код калькулятора. Посмотрим на интересующие нас строки:

$output = trim(shell_exec("timeout 60 bc 2>&1 <<<'$expr'")); 

Мы видим, что происходит простое склеивание строк, поэтому можно с легкостью, например, закрыть кавычку, а также интересует строчка фильтрующая ввод:

if (preg_match('#[g-wy-z]#si', $expr)) { 

Это регулярное выражение отфильтровывает только буквы, поэтому все остальные символы проходят, также кроме hex символов a-f разрешена буква ‘x’. Под данный набор символов подходит команда xxd. Теперь надо узнать в каком файле хранится флаг, однако можно заметить что при запросе к /flag.txt выдаётся 403, а не 404, поэтому попытаемся его вывести. Для этого воспользуемся масками и напишем ‘flag.txt’ как ‘f*’. Теперь, вернёмся к строке передаваемой на исполнение – надо закрыть одинарную кавычку и не забыть про неё в конце, а также перейти к исполнению своей команды, это можно сделать например так: “' | {cmd} #”. Теперь подставим сюда получение flag.txt: “'| xxd f* #”


Флаг - hy17{9edd3d10987207dc1f97a9bfc6af269f}


Misc 100 – FBI

Link: https://hy17-fbi.spb.ctf.su/

При переходе на ссылку, мы видим некоторую информацию об Ыже, а также, что указать улицу, на которой он сейчас находится. Попробуем искать по самым популярным местам, а именно соцсетям. Первый же запрос в яндексе 'facebook "YZHESLAV"' у меня увенчался успехом:

Однако никакой информации о его точном местоположении, мы не находим. Поэтому продолжаем поиски, но в этот раз попробуем поискать его логин с facebook’а(theblzh2016) на сайтах, на которые можно зайти с помощью facebook аккаунта. В частности таким местом является инстаграмм. При попытке открыть theblzh2016 на инстаграмме(https://www.instagram.com/theblzh2016/) открывается ещё 1 страничка Ыжа:

При просмотре картинок на 1 из них можно увидеть подпись: Working at *Home*

Попробуем узнать, где находится дом у Ыжа. На фотографии видно wi-fi точки доступа, поэтому попробуем с помощью сервиса по поиску точек доступа, узнать где они находятся. Например с помощью «https://find-wifi.mylnikov.org/». После нахождения координат всех wi-fi точек, рассставляем их на карте и начинаем перебирать все улицы находящиеся внутри данной области:

В итоге при вводе “Rue Louvigny”(синяя на карте) мы получаем флаг - hy17{ffb9fec8c69eb0e0eb34d1d22529194b}


Reverse 300 - Anaconda

При просмотре архива, видим файл secret.pyc. Попробуем посмотреть что в нём. Однако при попытке декомпилирования различными программами мы получаем ошибки, поэтому попробуем посмотреть на байткод этого файла. Для этого я воспользовался python-xdis.

При просмотре функций можно увидеть странный джамп:

 1:          0 LOAD_CONST               1 (1)
              3 LOAD_FAST                0 (var1)
              6 JUMP_FORWARD             2 (to 11)
              9 LOAD_FAST              512 (512)
             12 LOAD_FAST                1 (var2)
             15 BINARY_ADD
             16 RETURN_VALUE

Поэтому удалим эти самые джампы из функций с помощью хекс редактора, чтобы увидеть код, который будет исполняться, также не забываем смотреть, чтобы остальные джампы продолжали указывать на правильные позиции. После этого попробуем декомпилировать уже модифицированный файл и в этот раз декомпиляция проходит без ошибок(по крайней мере у Decompyle++). Получаем исходный код:

Можно увидеть, что входная строка должна быть той же длины, что и var2, а именно 36, также ‘1is_this_a_re---al+++var?’ должна быть равна 0, а значит часть которая прибавляется к ней в цикле всегда должна быть равна 0. Выражаем из этой части ‘c1’:

ord(c1) = add2(1 + ctr, c++rulez) & 255 ^ ord(c2)

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

И получаем флаг – HACKYOU_WHY_DO_YOU_SPOIL_MY_BYTECODE


csiM 300 – Samba

При просмотре дампа мы видим использование ‘pysmb’ – что указывает, на использование питона, а также видим, что использовалось переполнение(большое количество букв A).

Однако в конце мы не видим кода для исполнения. Также можно в других соединениях можно заметить передачу mft записей. Зная что должен передаваться шелл-код для исполнения, попытаемся найти кусок данных с ддостаточно случайными байтами подряд. Таким местом является конец этих самых mft записей:

При просмотре этого кода видим, что этот код дешифрует и что-то:

Исполняем в gdb и при срабатывании breakpoint’а вводим: «x/s $rax», получая флаг - "flag_D33p_1nside_Y0u_Cry_Cry_Cry"


Forensic 100 – Access

При открытии лога, видим очень много записей. Но можно заметить что на большинство из них возвращаются 40* ошибки. Поэтому удалим их с помощью regex’а «^[^"]*"[^"]*" [^2].*$». Также очень много запросов к «/», поэтому удалим их тоже regex’ом «^[^"]* "GET / HTTP/1.[01]".*$».

Теперь при просмотре запросов, можно заметить запросы к файлу «/class/jpcache/jpcache.php» с параметром «exec». При его расшифровке видим, что в нём передаются команды, поэтому отсеем только эти запросы. После чего удалим из них всё кроме содержимого в exec и делаем urldecode:

Видим, что происходила загрузка и исполнение pdf файла с ftp. Поэтому попробуем тоже скачать этот файл. При подключении вводим логин и пароль jameed08/ correcthorsebatterystaple и скачиваем файл. Открываем и видим флаг: