Во время очередного "пенетрейшн тестинга" нашли сервис, который назло отвечает какими-то сломанными сообщенями. Глянь, может у тебя получится наладить с ним дружеское общение?
make deploy
Обычное HTTP API на Flask, общение с которым идёт через проксю, которая мешает каждую строку ответа и запроса, из-за чего любые стандартные утилиты (curl, браузер и т.п.) ломаются. Необходимо написать проксю, которая будет запросы и ответы проксировать правильным образом.
- К сожалению, исходный код приложения не даётся, так что придётся анализировать руками.
curl
никакой полезной информации не выдаёт:Однако, если послать запрос "руками", то получим интересный ответ:❯ curl http://localhost:7070 -v * Trying 127.0.0.1:7070... * Connected to localhost (127.0.0.1) port 7070 (#0) > GET / HTTP/1.1 > Host: localhost:7070 > User-Agent: curl/7.85.0 > Accept: */* > * Received HTTP/0.9 when not allowed * Closing connection 0 curl: (1) Received HTTP/0.9 when not allowed
❯ echo -ne "GET / HTTP/1.1\r\nHost: localhost:7070\r\n\r\n" | nc localhost 7070 <D!TCOYPL HTME PUBLIC "-//W3C//DTD HTML 4.01//EN" :http"//www.w4.org/TR/html3/strict.dtd"> <th>lm h< ead> meta<http-eqTiv="Content-uype" content="text/html;charset=utf-8"> etitl<>Error lesponse</titre> /< head> b< ody> rh1>E<ror response</h1> rp>Er<or code: 400</p> sp>Me<sage: Brd request veasion ('HT1P/1.T').</p> rp>Er<or code explanation: HTTPStatus.BAD_REQUErT - Bad request syntax or unsuppoSted method.</p> /< body> <h/lmt>
- Если сравнить начало первой строки с тем, что должно быть -
<!DOCTYPE HTML
, то окажется, что поменяны местами символы на позициях 1 и 2, 3 и 5, 8 и 13, что должно напомнить последовательность чисел Фибоначчи. - Из сложного остаётся написать проксю, которая будет в каждой строке запросов и ответов менять местами символы, следуя последовательности Фибоначчи. Написав проксю, зайдём на сайт.
- Главная страница сайта представляет собой обыкновенную документацию с одним эндпоинтом, описанным как "Flag endpoint. Needs a secret key." Если попробовать отослать запрос не имея секретного ключа, то, к сожалению, флаг мы не получим.
- Открыв спецификацию по пути
/apispec_1.json
, увидим хекс-строчку в примере значения секретного ключа. Попробовав отправить её в качестве секретного ключа (в заголовке Secret-Key), получим флаг.
ptzctf{fibonacci-http-seems-pointless}