ASCII Art en logs de servidor Web

Como estamos en vísperas del día de los Reyes Magos, hoy traemos una entrada divertida y que esperamos que os guste. Eso sí, como siempre, dadle buen uso. Vamos a insertar un poco de «arte» a modo de ASCII Art en los logs de un servidor Web. Mola, ¿no?

No es nada nuevo, de hecho la idea surge a raíz de un tweet de Mercè Molist donde se mostraba un mensaje que habían dejado en unos logs de un servidor. Me pareció bastante ingenioso, así que investigando un poco (es bastante simple como veréis a continuación) decidí replicarlo pero incluyendo un ASCII Art.

¿No sabéis lo que es? Seguro que estáis hartos de verlo, algo como esto:

 __  __           __   _                ________  _          
   / / / ____ ______/ /__(_____  ____ _   / ____/ /_(__________ 
  / /_/ / __ `/ ___/ //_/ / __ \/ __ `/  / __/ / __/ / ___/ __ \
 / __  / /_/ / /__/ ,< / / / / / /_/ /  / /___/ /_/ / /__/ /_/ /
/_/ /_/\__,_/\___/_/|_/_/_/ /_/\__, /  /_____/\__/_/\___/\____/ 
                              /____/

¿Y cómo lo vamos a hacer? Muy sencillo, seguiremos los siguientes pasos, que como podréis comprobar, son muy simples:

  1. Guardar nuestro ASCII Art en un fichero.
  2. Crear un script en Python que lea línea por línea el fichero.
  3. Por cada línea leída, hace una petición HTTP al servidor Web.

Aquí lo interesante es que modificaremos las cabeceras de HTTP en función de cómo queramos hacer la petición, y es que dependerá de varios factores, por ejemplo de cómo esté configurado el formato de log en el servidor.

Algo que en los servidores Apache, por ejemplo, se podría definir con la siguiente línea en su archivo de configuración:

CustomLog ${APACHE_LOG_DIR}/access.log combined

En el caso de servidores Web de tipo Apache, el formato de logs se puede personalizar, y existen varios formatos para ello. Por ejemplo, con el formato de log «common«, un access.log de un Apache tendría este aspecto:

[05/Jan/2016:11:02:26 +0100] «GET / HTTP/1.1» 200 572

Sin embargo, por ejemplo con el formato de log «combined«, un access.log tendría el siguiente aspecto:

[05/Jan/2016:11:40:53 +0100] «GET / HTTP/1.1» 200 572 «-» «»

En este último formato (combined), los dos últimos valores que van entre comillas, justo después del 572 (tamaño de petición), son el Referer (origen de la petición) y el User-agent, respectivamente.

Si el servidor está usando este formato, con nuestro script en Python podemos «jugar» a insertar nuestro ASCII Art a través de una de estas cabeceras.

Veamos nuestro script, http-combined.py para el formato «combined»:

#!/usr/bin/env python

import urllib2

file = open(«reyes.txt», «r»)
while True:
line = file.readline()
requrl = «http://localhost/»
req = urllib2.Request(requrl)
req.add_header(‘User-agent’, line)
resp = urllib2.urlopen(req)
if not line:
break
file.close()

En la primera línea importamos la librería urllib2 necesaria para peticiones HTTP con Python. A continuación abrimos el fichero reyes.txt que contiene nuestro ASCII Art. Mediante un «while» vamos leyendo línea por línea el fichero y hacemos una petición HTTP a una URL. En este caso, como prueba de concepto, he puesto la URL de un servidor Web Apache que se ejecuta en la misma máquina.

La parte importante, es que en este caso vamos a añadir una cabecera nueva a nuestra petición, que es el User-agent, que tendrá como valor la línea que ha leído del fichero reyes.txt.

req.add_header(‘User-agent’, line)

Finalmente, cuando no haya más líneas que leer, hace un «break» para salir del «while«.

Antes de ejecutarlo, veamos qué contiene el fichero reyes.txt:

ASCII Art en logs de servidor Web

Pues con este mensaje de «Felices Reyes Magos«, le vamos a desear al administrador del servidor Web, un feliz día de Reyes Magos. 😉

Vamos a ejecutar nuestro script y vemos cómo queda en los logs.

ASCII Art en logs de servidor Web¡Qué mono verdad! 😛

Por último, veamos cómo quedaría nuestro script en Python en caso de que el formato de log sea «common«, es el que toma por defecto en caso de no especificar ninguno de forma personalizada. En ese caso, no podemos usar las cabeceras Referer o User-agent, así que lo único que podemos hacer es modificar la petición GET para que añada nuestra línea leída del fichero que contiene nuestro ASCII Art.

#!/usr/bin/env python

import urllib2

file = open(«reyes.txt», «r»)
while True:
line = file.readline()
requrl = «http://localhost/» + line
req = urllib2.Request(requrl)
resp = urllib2.urlopen(req)
if not line:
break
file.close()

Como podéis observar, se añade al final de la URL la línea leída del fichero txt.

Ejecutando nuestro script, preparado para formato «common«, los logs quedarían así:

ASCII Art en logs de servidor Web

Hasta aquí esta nueva entrada que espero que os haya gustado. Y recordad, hacer hacking también es esto. Learn, Hack and Share (and Enjoy)!

Por cierto, ¡Felices Reyes Magos! 😉