Hi, ich versuche einen Socks 4 Server in PHP zu schreiben.
Bis jetzt soll der Server zum Testen nur eine Anfrage bearbeiten und dann schließen.
Ich teste den Server, indem ich ihn als Socks Proxy in Firefox einstelle.
Wenn ich nun eine Website aufrufe, zeigt Firefox die Antwort nicht an, sondern einen Download-Dialog.
In der heruntergeladenen Datei ist der HTTP-Header und der HTML-Code, das würde passen.
Das einzige Problem ist, dass das erste Byte der Datei ein null-Byte ist, deswegen funktioniert es nicht.
Ich weiß aber nicht, wie dieses null-Byte dahin kommt, denn im Puffer, der an Firefox gesendet wird ist es nicht enthalten.
Hier der Code:
Bis jetzt soll der Server zum Testen nur eine Anfrage bearbeiten und dann schließen.
Ich teste den Server, indem ich ihn als Socks Proxy in Firefox einstelle.
Wenn ich nun eine Website aufrufe, zeigt Firefox die Antwort nicht an, sondern einen Download-Dialog.
In der heruntergeladenen Datei ist der HTTP-Header und der HTML-Code, das würde passen.
Das einzige Problem ist, dass das erste Byte der Datei ein null-Byte ist, deswegen funktioniert es nicht.
Ich weiß aber nicht, wie dieses null-Byte dahin kommt, denn im Puffer, der an Firefox gesendet wird ist es nicht enthalten.
Hier der Code:
PHP-Code:
<?php
$target_ip = "";
set_time_limit(1000);
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if( !socket_bind($sock, "127.0.0.1" , 5000) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Waiting for incoming connections... \n";
//Accept incoming connection - This is a blocking call
$client = socket_accept($sock);
//display information about the client who is connected
if(socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us. \n";
}
$input = socket_read($client, 9);
$target_port = 0;
echo "<br/>msg:";
for($i=0;$i<9;$i++)
{
echo ord($input[$i]) + " ";
}
echo "<br/>";
for($i=4;$i<8;$i++)
{
$target_ip = $target_ip . ord($input[$i]);
if($i != 7) $target_ip = $target_ip . ".";
}
$target_port = ord($input[2]) * 256;
$target_port = $target_port + ord($input[3]);
echo "<br/>Target-Port: " . $target_port;
$response = $input;
$response[0] = chr(0);
$response[1] = chr(90);
socket_write($client, $response); //SOCKS accepted
//Verbindung zum Ziel
if(!($tsock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Target-Socket created <br/>";
if(!socket_connect($tsock , $target_ip , 80))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not connect: [$errorcode] $errormsg \n");
}
while(true)
{
$reply = "";
echo "<br/>";
$input = socket_read($client, 2048);
echo "Requeset Browser: " . $input;
echo "<br/>";
socket_write($tsock, $input);
$reply = socket_read($tsock, 2048);
echo "Reply from target " . $reply;
socket_write($client, $reply);
die(""); // nach erster Abfrage abbrechen
}
echo "<br/>Ziel-Ip: " . $target_ip;
socket_close($client);
?>
Kommentar