Дмитрий DarkByte Москин

Мой блог, да.
logo

CodeGate 2012 write-ups

Опубликовано 25.02.2012 автором Дмитрий Москин
Поиграли в корейский CTF CodeGate. Задания были интересными, а главное разнообразными. Но времени на их решение, как обычно, было маловато, очень помешали субботние пары :)

Наша команда, WildRide, заняла почётное 42 место из 182 команд :D

Описание решения некоторых тасков:
Vulnerability 100
Vulnerability 200
Binary 100

Misc 100
Misc 400
Misc 500
Network 100
Network 300
Forensics 300


Misc #1
Az hrb eix mcc gyam mcxgixec rokaxioaqh hrb mrqpck gyam lbamgarx oatygqh Erxtoigbqigarx Gidc hrbg gasc gr koaxd erzzcc zro i jyaqc Kr hrb ocqh rx Ockubqq ro Yrg man? Gyc ixmjco am dccqihrbgm

Очень лёгкий таск. Обычный шифр замены, который решается частотным анализом с последующей корректировкой по словарю.
If you can see this sentance ordinarily you solved this quistion rightly Congratulation Take yout time to drink coffee for a while Do you rely on Redbull or Hot six? The answer is keelayouts

Флаг: keelayouts. Приложенный файл я так и не посмотрел, но говорят, что там была подсказка к решению.


Misc #4
Down

Ещё один таск на 1 минуту. Скачиваем архив, в файле codegate_homepage.htm в самом конце видим вызов функции "c" с передачей ей в качестве параметра строк разной длинны. Функция объявлена в файле codegate.js и обфусцирована, но мы просто берём уже развёрнутую функцию через консоль JavaScript.
function c(_0x272dx2){_0x272dx2=_0x272dx2[_0xfd3a[0]](/ /g,1);_0x272dx2=_0x272dx2[_0xfd3a[0]](/\t/g,0);var _0x272dx3=_0x272dx2;_0x272dx2=_0xfd3a[1];for(i=0;i<_0x272dx3[_0xfd3a[2]];i++){_0x272dx2=_0x272dx3[_0xfd3a[3]](i,i+1)+_0x272dx2};var _0x272dx4=_0xfd3a[1];for(i=0;i<_0x272dx2[_0xfd3a[2]];i+=9){_0x272dx4+=String[_0xfd3a[4]](parseInt(_0x272dx2[_0xfd3a[3]](i,i+9),2))};eval(_0x272dx4)}

В конце функции находим eval и заменяем его на console.log, обновляем страницу и видим в консоли:
var p = 'YTK4YPT1YK48PTK48TK34PTYK6TDKT5P2KT73TKPY4TBTK3TT4YKT4ETK4YTP7K4T6KT30TKYP7T2KYT33TKP7TY6KTYP33TKPY7PT2YT';
p = p.replace(/T/g,'').replace(/P/g,'').replace(/Y/g,'').replace(/K/g,'%');
var authkey = unescape(p);

Выполняем, смотрим значение authkey и получаем флаг: AHH4mRsK4NGF0r3v3r


Misc #5
Thank you very much for spending time with us.
The final problem enjoy with you. It may not look hard.
Let's view the problem from another angle.
Decrypt it.
RDCVGF_YGBNJU_TGBNM_YGBNJU_TGBNM_TGBNM_YGBNJU_TGBNM

Подумав немного, обращаем внимание на расположение букв на клавиатуре. Буквы образуют символы, а именно "GOLOLLOL". И с 20й попытки правильно вводим флаг G_O_L_O_L_L_O_L.


Network #1
Someone have leaked very important documents. We couldn't find any proof without one PCAP file. But this file was damaged. 
The password of disclosure document is very weakness and based on Time, can be found easily.
Cryptographic algorithm is below.

Msg = "ThisIsNotARealEncryption!SeemToEncoding"
Key = 0x20120224 (if date format is 2012/02/24 00:01:01)
Cryto = C(M) = Msg * Key = 0xa92fd3a82cb4eb2ad323d795322c34f2d809f78

Answer: Decrypt(Msg)

К заданию приложен файл, похожий на pcap, но видимо с повреждённым заголовком. Анализируя блакнотом HTTP пакеты в файле, находим всего один интересный, ответ которого составляет 200кб.

Наверное, по задумке автора задания, нужно было восстановить pcap файл и получить файл из того самого ответа, т.к. он фрагментирован, но делать этого было лень, поэтому просто вырезаем все данные от начала ответа и до конца файла. По заголовкам видим, что файл похож на zip архив, содержащий 2 картинки и файл key. Восстанавливаем архив, но распаковать его не получается, требует пароль.

Читаем ещё раз задание, смотрим HTTP запросы и получаем пароль "19841128", который подходит к файлу key. Внутри файла находим строку "be7790a9f6e79752d1f9e55a79a33f421cf68". Вновь обращаемся к заданию и выполняем процедуру расшифровки:
hex( 0xbe7790a9f6e79752d1f9e55a79a33f421cf68/0x19841128 ) = 0x776f30306f735230634b696e473a29

Приводим результат к тексту и получаем флаг: wo00osR0cKinG:)


Network #3
One day, attacker A hacked into B companys internal system and then stole backup data.
This backup data was made by attacker A himself.
Attacker A used his specifically configured network to detour B companys security system.
Now you(B'company's an employee) detected it late.
You have to analyze the traffic by using WireShark and have to find which data was leaked from which internal system.
A stolen data by Attacker A will be an important hint to find the answer.
Answer : strupr(md5(Hint_in_the_leaked data|Hacked_internal_system_address)) ('|'is just a character)

На входе имеем pcap файл с непонятными UDP пакетами. Скальпель показывает наличие 7z архива внутри. Wireshark показывает в пакетах данные похожие на ipv6 адреса. Выполняем декодирование потока как ipv6 (Decode As -> Network -> IPv6). Фоловим TCP поток и вытаскиваем 7z архив, внутри которого находим файл "test2.swf", который даёт подсказку "The answer is ipv6.dst". Берём ipv6 адрес атакующего и формируем флаг "strtoupper(md5('ipv6.dst|fe80::c0a8:8888'))" и получаем его: 6642E5A831032D2CF852C66024D9C1F1.


Forensics #2
When IU who lives in Seoul tried to do SQL Injection attack a certain WEB site, suddenly the browser was closed abnormally. 
What is the SQL Injection value she tried to enter and when the browser was closed? The time is based on Korea Standard Time(UTC +09:00)
Time Format is YYYY-MM-DDThh:mm:ssTZD (TZD : +hh:mm or hh:mm)

В задании дан архив с папкой Users из Windows 7. Необходимо найти логи попытки проведения SQL инъекции. При осмотре обнаруживаются 3 установленных браузера: IE, Chrome и Firefox. Анализ профилей первых двух ничего интересного не выявляет. Зато в FF можно найти файл sessionstore.js, в котором хранится информация о последних сессиях.

Сразу же в глаза бросается строка "1_UNI/**/ON_SELECT", а затем и время в поле "lastUpdate". Форматируем время в соответствии с поставленным условием и получаем флаг 1_UNI/**/ON_SELECT|2012-02-12T10:23:17+09:00

P.S. может быть чего нибудь ещё вспомню, а пока что всё, можно идти спать (: