Este artículo explica cómo conectarse a servidores HTTP utilizando netcat a fin de diagnosticar conexiones, cabeceras y respuestas HTTP.

La herramienta netcat es una de las utilidades más prácticas para el diagnóstico de redes en sistemas operativos de la familia Unix. Es capaz de leer y escribir datos a través de conexiones TCP o UDP, y al mismo tiempo posee un gran número de características que permiten crear casi cualquier tipo de conexión para depurar y explorar redes.

En su uso más simple (nc host port), netcat crea una conexión TCP hacia el puerto indicado del host especificado. La entrada estándar se envía al host, y cualquier dato que llegue desde el host es volcado por salida estándar.

Netcat también puede funcionar como servidor, escuchando conexiones entrantes en un puerto indicado, realizando la misma tarea de entrada/salida.

Para instalar netcat en Debian y derivados, simplemente ejecutar:

# apt-get install netcat

En los sistemas operativos de la familia Unix, netcat es provisto por el binario nc.

Para iniciar una conexión hacia un servidor HTTP, sólo basta indicar su nombre de host o IP junto con un puerto (típicamente 80):

root@linuxito:~# nc -vv www.google.com 80
DNS fwd/rev mismatch: www.google.com != atl26s13-in-f4.1e100.net
www.google.com [172.217.11.132] 80 (http) open

La opción -vv se utiliza para obtener mayor información sobre cómo se establece la conexión TCP/IP contra el servidor HTTP. Se observa la resolución DNS y la conexión exitosa con la dirección IP resuelta y puerto indicado.

Establecida la conexión, es posible "conversar" con el servidor HTTP. Para ello es necesario conocer el "idioma" (protocolo) que utiliza el servidor. En este caso es necesario conocer los métodos HTTP:

Métodos de petición del protocolo HTTP

Los mensajes del protocolo HTTP (al igual que otros protocolos como SMTP o FTP) son en texto plano, con lo cual es posible establecer fácilmente la comunicación con el servidor.

Por ejemplo, si deseamos obtener el recurso raíz (/) para el dominio "www.google.com", lo que corresponde a cargar la página en la URL http://www.google.com/, es necesario utilizar el método HTTP GET:

GET / HTTP/1.1

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.cl/?gfe_rd=cr&ei=aAf6WIOOMPOdXqbvu_gB
Content-Length: 256
Date: Fri, 21 Apr 2017 13:21:44 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.cl/?gfe_rd=cr&ei=aAf6WIOOMPOdXqbvu_gB">here</A>.
</BODY></HTML>
^C sent 16, rcvd 497

El método GET requiere, como parámetros, el nombre del recurso que se desea obtener, junto con la versión del protocolo HTTP a utilizar (en este ejemplo la versión 1.1 del protocolo HTTP).

En este ejemplo utilicé una solicitud simple, pero es posible agregar todas las cabeceras del protocolo HTTP que se deseen:

Lista de cabeceras HTTP

Luego de presionar dos veces la tecla enter, se envía el mensaje al servidor y se obtiene la respuesta desde el mismo.

En la primera sección del mensaje de respuesta se incluye el código de retorno del protoclo HTTP, junto con las cabeceras de respuesta:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.cl/?gfe_rd=cr&ei=aAf6WIOOMPOdXqbvu_gB
Content-Length: 256
Date: Fri, 21 Apr 2017 13:21:44 GMT

Luego de una línea en blanco viene el contenido correspondiente al recurso solicitado:

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.cl/?gfe_rd=cr&ei=aAf6WIOOMPOdXqbvu_gB">here</A>.
</BODY></HTML>

En este ejemplo se trata de una respuesta 302, la cual corresponde con una redirección temporal. Esto indica que el recurso solicitado se ha encontrado, pero se ha movido (temporalmente) a otra ubicación, especificada en la respuesta.

En artículos anteriores expliqué cómo interactuar con un servidor de correo POP utilizando netcat y cómo interactuar con un servidor SMTP utilizando netcat.

Para el caso de servidores HTTPS no es posible utilizar netcat, dado que se debe establecer previamente una conexión SSL, la cual es cifrada. A tal fin se debe recurrir al modo s_client de OpenSSL:

Verificar conexiones SSL/TLS desde línea de comandos con OpenSSL

Referencias

man netcat


Tal vez pueda interesarte


Compartí este artículo