
Основана на CVE-2018-10933
CVE-2018-10933 — это уязвимость, обнаруженная в некоторых версиях libSSH, которая может предоставить потенциально неограниченный доступ к машине. Уязвимость возникает из-за неправильной обработки заголовков пакетов во время процесса аутентификации: отправка специально сформированного пакета с байтом MSG_USERAUTH_SUCCESS может позволить любому обойти аутентификацию. После этого злоумышленник получает полный доступ к машине.
Основа этой задачи заключается в том, чтобы участники исследовали предоставленный образ Docker, обнаружили эту уязвимость, использовали её для получения доступа, а затем нашли ключ, скрытый в символической ссылке на машине.
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
Ниже приведено подробное описание предполагаемого решения:
Обратите внимание, что из описания задачи следует, что злоумышленник получил доступ через порт 22, порт, обычно зарезервированный для SSH. Также обратите внимание, что злоумышленник не использовал учётные данные для получения доступа.
Исходя из этого, если поискать прошлые ошибки, связанные с получением доступа к машине через SSH без учётных данных, вполне вероятна проблема с байтом MSG_USERAUTH_SUCCESS. В качестве альтернативы, установив соединение с портом 22, можно определить версию запущенного libSSH, а затем поискать распространённые эксплойты для этой версии.
Также из описания можно заметить, что имя файла, которое нужно найти (флаг), существует только как цель символической ссылки.
Теперь, зная, что доступ можно получить, используя эту уязвимость, можно написать свой или скопировать пример скрипта, который запускает этот эксплойт, и выполнить команду на целевой машине. Я адаптировал скрипт эксплуатации для этого решения и назвал его libsshauthbypass.py.
Чтобы запустить этот скрипт и получить флаг с машины (в случае демо-образа), можно выполнить команду, подобную следующей:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
что даёт вывод, похожий на
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
Чтобы использовать версию этой задачи для своего собственного CTF, настоятельно рекомендуется изменить Dockerfile, чтобы использовать другой путь, нежели предоставленный по умолчанию, изменить флаг в flag.txt (при этом он должен оставаться одной строкой), а затем пересобрать образ. Обратите внимание, что может потребоваться запускать новый контейнер для каждой попытки подключения, чтобы предотвратить выполнение кем-либо разрушительной команды, затрагивающей всех участников.
Чтобы пересобрать образ Docker с новым флагом (и протестировать его):
flag.txt новым флагом./build_run <image name>[:<version number] <port number>./libsshauthbypass.py или свой собственный скрипт для подключения к контейнеру с правильной полезной нагрузкой и командой, которую вы хотите выполнить.build_run, контейнер будет остановлен и удалён, но образ останется и будет помечен как <image name>Proof of Concept: https://youtu.be/ELrOBm02ANg
Прохождение задачи https://youtu.be/Ii121piSZR0