Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Buscador

Entradas Mensuales

Suscripción

¿Quieres recibir las últimas novedades del blog en tu correo?

¡Suscríbete al feed!

Foro de elhacker.net - Noticias

elhacker.NET en Facebook

Entradas populares

PostHeaderIcon GHOST: glibc: buffer overflow en gethostbyname CVE-2015-0235




Una grave vulnerabilidad bautizada como GHOST en GNU/Linux presente desde hace más de 14 años permite el acceso sin contraseña gracias a un desbordamiento de búfer en la función gethostbyname de la biblioteca C de GNU/Linux (glibc)





Este error está presente en todas las versiones de Red Hat Enterprise Linux y variantes (CentOS etc.), así como los sistemas Debian.

 El fallo se dio a conocer por primera vez en una lista de correo francés, pero pudo haber sido un accidente --- el error probablemente no estaba destinado a ser revelado ya, como no hay de distro habían actualizado los paquetes disponibles.

Una gran cantidad de aplicaciones de servidor intenta resolver o el nombres de host de los clientes o direcciones IP cuando se establece una conexión, por lo que todo lo que sería potencialmente vulnerable: el cliente malicioso controlar sus registros DNS simplemente necesita volver especialmente diseñado nombre de host o dirección de datos que es demasiado grande para caber en el búfer. Y esto afecta a todo, sin importar el idioma de la aplicación de servidor está escrita en C, Python, Golang, PHP, Java ...

El 27 de enero 2015 - * _Qualys, Inc ._ (NASDAQ: QLYS), el principal proveedor de soluciones de seguridad y cumplimiento en la nube, anunció que su equipo de investigación de seguridad estibarse descubierto en la biblioteca C de GNU / Linux (glibc) una vulnerabilidad crítica que permite a los hackers tomar el control remoto de cualquiera sistema, se pasa totalmente système.Qualys una contraseña trabajado en estrecha colaboración y coordinación con los proveedores Distribuciones de Linux para proporcionar un parche para todas las distribuciones de afectados los sistemas Linux. Este parche está disponible ahora con los proveedores correspondientes.


Bautizada como GHOST (CVE-2015-0235), ya que puede ser desencadenada por _gethostbyname las funciones y gethostbyaddr_ esta vulnerabilidad afecta a muchos sistemas de Linux glibc versión 2.2 publicado el 10 de noviembre de 2000. Qualys investigadores tienen también identificó varios factores que mitigan el impacto de esta vulnerabilidad, incluyendo uno publicado 21 de mayo 2013 entre parche glibc-2.17 versiones y glibc-2.18. Por desgracia, este parche no haber sido clasificado como un boletín de seguridad, la mayoría distribuciones estables y disfrutando de un apoyo a largo plazo fueron de expuesta, incluyendo Debian 7 ("Wheezy"), Red Hat Enterprise Linux 6 y 7 CentOS 6 y 7 y Ubuntu 12.04.

Listado de distribuciones afectadas:

  • RHEL(Red Hat Enterprise Linux) version 6.x and 7.x
  • CentOS Linux version 6.x & 7.x
  • Ubuntu Linux version 10.04, 12.04 LTS
  • Debian Linux version 7.x
  • Linux Mint version 13.0
  • SUSE Linux Enterprise 11 and older (also OpenSuse Linux 11 or older versions).
  • Arch Linux glibc version <= 2.18-1


¿Por qué se llama la vulnerabilidad GHOST (FANTASMA)?

 Se llama como la vulnerabilidad FANTASMA, ya que puede ser desencadenada por las funciones getHost.




Actualizado paquetes glibc que fijan un problema de seguridad ya están disponibles para Red Hat Enterprise Linux 5. Red Hat Seguridad del producto ha calificado esta actualización como tener seguridad crítica impacto. A Common Vulnerability Scoring System (CVSS) puntuación total, que da una calificación detallada gravedad, está disponible desde el enlace CVE en la sección de referencias.

Los paquetes glibc proporcionan las bibliotecas estándar de C (libc), hilos POSIX bibliotecas (libpthread), bibliotecas matemáticas estándar (libm), y el nombre Servidor de Almacenamiento en caché Daemon (nscd) utilizado por varios programas en el sistema. Sin estas bibliotecas, el sistema Linux no puede funcionar correctamente.

Un desbordamiento de búfer basado en heap se encontró en la glibc __nss_hostname_digits_dots (función), que se utiliza por el gethostbyname () y gethostbyname2 () función glibc. Un atacante remoto capaz de hacer una aplicación llama a cualquiera de estas funciones podrían utilizar este error para ejecutar código arbitrario con los permisos del usuario que ejecuta el aplicación. (CVE-2015 a 0235)

Red Hat quiere agradecer a Qualys por informar de este problema.

Todos los usuarios de glibc se les recomienda actualizar a estos paquetes actualizados, que contener un parche portado para corregir este problema.

¿Qué es glibc? 


La biblioteca C o glibc de GNU es una implementación de la biblioteca estándar de C y una parte central del sistema operativo Linux. Sin esta biblioteca un sistema Linux no funcionará.



Al igual que el reciente fallo OpenSSL Heartbleed, este será un uno molesto para arreglar. La actualización está en el paquete glibc, pero eso es un conjunto de bibliotecas que están siendo utilizados por una gran cantidad de servicios que se ejecutan. Después de la actualización, cada uno de estos servicios tienen que ser reiniciados ...

Comando para ver versión librería glibc del sistema:


ldd --version 

Comando para ver servicios o procesos afectados:

lsof | grep libc | awk '{print $1}' | sort | uniq

¿Cómo actualizar el Sistema?


  CentOS/RHEL/Fedora/Scientific
yum clean alls
yum update
Ubuntu

apt-get clean
apt-get update
apt-get dist-upgrade
 Debian

apt-get clean
apt-get update
apt-get dist-upgrade

 Paquetes:
Updated: glibc
Updated: glibc-common
Updated: glibc-headers
Updated: glibc-devel
Updated: glibc-static

  char buf[32];
  struct hostent *result = NULL;
  struct hostent ret;
  int h_err = 0;
  int err;

  err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err);
  return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE;



Por el momento no hay paquetes actualizados para RHEL / CentOS todavía. Red Hat ha lanzado el CVE públicamente, por lo que pronto se liberarán.

PoC


#include 
#include 
#include 
#include 
#include 

#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);
}

Código:




           size_needed = (sizeof (*host_addr)
    -                    + sizeof (*h_addr_ptrs) + strlen (name) + 1);
    +                    + sizeof (*h_addr_ptrs)
    +                    + sizeof (*h_alias_ptr) + strlen (name) + 1);



+             if (buffer_size == NULL)
+               *status = NSS_STATUS_NOTFOUND;
+             else
+               *result = NULL;




-         size_needed = (sizeof (*host_addr)
-                        + sizeof (*h_addr_ptrs) + strlen (name) + 1);
-
-         if (buffer_size == NULL && buflen < size_needed)
-           {
-             if (h_errnop != NULL)
-               *h_errnop = TRY_AGAIN;
-             __set_errno (ERANGE);
-             goto done;
-           }
-         else if (buffer_size != NULL && *buffer_size < size_needed)
-           {
-             char *new_buf;
-             *buffer_size = size_needed;
-             new_buf = realloc (*buffer, *buffer_size);
-
-             if (new_buf == NULL)
-               {
-                 save = errno;
-                 free (*buffer);
-                 __set_errno (save);
-                 *buffer = NULL;
-                 *buffer_size = 0;
-                 *result = NULL;
-                 goto done;
-               }
-             *buffer = new_buf;
-           }
-
-         memset (*buffer, '\0', size_needed);
-
-         host_addr = (host_addr_t *) *buffer;
-         h_addr_ptrs = (host_addr_list_t *)
-           ((char *) host_addr + sizeof (*host_addr));
-         hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs);


Fuentes:

0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.