Текст для RACTF 2020 Николаса, Мунира, Джозефа и Смами.

Мы сделали этот CTF в свободное время, чтобы подготовиться к одному из местных соревнований в моей стране. Как оказалось, это был забавный CTF. Поэтому я решил написать свое решение для некоторых хороших задач из этого CTF. На самом деле, мы решаем большую часть задачи (нерешенными остались только 2 задачи), но у меня не так много времени, чтобы создать этот репортаж, поэтому я постараюсь добавить больше, если будет время 😆

Оглавление

Крипто: 04 — 400 баллов
Разное: Телепорт — 300 баллов
Интернет: Получение админки — 300 баллов

Криптовалюта: 04 — 400 баллов

IOINR EANED GTTEA INEHM ETEIS PMAON RGNHB BTTWE EEYSC YMOET PTOAL STEII DAHDE LTNUT MYSOR OTIEH WEGTN TMHAO YSYWW DNOAA EDHNG LNNHI OHDGE SSEOT YAEAD TENRY TITBO TRDHI OMALN DBTOO DEAUH EFTOR LREVO EHSMS CWEST AAADY EAIZN RRULT JNTWY SLAOO ATTHK UTYED GOOMY FOSEF SASDO NSNAH OSSIO EIBPS ALCCR NDTNO EMEHA STNEL TIHIE AABED PYTMP SOOED IUWHS LACEE TSORS NUICY RASMU TEEMR NSTME EYUXG STAOU OSEEY BIELR YNLEW CUTID THNES PGMKE YOYNE YEVYE UTSTY NOSY RIAER NDSEC OLCRX XOYCE X

Флаг — это 2-я и 3-я 9-буквенные слова, соединенные вместе

Благодаря этой задаче я многое узнаю о криптоанализе. Если вы хотите узнать об этом больше, предлагаю вам прочитать эту статью. Это хороший способ начать. Итак, в этом задании нам дали только зашифрованный текст без ключа. Итак, на данный момент это неизвестный шифр, так как в постановке задачи не было ни намека на него. Основываясь на статье, которую я дал ранее, хороший способ начать идентифицировать неизвестный шифр — это провести частотный анализ. Пытаюсь посчитать все буквы в шифртексте, и вот результат:

Обратите внимание, что частота каждого символа аналогична подсчету частоты английских букв. Мы могли бы сделать вывод, что этот шифр будет шифром перестановки. Чтобы взломать шифр перестановки без ключа, я нашел хорошую статью из этой ветки обмена криптографическими стеками, в которой предлагается способ взломать этот шифр с помощью анализа биграмм. Подводя итог методу, во-первых, нам нужно вывести длину ключа. После определения длины ключа предположим, что у нас есть столбец i и столбец j. Нам нужно рассчитать оценку, если столбец j идет сразу после столбца i. Предположим, что столбец i состоит из {A, B, C}, а столбец j состоит из {D, E, F}. Оценка рассчитывается из среднего значения вероятности пары биграмм столбцов i и j (AD, BE, CF). Для простоты вероятность пары биграмм рассчитана по предыдущей статье. После подсчета всех парных баллов для каждого столбца i соедините его с другим столбцом j, имеющим наивысший балл. Чтобы было понятнее, посмотрите, как решить эту задачу.

Обычно длина ключа является фактором длины зашифрованного текста. Длина зашифрованного текста 396, поэтому множитель {1, 2, 3, 4, 6, 9, 11, 12, 18, 22, 33, 36, 44, 66 , 99, 132, 198, 396}. Нам нужно проверять правильный ключ один за другим. Для простоты предположим, что вы перепробовали всю длину от 1 до 18, и теперь мы собираемся использовать 22. Во-первых, нам нужно разделить наш зашифрованный текст на 22 столбца в строке. Шифрованный текст будет выглядеть так:

Затем мы создадим таблицу 22x22, содержащую оценку столбца i и столбца j. Score(i, j) — это оценка, если столбец j идет сразу после столбца i. Помните, что оценка является средней оценкой (используя оценку вероятности в этой статье) каждой биграммы, построенной из символов в столбце i + столбце j, которые находятся в той же строке (например, если мы i = 0 и j = 2, то биграмма будет {II, ES, CM, TU, AY и т. д.}). Таблица результатов будет такой.

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

Наконец мы успешно расшифровали наш зашифрованный текст и нашли флаг!.

Flag: ractf{CONCERNEDENCRYPTED}

Разное: Телепорт — 300 очков

Один из наших администраторов играет в странную игру, к которой можно получить доступ через TCP. Он играет какое-то время, но не может получить флаг! Посмотрим, сможешь ли ты ему помочь.

В этом задании нам дали файл Python, содержащий этот код:

import math
x = 0.0
z = 0.0
flag_x = 10000000000000.0
flag_z = 10000000000000.0
print("Your player is at 0,0")
print("The flag is at 10000000000000, 10000000000000")
print("Enter your next position in the form x,y")
print("You can move a maximum of 10 metres at a time")
for _ in range(100):
    print(f"Current position: {x}, {z}")
    try:
        move = input("Enter next position(maximum distance of 10): ").split(",")
        new_x = float(move[0])
        new_z = float(move[1])
    except Exception:
        continue
    diff_x = new_x - x
    diff_z = new_z - z
    dist = math.sqrt(diff_x ** 2 + diff_z ** 2)
    if dist > 10:
        print("You moved too far")
    else:
        x = new_x
        z = new_z
    if x == 10000000000000 and z == 10000000000000:
        print("ractf{#####################}")
        break

Итак, задача состоит в том, что нам нужно переместиться к координате 10000000000000 с сотней попыток, где каждую попытку мы могли бы пройти только через точку, расстояние которой равно 10. Кажется невозможным, верно? Но один из наших товарищей по команде нашел уязвимость в этой задаче. Мы могли бы попытаться сначала ввести nan, nan, установив наши (x,y) в (nan, nan). После этого со второй попытки мы могли бы ввести (10000000000000, 10000000000000), потому что при проверке расстояния результат будет nan, а первое if (if dist › 10) вернет False, и установка нашей новой координаты на ( 10000000000000, 10000000000000) и мы получили флаг!

Flag: ractf{fl0at1ng_p01nt_15_h4rd}

Сеть: Телепорт — 300 очков

Посмотрите, сможете ли вы получить учетную запись администратора.

Итак, в этом задании нам дали веб-сайт, который выглядит следующим образом:

Итак, пытаясь зарегистрироваться и щелкнуть ссылку администратора, оказалось, что она отключена. Поэтому нам нужно войти с неизвестными учетными данными. Попробуйте сделать SQL-инъекцию в форме входа, она уязвима для SQL-инъекций. Сначала мы получили эту ошибку

Хммм, мой друг попытался поставить LIMIT 1 на нашу полезную нагрузку, и мы успешно вошли в сеть.

Итак, мы успешно вошли на сайт, но не как администратор. Итак, теперь наша цель — повысить привилегии пользователя до администратора. Веб-сайт использует JWT, поэтому мы пытаемся расшифровать JWT.

Существует одна известная атака, при которой мы можем обмануть JWT, установив для заголовка alg значение None, чтобы обойти проверку подписи. Итак, мы пытаемся изменить значение alg на None и изменить привилегию на 99. Мы используем python для создания нашей полезной нагрузки!

import base64
def b64urlencode(data):
    return base64.b64encode(data).replace(b'+', b'-').replace(b'/', b'_').replace(b'=', b'')
print(b64urlencode(b"{\"typ\":\"JWT\",\"alg\":\"none\"}") + b'.' + b64urlencode(b"{\"user\":\"Harry\",\"privilege\":99}") + b'.')

Используя JWT, сгенерированный этим скриптом, мы успешно повысили наши права пользователя до администратора. Пытаясь зайти на админку, получаем флаг.

Flag: ractf{j4va5cr1pt_w3b_t0ken}

Слова от автора

Спасибо моему товарищу по команде, так как нам удалось решить много задач, и нам удалось занять 8-е место. Спасибо RACTF за проведение этого конкурса CTF ☺️