domingo, 5 de abril de 2009

Jugando con el HTTP

Bueno en esta oportunidad no voy a hablar de mi vida, que ya debe resultar bastante aburrido. Creo que ha llegado la hora de publicar alguna de las webadas a las que se refería Salomón (entiéndase por webadas toda aquella acción inútil realizada en la WEB).

Hace unas semanas comencé a investigar sobre el protocolo HTTP pues quería desarrollar un programa que use el protocolo HTTP para descargar automáticamente alguna información que necesitará de Internet. En mi investigación encontré algunas cosas que me resultaron bastante interesantes. Y bueno ese es el tema de este... “POST”.
Los que saben que es un protocolo y para qué sirve pueden saltarse este apartado. Sí, sí, tú sigue leyendo ;D. Hablando informáticamente los protocolos son reglas de comunicación que permiten el intercambio de información entre dos maquinas distintas. Un protocolo consta de un conjunto de órdenes que las maquinas intercambian para poder negociar algún trámite. El internet esta soportado sobre un gran número de protocolos que estandarizan diferentes servicios: correo electrónico, navegación web, transferencia de archivos, resolución de nombres de dominio, etc. Todos estos protocolos forman parte de la familia de protocolos TCP/IP. El protocolo HTTP es uno de ellos y sirve para la navegación web. A cada protocolo se le asigna un numero de puerto estandar por donde el servidor atiende las peticiones de los clientes. El puerto asociado al protocolo HTTP es el puerto 80. Las órdenes HTTP son generadas por nuestro navegador web automáticamente cuando nosotros visitamos un website por ello no tenemos que preocuparnos por el protocolo, es decir, el protocolo es transparente a nosotros.
La comunicacion entre cliente y servidor se lleva a cabo en dos etapas:
  1. El cliente envia al servidor una solicitud HTTP.
  2. El servidor procesa la solicitud y envia una respuesta HTTP.

Las sintaxis de la solicutud HTTP es la siguiente:

[Metodo HTTP] [URL del recurso] [Version del protocolo]

Por ejemplo:

GET /index.htm HTTP/1.0

A continuacion se envian los headers que aportan informacion adicional sobre la solicitud como el nombre del navegador, el sistema operativo, etc. la sintaxis de los headers es la siguiente:

[Header]: [Valor]

Por ejemplo:

Host: servidorweb.com
Accept: text/html
User-Agent: Mozilla/4.0

Una solicitud HTTP completa seria:

GET /index.htm HTTP/1.0
Host: servidorweb.com
Accept: text/html
User-Agent: Mozilla/4.0

Estos son algunos de los metodos del protocolo HTTP:

GET: Solicita el recurso especificado en la URL.
POST: Envia los datos de un formulario al programa ubicado en la URL.
HEAD: Solicita el encabezado del recurso especificado en la URL.
PUT: Envia datos a la URL especificada.
DELETE: Borra el recurso especificado en la URL.
OPTIONS: Solicita los metodos permitidos.
TRACE: Envia datos al servidor y esos datos son devueltos. Es una especie de eco.
CONNECT: Crea una conexion con el servidor.

Algunos headers:

Accept: Tipo de contenido aceptado por el navegador. (por ejemplo, text/html).
Accept-Charset: Juego de caracteres que el navegador espera.
Accept-Encoding: Codificación de datos que el navegador acepta.
Accept-Language: Idioma que el navegador espera (de forma predeterminada, inglés)
Authorization: Identificación del navegador en el servidor.
Content-Encoding: Tipo de codificación para el cuerpo de la solicitud.
Content-Language: Tipo de idioma en el cuerpo de la solicitud.
Content-Length: Extensión del cuerpo de la solicitud.
Content-Type: Tipo de contenido del cuerpo de la solicitud (por ejemplo, text/html).
Date: Fecha en que comienza la transferencia de datos.
User-Agent: Cadena con información sobre el cliente, por ejemplo, el nombre y la versión del navegador y el sistema operativo.

La respuesta HTTP consta de una linea de estado y mas headers. La linea de estado contiene la version del protocolo y un codigo de respuesta. Por ejemplo:

HTTP/1.1 200 OK
Date: Sun, 05 Apr 2009 17:05:26 GMT
Server: Apache/2.2.3 (Red Hat)
Content-Type: text/html
Content-Length: 2600

<HTML><HEAD>... </HTML>


Estos son algunos headers de respuesta:

Content-Encoding: Tipo de codificación para el cuerpo de la respuesta.
Content-Language: Tipo de idioma en el cuerpo de la respuesta.
Content-Length: Extensión del cuerpo de la respuesta.
Content-Type: Tipo de contenido del cuerpo de la respuesta (por ejemplo, texto/html).
Date: Fecha en que comienza la transferencia de datos.
Location: Redireccionamiento a una nueva dirección URL asociada con el documento.
Server: Características del servidor que envió la respuesta.

Algunos codigos de respuesta:

200 OK: La solicitud se llevó a cabo de manera correcta
201 CREATED: Sigue a un comando POST e indica el éxito, la parte restante del cuerpo indica la dirección URL donde se ubicará el documento creado recientemente.
202 ACCEPTED: La solicitud ha sido aceptada, pero el procedimiento que sigue no se ha llevado a cabo.
203 PARTIAL INFORMATION: Cuando se recibe este código en respuesta a un comando de GET indica que la respuesta no está completa.
204 NO RESPONSE: El servidor ha recibido la solicitud, pero no hay información de respuesta.
205 RESET CONTENT: El servidor le indica al navegador que borre el contenido en los campos de un formulario.
301 MOVED: Los datos solicitados han sido transferidos a una nueva dirección.
302 FOUND: Los datos solicitados se encuentran en una nueva dirección URL, pero, no obstante, pueden haber sido trasladados.
303 METHOD: Significa que el cliente debe intentarlo con una nueva dirección; es preferible que intente con otro método en vez de GET.
400 BAD REQUEST: La sintaxis de la solicitud se encuentra formulada de manera errónea o es imposible de responder.
401 UNAUTHORIZED: Los parámetros del mensaje aportan las especificaciones de formularios de autorización que se admiten. El cliente debe reformular la solicitud con los datos de autorización correctos.
403 FORBIDDEN: El acceso al recurso simplemente se deniega.
404 NOT FOUND: Un clásico. El servidor no halló nada en la dirección especificada.
411 CONTENT LENGHT REQUIRED: Nescesita especificar la longitud en la solicitud.
413 REQUESTED ENTITY TOO LARGE: La longitud es mayor a la que permite el servidor.
500 INTERNAL ERROR: El servidor encontró una condición inesperada que le impide seguir con la solicitud (una de esas cosas que les suceden a los servidores...)
501 NOT IMPLEMENTED: El servidor no admite el servicio solicitado.
503 SERVICE UNAVAILABLE: El servidor no puede responder en ese momento debido a que se encuentra congestionado.



Jejeje ahi una representacion bastante grafica de algunos codigos de respuesta.

Bueno hasta aqui llego la teoria ahora vamos a la practica. Vamos a usar una herramienta muy conocida: el Netcat. Llamada también la navaja suiza de los hackers. Es un programa de red que permite hacer muchas cosas: Abrir puertos, conectar a algún servidor, actuar como proxy, escanear puertos, fingerprint, etc. Lo podemos descargar de aquí:

http://joncraton.org/files/nc111nt.zip

Posiblemente su antivirus lo detecte, pues es una herramienta muy usada por hackers, como ya dije, pero no es malware, es inofensivo. Bien crea una carpeta en el disco C: llamada por ejemplo "nc" y descomprime ahi el contenido del archivo que has descargado.

Ahora ve a Inicio>Ejecutar>Accesorios>Simbolo del sistema (se abre la linea de comandos)

Ejecuta las siguientes ordenes:

C:\Documents and Settings\user>cd \
C:\>cd nc
C:\nc>

Ahora les dejo este video, vale ya me canse de escribir :P.

http://www.youtube.com/watch?v=ijyVppPluoY

Sitios web revisados:
http://www.taringa.net/posts/info/1969535/El-protocolo-HTTP-+-Yapa.html
http://es.wikipedia.org/wiki/Protocolo_de_comunicaciones