Remote Linux Vulnerability: GHOST (GLIBC) Critica.

Iniciado por shkz, Enero 28, 2015, 02:13:02 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 28, 2015, 02:13:02 PM Ultima modificación: Enero 30, 2015, 12:21:30 AM por cnfs

Bueno, me ha sorprendido no encontrar nada con el buscador del foro sobre esta vulnerabilidad, si se trata de un error y trataron ya este tema, pido disculpas, y borren el tema. Estaba en dudas si ponerlo en seguridad o hacking, pero como es algo temprana la vulnerabilidad 'publicamente', y hay tantos sistemas vulnerables por ahi, lo considere correcto aca.

Sin dudas una de las noticias de estos dias es el descubrimiento de la vulnerabilidad CVE-2015-0235.
Afecta a la libreria "glibc". La gente de Qualys descubrio un interesante desbordamiento de buffer en una funcion de glibc llamada "the_nss_hostname_digits_dots()". Se puede tomar ventaja remotamente de esta vulnerabilidad desde la funcion gethostbyname() de glibc.

Al parecer de glibc-2.17 a glibc-2.18 se encuentra parcheado. De hecho lo estaban desde el 2013 pero no se considero de mayor prioridad y se paso por alto en muchos desarrolladores, por ende los modulos de ciertas distribuciones siguen siendo aun vulnerables.

Algunas app conocidas que dependen de esta libreria son Apache, GnuPG, OpenSSH, entre otras.

A continuacion adjunto un PoC hecho por vpetkov, para que puedan testear la vulnerabilidad localmente.  Primero dense una idea de que libreria tienen instalada con el siguiente comando, desde mi debian/ubuntu (sistemas derivados de estos):

$> ldd --version

Desde Redhat y CentOS:

$> rpm -q glibc

El PoC para verificar si es vulnerable o no el sistema, peguenlo en un editor de texto, guardenlo con como ghost.c y luego lo deben compilar con gcc de la siguiente manera

$> gcc ghost.c -o ghost (compilan)

$> chmod +x ghost (le dan permisos de ejecucion).

$> ./ghost (ejecutan)



Código: c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}



Si es vulnerable, saldria "vulnerable" je je.
Sino, lo contrario.

Para fixear esto desde Debian/Ubuntu vamos a enfocar solamente en actualizar la libc.

$> apt-get update
$> apt-get install --only-upgrade libc6 -y


(Reiniciemos, y luego volver a verificar con el PoC si sigue siendo vulnerable).
El resto de distribuciones, favor de verificar y tratar de actualizar el modulo a la ultima version, y no seria mala idea el kernel tambien.

Mas informacion detallada directo desde Qualys Community:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Security Researcher
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Justamente ayer estaba leyendo sobre esto por un tweet que publico HD Moore

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muy bueno bro! Tu escritura es muy agradable a la vista!
Muchas gracias por el aporte!

Saludos!
ANTRAX


Muchas Gracias Antrax.

Saludos!
Security Researcher
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Por lo que veo copiaste mal el código a los include les hace falta

Código: c
#include <netdb .h="">
#include <stdio .h="">
#include <stdlib .h="">
#include <string .h="">
#include <errno .h="">
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Por lo que veo copiaste mal el código a los include les hace falta

Código: c
#include <netdb .h="">
#include <stdio .h="">
#include <stdlib .h="">
#include <string .h="">
#include <errno .h="">


Juraría que los había puesto, creo que ANTRAX me edito el post y agrego esa imagen arriba.. y seguramente el "code" :p..
Ya esta corregido de todos modos, gracias por la aclaración Stuxnet. Saludos.
Security Researcher
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta