Compare commits
20 Commits
mobile
...
84d3a7417b
| Author | SHA1 | Date | |
|---|---|---|---|
| 84d3a7417b | |||
| 74317aef47 | |||
| 34c42374b5 | |||
| dc75b05877 | |||
| fb88fd9d67 | |||
| c5f3d37ef6 | |||
| cbb5f7cffe | |||
| a1eb5e8c27 | |||
| 4a639aeb9a | |||
| d3b7f4b286 | |||
| 0302e4b964 | |||
| 649c621345 | |||
| 50946c114b | |||
| 16adc1d99e | |||
| de78c5f8a0 | |||
| d271d2ce4d | |||
| e4c34ce8bd | |||
| 1ce1b57b4b | |||
| 4c349249eb | |||
| b32579b957 |
@@ -1,8 +1,11 @@
|
||||
import werkzeug
|
||||
from flask import Flask, render_template, request, url_for, session, redirect, g, abort, send_file
|
||||
from flask import Flask, render_template, request, url_for, session, redirect, g, abort, send_file, render_template_string
|
||||
import sqlite3
|
||||
from random import getrandbits
|
||||
from func import *
|
||||
import base64
|
||||
#Вот сюда тебе и надо, начинающий мастер OSINT'а! Только не смотри другие флаги: кто посмотрит, тот ***** :>
|
||||
|
||||
|
||||
connection = sqlite3.connect('database.db')
|
||||
cursor = connection.cursor()
|
||||
@@ -22,6 +25,16 @@ app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'ca4ac4ada05f91a5790d2132992bfaed86df15c4d08f2dfe'
|
||||
DATABASE = 'database.db'
|
||||
|
||||
@app.route("/osint/found_me", methods=('GET', 'POST'))
|
||||
def osintfound():
|
||||
Y0u_Fin4ly_F0und_7his = 'C4TchFl4g{Pls_supp0rt_my_pr0j3ct}'
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == Y0u_Fin4ly_F0und_7his:
|
||||
return render_template('found-me.html', flag=Y0u_Fin4ly_F0und_7his, success_flag='.')
|
||||
return render_template('found-me.html', flag=Y0u_Fin4ly_F0und_7his, error='Ошибка: неверный флаг!')
|
||||
return render_template('found-me.html')
|
||||
|
||||
def get_db():
|
||||
db = getattr(g, '_database', None)
|
||||
if db is None:
|
||||
@@ -53,6 +66,8 @@ def osint():
|
||||
@app.route("/web/sql-injection", methods=('GET', 'POST'))
|
||||
def websql():
|
||||
if request.method == 'POST':
|
||||
if 'login' not in (keys := request.form.keys()) or 'pass' not in keys:
|
||||
abort(400)
|
||||
login = request.form['login']
|
||||
password = request.form['pass']
|
||||
cursor = get_db().cursor()
|
||||
@@ -72,52 +87,107 @@ def webidor():
|
||||
def webpt():
|
||||
return render_template('path-traversal.html')
|
||||
|
||||
@app.route("/web/ssti")
|
||||
@app.route("/web/ssti", methods=('GET', 'POST'))
|
||||
def webssti():
|
||||
return render_template('ssti.html')
|
||||
id = session.get('ssti_id')
|
||||
flag = session.get('flag_ssti')
|
||||
if id not in comments.keys():
|
||||
session['ssti_id'] = id = hex(getrandbits(45))[2:]
|
||||
comments[id] = []
|
||||
session['flag_ssti'] = flag = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'user_flag' in request.form.keys():
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag:
|
||||
return render_template('ssti.html', flag=flag, success_flag='.')
|
||||
return render_template('ssti.html', flag=flag, error='Ошибка: неверный флаг!')
|
||||
|
||||
username = request.form['username']
|
||||
comment = request.form['user_comment']
|
||||
comments[id].append((username, comment))
|
||||
def render(x):
|
||||
try:
|
||||
return render_template_string(x, flag=flag)
|
||||
except:
|
||||
return x
|
||||
return render_template('ssti.html', render_template_string=render, comments=comments[id], flag=flag)
|
||||
|
||||
|
||||
comments = {}
|
||||
|
||||
|
||||
@app.route("/web/portswigger-guide")
|
||||
def webpsguide():
|
||||
return render_template('portswigger-guide.html')
|
||||
|
||||
@app.route("/forensic/metadata")
|
||||
@app.route("/forensic/metadata", methods=('GET', 'POST'))
|
||||
def fmetadata():
|
||||
session['task1_id'] = id = hex(getrandbits(45))[2:]
|
||||
session['task1_flag'] = flag_task1 = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||||
task1_flag(flag_task1, id)
|
||||
flag_task1 = session.get('flag_task1')
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag_task1:
|
||||
return render_template('task1-metadata.html', flag=flag_task1, success_flag='.')
|
||||
return render_template('task1-metadata.html', flag=flag_task1, error='Ошибка: неверный флаг!')
|
||||
if flag_task1:
|
||||
return render_template('task1-metadata.html', flag=flag_task1)
|
||||
abort(404)
|
||||
return render_template('task1-metadata.html')
|
||||
|
||||
if not flag_task1:
|
||||
session['task1_id'] = id = hex(getrandbits(45))[2:]
|
||||
session['flag_task1'] = flag_task1 = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||||
task1_flag(flag_task1, id)
|
||||
return render_template('task1-metadata.html', flag=flag_task1)
|
||||
|
||||
@app.route("/forensic/getimg")
|
||||
def forensic_task1():
|
||||
if 'task1_id' not in session.keys():
|
||||
abort(404)
|
||||
return send_file(f'/tmp/task1/{session['task1_id']}.jpg')
|
||||
|
||||
@app.route("/forensic/base-guide")
|
||||
@app.route("/forensic/base-guide", methods=('GET', 'POST'))
|
||||
def fbase():
|
||||
return render_template('base.html')
|
||||
flag_task4 = session.get('flag_task4')
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag_task4:
|
||||
return render_template('base.html', flag=flag_task4, success_flag='.')
|
||||
return render_template('base.html', flag=flag_task4, error='Ошибка: неверный флаг!')
|
||||
if not flag_task4:
|
||||
session['flag_task4'] = flag_task4 = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||||
base32str = str(base64.b32encode(flag_task4.encode()))[2:-1]
|
||||
base64str = str(base64.b64encode(f"Ой-ой, похоже, что самое главное всё ещё зашифровано.. Сможешь расшифровать, ОП? {base32str}".encode()))[2:-1]
|
||||
return render_template('base.html', base_task=base64str)
|
||||
|
||||
@app.route("/forensic/.docx_files")
|
||||
|
||||
@app.route("/forensic/.docx_files", methods=('GET', 'POST'))
|
||||
def fbinwalk():
|
||||
flag_task3 = 'C4TchFl4g{GT4_6_1eaks}'
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag_task3:
|
||||
return render_template('binwalk.html', flag=flag_task3, success_flag='.')
|
||||
return render_template('binwalk.html', flag=flag_task3, error='Ошибка: неверный флаг!')
|
||||
return render_template('binwalk.html')
|
||||
|
||||
@app.route("/forensic/hex")
|
||||
@app.route("/forensic/hex", methods=('GET', 'POST'))
|
||||
def fhex():
|
||||
flag_task2 = "C4TchFl4g{I_hir3d_7his_c4r_t0_st4r3_4t_Y0u}"
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag_task2:
|
||||
return render_template('hex.html', flag=flag_task2, success_flag='.')
|
||||
return render_template('hex.html', flag=flag_task2, error='Ошибка: неверный флаг!')
|
||||
return render_template('hex.html')
|
||||
|
||||
@app.route("/forensic/hash")
|
||||
@app.route("/forensic/hash", methods=('GET', 'POST'))
|
||||
def fhash():
|
||||
flag_task5 = "C4TchFl4g{superadmin}"
|
||||
if request.method == 'POST':
|
||||
user_flag = request.form['user_flag']
|
||||
if user_flag == flag_task5:
|
||||
return render_template('hash.html', flag=flag_task5, success_flag='.')
|
||||
return render_template('hash.html', flag=flag_task5, error='Ошибка: неверный флаг!')
|
||||
return render_template('hash.html')
|
||||
|
||||
@app.route("/osint/questions")
|
||||
def osintquestions():
|
||||
return render_template('osint-questions.html')
|
||||
|
||||
|
||||
@app.route("/osint/geoguessr")
|
||||
def osintgeoguessr():
|
||||
@@ -139,9 +209,9 @@ def success_login():
|
||||
return render_template('success-sql.html', flag=flag)
|
||||
abort(404)
|
||||
|
||||
@app.errorhandler(werkzeug.exceptions.NotFound)
|
||||
def handle_bad_request(e):
|
||||
return '<img src="https://http.cat/404.jpg">', 404
|
||||
@app.errorhandler(werkzeug.exceptions.HTTPException)
|
||||
def error_handler(e):
|
||||
return f'<img src="https://http.cat/{e.code}.jpg">', e.code
|
||||
|
||||
app.run(host="0.0.0.0", debug=False)
|
||||
connection.close()
|
||||
|
||||
@@ -2,6 +2,8 @@ import os
|
||||
|
||||
def task1_flag(flag_task1, id):
|
||||
os.system('exiftool -all= static/imgs/task1.jpg')
|
||||
os.system('mkdir /tmp/task1')
|
||||
if not os.path.exists('/tmp/task1'):
|
||||
os.mkdir('/tmp/task1')
|
||||
os.system(f'cp static/imgs/task1.jpg /tmp/task1/{id}.jpg')
|
||||
os.system(f"exiftool -Comment='{flag_task1}' /tmp/task1/{id}.jpg")
|
||||
os.system(f"exiftool -Comment='{flag_task1}' /tmp/task1/{id}.jpg")
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
@@ -168,6 +168,20 @@
|
||||
align-content: flex-start;
|
||||
}
|
||||
|
||||
.comments {
|
||||
background-color: rgb(35, 33, 54);
|
||||
height: 10rem;
|
||||
width: 95%;
|
||||
text-align: left;
|
||||
border-radius: 0.5rem;
|
||||
overflow-y: auto;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.comment {
|
||||
margin: 2rem;
|
||||
}
|
||||
|
||||
.navgoodlinks {
|
||||
display:flex;
|
||||
justify-content: start;
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
user1:$5$$a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3:19429:0:::::
|
||||
user2:$5$$b3a8e0e1f9ab1bfe3a36f231f676f78bb30a519d2b21e6c530c0eee8ebb4a5d0:19469:0:::::
|
||||
herobrine:$5$$35a9e381b1a27567549b5f8a6f783c167ebf809f1c4d6a9e367240484d8ce281:19523:0:::::
|
||||
nobody:*:19429:0:::::
|
||||
root:$5$$186cf774c97b60a1c106ef718d10970a6a06e06bef89553d9ae65d938a886eae:19111:0:::::
|
||||
superman:$5$$73cd1b16c4fb83061ad18a0b29b9643a68d4640075a466dc9e51682f84a847f5:19999:0:::::
|
||||
cat:$5$$77af778b51abd4a3c51c5ddd97204a9c3ae614ebccb75a606c3b6865aed6744e:19765:0:::::
|
||||
bin:*:19111:0:9999:7:::
|
||||
sys:*:19111:0:99999:7:::
|
||||
_kali:$5$$fc5669b52ce4e283ad1d5d182de88ff9faec6672bace84ac2ce4c083f54fe2bc:19111:0:::::
|
||||
Binary file not shown.
@@ -0,0 +1,69 @@
|
||||
{% 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"><a href="https://habr.com/ru/articles/190054/" class="hltext">Кодировки Base64 и Base32</a> - метод представления бинарных данных в виде текста, однако часто используется во всяких загадках, ARG и CTF как "шифр"</p>
|
||||
<p class="simpletext" style="text-align: left">Как кодировать или декодировать Base64 и Base32? Обычно для этого используют онлайн утилиты, одна из самых удобных - <a href="https://gchq.github.io/CyberChef/" class="hltext">CyberChef</a>. Также полезно знать способ с Python, для этого есть отдельная библиотека:<span class="context" style="font-size: 0.9rem">(пример кода ниже)</span></p>
|
||||
<pre><code class="codefont python">import base64
|
||||
|
||||
data = "[данные]"
|
||||
|
||||
#Для Base64:
|
||||
encoded_data64 = base64.b64encode(data)
|
||||
decoded_data64 = base64.b64decode(encoded_data64)
|
||||
|
||||
#Для Base32:
|
||||
encoded_data32 = base64.b32encode(data)
|
||||
decoded_data32 = base64.b32decode(encoded_data32)
|
||||
</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Также есть базовые утилиты для командной строки:<span class="context" style="font-size: 0.9rem">(пример команд ниже)</span></p>
|
||||
<pre><code class="codefont bash">base64 [файл] > [закодированный файл] #Для кодировки файлов
|
||||
echo -n "Ваш текст" | base64 #Для кодировки текста
|
||||
base64 -d [Закодированный файл] > [Декодированный документ] #Для декодировки файлов
|
||||
echo -d "Закодированный текст" | base64 #Для декодировки текста
|
||||
|
||||
</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Как различать Base64 и Base32? Они используют разный набор символов для представления данных:<span class="context" style="font-size: 0.9rem">(пример ниже)</span></p>
|
||||
<pre><code class="codefont bash">
|
||||
#Алфавит Base64 (чувствителен к регистру):
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
abcdefghijklmnopqrstuvwxyz
|
||||
0123456789 + /
|
||||
|
||||
#Алфавит Base32 (нечувствителен к регистру):
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
234567
|
||||
</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Различать их стоит по наличию символов <span class="mono">0, 1, I, L, O</span> - у Base32 их нет. Символ <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">
|
||||
<p class="simpletext">На просторах небезызвестной ветки /b форума Двач я нашёл это.. Оно определённо точно напоминает мне <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">какую-то кодировку</abbr>.. или их там сразу две? Поможешь разгадать эту загадку?</p>
|
||||
<pre><code style="width: 35rem" class="codefont bash">{{ base_task }}</code></pre>
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/forensic/base-guide" 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('forensic') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,41 @@
|
||||
{% 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"><a href="https://encyclopedia.kaspersky.ru/glossary/docx/" class="hltext">.docx</a> файлы это примерно одно и то же, что простой .zip архив. Внутри него отдельными файлами хранятся шрифты, содержание, разметка и приложения, в общем - всё, что использовалось в документе.</p>
|
||||
<p class="simpletext" style="text-align: left">Таким образом, если файл не открывается, то можно попробовать вытащить его содержимое, используя предустановленную в Kali утилиту <a href="https://kali.tools/?p=6771" class="hltext">Binwalk</a>. (Ну или посмотреть на повреждённые сигнатуры.. Но об этом в таске про <a href="{{ url_for('fhex') }}" class="hltext">Hex</a>)</p>
|
||||
<p class="simpletext" style="text-align: left">Как использовать утилиту binwalk? Для начала стоит просто просмотреть файл на наличие в нём чего-либо:<span class="context" style="font-size: 0.9rem">(пример команды ниже)</span></p>
|
||||
<pre><code class="codefont bash">binwalk [файл]</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Если в выданных данных вы замечаете что-то, что не пустое, то можно попробовать извлечь всё содежимое, добавив соответсвующий флаг в команду:</p>
|
||||
<pre><code class="codefont bash">binwalk -e [файл]</code></pre>
|
||||
<p class="simpletext" style="text-align: left"> Конкретно в этом таске в извлечённых данных будут картинки, а на одной из них - флаг-ответ.</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="Смотри подсказку(кнопка снизу слева)">(Доклад.docx)</abbr> повредился или что-то типо того... Поможешь мне найти флаг в том, что осталось от моей работы?</p>
|
||||
<a href="{{ url_for('static', filename='Доклад.docx') }}" class="simpletext header" style="font-size: 1.6rem">Доклад.docx</a>
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/forensic/.docx_files" 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('forensic') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,35 @@
|
||||
{% extends 'utils/_task.html' %} <!--Тебе сюда!!!!-->
|
||||
|
||||
{% block content %}
|
||||
{% include 'utils/_forensicsidenav.html' %}
|
||||
|
||||
<div id="popup" class="sql-guide capsule-window">
|
||||
<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></p>
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/osint/found_me" 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 %}
|
||||
|
||||
<!--Дада, ты почти нашёл флаг.. Раз уж ты тут, может возьмёшь его напрямую из кода его одобрения? Только не смотри на другие флаги там! Так будет нечестно!-->
|
||||
@@ -0,0 +1,52 @@
|
||||
{% 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"><a class="hltext" href="https://manpages.ubuntu.com/manpages/trusty/ru/man5/shadow.5.html">Файл Shadow</a> - это системный файл в Linux, который хранит хэшированные пароли пользователей.</p>
|
||||
<p class="simpletext" style="text-align: left">Shadow содержит в себе информацию в следующем виде:</p>
|
||||
<pre><code class="codefont bash">username:password_hash:last_change:min:max:warn:inactive:expire:reserved
|
||||
|
||||
1 username - имя пользователя
|
||||
2 password_hash - Хеш пароля :$алгоритм шифрования$соль$хеш:
|
||||
3 last_change - Последнее изменение (в днях с 1970)
|
||||
4 min - Минимум дней между сменами пароля
|
||||
5 max - Максимум дней, через которые пароль надо сменить
|
||||
6 warn - За сколько дней до истечения пароля предупредить
|
||||
7 inactive - Сколько дней после истечения пароль остаётся активен
|
||||
8 expire - День, когда аккаунт полностью истекает (в днях с 1970)
|
||||
9 reserved - Зарезервировано для будущего использования
|
||||
</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Открыв файл Shadow нужно найти хеш пароля суперпользователя - root. Строчка будет выглядеть так:</p>
|
||||
<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">Для подбора пароля можно использовать онлайн утилиты, по типу <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>
|
||||
<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>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="small capsule-window info1" style="height: auto">
|
||||
<p class="simpletext">На своей рабочей машине я смог достать этот <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">файл</abbr>.. Я где-то слышал, что в нём есть то, что поможет мне стать админом - пароль или что-то вроде.. но Вместо пароля там написан какой-то бред!<span class="context" style="font-size: 0.9rem">(в ответ напиши C4Tch_Fl4g{сюда вставь пароль админа})</span></p>
|
||||
<a href="{{ url_for('static', filename='shadow') }}" class="simpletext header" style="font-size: 1.6rem">Shadow</a>
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/forensic/hash" 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('forensic') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,46 @@
|
||||
{% 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">Любой файл можно представить в виде <a href="https://course.ugractf.ru/stegano/files.html" class="hltext">Hex-данных</a>.</p>
|
||||
<p class="simpletext" style="text-align: left">Для записи байтов в hex формате используется 16-ричный вид (по 2 цифры), т.е от 0 до F. В Hex'е файла можно наблюдать: важные сигнатуры, указывающие на тип файла и просто байты информации.</p>
|
||||
<p class="simpletext" style="text-align: left">Эти данные можно редактировать в Hex-редакторах, например, <a href="https://course.ugractf.ru/stegano/files.html" class="hltext">xxd</a>. Открыть файл и посмотреть его Hex с помощью xxd можно так:<span class="context" style="font-size: 0.9rem">(пример команды ниже)</span></p>
|
||||
<pre><code class="codefont bash">xxd [файл]</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Не обязательно вносить какие-либо изменения, можно просто внимательно посмотреть их представление в формате ASCII <span class="context" style="font-size: 0.9rem">(Обычно слева - данные в бинарном виде, посередине - столбик с 16-ричными данными (Hex), а справа их представление в понятном нам языке, в виде символов ASCII).</span></p>
|
||||
<pre><code class="codefont bash">
|
||||
│00000000│ 50 4b 03 04 14 00 06 00 ┊ 08 00 00 00 21 00 32 91 │PK•••⋄•⋄┊•⋄⋄⋄!⋄2×│
|
||||
│00000010│ 6f 57 66 01 00 00 a5 05 ┊ 00 00 13 00 08 02 5b 43 │oWf•⋄⋄ו┊⋄⋄•⋄••[C│
|
||||
│00000020│ 6f 6e 74 65 6e 74 5f 54 ┊ 79 70 65 73 5d 2e 78 6d │ontent_T┊ypes].xm│
|
||||
│00000030│ 6c 20 a2 04 02 28 a0 00 ┊ 02 00 00 00 00 00 00 00 │l ו•(×⋄┊•⋄⋄⋄⋄⋄⋄⋄│</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Вышеприведённый пример - начало любого .docx файла и в самом начале у него идут 2 байта отвечающие за его структуру <a href="{{ url_for('fbinwalk') }}" class="hltext" title="Задание на эту тему">архива</a> - PK или же 50 4b. Если их повредить, т.е изменить в редакторе 50 4b -> 00 00, то файл просто перестанет открываться.</p>
|
||||
<p class="simpletext" style="text-align: left">Однако в случае нашего задания нужно просто посмотреть на строки без пустых или бесполезных байтов. С этим может помочь утилита <a href="https://ioflood.com/blog/strings-linux-command/" class="hltext">strings</a>:<span class="context" style="font-size: 0.9rem">(пример команды ниже)</span></p>
|
||||
<pre><code class="codefont bash">strings [файл]</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Именно она и выведет нам флаг быстрее всех.</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>?</p>
|
||||
<img style="heigth: auto; width: 23rem" src="{{ url_for('static', filename='imgs/hextask.jpg') }}">
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/forensic/hex" 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('forensic') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -8,7 +8,7 @@
|
||||
<p class="simpletext">< Задания категории OSINT ></p>
|
||||
<nav class="navbtn">
|
||||
{%- for name, descr in (
|
||||
('osintquestions', "Чур ответы не гуглить!"),
|
||||
('osintfound', "Чур ответы не гуглить!"),
|
||||
('osintgeoguessr', "Профессионал Яндекс-карт"),
|
||||
('osintrht', "Реально сложный таск"),
|
||||
) %}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{% extends 'utils/_task.html' %}
|
||||
{% include 'utils/_osintsidenav.html' %}
|
||||
{% block content %}
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,6 +1,8 @@
|
||||
{% extends 'utils/_task.html' %}
|
||||
{% include 'utils/_websidenav.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://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html?highlight=sql%20inje#what-is-sql-injection">SQL-инъекция</a> - уязвимость системы, позволяющая пользователю ввести вредоносный код в SQL-запрос.<br />
|
||||
<p class="simpletext" style="text-align: left">Как именно это работает? Все дело в том, что данные, которые ввёл пользователь, вставляются в запрос напрямую <span class="context" style="font-size: 0.9rem">(пример кода с сервера ниже)</span></p>
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
{% 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"><a href="https://portswigger.net/web-security/server-side-template-injection" class="hltext">SSTI (Server-side template injection)</a> - уязвимость, позволяющая внедрить код в шаблон, выполнив его на стороне сервера.</p>
|
||||
<p class="simpletext" style="text-align: left">Как это работает? Если пользователь ввёдет где-либо на сайте не просто текст, а команду, вставляемую в шаблонизатор, то сервер может выполнить её и вернуть пользователю результат, если не стоит должных защит. Примерно так это выглядит на сервере:<span class="context" style="font-size: 0.9rem">(пример кода ниже)</span></p>
|
||||
<pre><code class="codefont python">if request.method == 'POST':
|
||||
comment = request.form['user_comment']
|
||||
# В HTML комментарий вставляется через вызов переменной: {% raw %} <p> {{ comment }} </p> {% endraw %}</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Можно заметить, что {% raw %} {{ }} {% endraw %} передают переменную. Т.е пользователь может просто написать команду такого же вида в поле ввода и она будет выполнена. </p>
|
||||
<p class="simpletext" style="text-align: left">В нашем случае можем ввести в комментарии:</p>
|
||||
<pre><code class="codefont python">{% raw %} {{ flag }} {% endraw %}</code></pre>
|
||||
<p class="simpletext" style="text-align: left">На доске же вместо нашего "комментария" отобразится введённая переменная, т.е флаг</p>
|
||||
<p class="simpletext" style="text-align: left">Однако можно в {% raw %} {{ }} {% endraw %} вписать любую команду и она будет выполнена с одним "но": Современные шаблонизаторы неохотно обрабатывают в принципе всё, что в них суют и даже здесь уязвимость создана искусственно</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">Приветствую тебя, о сетевой путник! <br />
|
||||
Прошу, оставь упоминание о себе здесь! Тут допускается всё: ничего страшного если твой комментарий будет <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">немного странным</abbr></p>
|
||||
<form action="/web/ssti" method="post" class="simpletext">
|
||||
<div class="small-container" style="justify-content: space-between;"><p>Никнейм:</p> <input type="text" name="username" class="inpt" /></div>
|
||||
<div class="small-container" style="justify-content: space-between;"><p>Комментарий:</p> <input type="text" name="user_comment" class="inpt"/></div>
|
||||
<input type="submit" value="Отправить" class="btn1" style="margin-top: 1.25rem">
|
||||
</form>
|
||||
<div class="comments">
|
||||
<div class="comment">
|
||||
{% for (username, comment) in comments -%}
|
||||
<p class="header" style="text-align: left">{{ username }}</p>
|
||||
<p class="mono">{{ render_template_string(comment) }}</p>
|
||||
{% endfor -%}
|
||||
</div>
|
||||
<div class="comment">
|
||||
<p class="header" style="text-align: left">Sup3r_C4t</p>
|
||||
<p class="mono">Мяу-мяу Мяу-мяу</p>
|
||||
</div>
|
||||
<div class="comment">
|
||||
<p class="header" style="text-align: left">Herobrine</p>
|
||||
<p class="mono">▓▒░(°◡°)░▒▓</p>
|
||||
</div>
|
||||
<div class="comment">
|
||||
<p class="header" style="text-align: left">0MegaCTF++</p>
|
||||
<p class="mono">Выходи сюда, глупый Админ! Отдавай флаг!!!!(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="/web/ssti" 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 %}
|
||||
@@ -26,7 +26,7 @@
|
||||
<div class="task-done">
|
||||
<h1 class="header">Вы прошли задание!</h1>
|
||||
<img class="done" src="{{ url_for('static', filename='imgs/done_icon.png') }}">
|
||||
<a href="{{ url_for('index') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < НА ГЛАВНУЮ > </a>
|
||||
<a href="{{ url_for('web') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div id="success"> <p>Вход произведён успешно!</p> </div>
|
||||
|
||||
@@ -1,22 +1,44 @@
|
||||
{% extends 'utils/_task.html' %}
|
||||
{% include 'utils/_forensicsidenav.html' %}
|
||||
|
||||
{% block content %}
|
||||
{% include 'utils/_forensicsidenav.html' %}
|
||||
|
||||
<div id="popup" class="sql-guide capsule-window">
|
||||
<p class="simpletext" style="text-align: left"><a href="https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/index.html?highlight=metadata#metadata" class="hltext">Метаданные (Metadata)</a> - данные несущие информацию о других данных, например о каком-либо файле<br />
|
||||
<p class="simpletext" style="text-align: left"> Что там может быть? Примерно всё, что угодно, но обычно там пишется техническая информация о файле или методе, которым он был получен: дата последнего изменения, разрешение или размер, у фотографий можно найти модель камер и тд. Также метаданные можно перезаписывать или добавлять туда новые свойства. Для этого есть много утилит, однако в Kali базово предустановлена <a href="https://kali.tools/?p=5984" class="hltext">Exiftool</a>.<br />
|
||||
<p class="simpletext" style="text-align: left"> Посмотреть метаданные картинки, используя exiftool, можно следующим образом:<span class="context" style="font-size: 0.9rem">(пример команды ниже)</span></p>
|
||||
<pre><code class="codefont bash">exiftool [файл]</code></pre>
|
||||
<p class="simpletext" style="text-align: left">В консоли появятся метаданные, где, в нашем случае, будет спрятан флаг</p>
|
||||
<p class="simpletext" style="text-align: left">Если хочется внести что-то твоё в метаданные файла или перезаписать их, то можно использовать следующую команду:
|
||||
<pre><code class="codefont bash">exiftool -[Название тега, который будет изменён]='что-нибудь, что хочется оставить в метаданных' [файл]</code></pre><br />
|
||||
<span class="context" style="font-size: 0.9rem">(пример)</span>
|
||||
<pre><code class="codefont bash">exiftool -Comment='Я люблю котиков' cat_img.png</code></pre>
|
||||
<p class="simpletext" style="text-align: left">Если же возможности использовать Exiftool нет, то можно использовать on-line версии или другие утилиты</p>
|
||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="capsule-window info1">
|
||||
<p class="simpletext">Перед тобой картинка. Проверь её метаданные, вдруг там что-то есть</p>
|
||||
<img src="{{ url_for('forensic_task1') }}">
|
||||
<div class="small capsule-window info1" style="height: auto">
|
||||
<p class="simpletext">Перед тобой очень забавная картинка. Попробуй проверить её <abbr class="hltext" title="Смотри подсказку(кнопка снизу слева)">метаданные</abbr>, вдруг там что-то есть</p>
|
||||
<img style="heigth: auto; width: 30rem" src="{{ url_for('forensic_task1') }}">
|
||||
</div>
|
||||
<div class="flag-input ">
|
||||
<div class="flag-input">
|
||||
<h3 class="header" style="text-align:left">Введите ответ:</h3>
|
||||
<form action="success_login" method="post" class="simpletext">
|
||||
<form action="/forensic/metadata" 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 id="popup" class="sql-guide capsule-window">
|
||||
<p class="simpletext"style="text-align: left"><a class="hltext" href="https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html?highlight=sql%20inje#what-is-sql-injection">SQL-инъекция</a> - уязвимость системы, позволяющая пользователю ввести вредоносный код в SQL-запрос.<br />
|
||||
|
||||
<span class="close-btn usable-context" onclick="hidePopup()">скрыть</span>
|
||||
</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('forensic') }}" class="usable-context" style="text-align: canter; margin: 1rem; padding: 1rem;"> < Вернуться к заданиям > </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -3,7 +3,7 @@
|
||||
<nav class="navlink">
|
||||
<a href="{{ url_for('index') }}" class="link">На главную</a>
|
||||
{%- for link, text in (
|
||||
('osintquestions', "Чур ответы не гуглить!"),
|
||||
('osintfound', "Чур ответы не гуглить!"),
|
||||
('osintgeoguessr', "Мастер яндекс-карт"),
|
||||
('osintrht', "Реально сложный таск"),
|
||||
) %}
|
||||
|
||||
Reference in New Issue
Block a user