Compare commits
1
Commits
master
..
84d3a7417b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84d3a7417b |
No files matched your search
Generated
+2
-4
@@ -1,10 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
<orderEntry type="jdk" jdkName="Python 3.12 virtualenv at ~/PycharmProjects/MadokaMagicaSite/venv" jdkType="Python SDK" />
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="Python 3.12 (CTF-site-project)" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PyDocumentationSettings">
|
<component name="PyDocumentationSettings">
|
||||||
|
|||||||
Generated
-1
@@ -3,5 +3,4 @@
|
|||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Python 3.12 (pythonProject)" />
|
<option name="sdkName" value="Python 3.12 (pythonProject)" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (CTF-site-project)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
</project>
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# CTF для самых маленьких #
|
|
||||||
|
|
||||||
## Что это такое? ##
|
|
||||||
CTF - это игра/соревнование в области Информационной Безопасности, где команда
|
|
||||||
при помощи различных уязвимостей ищет флаг - уникальную последовательность
|
|
||||||
символов
|
|
||||||
|
|
||||||
Этот проект - русскоязычный обучающий сайт с лёгкими CTF-тасками для самых
|
|
||||||
начинающих. К каждому заданию есть подсказка, полностью объясняющая ход решения
|
|
||||||
со ссылками на другие полезные ресурсы, в том числе, англоязычные
|
|
||||||
|
|
||||||
## Как использовать? ##
|
|
||||||
Просто заходи на сайт и решай! К каждому заданию есть подсказка: попробуй
|
|
||||||
решить сам или используй подсказку на кнопку снизу слева
|
|
||||||
|
|
||||||
----------
|
|
||||||
|
|
||||||
## Возникли проблемы? ##
|
|
||||||
Не спеши писать ишью! Пиши на почту: **chest@codrs.ru**. Хочешь
|
|
||||||
поблагодарить? Посети наши другие проекты или ставь нам звёздочку:3
|
|
||||||
|
|
||||||
---------
|
|
||||||
|
|
||||||
## А где сайтик? ##
|
|
||||||
А вот же сайтик:
|
|
||||||
https://ctf.codrs.ru/
|
|
||||||
@@ -4,7 +4,7 @@ import sqlite3
|
|||||||
from random import getrandbits
|
from random import getrandbits
|
||||||
from func import *
|
from func import *
|
||||||
import base64
|
import base64
|
||||||
#Вот сюда тебе и надо, начинающий мастер OSINT'а! Только не смотри другие флаги: кто посмотрит, тот РџРѕРїРєР° :>
|
#Вот сюда тебе и надо, начинающий мастер OSINT'а! Только не смотри другие флаги: кто посмотрит, тот ***** :>
|
||||||
|
|
||||||
|
|
||||||
connection = sqlite3.connect('database.db')
|
connection = sqlite3.connect('database.db')
|
||||||
@@ -66,6 +66,8 @@ def osint():
|
|||||||
@app.route("/web/sql-injection", methods=('GET', 'POST'))
|
@app.route("/web/sql-injection", methods=('GET', 'POST'))
|
||||||
def websql():
|
def websql():
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
if 'login' not in (keys := request.form.keys()) or 'pass' not in keys:
|
||||||
|
abort(400)
|
||||||
login = request.form['login']
|
login = request.form['login']
|
||||||
password = request.form['pass']
|
password = request.form['pass']
|
||||||
cursor = get_db().cursor()
|
cursor = get_db().cursor()
|
||||||
@@ -77,74 +79,13 @@ def websql():
|
|||||||
return redirect(url_for('success_login'), code=302)
|
return redirect(url_for('success_login'), code=302)
|
||||||
return render_template('sql-injection.html')
|
return render_template('sql-injection.html')
|
||||||
|
|
||||||
@app.route("/web/success_login-sqltask", methods=('GET', 'POST'))
|
@app.route("/web/idor")
|
||||||
def success_login():
|
|
||||||
flag = session.get('sql_flag')
|
|
||||||
if request.method == 'POST':
|
|
||||||
user_flag = request.form['user_flag']
|
|
||||||
if user_flag == flag:
|
|
||||||
return render_template('success-sql.html', flag=flag, success_flag='.')
|
|
||||||
return render_template('success-sql.html', flag=flag, error='Ошибка: неверный флаг!')
|
|
||||||
if flag:
|
|
||||||
return render_template('success-sql.html', flag=flag)
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
idor_main_users = {}
|
|
||||||
|
|
||||||
@app.route("/web/idor", methods=('GET', 'POST'))
|
|
||||||
def webidor():
|
def webidor():
|
||||||
if request.method == 'POST':
|
|
||||||
if 'user_flag' in request.form.keys():
|
|
||||||
flag = session.get('idor_flag')
|
|
||||||
user_flag = request.form['user_flag']
|
|
||||||
if user_flag == flag and 'idor_id' in session.keys() and session['idor_id'] in idor_main_users.keys():
|
|
||||||
del idor_main_users[session['idor_id']]
|
|
||||||
return render_template('idor.html', flag=flag, success_flag='.')
|
|
||||||
return render_template('idor.html', flag=flag, error='Ошибка: неверный флаг!')
|
|
||||||
|
|
||||||
login = request.form['login']
|
|
||||||
mail = request.form['mail']
|
|
||||||
password = request.form['pass']
|
|
||||||
if not login:
|
|
||||||
return render_template('idor.html', error='Ошибка: не оставляйте себя без имени!')
|
|
||||||
if not password:
|
|
||||||
return render_template('idor.html', error='Ошибка: Пароль важен, заполните поле!')
|
|
||||||
|
|
||||||
session['idor_flag'] = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
|
||||||
session['idor_id'] = id = getrandbits(8) + 16
|
|
||||||
idor_main_users[id] = {'login': login,'mail': mail}
|
|
||||||
return redirect(url_for('webidor_user', id=session['idor_id']), code=302)
|
|
||||||
return render_template('idor.html')
|
return render_template('idor.html')
|
||||||
|
|
||||||
|
@app.route("/web/path-traversal")
|
||||||
@app.route("/web/idor/user_id<int:id>", methods=('GET', 'POST'))
|
|
||||||
def webidor_user(id):
|
|
||||||
if 'idor_id' not in session.keys():
|
|
||||||
abort(404)
|
|
||||||
if id <= 15:
|
|
||||||
idor_users = {0: ('admin', 'superadmin@codrs.ru', 'Самый крутой админ EVER!!! Не согласен - не прав!'), 1: ('LiTeRallY_me', 'l0ser@codrs.ru', 'О, я-я-я!!!'), 2: ('meg4_c4t', 'meowmeow@codrs.ru', 'Мяу-мяу, мяу-мяу... мяу-мяу, мяу-мяу'), 3: ('Pepeg4', 'pepeg@codrs.ru', 'Pepe love you too'), 4: ('ChestWithCat', 'chast@codrs.ru', 'Сундук из майнкрафта. На сундуке кот. Есть рыба, кота приручить?'), 5: ('legacy_user', 'legacy@coders-squad.com', 'А вот прошлый домен был лучше! Продались российским корпорациям!!!!!'), 6: ('m&ms', 'm&ms_lover@codrs.ru', 'Ставлю лайки за покупку m&ms, писать в ТГ'), 7: ('am0ng US', 'US_agent@gmail.com','Russishe Sweine!'), 8: ('anime_girl', 'megumin@codrs.ru', 'アニメ - 世界で一番いいもの'), 9: (session['idor_flag'], 'supercat@codrs.ru', 'О, смотри! Там флаг!!! Ты нашёл:3'), 10: ('b0ss_0f_this-GYM', 'b0ss@codrs.ru', 'И что же ты хотел увидеть в описании у Босса качалки?'),
|
|
||||||
11: ('CS2_Destroyer', 'player777@codrs.ru', 'Погнали в Напы выскочим, размотаем всех. Не играешь? Я в соло вытащу, а ты посмотришь'), 12: ('VerySweetBread', 'sweetbread@codrs.ru', '生姜猫が大好きです'), 13: ('pupok', 'pup_zemli@codrs.ru', 'Whait.. WHAT?!'), 14: ('secret_KGB_agent', 'b0rn_in_US4@codrs.su', 'Союз нерушимый республик свободных!'), 15: ('nikitata', '1ida_1over@codrs.ru', 'Раст победа?')}
|
|
||||||
return render_template('idor_user.html', user=idor_users[id])
|
|
||||||
if id not in idor_main_users.keys():
|
|
||||||
abort(404)
|
|
||||||
return render_template('idor-main-user.html', login=idor_main_users[id]['login'], mail=idor_main_users[id]['mail'])
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/web/path-traversal", methods=('GET', 'POST'))
|
|
||||||
def webpt():
|
def webpt():
|
||||||
flag_task3 = 'С4Tch_Fl4g{Y0u_Find_4_littl3_kitty}'
|
|
||||||
if request.method == 'POST':
|
|
||||||
user_flag = request.form['user_flag']
|
|
||||||
if user_flag == flag_task3:
|
|
||||||
return render_template('path-traversal.html', flag=flag_task3, success_flag='.')
|
|
||||||
return render_template('path-traversal.html', flag=flag_task3, error='Ошибка: неверный флаг!')
|
|
||||||
filename = request.args.get("file")
|
|
||||||
if not filename:
|
|
||||||
return render_template('path-traversal.html')
|
return render_template('path-traversal.html')
|
||||||
try:
|
|
||||||
return send_file(filename)
|
|
||||||
except FileNotFoundError:
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
@app.route("/web/ssti", methods=('GET', 'POST'))
|
@app.route("/web/ssti", methods=('GET', 'POST'))
|
||||||
def webssti():
|
def webssti():
|
||||||
@@ -248,27 +189,25 @@ def fhash():
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/osint/mapmaster", methods=('GET', 'POST'))
|
@app.route("/osint/geoguessr")
|
||||||
def osintgeoguessr():
|
def osintgeoguessr():
|
||||||
flag_task6 = "C4TchFl4g{1905}"
|
return render_template('osint-geoguessr.html')
|
||||||
if request.method == 'POST':
|
|
||||||
user_flag = request.form['user_flag']
|
|
||||||
if user_flag == flag_task6:
|
|
||||||
return render_template('mapmaster.html', flag=flag_task6, success_flag='.')
|
|
||||||
return render_template('mapmaster.html', flag=flag_task6, error='Ошибка: неверный флаг!')
|
|
||||||
return render_template('mapmaster.html')
|
|
||||||
|
|
||||||
@app.route("/osint/really_hard_task", methods=('GET', 'POST'))
|
@app.route("/osint/really_hard_task")
|
||||||
def osintrht():
|
def osintrht():
|
||||||
flag_task7 = "C4Tch_Fl4g{13ts_p14y_min3cr4ft_t0g3th3r}"
|
|
||||||
if request.method == 'POST':
|
|
||||||
user_flag = request.form['user_flag']
|
|
||||||
if user_flag == flag_task7:
|
|
||||||
return render_template('osint-hardtask.html', flag=flag_task7, success_flag='.')
|
|
||||||
return render_template('osint-hardtask.html', flag=flag_task7, error='Ошибка: неверный флаг!')
|
|
||||||
return render_template('osint-hardtask.html')
|
return render_template('osint-hardtask.html')
|
||||||
|
|
||||||
|
@app.route("/web/success_login-sqltask", methods=('GET', 'POST'))
|
||||||
|
def success_login():
|
||||||
|
flag = session.get('sql_flag')
|
||||||
|
if request.method == 'POST':
|
||||||
|
user_flag = request.form['user_flag']
|
||||||
|
if user_flag == flag:
|
||||||
|
return render_template('success-sql.html', flag=flag, success_flag='.')
|
||||||
|
return render_template('success-sql.html', flag=flag, error='Ошибка: неверный флаг!')
|
||||||
|
if flag:
|
||||||
|
return render_template('success-sql.html', flag=flag)
|
||||||
|
abort(404)
|
||||||
|
|
||||||
@app.errorhandler(werkzeug.exceptions.HTTPException)
|
@app.errorhandler(werkzeug.exceptions.HTTPException)
|
||||||
def error_handler(e):
|
def error_handler(e):
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.7 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 23 KiB |
@@ -1,9 +0,0 @@
|
|||||||
__ __
|
|
||||||
| \/ |
|
|
||||||
| \ / | ___ _____ ________ _ __ ___ ___ _____ __ _ __ ___ ___ _____ ________ _ __ ___ ___ _____ __
|
|
||||||
| |\/| |/ _ \/ _ \ \ /\ / /______| '_ ` _ \ / _ \/ _ \ \ /\ / / | '_ ` _ \ / _ \/ _ \ \ /\ / /______| '_ ` _ \ / _ \/ _ \ \ /\ / /
|
|
||||||
| | | | __/ (_) \ V V / | | | | | | __/ (_) \ V V / | | | | | | __/ (_) \ V V / | | | | | | __/ (_) \ V V /
|
|
||||||
|_| |_|\___|\___/ \_/\_/ |_| |_| |_|\___|\___/ \_/\_( ) |_| |_| |_|\___|\___/ \_/\_/ |_| |_| |_|\___|\___/ \_/\_/
|
|
||||||
|/
|
|
||||||
|
|
||||||
С4Tch_Fl4g{Y0u_Find_4_littl3_kitty}
|
|
||||||
+5
-9
@@ -311,10 +311,10 @@
|
|||||||
|
|
||||||
.headerblock {
|
.headerblock {
|
||||||
width: clamp(60rem, 65% , 140rem);
|
width: clamp(60rem, 65% , 140rem);
|
||||||
height: 10rem;
|
height: clamp(10rem, 20%, 10rem);
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
margin-left: 0;
|
margin-left: 0rem;
|
||||||
border-color: black;
|
border-color: #000000;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
border: none;
|
border: none;
|
||||||
box-shadow: 1em 1em 0em 0px rgba(186, 65, 166, 0.7);
|
box-shadow: 1em 1em 0em 0px rgba(186, 65, 166, 0.7);
|
||||||
@@ -325,6 +325,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background-color: rgb(0 0 0 / 85%);
|
background-color: rgb(0 0 0 / 85%);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.headerblock:hover {
|
.headerblock:hover {
|
||||||
@@ -532,14 +533,9 @@
|
|||||||
body {
|
body {
|
||||||
background-image: url(/static/imgs/bg.gif);
|
background-image: url(/static/imgs/bg.gif);
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: calc(100dvh - 2rem);
|
height: 100vh;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
padding-top: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
body > .container {
|
|
||||||
height: calc(100% - 12rem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
|||||||
+4
-11
@@ -1,21 +1,14 @@
|
|||||||
{% extends 'utils/_task.html' %}
|
{% extends 'utils/_task.html' %} <!--Тебе сюда!!!!-->
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'utils/_forensicsidenav.html' %}
|
{% include 'utils/_forensicsidenav.html' %}
|
||||||
<!--Тебе сюда!!!!-->
|
|
||||||
<div id="popup" class="sql-guide capsule-window">
|
<div id="popup" class="sql-guide capsule-window">
|
||||||
<p class="simpletext" style="text-align: left">Попробуй вставить ссылку на эту страницу в поисковик и провести поиск, а не просто перейти по ней. Твоя задача перейти на <a class="hltext" href="https://g.codrs.ru/Chest/CTF-site-project">Gitea</a> или <a class="hltext" href="https://github.com/cheeest/CTF-site-project">GitHub</a> проекта</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Также если в браузере открыть код элементов, то можно заметить комментарии с подсказками, намекающими на GitHub и Gitea</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Перейдя в файл <a class="hltext" href="https://g.codrs.ru/Chest/CTF-site-project/src/branch/master/app.pyt">app.py</a> в нём можно найти следующие строки:<span class="context" style="font-size: 0.9rem">(пример ниже)</span></p>
|
|
||||||
<pre><code class="codefont python">@app.route("/osint/found_me", methods=('GET', 'POST'))
|
|
||||||
def osintfound():
|
|
||||||
Y0u_Fin4ly_F0und_7his = '[флаг]'</code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Собственно на строке 30 и есть флаг</p>
|
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="small capsule-window info1" style="height: auto;">
|
<div class="small capsule-window info1" style="height: auto;">
|
||||||
<p class="simpletext">Просто найди флаг.. Так уж и быть: я разрешаю тебе использовать <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">Google</abbr></p>
|
<p class="simpletext"><abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)"></abbr></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flag-input">
|
<div class="flag-input">
|
||||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||||
@@ -39,4 +32,4 @@ def osintfound():
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<!--Дада, ты почти нашёл флаг.. Раз уж ты тут, может возьмёшь его напрямую из кода? Только не смотри на другие флаги там! Так будет нечестно!-->
|
<!--Дада, ты почти нашёл флаг.. Раз уж ты тут, может возьмёшь его напрямую из кода его одобрения? Только не смотри на другие флаги там! Так будет нечестно!-->
|
||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
<p class="simpletext" style="text-align: left">Открыв файл Shadow нужно найти хеш пароля суперпользователя - root. Строчка будет выглядеть так:</p>
|
<p class="simpletext" style="text-align: left">Открыв файл Shadow нужно найти хеш пароля суперпользователя - root. Строчка будет выглядеть так:</p>
|
||||||
<pre><code class="codefont bash">root:$5$$186cf774c97b60a1c106ef718d10970a6a06e06bef89553d9ae65d938a886eae:19111:0:::::</code></pre>
|
<pre><code class="codefont bash">root:$5$$186cf774c97b60a1c106ef718d10970a6a06e06bef89553d9ae65d938a886eae:19111:0:::::</code></pre>
|
||||||
<p class="simpletext" style="text-align: left">Видно, что алгоритм хеширования - <span class="mono">$5$</span> - sha-256, а соли вовсе нет. Можно попробовать подобрать пароль к хешу.</p>
|
<p class="simpletext" style="text-align: left">Видно, что алгоритм хеширования - <span class="mono">$5$</span> - sha-256, а соли вовсе нет. Можно попробовать подобрать пароль к хешу.</p>
|
||||||
<p class="simpletext" style="text-align: left">Для подбора пароля можно использовать онлайн утилиты, по типу <a class="hltext" href="https://crackstation.net/">Crack Station</a> или утилитой по-типу <a class="hltext" href="https://hashcat.net/hashcat/">hashcat</a>- именно она базово предустановленна в Kali:<span class="context" style="font-size: 0.9rem">(пример команды ниже)</span></p>
|
<p class="simpletext" style="text-align: left">Для подбора пароля можно использовать онлайн утилиты, по типу <a class="hltext" href="https://crackstation.net/">Crack Station</a> или утилитой по-типу <a class="hltext" href="https://hashcat.net/hashcat/">hashcat</a>(именно она базово предустановленна в Kali:
|
||||||
<pre><code class="codefont bash">hashcat -m 1470 [файл с хешом или сам хеш строкой] [словарь (в Kali базовый Rockyou)]</code></pre>
|
<pre><code class="codefont bash">hashcat -m 1470 [файл с хешом или сам хеш строкой] [словарь (в Kali базовый Rockyou)]</code></pre>
|
||||||
<p class="simpletext" style="text-align: left">Опция -m отвечат за тип хеша, в данном случае <span class="mono">1470 - sha-256</span></p>
|
<p class="simpletext" style="text-align: left">Опция -m отвечат за тип хеша, в данном случае <span class="mono">1470 - sha-256</span></p>
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="ru">
|
|
||||||
{% include 'utils/_head.html' %}
|
|
||||||
<body>
|
|
||||||
{% include 'utils/_header.html' %}
|
|
||||||
<div class="container" style="max-width:70%; justify-content: space-between;min-width: 40rem; flex-wrap: nowrap">
|
|
||||||
<div class="profile">
|
|
||||||
<h2 class="header" style="text-align:left">Ваш Профиль:</h2>
|
|
||||||
<p class="simpletext" style="text-align:left">Логин: <span class="context">{{ login }}</span></p>
|
|
||||||
<p class="simpletext" style="text-align:left">Почта: <span class="context">{{ mail }}</span></p>
|
|
||||||
<p class="simpletext" style="text-align:left">О Вас: <br />
|
|
||||||
<span class="mono">Здесь пока совсем ничего нет</span></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% include 'utils/_websidenav.html' %}
|
|
||||||
|
|
||||||
<div id="success"> <p>Вход произведён успешно!</p> </div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{% extends 'utils/_task.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% include 'utils/_websidenav.html' %}
|
|
||||||
|
|
||||||
<div id="popup" class="sql-guide capsule-window">
|
|
||||||
<p class="simpletext" style="text-align: left"><a class="hltext" href="https://portswigger.net/web-security/access-control/idor">IDOR(Insecure direct object references)</a> - уязвимость, позволяющая пользователю получить доступ к объекту (к которому он доступ иметь не должен) напрямую, без проверок, например по ID</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Как именно это работает? На сервере просто отсутствуют проверки, которые не дают пользователю реализовать доступ к определённым объектам. На сервере это может выглядеть так: <span class="context">(пример кода ниже)</span></p>
|
|
||||||
<pre><code class="codefont python">@app.route("/web/idor/user_id<int:id>")
|
|
||||||
def user(id):
|
|
||||||
return render_template(f'user_id{id}.html')</code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Грубо говоря, мы можем ввести ID в путь и получить приватную страницу пользователя<span class="context">(конкретно тут она не выглядит сильно приватной, но всё же)</span>, ID которого ввели</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Для решения этого задания стоит посмотреть на путь, и заметить, что там есть id : <span class = mono>ctf.codrs.ru/web/idor/user_id184</span>. Можно попробовать поменять ID и обнаружить, что нас переносит на странички других пользователей.<span class="context">ID, на которых есть странички - Ваш ID и числа от 0 до 15</span></p>
|
|
||||||
<p class="simpletext" style="text-align: left">Походив по профилям пользователей можно увидеть, что у одного из них <span class="context">(ID 9)</span> Имя пользователя - флаг.</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Далее стоит вернуться на главную, используя стрелочку назад в самом браузере, и ввести флаг в соответствующее поле. Будьте внимательны! После каждого нажатия кнопки <span class="mono">Войти</span> флаг перегенерируется.</p>
|
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="small capsule-window info1" style="height: auto;">
|
|
||||||
<form action="/web/idor" method="post" class="simpletext">
|
|
||||||
<p class="simpletext">Блин, я потерял страничку пользователя с почтой <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">supercat@codrs.ru</abbr>. Можешь поискать? Для начала войди на сайт.</p>
|
|
||||||
<div class="small-container" style="justify-content: center;" ><p>Логин: <p class="hidden">.</p> </p> <input type="text" name="login" class="inpt" /></div>
|
|
||||||
<div class="small-container" style="justify-content: center;"><p>Почта: <p class="hidden">.</p> </p> <input type="text" name="mail" class="inpt" /></div>
|
|
||||||
<div class="small-container" style="justify-content: center;"><p>Пароль:</p> <input type="password" name="pass" class="inpt"/></div>
|
|
||||||
<input type="submit" value="Войти" class="btn1">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flag-input">
|
|
||||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
|
||||||
<form action="/web/idor" method="post" class="simpletext">
|
|
||||||
<input class="inpt" type="text" name="user_flag" style="width: 100%; height: 1.25rem; margin: 0">
|
|
||||||
<input type="submit" value="Submit" class="btn1" style="margin-top: 1.25rem">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
<div id="error"> <p>{{ error }}</p> </div>
|
|
||||||
{% elif success_flag %}
|
|
||||||
<div class="task-done">
|
|
||||||
<h1 class="header">Вы прошли задание!</h1>
|
|
||||||
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
|
|
||||||
<a href="{{ url_for('web') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="ru">
|
|
||||||
{% include 'utils/_head.html' %}
|
|
||||||
<body>
|
|
||||||
{% include 'utils/_header.html' %}
|
|
||||||
<div class="container" style="max-width:70%; justify-content: space-between;min-width: 40rem; flex-wrap: nowrap">
|
|
||||||
<div class="profile">
|
|
||||||
<h2 class="header" style="text-align:left">Ваш Профиль:</h2>
|
|
||||||
<p class="simpletext" style="text-align:left">Логин: <span class="context">{{ user[0] }}</span></p>
|
|
||||||
<p class="simpletext" style="text-align:left">Почта: <span class="context">{{ user[1] }}</span></p>
|
|
||||||
<p class="simpletext" style="text-align:left">Описание: <br />
|
|
||||||
<span class="mono">{{ user[2] }}</span></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% include 'utils/_websidenav.html' %}
|
|
||||||
|
|
||||||
<div id="success"> <p>Вход произведён успешно!</p> </div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -34,10 +34,6 @@
|
|||||||
CTF Новости России -
|
CTF Новости России -
|
||||||
<a target="_blank" rel="noopener noreferrer" class="btn2" href="https://ctfnews.ru/">CTF News</a>
|
<a target="_blank" rel="noopener noreferrer" class="btn2" href="https://ctfnews.ru/">CTF News</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
|
||||||
CTF от СПБ -
|
|
||||||
<a target="_blank" rel="noopener noreferrer" class="btn2" href="https://forkbomb.ru/">forkbomb.ru</a>
|
|
||||||
</p>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -54,9 +50,9 @@
|
|||||||
большинство используемых утилит базово есть в
|
большинство используемых утилит базово есть в
|
||||||
<a target="_blank" rel="noopener noreferrer" href="https://www.kali.org/get-kali/#kali-platforms" class="hltext">Kali</a>.
|
<a target="_blank" rel="noopener noreferrer" href="https://www.kali.org/get-kali/#kali-platforms" class="hltext">Kali</a>.
|
||||||
Если вы используете Windows, то можно работать с
|
Если вы используете Windows, то можно работать с
|
||||||
<a target="_blank" rel="noopener noreferrer" href="https://www.virtualbox.org/wiki/Downloads" class="hltext">Виртуальной Машины</a > или использовать онлайн-утилиты</a>
|
<a target="_blank" rel="noopener noreferrer" href="https://www.virtualbox.org/wiki/Downloads" class="hltext">Виртуальной Машины</a>
|
||||||
</p>
|
</p>
|
||||||
<p> Good luck, have fun :3 </p>
|
<p> Good luck, have fun =) </p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="popup" class="meme capsule-window">
|
<div id="popup" class="meme capsule-window">
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
{% extends 'utils/_task.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% include 'utils/_forensicsidenav.html' %}
|
|
||||||
|
|
||||||
<div id="popup" class="sql-guide capsule-window">
|
|
||||||
<p class="simpletext" style="text-align: left">У этого таска есть 2 явных решения:</p>
|
|
||||||
<p class="simpletext" style="text-align: left">1. Использовать знания, полученные в ходе решения задания <a class="hltext" href="{{ url_for('fmetadata') }}">Метаданные и как их найти</a>. Открыв метаданные данного фото и пролистав в самый низ можно увидеть координаты: <span class="context">(пример строк ниже)</span></p>
|
|
||||||
<pre><code class="codefont html">GPS Latitude : 60 deg 0' 43.30" N
|
|
||||||
GPS Longitude : 30 deg 22' 43.70" E
|
|
||||||
GPS Position : 60 deg 0' 43.30" N, 30 deg 22' 43.70" E </code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left"> У нас есть координаты в градусах, секундах и минутах. Можем перевести их в десятичный формат и получаем координаты:</p>
|
|
||||||
<pre><code class="codefont html">60.012028, 30.378806</code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Введя координаты в любые карты они покажут место в Санкт-Петербурге, расположенное на северо-востоке от станции метро <a class="hltext" href="https://yandex.ru/maps/-/CHbim08A">"Политехническая"</a>, рядом есть <a class="hltext" href="https://yandex.ru/maps/-/CHbiMWiB">Политехнический парк</a>, где располагается Политехнический университет Петра Великого. Именно ему принадлежит <a class="hltext" href="https://yandex.ru/maps/-/CHbiIL4q">Гидробашня</a>, о которой идёт речь в задании. Погуглив год её постройки, получаем ответ: 1905.</p>
|
|
||||||
<p class="simpletext" style="text-align: left">2. Провести поиск по картинке и узнать, что территория с жёлтыми зданиями это <a class="hltext" href="https://yandex.ru/maps/-/CHbiIGOr">Военная академия связи</a>. Можно зайти на панорамы карт и определить точное место съёмки и даже увидеть верхушку нужной нам башни. Узнав, что это <a class="hltext" href="https://yandex.ru/maps/-/CHbiIL4q">Гидробашня</a> Политехнического университета Петра великого можно узнать год её постройки - всё тот же 1905</p>
|
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="small capsule-window info1" style="height: auto;">
|
|
||||||
<p class="simpletext" style="text-align: left">Зацените вид из окна! Весь город как на ладони, круть! Только я не знаю, можно ли делать фотки <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">территории с жёлтыми домами</abbr> - там люди в форме и различные антенны..?
|
|
||||||
Вообще я хочу попросить помощи. Недалеко от места съёмки, в парке, есть небольшая башня, она очень красивая, я часто прохожу мимо неё, однако ничего о ней не знаю. Можешь написать, в каком году она была основана? <span class="context">(В ответ запиши C4TchFl4g{год основания башни})</span></p>
|
|
||||||
<img style="heigth: auto; width: 20rem" src="{{ url_for('static', filename='imgs/Yandex-task.jpg') }}">
|
|
||||||
</div>
|
|
||||||
<div class="flag-input">
|
|
||||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
|
||||||
<form action="/osint/mapmaster" method="post" class="simpletext">
|
|
||||||
<input class="inpt" type="text" name="user_flag" style="width: 100%; height: 1.25rem; margin: 0">
|
|
||||||
<input type="submit" value="Submit" class="btn1" style="margin-top: 1.25rem">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
<div id="error"> <p>{{ error }}</p> </div>
|
|
||||||
{% elif success_flag %}
|
|
||||||
<div class="task-done">
|
|
||||||
<h1 class="header">Вы прошли задание!</h1>
|
|
||||||
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
|
|
||||||
<a href="{{ url_for('osint') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{% extends 'utils/_task.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% include 'utils/_osintsidenav.html' %}
|
|
||||||
|
|
||||||
<div id="popup" class="sql-guide capsule-window">
|
|
||||||
<p class="simpletext" style="text-align: left">Это задание чем-то хоже схоже с ARG. Стоит просто следовать подсказкам и быть внимательным, переходя от этапа к этапу.</p>
|
|
||||||
<p class="simpletext" style="text-align: left">В самом задании есть намёк на <a class="hltext" href="https://github.com/cheeest/CTF-site-project">GitHub</a> или <a class="hltext" href="https://g.codrs.ru/Chest/CTF-site-project">Gitea</a> проекта. Перейдя туда можно найти файл <a class="hltext" href="https://g.codrs.ru/Chest/CTF-site-project/src/branch/master/weird_file.txt">weird_file.txt</a>, где будет текст с битой кодировкой. Вернув кодировку а её исходный вид можно прочитать текст, где ещё в base64 зашифрована важная информация:</p>
|
|
||||||
<pre><code class="codefont python">Домен майнкрафт сервера (версия 1.7.4 - 1.21.4) - ctf.codrs.ru
|
|
||||||
При входе вписать команду - /server mega_minecraft_ctf</code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Зайдя на сервер нужно пройти мини-регистрацию и вписать вышеуказанную команду. У спавна можно увидеть табличку с обычным квадратным уравнением, ответами на которое будут координаты <span class="mono">x-42 и z-69</span>. Рядом стоит взять лодку, наступив на нажимную пластину, и поплыть к координатам. Ровно на месте будет телепорт наверх, откуда можно будет наблюдать флаг</p>
|
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
|
||||||
</div>
|
|
||||||
<div class="container">
|
|
||||||
<div class="small capsule-window info1" style="height: auto">
|
|
||||||
<p class="simpletext">Ты наверное уже видел Gitea или GitHub проекта.. Не находил там ничего странного? По-моему, при разработке там остался один <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">подозрительный файл</abbr>, сможешь посмотреть его?</p>
|
|
||||||
</div>
|
|
||||||
<div class="flag-input">
|
|
||||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
|
||||||
<form action="/osint/really_hard_task" method="post" class="simpletext">
|
|
||||||
<input class="inpt" type="text" name="user_flag" style="width: 100%; height: 1.25rem; margin: 0">
|
|
||||||
<input type="submit" value="Submit" class="btn1" style="margin-top: 1.25rem">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
<div id="error"> <p>{{ error }}</p> </div>
|
|
||||||
{% elif success_flag %}
|
|
||||||
<div class="task-done">
|
|
||||||
<h1 class="header">Вы прошли задание!</h1>
|
|
||||||
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
|
|
||||||
<a href="{{ url_for('osint') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
{% extends 'utils/_task.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% include 'utils/_websidenav.html' %}
|
|
||||||
|
|
||||||
<div id="popup" class="sql-guide capsule-window">
|
|
||||||
<p class="simpletext" style="text-align: left"><a class="hltext" href="https://portswigger.net/web-security/file-path-traversal">Path Traversal</a> - уязвимость, позволяющая пользователю получить доступ к файлам на хосте при помощи уязвимого параметра URL.</p>
|
|
||||||
<p class="simpletext" style="text-align: left">Как это работает? Для просмотра или скачивания файла на сайте есть условная кнопка, при нажатии на неё, в путь прибавляется параметр, аргумент которого - путь к файлу:<span class="context">(пример тега ниже)</span></p>
|
|
||||||
<pre><code class="codefont html"> <button class="big_btn" onclick="location.href='/cats/download_cat?file=static/imgs/cat.jpg'"></code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Да, это просто самый обычный путь, который без проверок принимается сервером, на что в ответ, пользователь получает запрошенный файл:<span class="context">(пример кода ниже)</span></p>
|
|
||||||
<pre><code class="codefont python"> filename = request.args.get("file")
|
|
||||||
return send_file(filename)</code></pre>
|
|
||||||
<p class="simpletext" style="text-align: left">Получается можно вписать туда что-то своё? Именно! В задании от нас хотят флаг, который лежит в <span class="mono">.txt</span> файле. Получается мы можем изменить параметр заменой <span class="mono">cat.jpg -> flag.txt</span></p>
|
|
||||||
<p class="simpletext" style="text-align: left">Есть и более жестокая эксплуатация сей уязвимости: можно откатиться на директории назад, дойти до корня и взять важный системный файл. Как это сделать? <span class="mono">../</span> вернёт нас на директорию назад. Так можем попробовать снова изменить путь: <span class="mono">cat.jpg -> ../../app.py</span>, что вернёт нам соответствующий <a calss="hltext" hraf="https://g.codrs.ru/Chest/CTF-site-project/src/branch/master/app.py">python файл</a></p>
|
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="small capsule-window info1" style="height: auto;">
|
|
||||||
<p class="simpletext"><abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">Посмотри</abbr> файл и помоги решить задачку, но будь внимателен, стоит проверять, что происходит при нажатии на подозрительные кнопки. Флаг в соотвествующем .txt файле</p>
|
|
||||||
<button class="btn1" onclick="location.href='/web/path-traversal?file=static/imgs/cat.jpg'">
|
|
||||||
К изображению
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flag-input">
|
|
||||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
|
||||||
<form action="/web/path-traversal" method="post" class="simpletext">
|
|
||||||
<input class="inpt" type="text" name="user_flag" style="width: 100%; height: 1.25rem; margin: 0">
|
|
||||||
<input type="submit" value="Submit" class="btn1" style="margin-top: 1.25rem">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
<div id="error"> <p>{{ error }}</p> </div>
|
|
||||||
{% elif success_flag %}
|
|
||||||
<div class="task-done">
|
|
||||||
<h1 class="header">Вы прошли задание!</h1>
|
|
||||||
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
|
|
||||||
<a href="{{ url_for('web') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<pre><code class="codefont bash">exiftool -[Название тега, который будет изменён]='что-нибудь, что хочется оставить в метаданных' [файл]</code></pre><br />
|
<pre><code class="codefont bash">exiftool -[Название тега, который будет изменён]='что-нибудь, что хочется оставить в метаданных' [файл]</code></pre><br />
|
||||||
<span class="context" style="font-size: 0.9rem">(пример)</span>
|
<span class="context" style="font-size: 0.9rem">(пример)</span>
|
||||||
<pre><code class="codefont bash">exiftool -Comment='Я люблю котиков' cat_img.png</code></pre>
|
<pre><code class="codefont bash">exiftool -Comment='Я люблю котиков' cat_img.png</code></pre>
|
||||||
<p class="simpletext" style="text-align: left">Если же возможности использовать Exiftool нет, то можно использовать онлайн версии или другие утилиты</p>
|
<p class="simpletext" style="text-align: left">Если же возможности использовать Exiftool нет, то можно использовать on-line версии или другие утилиты</p>
|
||||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
<link rel="stylesheet" href="{{ url_for('static', filename='index.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='index.css') }}">
|
||||||
<script src="{{ url_for('static', filename='scripts/animation.js') }}"></script>
|
<script src="{{ url_for('static', filename='scripts/animation.js') }}"></script>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
{%- if request.path != url_for('index') %}
|
{%- if request.path != url_for('index') %}
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/base16/ros-pine-moon.min.css">
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/base16/ros-pine-moon.min.css">
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
('webidor', "Уязвимость IDOR"),
|
('webidor', "Уязвимость IDOR"),
|
||||||
('webpt', "Уязвимость Path Traversal"),
|
('webpt', "Уязвимость Path Traversal"),
|
||||||
('webssti', "Уязвимость SSTI"),
|
('webssti', "Уязвимость SSTI"),
|
||||||
|
('webpsguide', "Немного о PortSwigger"),
|
||||||
) %}
|
) %}
|
||||||
{%- if request.path != url_for(link) %}
|
{%- if request.path != url_for(link) %}
|
||||||
<a href="{{ url_for(link) }}" class="link">{{ text }}</a>
|
<a href="{{ url_for(link) }}" class="link">{{ text }}</a>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
('webidor', "Уязвимость IDOR"),
|
('webidor', "Уязвимость IDOR"),
|
||||||
('webpt', "Уязвимость Path Traversal"),
|
('webpt', "Уязвимость Path Traversal"),
|
||||||
('webssti', "Уязвимость SSTI"),
|
('webssti', "Уязвимость SSTI"),
|
||||||
|
('webpsguide', "Немного о PortSwigger"),
|
||||||
) %}
|
) %}
|
||||||
<a href="{{ url_for(name) }}" class="btn1">{{ descr }}</a>
|
<a href="{{ url_for(name) }}" class="btn1">{{ descr }}</a>
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
Ты на верном пути, флаг будет скоро (надейся)
|
|
||||||
Может пока отвлечёшься и сыграешь в майн?
|
|
||||||
На версиях 1.7.4 - 1.21.4 есть один прикольный сервер,
|
|
||||||
где можно поиграть. Задёшь? Домен - Y29kcnMucnU=.
|
|
||||||
После проверки и входа в лобби найди нужный сервер при помощи команды в чате:
|
|
||||||
L3NlcnZlciBtZWdhX21pbmVjcmFmdF9jdGY=
|
|
||||||
Reference in new issue
Block a user