lunes, 13 de septiembre de 2010

Explotar de forma remota un error de formato

La explotación de un error de formato de forma remota puede ser algo muy divertido. Lo permite entender muy bien los riesgos asociados a este tipo de errores. No vamos a explicar aquí la base para esta vulnerabilidad (es decir, su origen o la construcción de la cadena de formato)

- [1. Contexto: el servidor] vulnerables -

Vamos a utilizar el servidor muy minimalista (pero sin embargo pedagógicos) a lo largo este trabajo. La Comisión solicita un nombre de usuario y contraseña, luego se hace eco de su insumos.

Para instalar el servidor fmtd, tendrá que configurar inetd para que
conexiones con el puerto 12345 están permitidos:

Or with xinetd:

# /etc/xinetd.conf

service fmtd
{
type = UNLISTED
user = raynal
group = users
socket_type = stream
protocol = tcp
wait = no
server = /tmp/fmtd
port = 12345
only_from = 192.168.1.1 192.168.1.2 127.0.0.1
}

A continuación, reinicie su servidor. No se olvide de cambiar las reglas de su
servidor de seguridad si está utilizando una.

Ahora, vamos a ver cómo funciona este servidor:

$ telnet bosley 12345
Trying 192.168.1.2...
Connected to bosley.
Escape character is '^]'.
login: raynal
password: secret
hello world
hello world
^]

telnet> quit
Connection closed.

Vamos a echar un vistazo al archivo de registro:
Jan 4 10:49:09 bosley fmtd[877]: login -> read login [raynal^M ] (8) bytes
Jan 4 10:49:14 bosley fmtd[877]: passwd -> read passwd [bffff9d0] (8) bytes
Jan 4 10:49:56 bosley fmtd[877]: vul() -> error while reading input buf [] (0)
Jan 4 10:49:56 bosley inetd[407]: pid 877: exit status 255

En el ejemplo anterior, nos indica un inicio de sesión, una contraseña y un
frase antes de cerrar la conexión. Pero qué sucede cuando alimentamos
el servidor con las instrucciones de formato:

telnet bosley 12345
Trying 192.168.1.2...
Connected to bosley.
Escape character is '^]'.
login: raynal
password: secret
%x %x %x %x
d 25207825 78252078 d782520

Las instrucciones "% x% x% x% x" , muestra que nuestro
servidor es vulnerable a un error de formato.


De hecho, todos los programas actuan como que no son vulnerables a un
formato de errores:

int main( int argc, char ** argv )
{
char buf[8];
sprintf( buf, argv[1] );
}

Usando hn% aprovechado esta conduce a un desbordamiento: el formato de cadena es cada vez más y más, pero desde ningún control
realizados por su longitud, un desbordamiento.


En cuanto a las fuentes revela que los problemas vienen de vul ()

función:
...
snprintf(tmp, sizeof(tmp)-1, buf);
...
está disponible directamente a un usuario malintencionado, el ze "="
ya que el está disponible directamente a un usuario malintencionado, a
este último se le permite tomar el control del servidor ... y obtener así una
shell con los privilegios del servidor.

esta es la primera entrega en ya iremos platicando de esto mas adelante.

Saludos mundo libre.

No hay comentarios:

Publicar un comentario