CTF - что это такое и с чем это едят? Разбор множества заданий.

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0

Авторство: germans

Источник: xss.is​


Приветствую всех в этой статье! Давайте начнем с того, чтобы разобраться, что такое CTF.

CTF - это обычный турнир по информационной безопасности, что расшифровывается как Capture the Flag. Существует две основные ситуации: воровать флаги у организаторов или у других команд. Лично я участвовал только в первом типе, но второй также звучит достаточно интересно (в видео по ссылке представлен CTF между двумя командами).

Почему стоит участвовать в CTF?

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

- Репутация и некий авторитет: успех на CTF однозначно добавит вашей команде парочку баллов в сообществах. Это спокойно может раскрыть перед тобой двери к новым оферам и предложениям.

- Знания: не стоит думать, что на CTF все грызут глотку друг другу за баллы и так далее, не так все это! Смело могу заявить это, что если нормально описать вашу проблему, то наврятле вам скажут, мол гуляй! Если это конечно не запрещено правилами, а зачастую запрещено давать только флаги, а подсказки никто не отменял.

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

Как можно поучаствовать в CTF?
- Не буду я тут сильно разглагольствоваться, заходите на сайт, и наслаждаетесь огромным выбором предстоящих CTF, так же там сразу пишут и про призовые.

Какие бывают категории задач на CTF?

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

1. Web - впринципе все и так становится понятным, лазаем по сайтам, ищем дырки в коде, sql-инъекции, кросс-сайтовые скрипты, это все.

2. Crypto - дешифруем, вскрываем коды.

3. Forensics - можно представить, что ты криминалист по ИБ, которому надо анализировать файлы, и искать следы.

4. Reverse - ломаем защиты софта, анализируем программы, пытаемся понять как устроены внутренности.

5. Stegano - ищем флаг среди любых файлов, начиная от всяких треков, заканчивая картинками.

6. OSINT - разведка по сети интернет, ничего более, и сложного.

7. CTB - задачи связанные с блокчейном, смарт-контрактами.

Основную теорию считаю, что рассказал, если у вас будут вопросы, пишите - c удовольствием отвечу, пора переходить к практике.

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

OSINT - задачи:

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


Открыв или скачав файл, мы наблюдаем такую картину, что это access.log какого то сайта, но от этого нам не худо и не бедно не станет.
Снимок экрана 2023-12-28 в 18.05.20.png


Наврятле можно сделать какую либо атаку GET-запросом, по этому сразу же отметаем их таким скриптом на Python
Код: Скопировать в буфер обмена
Код:
def remove_get_requests(file_path):
    with open(file_path, 'r') as file:
        lines = file.readlines()

    filtered_lines = [line for line in lines if "GET" not in line]

    with open(file_path, 'w') as file:
        file.writelines(filtered_lines)

file_path = 'ctf_log.txt'
remove_get_requests(file_path)

Нельзя сказать, что это нам сильно помогло, но мы сократили кол-во строк до 558.
Снимок экрана 2023-12-28 в 18.08.37.png



Дальше, прогоним наш оставшийся файл логов python скриптом со словарем слов

Код: Скопировать в буфер обмена
Код:
def check_for_malicious_activity(file_path):
    malicious_keywords = ["malware", "shell", "exploit", "backdoor", "trojan", "virus"]

    with open(file_path, 'r') as file:
        for line_number, line in enumerate(file, start=1):
            if any(keyword in line.lower() for keyword in malicious_keywords):
                print(f"{line_number}: {line.strip()}")

file_path = 'ctf_log.txt'
check_for_malicious_activity(file_path)

Бамц, что мы видим? Подгрузку шелла, где нашего хацкера заредиректило и некая ссылка.

Снимок экрана 2023-12-28 в 18.14.45.png



Открываем нашу ссылочку, и что мы наблюдаем на ней.

Снимок экрана 2023-12-28 в 18.16.21.png



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

Снимок экрана 2023-12-28 в 18.18.43.png


Ненужный нам мусор, абсолютно.. Видимо мы забрели абсолютно не туда, не в то русло. Не стоит забывать, что наша задачка на OSINT. Стоит попробовать в другом месте, давайте попробуем забить наш кошелек в нижнем регистре на namechk[dot].com : 0x852d15f44ae5e20202047669a02c86a2f951144b95 ; это проверит кошелек на наличие каких либо соц сетей по юзернейму
Снимок экрана 2023-12-28 в 18.39.04.png



Бамц, и у нас находится soundcloud с таким именем, где на аватарке мы и видим наш флаг, который успешно забираем и ложим баллы себе в кармашек.
Снимок экрана 2023-12-28 в 18.39.47.png



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

Итак, у есть шифрованная строка.

Спойлер: дешифровать
['0x40d', '0x468', '0x414', '0xa', '0x419', '0x414', '0x418', '0x414', '0x46a', '0x412', '0x468', '0xa', '0x417', '0x469', '0x411', '0x466', '0xa', '0x410', '0xa', '0x414', '0x41e', '0x417', '0x414', '0x416', '0x469', '0x6', '0xa', '0x410', '0x414', '0x419', '0x41e', '0x41a', '0xa', '0x414', '0x417', '0x412', '0xa', '0x418', '0x46b', '0x468', '0x46a', '0x41f', '0x46d', '0x41a', '0x464', '0x468', '0x46b', '0x465', '0xa', '0x418', '0xa', '0x41b', '0x41a', '0x46a', '0x41f', '0x6', '0xa', '0x412', '0xa', '0x410', '0x41a', '0x410', '0x412', '0x416', '0xa', '0x414', '0x41b', '0x46a', '0x41a', '0x41d', '0x414', '0x416', '0xa', '0x414', '0x417', '0x412', '0xa', '0x414', '0x41b', '0x416', '0x41f', '0x417', '0x412', '0x418', '0x41a', '0x464', '0x468', '0x46b', '0x465', '0xa', '0x46b', '0x41f', '0x410', '0x46a', '0x41f', '0x468', '0x41a', '0x416', '0x412', '0x15', '0xa', '0x52', '0x59', '0x59', '0x75', '0x45', '0x58', '0x75', '0x52', '0x45', '0x58', '0x75', '0x43', '0x59', '0x75', '0x4c', '0x5f', '0x44', '0x44', '0x53']

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

Python: Скопировать в буфер обмена
Код:
encrypted_values = ['0x40d', '0x468', '0x414', '0xa', '0x419', '0x414', '0x418', '0x414', '0x46a', '0x412', '0x468', '0xa', '0x417', '0x469', '0x411', '0x466', '0xa', '0x410', '0xa', '0x414', '0x41e', '0x417', '0x414', '0x416', '0x469', '0x6', '0xa', '0x410', '0x414', '0x419', '0x41e', '0x41a', '0xa', '0x414', '0x417', '0x412', '0xa', '0x418', '0x46b', '0x468', '0x46a', '0x41f', '0x46d', '0x41a', '0x464', '0x468', '0x46b', '0x465', '0xa', '0x418', '0xa', '0x41b', '0x41a', '0x46a', '0x41f', '0x6', '0xa', '0x412', '0xa', '0x410', '0x41a', '0x410', '0x412', '0x416', '0xa', '0x414', '0x41b', '0x46a', '0x41a', '0x41d', '0x414', '0x416', '0xa', '0x414', '0x417', '0x412', '0xa', '0x414', '0x41b', '0x416', '0x41e', '0x417', '0x412', '0x418', '0x41a', '0x464', '0x468', '0x46b', '0x465', '0xa', '0x46b', '0x41f', '0x410', '0x46a', '0x41f', '0x468', '0x41a', '0x416', '0x412', '0x15', '0xa', '0x52', '0x59', '0x59', '0x75', '0x45', '0x58', '0x75', '0x52', '0x45', '0x58', '0x75', '0x43', '0x59', '0x75', '0x4c', '0x5f', '0x44', '0x44', '0x53']
decrypted_values = [int(value, 16) for value in encrypted_values]
possible_keys = range(256)
for key in possible_keys:
    decrypted_result = [char ^ key for char in decrypted_values]
    print(f"дешифр: {''.join(map(chr, decrypted_result))}")

Запускам наш код и, что мы видим.

Снимок экрана 2023-12-28 в 19.01.09.png



Кучу мусора, и нашу желаемую строку с 42 ключем. Флаг у нас xss_or_xor_is_funny


Если у вас есть какие либо вопросы задавайте. Разбирать будем дальше, так же есть интересная затея реализовать CTF среди XSS в индивидуальном зачете, если вам это интересно, прошу тоже уведомить!

View hidden content is available for registered users!
 
Сверху Снизу