June 20, 2020

PicoCTF 2019. Прохождение задания категории General Skills.

Про picoCTF.

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

Если кратко, то это ежегодный открытый CTF нацеленный по большей части на школьников старших классов в США. Тем не менее играть может каждый и задачи представленные на этом соревновании действительно можно отнести к базовым и классическим задачам.

Начать вы можете просто пройдя регистрацию на сайте - https://2019game.picoctf.com/problems

Все задания доступны круглый год, вы можете решать их постепенно и таким образом прокачивать свои навыки. Также есть множество решений в сети (по большей части на английском), с помощью которых вы можете посмотреть другие варианты решения или если вы конкретно застряли, то можете подглядеть в них.

Базовые знания и примеры задачек можно найти на нашем канале по хэштегам: #CTF, #Практика, #Основы, #КМБ, #Решения.

Структура picoCTF.

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

После регистрации и авторизации вы попадете в свой аккаунт. Задачи вы можете найти на вкладке "Challenge Problems". Перед вами будет следующий интерфейс.

Слева вы можете выбрать задания какой категории вам отображать, а какой нет. По центру у вас идёт описание задач с ссылками на файлы и поле для ввода флага. Задания открываются постепенно по мере решения других задач одной категории. Ответом является флаг, который просто представляет собой строку вида picoCTF{<любой текст>}

Также для решения некоторых задач вам будет нужно использовать ssh чтобы зайти на машину организаторов. Это можно сделать прямо через браузер или из консоли на своём компьютере.

Перейдите во вкладку "Shell" на сайте и увидите следующее.

Здесь вы вводите своё имя пользователя и пароль.

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

ssh <ваше-имя-пользователя>@2019shell.picoctf.com

При первом подключении будет создан аккаунт, а последующие подключения уже будут успешными. Ряд заданий можно выполнить только на сервере, поэтому если вы захотите решить всё, то вам придётся с этим столкнуться.

Если у вас остались какие-то вопросы по структуре и тому как решать/сдавать, вы можете написать в бот-ответчик указанный внизу поста.

Теперь переходим к решению задач категории "General Skills".

Про категорию General Skills.

Данная категория представляет собой набор базовых заданий на умение владеть компьютером, языками программирования, ОС Linux и его базовыми утилитами.

Список заданий (навигация по тексту поста):

Задание "The Factory's Secret"

Это не совсем обычное задание, оно скорее просто развлекательное. Если вы пройдёте по ссылке то попадёте в игру, в которой вам нужно будет собрать обрывки QR-кода и после составить из него флаг. Собираются обрывки в разных зонах. Можно побегать и поискать подсказки, но это не совсем на интересно, поэтому задачу мы пропустим (если вам хочется поиграть в игру, то можете побегать самостоятельно).

Задание "Lets Warm Up"

В этой задаче нужно просто перевести число 0х70 в ASCII символ.

Это можно сделать с помощью Python.

В итоге нужно сдать вот такой флаг: picoCTF{p}

Если вам нужно перевести что-то в ASCII вы можете использовать chr() в интерактивной консоли Python.

Задание "Warmed Up"

Здесь нужно перевести число 0x3d из 16-ричной системы в 10-чную. Также можно это сделать с помощью консоли python.

Ответ: picoCTF{61}

16-ричные числа автоматически конвертируются в 10-чные в консоли.

Задание "2Warm"

Опять задание на перевод, но на этот раз нужно перевести из десятичной в двоичную.

В Python для этого есть функция bin.

Берём часть после 0b.

Ответ: picoCTF{101010}

Обратите внимание, что bin() возвращает строку.

Задание "Bases"

Обратим внимание на название задания. Нам нужно декодировать текст, по виду этот текст похож на кодировку base64 (про неё подробно можно посмотреть тут - https://ru.wikipedia.org/wiki/Base64). Если кратко, то это формат представления данных который активно используется в интернете.

Используем python, чтобы попробовать декодировать из base64.

Ответ: picoCTF{l3arn_th3_r0p35}

Форматы кодирования данных можно определять по используемым символам (т.к. используются разные алгоритмы в зависимости от базы системы).

Задание "First Grep"

В данной задаче, нам нужно найти строчку внутри файла, это можно выполнить с помощью утилиты "grep", которая осуществляет поиск подстроки в файле или наборе файлов. Скачиваем файл и запускаем grep с форматом флага.

Ответ: picoCTF{grep_is_good_to_find_things_887251c6}

Некоторые задания можно решить таким образом, при этом автор мог его и не закладывать, но это бывает редко.

Задание "Resources"

В этом задании вам дают ссылку на сайт с различными ресурсами, которые можно изучить/освоить для улучшения своих навыков решения заданий. Флаг просто лежит на страничке, этот таск просто указывает вам на ресурсы, которые ещё можно посмотреть.

Ответ: picoCTF{r3source_pag3_f1ag}

Задание "strings it"

Задание похоже на "First Grep". Нам дают файл и нужно найти в нём флаг, на этот раз файл бинарный и простой grep укажет, что строчка с флагом есть в файле, но не покажет её. Можно вызывать утилиту strings, которая достаёт все строки из файла и передать её результат работы в grep.

Ответ: picoCTF{5tRIng5_1T_d5b86184}

Задание "what's a net cat?"

В этом задании нужно просто подключиться к TCP-порту с помощью nc или любого другого средства сетевого взаимодействия.

Ответ: picoCTF{nEtCat_Mast3ry_a752a0d3}

Задание "Based"

Данное задание содержит в себе сразу несколько прошлых задач. Нам нужно подключиться к порту и ввести три ответа на вопросы. Ответом является некоторое слово, которое было закодировано с помощью чисел в разных системах счисления. При этом первый ответ всегда даётся в начале. Второе слово переводится закодировано 8-ричными числами, а третье 16-ричными.

Пример диалога с сервером

Так как запас времени 45 секунд, то можно использовать python в консоли.

Конечно, можно и написать скрипт для этого, но проще и быстрее будет сделать в консоли.

Ответ: picoCTF{learning_about_converting_values_4b4e293e}

Задание "First Grep: Part II"

В этом задании опять нужно использовать grep, на этот раз на сервере организаторов есть множество файлов и папок, и где-то среди них лежит флаг. Для решения такой задачи можно использовать ключ "-r" который производит рекурсивный поиск в заданной директории и под-директориях.

Ответ: picoCTF{grep_r_to_find_this_af11356f}

Задание "plumbing"

В этой задаче нам нужно подключиться к сетевому порту и отфильтровать получаемый трафик. Сделать это можно с помощью перенаправление вывода на вход команды grep.

Ответ: picoCTF{digital_plumb3r_c1082838}

Задание "whats-the-difference"

В этом задании нам нужно сравнить два бинарных файла. Файлы равны по размеру, поэтому самый простой способо это прочитать их и сравнить в цикле.

Ответ: picoCTF{th3yr3_a5_d1ff3r3nt_4s_bu773r_4nd_j311y_aslkjfdsalkfslkflkjdsfdszmz10548}

Задание "where-is-the-file"

В этой задаче нужно прочитать скрытый файл на сервере. Заходим в указанную папку и попробуем сделать простой листинг через "ls" и ничего не увидим. Теперь сделаем полный листинг с отображением скрытых файлов (в Linux-е это файлы, имя которых начинается на символ точки).

Ответ: picoCTF{w3ll_that_d1dnt_w0RK_30444bc6}

Задание "flag_shop"

В этой задаче нам дают исходник сервера и адрес, где запущен этот исходник. Сервис представляет собой магазин с флагами. Посмотрим исходник.

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

Т.к. переменная int знаковая, мы можем переполнить её до момента, когда она станет отрицательной и таким образом из нашего баланса вычтеться отрицательное число, что равносильно прибавлению.

Чтобы переполнить нужно передать число, которое при умножении на 900 даст результат больший чем 2147483647. Например число 2386098.

Ответ: picoCTF{m0n3y_bag5_e062f0fd}

Задание "mus1c"

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

Например "shout" и "put <> into".

Немного погуглив (например запрос "shout programming") можно найти такой интересный язык - https://codewithrockstar.com/code

И синтаксис очень похож. Попробуй запихнуть наш файл в интерпретатор языка.

Получим последовательность чисел, попробуем перевести её в ASCII.

И получаем флаг.

Ответ: picoCTF{rrrocknrn0113r}

Интересное задание, которое показывает, что нужно цепляться за что-то странное и гуглить его.

Задание "1_wanna_b4_a_r0ck5tar"

Задание похоже на прошлое, но на этот раз программа ничего не выводит.

Если немного прочитать документацию и примеры использования языка (https://codewithrockstar.com/docs), то можно понять, что этот код считывает два ввода (через Listen).

Также можно найти транслятор с данного языка на Python. Используем его и получим следующий код.

Как можно заметить, нам нужно ввести 19 и 160, чтобы пройти все условия. Однако это не верно, при вводе этих числе ничего не произойдёт. Если использовать интерпретатор на сайте, то можно понять, что строка "A guitar is a six-string" инициализирует переменную значением "10"

А переменную "Music" значением 170.

Попробуем ввести 10 и 170.

Получаем последовательность чисел. Переводим их в ASCII.

Ответ: picoCTF{BONJOVI}

Это было финальное задание данной категории.

В целом задачи в данной категории были довольно простые, но последине две показались довольно весёлыми и даже решались не в 1 действие, хотя они всё равно не очень сложные.