Vistas de página en total

miércoles, 17 de febrero de 2016

ASCII Art en logs de servidor Web

¿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:

    Guardar nuestro ASCII Art en un fichero.
    Crear un script en Python que lea línea por línea el fichero.
    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:
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.
¡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í:
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)!

No hay comentarios:

Publicar un comentario