martes, 3 de febrero de 2009

Secuestro de Formatos en Sitios WEB

(Artículo original en inglés: anders.com)

Lo Que Pasa

Los generadores de SPAM son frecuentemente incluidos en las listas negras y expulsados de las redes. A causa de esto, truquear un sitio web que no envía SPAM y convertirlo en uno que si envíe SPAM se ha vuelto una prioridad para ellos. Una forma de los generadores de SPAM para encontrar servidores web vulnerables, es probar aplicaciones CGI (Common Gateway Interface)que permita esclavizar al servidor web. Una vez encontrado un servidor web vulnerable, el generador de SPAM puede disfrazar el verdadero origen de su SPAM, mientras que el servidor WEB esclavizado hace el trabajo pesado.

¿Cómo lo Hacen?


Una tarea común realizada por los sitios web es enviar un correo electrónico al propietario del sitio web con los datos que alguien haya ingresado en una forma. Por ejemplo, un "script" que haga justamente esto, se llama formmail.pl o formmail.cgi del archivo de scripts de Mat. En este "script", así como en muchos otros similares, algunos campos en la forma se utilizan directamente en el encabezado ("header") de un correo electrónico ("email").(Por ejemplo el campo "Responder a:" de un correo electrónico algunas veces toma el valor de lo que sea que el usuario de la forma haya ingresado en el campo llamado "email", de modo que el propietario del sitio web pueda hacer click rápidamente en el botón "Reply" para enviar una respuesta al correo electrónico. Si estos campos se incluyen sin modificación, un generador de SPAM puede simplemente sobre escribir el resto de las líneas de encabezado y efectivamente enviar cualquier correo electrónico que deseen a través del sistema correo electrónico subyacente,efectivamente esclavizando el servidor web y el sistema de correo para enviar SPAM.

¿Cómo exactamente explotan el "script"?

El destino de un correo electrónico esta puesto en sus encabezados. Los encabezados, como todo lo demás en un correo electrónico, sólo son líneas de texto. Lo que separar a los encabezados del cuerpo de un correo electrónico son solamente dos líneas en blanco. Si tu "script" de la forma de correo coloca cualquier cosa en el encabezado de un correo electrónico que esta inalterado con respecto a lo que los usuarios de la web introdujeron, podrían agregar fácilmente esas dos líneas en blanco. Esto, naturalmente, únicamente truncaría los encabezados antes y hace que el cuerpo del correo electrónico contenga algo de los encabezados también. Sin embargo si el usuario de la web decide agregar unos cuantos encabezados más antes de enviar las dos líneas blancas, el sistema de correo subyacente escuchará aquellos encabezados también ; así que lo que los generadores de SPAM estan haciendo es incluir una "CCO:" ("Bcc:") lista de víctimas de spam al correo electrónico. Cuando el subsistema de correo tien el correo electrónico, sigue ciegamente lo que esta escrito en los encabezados y felizmente envía una copia del mensaje a cada persona listada en la línea "CCO:" ("Bcc:"). Ahora naturalmente los geenradores de SPAM probablemente también agregarán su propia línea de "Asunto:" y algo de contenido SPAM en el correo electrónico.

Con objeto de encontrar los servidores web vulnerables , los generadores de SPAM generalmente prueban la "forma" enviando un correo de muestra copiando de forma oculta ("CCO:") a una dirección de correo electrónico a la que ellos tengan acceso y que puedan desechar en cualquier momento. Los administradores de sitios web se dan cuenta de esto cuando reciben de 5 a 10 correos en menos de 1 segundo.

¿Y que podemos hacer al respecto?

La manera más sencilla de mitigar el peligro es deshabilitar cualquier caracter "linefeed" or "carriage return" en campos utilizados en los encabezados del correo electrónico y en consecuencia deshabilitando la posibilidad de un atacante de agregar esas dos líneas en blanco y truquear tu sistema de correo para enviar lo que a ellos se les antoje. Entonces el problema se convierte en una tarea de limpieza de código mas que estar esclavizado a perseguir generadores de SPAM.

¿Eh? ¿Cómo le hago?

Bueno, aquí es donde se vuelve un poco complicado. La respuesta a esta cuestión depende de que software este ulizando el procesador de "formas" en tu servidor web. Si no escribiste tu propio procesador de "formas", tu primer paso es probablemente preguntar a la gente que te ayudó a configurar tu sitio web. Las formas procesadoras de correo más comunes han tenido arreglos de problemas ("bug fixes") liberados desde que esta vulnerabilidad apareció. ¿Tu proveedor de servicios de "hosteo" ha actualizado su código para el posteo de "formas"?

Si sabes lo que estas haciendo, checa todos los campos en las "formas" que se utilizan en los encabezados de correo electrónico y elimina los caracteres "carriage return" (\r) y "line feed" (\n). En perl, se hace así:

$field =~ s/\r//g; $field = ~ s/\n/ /g;

Si estas utilizando PHP, puedes hacer esto para cada variable utilizada en los encabezados de correo electrónico:

$_POST['email'] = preg_replace("/\r/", "", $_POST['email']);
$_POST['email'] = preg_replace("/\n/", "", $_POST['email']);

¿Cómo se si he sido atacado?

Como la mayoría de los "scripts" de formatos para enviar correo no escriben en algún lugar de un archivo lo que estan haciendo, la mejor manera de distinguir si tu configuración ha sido esclavizada para enviar SPAM es verificar tus "logs" del servidor de correo. Si estas con proveedor de servicios de "hosteo", generalmenete ellos puedes verificar esto por ti.

¿Que debería hacer si he sido atacado?

Deberías actualizar tus "scripts" de formatos para envió de correo electrónico de modo que intentos repetitivos no sean exitosos. (hazlo como se describió antes). Luego podrías rastrear la dirección de correo electrónico desechable que utilizó el generador de SPAM para probar la vulnerabilidad.

Bien, estoy limpio. ¿Ahora cómo detengo los molestos correos de prueba?

De nuevo, pregunta a tu proveedor de servicios de "hosteo". Sin embargo, si tu has hecho las ediciones por tu cuenta, busca una huella en el correo electrónico que lo señale como obviaente malo. Como si el campo de correo contiene los caracteres "Bcc:" ("CCO:"), es muy probable que estes viendo una prueba de vulnerabilidad. Nada mas coloca un enunciado "if" alrededor del bloque de código que te envía un correo que prueba la vulnerabilidad. No olvides ignorar las mayúsculas dado que "Bcc:" y "bcc:" funcionan igual. Alternativamente podrías buscar sólo las dos líneas en blanco, sin embargo debes tener cuidado con "\r\n\r\n" y con "\n\n" ya que las dos opciones se interpretan como dos líneas en blanco. Si vas a proceder de sta manera, Te sugiero que quites primero todas los caracteres "\r" y luego busques "\n\n".

¿Qué mas puede hacerse?

Una mejor (aunque mas complicada) manera de hacer esto es requerir algo que es fácil de hacer para un humano pero difícil para una computadora. Tal método que es bastante popular es utilizar una imágen Captcha con algún texto en ella que el usuario deberá introducir en la forma antes de enviarla. Puedes también encontrar otro método de reconocimiento de figuras en JustHumans.com

Quiero una explicación más técnica con un ejemplo!

Considera una forma CGI que acepta una variable de "forma" llamada "reply- to" la cual se inserta en los encabezados de un correo de comentarios enviado al administrador del sitio web ("webmaster"). El correo resultante que el CGI envía al sistema de correo local se vería asi:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.com
Subject: New Comment!

I like your website. Thanks for the resource.

El sistema de correo subyacente obtiene este correo y lo procesa como lo esperarías, enviando una copia de este mensaje a me@example.com.

Ahora, un generador de SPAM quiere atacar esta "forma", así que llena todos los campos como vimos antes pero envía lo siguiente a la variable de la "forma" CGI llamada "reply-to":

webuser@company.com
Bcc: joe@foo.com, jane@bar.com
Subject: Compra Viagra!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Consigue tu viagra aquí! http://xxx.viagra.com/xxx
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Luce peligroso, ¿no?. Con un procesador de "formas" no verificado, el correo electrónico resultante enviado al subsistema de correo se vería así:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.com
Bcc: joe@foo.com, jane@bar.com
Subject: Compra Viagra!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Consigue tu viagra aquí! http://xxx.viagra.com/xxx
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Subject: New Comment!

I like your website. Thanks for the resource.

Debido a que la variable CGI "reply-to" incluye caracteres "new-line" y una gran cantidad de direcciones para SPAM, el atacante puede engañar al que envía el correo haciéndolo pensar que la línea "Bcc:" ("CCO:") y la línea "Subject" son legítimas. De esa forma joe@bo.com y jane@bar.com obtienen un correo con el Asunto "Compra Viagra!".

Otra vez, para protegernos de esto, sólo necesitamos deshacernos de los caracteres return ("\r") y "newline" ("\n"), en todos los campos de la "forma" CGI utilizados en los encabezados del correo electrónico. Si lo hicimos, el correo electrónico para el subsistema subyacente se vería así:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.comBcc: joe@foo.com, jane@bar.comSubject: Compra Viagra!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Consigue tu viagra aquí! http://xxx.viagra.com/xxx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Subject: New Comment!

I like your website. Thanks for the resource.

y el subsistema de correo subyacente enviaría el correo como se esperaba.