CTF Квест
На конференции highload 2018, компания wallarm делала и досих пор доступен для прохождения ctf квест. Ниже описание некоторых забавных моментов и сути этого контеста, под катом спойлеры. А в конце ссылки.
.----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. |
| | ______ | || | _________ | || | _________ | |
| | .' ___ | | || | | _ _ | | || | |_ ___ | | |
| | / .' \_| | || | |_/ | | \_| | || | | |_ \_| | |
| | | | | || | | | | || | | _| | |
| | \ `.___.'\ | || | _| |_ | || | _| |_ | |
| | `._____.' | || | |_____| | || | |_____| | |
| | | || | | || | | |
| '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------'
Что такое CTF квесты вообще ?
Обычно это не которые задания по получению доступа к определенным системам или ее частям. Подобные квесты проводят в осовном security компании занимающиейся информационной безопасностью с целью нанять новых сотрудников, другими словами решая квесты по показываете что у вас есть скиллэто делать. А навыки эти полезны для этим компаниям, другими словами это геймификация проверки необходимого скилла, без нарушения чьих либо прав. Появилось это все конечно не сегодня, а намного раньше, - crackme были небольшие программы для проверки реверс инженеринг скилла, и раньше они в основном использовались для того чтобы показать разные техники защиты и обхода ограничений.
Концепция квеста от Wallarm
Вы подключаетесь за некую Сьюзен, и помогаете ей получить доступ
Чтобы получить задание нужно подключиться по ssh к серверу, все начинается с безобидного:
escape.myctf.ru
port: 22
username: suzen1
password: suzen1
ssh suzen1@escape.myctf.ru
suzen1@escape.myctf.ru's password:
####################################
# #
# Hello! It's level 1 #
# try something of cat, ls, cd #
# #
####################################
~ $ ls
diary.txt
~ $ cat diary.txt
Привет! Меня зовут Сьюзен и это мой дневник...
День 1:
Потыкав на клавиши я заставила-таки эту железяку зажечь свой экран.
На рабочем столе оказалась карточка с надписью:
IxWJeqKOR80ZfaxUr15vL7i6tbWz
*Пароль специально изменен чтобы небыло желания копипасить без прохождения.
2 Уровень
suzen2@escape.myctf.ru's password:
####################################
# #
# Hello! It's level 2 #
# try something of #
# ls|cd|cat|less|more|head|tail #
# to read password from homedir #
# #
# Read Suzen diary for the details #
# #
####################################
~ $ ls
#~o )~: :( :S :~( :~@ :~Q <:3)~ =P O:~) ~,~
$diary.txt *<:o) :) :_( :~) :~B :~o =( =^.^= XD ~:0
(*v*) *~* :* :o :~)(~: :~D :~| =) =~O X~(
(.V.) -$ :*) :o3 :~)* :~E :~∕ =8) >:) X~p
(~: 8~) :> :~# :~* :~J ;) =D B~) ^_^
(~}{~) :'( :P :~& :~> :~P ;~) =O O.o |~O
~ $ cat $diary.txt
cat: can't open '.txt': No such file or directory
~ $ cat *.txt
Привет! Меня зовут Сьюзен и это мой дневник... День 2: Пароль, который я нашла на рабочем столе помог мне выбраться из этой страшной комнаты через неприметную дверь в углу. Я долго вводила его в терминал, ведь знаете, моими маленькими пальчиками не очень то просто было нажимать эти тугие клавиши! Выйдя из комнаты я очутилась в длинном темном коридоре. Как только я отпустила дверь она захлопнулась, оставив меня в кромешной тьме. Делать то нечего, пришлось идти вперед. Держась за стену и чувствуя ее неровности шла все дальше и дальше, потеряв счет времени и пространству... Эти лица... они повсюду... они смотрят на меня.... Мне нужно найти ответ среди этих закорючек.... Я чувствую, что содержимое у них имеет одинаковый размер, но только в одном из них я смогу найти что-то полезное...
Тут все просто нужно посомтреть на файлы повнимательнее, и понять в каком файле пароли и как его выевести на экране с помошью доступных инструментов, определеным образом экранируя спецсимволы в названии файла.
3 уровень
suzen3
####################################
# #
# Hello! It's level 3 #
# only ls, really?? #
# #
####################################
~ $ ls
-diary.txt-
~ $ ls -la
total 12
-rw-r--r-- 1 root root 728 Nov 7 14:01 -diary.txt-
drwxr-xr-x 1 root root 4096 Nov 7 15:21 .
drwxr-xr-x 1 root root 4096 Oct 31 13:46 ..
Просто так прочитать файл -diary-.txt неполучится, нужно придумать способ как сделать это с помошью доступных инструментов, а доступно не так много:
~ $ ls -la /bin/
total 2116
drwxr-xr-x 1 root root 4096 Nov 7 15:24 .
drwxr-xr-x 1 root root 4096 Nov 23 10:48 ..
-rwxr-xr-x 1 root root 307 Oct 31 16:17 hello
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 ls
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 sh
Подсказывать тут нечего, набор инструментов намекает на прямой вариант сделать это unxiway способом.
Идея понятна, на каждом хосте надо выполнить опредленные действия чтобы получить пароль к следующему хосту. Собственно я хотел рассказать в этой заметке не о самом контесте, а о конкретных заданиях и решениях.
C 4 уровня начинаются интересные задачи, и вот одно из них
.----------------. .----------------. .----------------. .----------------. .-----------------.
.--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| _______ | || | _____ _____ | || | ________ | || | _________ | || | ____ _____ | |
| / ___ | | || ||_ _||_ _|| || | | __ _| | || | |_ ___ | | || ||_ \|_ _| | |
| | (__ \_| | || | | | | | | || | |_/ / / | || | | |_ \_| | || | | \ | | | |
| '.___`-. | || | | ' ' | | || | .'.' _ | || | | _| _ | || | | |\ \| | | |
| |`\____) | | || | \ `--' / | || | _/ /__/ | | || | _| |___/ | | || | _| |_\ |_ | |
| |_______.' | || | `.__.' | || | |________| | || | |_________| | || ||_____|\____| | |
| | || | | || | | || | | || | | |
'--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------'
Взрослые дяди ушли, а мне было очень скучно. Я так люблю рисовать, а ты?
...когда они вернулись я порвала рисунок на мелкие кусочки!!! Фиг им с маслом!
Здесь файл diary.txt наполнен вот такими строками:
...
| |
| |
| |
| |
| |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
-------' |
| '-------
...
Не трудно догадаться что из них нужно составить подобного рода ASCII art изображение с буквами которое и будет содержать пароль. Задачу можно сделать разными способами и инструментов доступно много:
drwxr-xr-x 1 root root 4096 Nov 23 11:11 ..
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 awk
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 cat
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 cut
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 find
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 fold
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 grep
-rwxr-xr-x 1 root root 1498 Oct 31 21:03 hello
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 less
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 ls
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 mv
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 rm
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 sed
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 sh
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 sort
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 split
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 tr
-rwxr-xr-x 1 root root 1075464 Oct 1 22:37 uniq
Нужно анализировать файл подсчитать параметры ascii символов, понять из чего состояит буква, и сделать парсер на awk который разберет “разрезаный” файл и на выходе даст буквы. Я сделал на AWK. Единстванная подсказка, это то, что на этом уровне все буквы uppercase, оно и понятно иначе бы пришлось заморачиваться с более сложным ascii artом.
Этот AWK скрипт позволяет выводить одну букву из файла, по указанному смещению.
BEGIN {
sx = 1
fx_lim = 0
fx = 28
t = 56
}
{
a = $0
if (fx == fx_lim || fx == (fx_lim+1) || fx == t) {
printf "%s",a,fx
if (sx == 2) {
printf "\n"
sx = 0
}
sx++
}
if (fx == t) {
fx = 0
}
fx++
}
Запускаем и получем собранную букву, естественно можно сделать чтобы скрипт выводил слово целиком, осталвлю это для вас.
awk -f scrpit.awk file.txt
.----------------.
| .--------------. |
| | _____ | |
| | |_ _| | |
| | | | | |
| | | | _ | |
| | _| |__/ | | |
| | |________| | |
| | | |
| '--------------' |
'----------------'
Еще задание в котором нужно найти пароль в pcap файле (сетевой дамп), может быть решено даже без tcpdump. Как это не банально смешно, но можно прочитать файл визуально найдя там похожие паттерны и словно нео в матрице, увидеть нужные символы, так сделал и я и это сработало.
Часть дампа с пометкой найденного символа и таких строк ровно столько сколько пароли.
По скольку к этому моменту вы скорее всего уже прошли несколько уровней и знаете как выглядят пароли, вы могли заметить что все пароли это 28 символов, и все они кончаются на “K”.
Это делает поиск паролей еще проще, так как мы ожидаем что следующие пароли будут такими же и соотвественно будем искать строки которые удовлетворяют этому условию.
Еще одно интересное задание,- это сделать HTTP GET запрос без доступных доступных инструментов, таких как curl, wget, без компиляторов, без встроенного системонго perl’a (без GET), без консольных браузеров, то есть сделать запрос используя только системные базовые инструменты на голой системе. Казалось бы это не возможно, но решение есть, особенно для тех кто понимает как устроена система устройств (dev filesystem) в linux.
Были и другие квесты, описывать их здесь не буду, пробуйте сами, доступ на первый уровень дан выше.
Где узнать больше ?
Канал в ТГ: wallarm_highload
Бывают ли другие ?
Да полно, ctftime , от Google Google CTF