Skip to content

Latest commit

 

History

History

ppc-strange-api

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

medium | ppc | StrangeAPI

Описание

Во время очередного "пенетрейшн тестинга" нашли сервис, который назло отвечает какими-то сломанными сообщенями. Глянь, может у тебя получится наладить с ним дружеское общение?

http://{IP}:7070

Запуск

make deploy

Информация

Обычное HTTP API на Flask, общение с которым идёт через проксю, которая мешает каждую строку ответа и запроса, из-за чего любые стандартные утилиты (curl, браузер и т.п.) ломаются. Необходимо написать проксю, которая будет запросы и ответы проксировать правильным образом.

Решение

  1. К сожалению, исходный код приложения не даётся, так что придётся анализировать руками. 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>
    
  2. Если сравнить начало первой строки с тем, что должно быть - <!DOCTYPE HTML, то окажется, что поменяны местами символы на позициях 1 и 2, 3 и 5, 8 и 13, что должно напомнить последовательность чисел Фибоначчи.
  3. Из сложного остаётся написать проксю, которая будет в каждой строке запросов и ответов менять местами символы, следуя последовательности Фибоначчи. Написав проксю, зайдём на сайт.
  4. Главная страница сайта представляет собой обыкновенную документацию с одним эндпоинтом, описанным как "Flag endpoint. Needs a secret key." Если попробовать отослать запрос не имея секретного ключа, то, к сожалению, флаг мы не получим.
  5. Открыв спецификацию по пути /apispec_1.json, увидим хекс-строчку в примере значения секретного ключа. Попробовав отправить её в качестве секретного ключа (в заголовке Secret-Key), получим флаг.

Решение

Флаг

ptzctf{fibonacci-http-seems-pointless}