Servidor Clandestino
REDES
Servidor Clandestino
2016-01-05
Por
Yvil Yenius

Pensando en dominar el mundo?. Claro, quién no?. Una de las principales pasos para dominar el mundo es, como todo genio diabólico sabe, establecer una organización clandestina de secuaces con la que llevar a cabo tus maléficos planes.
Y cuál es la clave para que tu organización clandestina funcione?. Efectivamente, la comunicación clandestina. Hay muchas formas de conseguir ese objetivo. Notas de papel en bancos en el parque, código secretos (el pájaro a volado) o reuniones clandestinas en garitos clandestinos. Por mencionar algunos ejemplos.

Sin embargo todos esos métodos tienen un gran problema. No son muy güays que digamos. Así que vamos a montarnos algunas cosas tecnológicas con las que empezar poner en marcha nuestra modesta organización clandestinas para dominar el mundo.

Un servidor clandestino

Vamos a comenzar montándonos un servidor clandestino. El punto clave para que nuestro servidor sea clandestino es que nadie sepa que está ahí. Y, como todos sabemos, la mejor forma de esconder algo es dejarlo totalmente a la vista.

Lo que vamos a hacer es escribir un sencillo servidor web que mostrará contenido inofensivo, por ejemplo, fotos de adorables gatitos cuando se accede a él utilizando un navegador normal. Sin embargo, si utilizamos el navegador oficial de nuestra organización clandestina, tendremos acceso al magistral plan de dominación del mundo que hemos maquinado durante la pasada noche en el pub.

Y como podemos conseguir esto. Bueno, de la misma forma que WebDav funciona. WebDAV es una extensión del protocolo HTTP para "gestionar documentos". Bueno, eso realmente no nos interesa, lo importante es que este sistema funciona añadiendo cabeceras especiales a las peticiones HTTP.

SCLAN

Bueno, ya os hemos dado todas las pistas. Nuestro Servidor Clandestino, al que originalmente hemos bautizado como SCLAN, no es más que un servidor web normal y corriente que sirve páginas diferentes cuando el cliente incluye en su petición una cabecera secreta.

Aquí tenéis el código:

#include <stdio.h>
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>

char *r = 
  "HTTP/1.0 200 OK\n"
  "Server:Inofensivo\n"
  "Content-type: text/html\n\n"
  "<html><body><h1>Hola Occam!</h1></body></html>\n";

char *r1 = 
  "HTTP/1.0 200 OK\n"
  "Server:SuperSecreto\n"
  "Content-type: text/html\n\n"
  "<html><body><h1>Hola Razor!</h1></body></html>\n";


int
main (int argc, char *argv[])
{
  char                 headers[4096];
  int                  hlen, ops = 1;
  struct sockaddr_in   server, client;
  socklen_t            len = sizeof (struct sockaddr_in);
  int  s,s1;

  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_family = AF_INET;
  server.sin_port = htons(8001);

  s = socket (PF_INET, SOCK_STREAM, 0);
  setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &ops, sizeof(ops));
  bind (s, (struct sockaddr *) &server, sizeof (server));
  listen (s, 10);

  while (1)
    {
      s1 = accept (s, (struct sockaddr *)&client, &len);
      /* read headers */
      memset (headers, 0, 4096);
      hlen = 0;
      while ((hlen += read (s1, headers + hlen, 4096)) == 4096);
      printf ("HEADERS:\n(%s)\n", headers);


      if (strstr (headers, "X-Secret: PASS") == NULL)
	write (s1, r, strlen(r));
      else
	write (s1, r1, strlen(r1));
      close (s1);
    }
  return 0;
}
▼ DOWNLOAD : sclan.tgz
Más tonto no puede ser eh?. Se trata del típico servidor HTTP que lee las cabeceras enviadas por el browser, y si encuentra nuestra cabecera secreta sirve un contenido diferente.... un contenido inquietante....

PROBANDO

Para probar SCLAN solo tenéis que compilar y ejecutar.

$ make sclan
./sclan
Compilando y Ejecutando el Servidor Clandestino
El servidor escucha en el puerto 8001 por defecto, así que ya estáis tardando en abrir vuestro browser preferido y apuntarlo a http://localhost:8001, para acceder a un inofensivo mensaje de bienvenida.

Si ahora enviamos las cabeceras secretas, obtendremos una respuesta mucho más transgresora... pero como podemos acceder a los contenidos clandestinos?. Pues mú fácil, utilizando la superpoderosa herramienta curl:

$ curl -H "X-Secret: PASS" http://localhost:8001
<html><body><h1>Hola Razor!</h1></body></html>
$
Accediendo a información clandestina con cURL
Toma ya!. Un pequeño paso para el programador, pero un gran paso para el genio malvado!

Un browser clandestino

Usar curl está muy bien, pero lo más probable es que nuestro secuaces no se manejen en la línea de comandos, así que más nos vale darles una herramienta más sencilla para acceder a nuestra transgresora red clandestina.

Buf!. Esto parece bastante trabajo... mejor nos buscamos unos secuaces un poco más espabilados... bueno, no es tan difícil como podría parecer si usamos GTK webkit.

Aquí tenéis un browser HTML reducido a la mínima expresión utilizando GTK webkit:

#include <gtk/gtk.h>
#include <webkit/webkit.h>


int 
main(int argc, char *argv[]) 
{
  WebKitWebView  *web_view;
  GtkWidget      *w;

  gtk_init (&argc, &argv);
  
  /* Crea ventana y añade webview  */
  w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(w), 800, 600);

  web_view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
  gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (web_view));
  gtk_widget_show_all(w);
  
  webkit_web_view_load_uri (web_view, "http://localhost:8001");

  g_signal_connect(G_OBJECT(w), "destroy", 
		   G_CALLBACK(gtk_main_quit), NULL);
  gtk_main();
  
  return 0;
}
▼ DOWNLOAD : sclan.tgz
Fácil no?. Ahora podemos compilar y probar nuestro nuevo navegador quasi-clandestino.

$ gcc -o sclan-browser sclan-browser.c `pkg-config --libs --cflags webkit-1.0`
$ ./sclan-browser
Compilando y ejecutando nuestro browser clandestino
Como era de esperar, por ahora solo podemos ver nuestro inocente mensaje "Hola Occam!.... Claro!. Nos falta enviar nuestras cabeceras clandestinas.

Insertando cabeceras clandestinas

Para insertar las cabeceras clandestinas tenemos que añadir un callback en la señal resource-request-starting. Esta señal se dispara justo antes de enviar la petición al servidor, cuando todo está a punto para hablar con el servidor y por lo tanto, todo los objetos internos creados y preparados.

Así que añadimos una línea como la de abajo, en alguna parte de la función main entre que el objeto webview se creado y la página cargada:

  g_signal_connect (G_OBJECT (web_view), "resource-request-starting", 
		    G_CALLBACK(secret_header_cb), NULL);

Lo único que nos falta es la función secret_header_cb, que será algo como esto:

void
secret_header_cb (WebKitWebView         *web_view,
               WebKitWebFrame        *web_frame,
               WebKitWebResource     *web_resource,
               WebKitNetworkRequest  *request,
               WebKitNetworkResponse *response,
               gpointer               user_data)
{
  SoupMessageHeaders *hdr = NULL;

  SoupMessage *sm = webkit_network_request_get_message (request);  
  g_object_get (G_OBJECT(sm), "request-headers", &hdr,NULL);
  soup_message_headers_append (hdr, "X-Secret", "PASS");

  return;
}
▼ DOWNLOAD : sclan.tgz
La función simplemente accede a las cabeceras de la petición que se está a punto de ejecutar y añade nuestra cabecera clandestina. Lamentablemente, para hacer eso tenemos que acceder, primero a la petición que va a hacer el objeto webkit y luego a la propiedad de esa petición que contiene las cabeceras. Una vez que tenemos ese objeto solo tenemos que añadir nuestra los campos que queramos.

COLOFÓN

Y hasta aquí este artículo. Ahora ya podemos coordinar nuestras hordas de secuaces y comenzar nuestro plan de dominación mundial. Además hemos aprendido un par de cosas sobre las cabeceras del protocolo HTTP y como escribir un navegador web básico. Para que nuestros secuaces puedan hacer algo útil con esto es necesario añadir un par de cosillas al servidor clandestino: procesar tipos MIME, leer los ficheros a transferir del disco, algunas hebras,.... Y a nuestro navegador también deberíamos añadirle algunos botones, un par de funciones para permitir la descarga de ficheros y habilitar Javascript para que nuestras páginas hagan cosillas chulas... Vamos que el que está aburrido es porque quiere :)
SOBRE Yvil Yenius
Cuando se trata de dominar el mundo, Yvil es la referencia. Su privilegiada mente para el mal y su carisma para ganarse la lealtad de secuaces a diestro y siniestro, la han convertido en una de las más grandes mentes malvadas de la historia. En su tiempo libre, hornea deliciosas tartas que lanzar a sus enemigos.

 
Tu publicidad aquí :)