Comportamento estranho do cliente telnet ao não especificar uma porta

5

No Debian Jessie, usando o php5.6 e a versão do telnet:

$ dpkg -l | grep telnet
ii  telnet                         0.17-36                      amd64        The telnet client

Eu escrevi um script php para escutar na porta 23 as conexões tcp de entrada. Para o teste, eu telnet para ele, no entanto, tenho notado que realmente faz a diferença em que eu telnet nele assim:

$ telnet localhost 23

vs assim:

$ telnet localhost

Mas, de acordo com man telnet , isso não deve fazer diferença:

port Specifies a port number or service name to contact. If not specified, the telnet port (23) is used.

Se eu não especificar a porta, obtenho um ruído estranho na linha. Ou talvez não seja barulho? Mas, se eu especificar a porta, não obtenho esse ruído na linha. O ruído é o seguinte conjunto de caracteres ascii:

<FF><FD><03><FF><FB><18><FF><FB><1F><FF><FB><20><FF><FB><21><FF><FB><22><FF><FB><27><FF><FD><05>

E caso isso ocorra devido a um bug no código do lado do servidor, aqui está uma versão reduzida do script, que exibe o ruído (embora eu não ache que haja erros no código, Eu apenas incluo isso porque alguém é obrigado a perguntar):

#!/usr/bin/php
<?php

set_time_limit(0); // infinite execution time for this script
define("LISTEN_ADDRESS", "127.0.0.1");

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 30, 'usec' => 0)); // timeout after 30 sec
socket_bind($sock, LISTEN_ADDRESS, 23); // port = 23
socket_listen($sock);
echo "waiting for a client to connect...\n";

// accept incoming requests and handle them as child processes
// block for 30 seconds or until there is a connection.
$client = socket_accept($sock); //get the handle to this client
echo "got a connection. client handle is $client\n";

$raw_data = socket_read($client, 1024);
$human_readable_data = human_str($raw_data);
echo "raw data: [$raw_data], human readable data: [$human_readable_data]\n";

echo "closing the connection\n";
socket_close($client);
socket_close($sock);

function human_str($str)
{
    $strlen = strlen($str);
    $new_str = ""; // init
    for($i = 0; $i < $strlen; $i++)
    {
        $new_str .= sprintf("<%02X>", ord($str[$i]));
    }
    return $new_str;
}

?>

E a saída do script (da conexão assim: telnet localhost ) é:

waiting for a client to connect...
got a connection. client handle is Resource id #5
raw data: [�������� ��!��"��'��], human readable data: [<FF><FD><03><FF><FB><18><FF><FB><1F><FF><FB><20><FF><FB><21><FF><FB><22><FF><FB><27><FF><FD><05>]
closing the connection

Mas ao se conectar como telnet localhost 23 (e emitir a palavra hi ), a saída é:

waiting for a client to connect...
got a connection. client handle is Resource id #5
raw data: [hi
], human readable data: [<68><69><0D><0A>]
closing the connection

Então, minha pergunta é se esse é o comportamento esperado do cliente telnet ou se é ruído? É muito consistente - é sempre o mesmo dado - então pode ser algum tipo de aperto de mão?

Aqui está a string "noise" novamente com espaços e sem espaços, caso seja mais útil:

FFFD03FFFB18FFFB1FFFFB20FFFB21FFFB22FFFB27FFFD05
FF FD 03 FF FB 18 FF FB 1F FF FB 20 FF FB 21 FF FB 22 FF FB 27 FF FD 05
    
por mulllhausen 04.04.2017 / 09:07

2 respostas

38

telnet não é netcat . O telnet protocol é mais que o TCP bruto. Entre outras coisas, pode ter várias opções e o "ruído" você re ver é a negociação dessas opções entre seu cliente e o servidor. Quando você especifica uma porta, não vê nenhum ruído porque, de acordo com o manual:

When connecting to a non-standard port, telnet omits any automatic initiation of TELNET options. When the port number is preceded by a minus sign, the initial option negotiation is done.

Portanto, aparentemente, sua implementação de telnet desativa a negociação de opção quando você especifica uma porta (mesmo quando a porta é 23) e a reativa quando a porta é precedida por um sinal de menos.

Em uma nota mais geral, geralmente é seguro esquecer telnet nos dias de hoje. Use netcat se precisar de um simples cliente TCP simples (ou servidor).

    
por 04.04.2017 / 10:05
6

É altamente provável que seu comando telnet inicie uma sessão TELNET se você não especificar nenhuma porta e inicie uma conexão TCP bruta se qualquer porta especificada.

telnet foi originalmente projetado para permitir que usuários distantes façam login em um sistema. Assim, o protocolo (ver RFC 854 - primeira versão do mesmo) é projetado de tal forma que telnet cliente negocia coisas diferentes com o servidor logo após a conexão ter sido iniciada.

    
por 04.04.2017 / 15:54