Cuando uno habla de hacking o hacks, la mayoría de la gente lo asocia con el típico nerd que vive con su mama y que desde el sótano de su casa irrumpe en otras computadoras. En este articulo voy a hablar un poco de las herramientas disponibles para hacer precisamente eso, pero por motivos didácticos, así que no soy responsable de sus acciones. La mayoría de ustedes han escuchado de nmap y nessus pero que hay de las otras herramientas? echemosle un vistazo y juguemos un poco con la red.

La preferida por muchos es tcpdump, es una herramienta que simplemente nos permite escuchar todo el trafico de la red y graba todos estos paquetes para que luego los podamos analizar. Si tienes mas de una NIC, puedes especificar por cual quieres escuchar pasándole el parámetro -i interfaz. Una cosa que me gusta es que tcpdump pone tu NIC en modo promiscuo (o por lo menos intenta hacerlo) de forma predeterminada, de esta forma puede escuchar todo el trafico de ese segmento de la red. Para deshabilitar el modo promiscuo y limitar el trafico solo a el que le compete a tu NIC puedes usar el parámetro -p. Hay muchos otros parámetros que puedes usar, recuerda ejecutar man tcpdump para mas información.

Aquí les dejo un video que muestra como saber que sitios web estan visitanto desde nuestra red.


Ahora bien, vamos a cuidar nuestras espaldas y supongamos que queremos saber que ordenadores están en tu segmento de red pero queremos evitar enviar paquetes a la red preguntando por estos ordenadores para que no nos delate (recuerda, este tipo de actividad le puede parecer sospechoso al administrador). La herramienta indicada para esta tarea es p0f, esta usa técnicas pasivas para tratar de adivinar que sistemas existen en tu segmento de red y al igual que tcpdump permite especificar la interfaz a usar y grabar trafico guardándolo en un archivo estilo tpcdump.

Nuestras dos herramientas se empiezan a diferenciar a la hora de definir de forma predeterminada el estado de promiscuidad de nuestra NIC, p0f requiere que especifiques que quieres que la NIC este en modo promiscuo y solo escucha cuando un ordenador en nuestra red abre nuevas conexiones. Aquí una lista de parámetros útiles para p0f.

  1. -i Especifica la NIC por la que va a escuchar (p0f -i eth0)
  2. -w Guarda la salida en formato tcpdump (p0f -i eth0 -w laboratorio.dump)
  3. -o Al igual que -w guarda la salida de este comando pero en un archivo de texto sin formato tcpdump
  4. -O Proporciona una salida mas descriptiva. Tambien llamado modo ACK
  5. -p Indica que quieres que ponga la NIC en modo promiscuo (p0f -i eth0 -p)
  6. -s Analiza un archivo que previamente capturaste en formato tcpdump

El problema de todo esto hasta ahora es que es muy probable que el resto de las maquinas esten bajo una NAT y no podamos verlas como tal, solo veremos el router. Uno puede usar el parámetro -M que le indica a p0f que use un algoritmo de detección de enmascaramiento e intenta identificar estas maquinas individualmente.

Supongamos que ya sabemos cuales son los otros ordenadores que existen en nuestra red, ahora lo interesante es saber que tipo de trafico tienen, sera FTP? o tal vez HTTP?, POP?, IMAP? o cualquier otro que sea de nuestro interés. Lo segundo que en mi caso me llama la atención es ver desde donde viene este trafico, con quien se comunican estos otros ordenadores? para responder todo esto podemos usar nuestra tercera herramienta, dsniff.

Esta utilidad al igual que las anteriores nos permite especificar que interfaz queremos usar e incluso podemos usar el parámetro -p para que use archivos que han sido grabados previamente. Puedes habilitar la detección automática de protocolos usando el parámetro -m lo que te va dar detalles crudos de que hacen tus vecinos de red.

La salida de este comando luce algo asi:

~# dsniff -m
dsniff: listening on eth0
-----------------
02/01/11 09:50:19 tcp 10.153.212.26.46004 -> trillian.gtlib.gatech.edu.21 (ftp)
USER anonymous
PASS mailto:axel-devel@lists.alioth.debian.org

-----------------
02/01/11 09:51:50 tcp 10.153.212.26.48257 -> linux.nssl.noaa.gov.21 (ftp)
USER anonymous
PASS mailto:axel-devel@lists.alioth.debian.org

-----------------
02/01/11 09:53:06 tcp 10.153.212.26.39551 -> chernabog.cc.vt.edu.21 (ftp)
USER anonymous
PASS chrome@example.com

Ahora que sabemos quienes están a nuestro alcance, que hacen y con quien, podemos revisar la seguridad de los servicios que prestan, el mas común es el servicio web.

Una herramienta buena para revisar como esta la seguridad de nuestro servidor web es nitko. Puedes seleccionar el hostname con la opción -h incluso puedes pasarle una lista de host o IPs en un archivo de texto. nitko se enfoca en el puerto 80 de forma predeterminada pero puedes alterar esto usando el parámetro -p de hecho tiene un montón de parámetros que puedes usar para pruebas de seguridad especificas... mas de las que quisiera mencionar aquí.

No quería terminar este articulo sin antes mencionar chkrootkit, esta utilidad nos permite analizar sistemas y trata de terminar si han sido manipulados, para ver una lista de las pruebas disponibles puedes usar el parámetro -l. Útil para verificar si el sistema ha sido infectado o si tiene rootkits.

Este articulo es para fines didácticos, para que 'juegues' en tu propia red y no para que dañes sistemas ajenos ni adquieras a información que no te pertenece.

A todos nos ha pasado, estamos trabajando, por error le damos en el teclado a la flecha de arriba y pasa lo peor:

rm -f /home/m1n1m3/descargas/descargdor.sh

Cualquier entra en pánico al darnos cuenta que no teníamos respaldo de este script, pero en estos momentos es cuando mas calma se debe de tener. Analicemos la situación, aun hay procesos usando este archivo, en mi caso aun sigo descargando y compartiendo archivos vía torrents gracias a este script que acabo de eliminar. Lo primero es encontrar el PID para lo cual podemos ejecutar ps y hacer un grep por el nombre del archivo, el resultado tendrá en la primera columna el PID como lo podemos ver aquí:

ps -p | grep -i descargador.sh
30560 pts/3    Ss+    0:00 /bin/bash /home/m1n1m3/descargas/descargdor.sh

El sistema de ficheros /proc mantiene vínculos a los archivos abiertos por procesos dentro de el sub-directorio fd/ (File Descriptor) que a su vez esa anidado dentro de una carpeta con el nombre del PID del proceso y como acabamos de comprobar nuestro script aun se esta ejecutando.

Teniendo en cuenta el PID que obtuvimos anteriormente y ya que sabemos que la estructura de directorios es /proc/<pid>/fd/ podemos determinar que el archivo que acabamos de eliminar esta dentro de /proc/30560/fd/. Para determinar cual de todos es podemos hacer un ls -la y hacerle un grep por el nombre del archivo a la salida del ls -la. Todo esto se debería de ver así:

ls -la /proc/30562/fd/* | grep descargador.sh
/proc/30560/fd/51 -> /home/m1n1m3/descargas/descargador.sh (deleted)

Para recuperar el archivo eliminado solo debemos copiar el archivo dentro de fd/ a donde queramos, en mi caso, lo quiero restaurar, así que ejecutare:

cp /proc/30560/fd/51 /home/m1n1m3/descargas/descargador.sh

Listo, archivo restaurado.

Nota: Esto funciona también en Android

Una cosa que nunca me gusto de Android y de hecho fue una de las cosas que mas me costo acostumbrarme fue la resolución de la pantalla, los iconos y letras inmensas, me parecía un desperdicio de pantalla el no poder cambiarle la densidad al LCD, en especial cuando tienes 11 centímetros (4.3 pulgadas). Luego de rootear el teléfono me puse a buscar la forma de alterar esto y conseguí una app que se llama LCDDensity for Root.

El programa funciona de maravilla, excepto que en el nightly build que estoy usando de CyanogenMod la barra del ADW.Launcher se muestra descontinua y desalineada si se asigna el valor de 190 o por debajo de este. Conseguí un script que usando el terminal de android nos permite asignar un valor arbitrario así que me propuse buscar cual era el valor entre 190 y 200 en el que la barra no se distorsionaba y luego de un par de intentos di con el numero 192. Este es el script:

#!/system/bin/sh
#Version 0.1
#Created by lithid

mount -o rw,remount /system
cd /system
sed "s/ro.sf.lcd_density = .*/ro.sf.lcd_density = $1/g" build.prop > tmp

mv tmp build.prop
echo -n "Do you want to reboot now? (y or n) > "
read list
if [ "$list" = "n" ] || [ "$list" = "N" ]
  then echo "No Eh? Must not wanna see your changes."
  mount -o ro,remount /system
  exit 1
elif [ "$list" = "y" ] || [ "$list" = "Y" ]; then echo "Rebooting Device"
  sleep 1 reboot
else
  echo "That is not a yes or a no"
  echo "Leaving"
  mount -o ro,remount /system
  exit 1
fi
exit

Este script fue escrito por @lithid y publicado en los foros de CyanogenMod.

Esta semana me pidieron algo curioso. El departamento de móviles me pidió borrar el contenido de todos los archivos de un directorio sin eliminar los archivos cada hora. Mi primera reacción fue usar uno de los scripts que he publicado anteriormente, ese script que usaba find para listar los 10 archivos mas grandes de un directorio y pensé que simplemente debía de modificar el ls por un echo > es decir modificar:

find /servicios/wap/ -type f -exec ls -ls {} \;

Para que quedara así:

find /servicios/wap/ -type f -exec echo >{ } \;

El detalle es que find considera que el '>' forma parte de el y me termina creando un archivo de nombre {} en el directorio sin blanquearme los archivos. La alternativa que termine usando fue dd y quedo así al final:

find /servicios/wap/ -type f -exec dd if=/dev/null of={} \;

Con su respectiva entrada en el crontab para que se ejecute cada hora. La entrada luce algo como esto:

* */1 * * * wireless /op/wap/scripts/wap_cleaner.sh

No hice algo mas elaborado por que esto es una solución temporal mientras se implementan otras aplicaciones.

Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano. Revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política.

Para duplicar estos resultados escribí un script que permite obtener estos emails y se adapta a cualquier comunidad que use phpBB como software para foros. echemos un vistazo.

TEMP_URL="/tmp/spider_url.tmp"
MAX_SLEEP=1
TMP_EMAILS="/tmp/spider_emails.tmp"
CONFIG=$1 EMAIL_OUTPUT="/tmp/emails.txt"

rm -f $TEMP_URL
rm -f $TMP_EMAILS
rm -f $EMAIL_OUTPUT

for COMUNIDAD in `cat $CONFIG`
  do COMUNIDAD_URL=`echo $COMUNIDAD | awk -F, '{print $1}'`
  PERFILMIN=`echo $COMUNIDAD | awk -F, '{print $2}'`
  PERFILMAX=`echo $COMUNIDAD | awk -F, '{print $3}'`
  PERFIL=$PERFILMIN
  while [ "$PERFIL" -lt "$PERFILMAX" ]
    do echo "http://$COMUNIDAD_URL/profile.php?mode=viewprofile&u="$PERFIL
    PERFIL=`expr $PERFIL + 1`
  done
done | sort -R | grep -i [a-z] >> $TEMP_URL

for URL_DE_PERFIL in `cat $TEMP_URL`
  do curl -s --referer `shuf -n1 $TEMP_URL` $URL_DE_PERFIL | grep -i "@" |\
  sed -e 's/</ /g' -e 's/>/ /g' -e 's/\:/ /g' -e 's/\=/ /g' -e 's/&amp;/ /g' |\
  sed s/\"/\ /g |\ tr ' ' '\n' | \ grep "@" | sort | uniq | tr 'A-Z' 'a-z'
  SEGUNDOS=$[ ( $RANDOM % $MAX_SLEEP )  + 1 ]
  sleep $SEGUNDOS
done >> $TMP_EMAILS cat `echo $TMP_EMAILS` |\
grep -i -E '[a-zA-Z0-9_]*@[a-zA-Z0-9]*\.*\.(com|edu|net|org|info|ve)' | sort |\
 uniq > $EMAIL_OUTPUT

El script toma información que es publica y la filtra hasta obtener una cadena que semejé una dirección de correo electrónico, como pueden ver en las siguientes imagenes el perfil de los usuarios son públicos y es predecible cual es la URL de estos perfiles ya que son numerados de forma secuencial.



Al ejecutar el script no arroja ninguna salida, tendríamos que hacer un cat a $EMAIL_OUTPUT como lo vemos aquí:

Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano, revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política

Si se fijan el el script el recibe un parámetro cuando lo ejecutamos, ese parámetro es la ruta a un archivo que va a contener la información de la URL del foro a escanear, el primer perfil a escanear y el ultimo perfil, todo separado por comas sin espacios en blanco (comunidad,minimo,maximo) el archivo se vería algo así:

www.noticierodigital.com/forum,1001,1010 aporrealos.com/forum,1000,1020

Para llegar a cual es el perfil numero del perfil del ultimo usuario registrado por demos jugar en nuestro navegador web con el parámetro u=17015 y cambiar ese numero por uno mas alto hasta que recibamos una pantalla de error del foro diciendo que ese perfil no existe.

Se puede asociar el perfil con el nick y por ende con el email.

Evitando Patrones. Si volvemos al script que publique, pueden ver que tome algunas medidas para evitar crear patrones el archivos de registro (log files) alterando el orden de los perfiles y cambiando aleatoriamente el tiempo a esperar entre visita y visita a los perfiles adicionalmente estoy enviando un 'referrer' perteneciente a estas comunidades con cada petición HTTP.

El producto final de este script es una lista de direcciones de correo, una dirección por linea y luce así:

ferminmittilo@gmail.com
ivanmarcanolopez@hotmail.com
jjguillen@cantv.net
monje902@hotmail.com
psichofra@hotmail.com
linux@hacks.org

Este script no funciona con todos los foros phpBB, algunos requieren una sesión valida para acedar la pagina de los perfiles. En la segunda parte de este script (que publicare en los próximos días) usare este mismo script pero implementando cookies, sesiones, proxies y recurriendo a la cache de algunos buscadores web.


UPDATE: El script corre sin problemas en el iPhone asi que se puede ejecutar desde cualquier parte que se tenga internet bien sea vía Edge, 3G o WIFI.

Aquí una captura de pantalla y un video de el script con algunas modificaciones después de ejecutarse:

Script para recolectar emails de foros web ejecutado desde el iPhone

Instale mediante un pendrive USB un parche que permite el acceso remoto a mi AppleTV vía SSH, el mismo parche instala una serie de aplicaciones como Boxee, bin utils y unas modificaciones o hacks al menú de la interfaz gráfica que permite la instalación de plugins (como Perian) y otras aplicaciones.

[caption id="attachment_330" align="aligncenter" width="562" caption="booteando"]AppleTV iniciando despues de un reflash[/caption]

La razón principal de esto es mas que todo para poder instalar XBMC y una serie de plugins y scripts para este que permiten organizar automaticamente la librería de películas. El pluging no solo permite renombrar y organizar de acuerdo a el nombre real de este vídeo, temporada y episodio si no también descarga automaticamente los subtítulos e información adicional al vídeo. Aquí les dejo un vídeo de el AppleTV iniciando desde el USB patchstick (el pendrive que preparamos) e instalando todo lo necesario.

Proximamente buscare de instalar macports o el portage de gentoo si es posible. Quiero migrar este site así como linuxevolution.org al AppleTV.

[gallery link="file" order="DESC"]

Hace poco me consultaron si se podía limitar el espacio de una carpeta Samba (samba share) sin tener control de usuarios es decir hay una carpeta por usuario que esta a su vez es 'mapeada' a su estación de trabajo (que corre windows) pero todos los usuarios usan el mismo usuario y el mismo password para acceder cada una de sus carpetas. La pregunta me dejo cabezón, yo nunca trabaje con Samba pero se que debe de haber forma de hacer esto. Por ahora me dispuse a crear un script que le ayudara.

Limitar el espacio de una carpeta sin usar cuotas en Samba

El script lee un archivo de texto separado por comas el cual tiene dos columnas una para el nombre del usuario y la cantidad de Megabytes que se le va a asignar a cada usuario. Usando el comando dd el script crear archivos que son formateados como EXT3 y seguidamente los monta. El archivo de texto plano luce así:

cat /tmp/usuarios.txt

maria.perez,5
arnaldo.hernandez,5
gustavo.flores,10
jesus.boss,5
marta.hernandez,5
wilkneman.pascoski,5
tatiana.siu,5
alexandra.delarosa,5

Aparte de crear, formatear y montar estos archivos el script también crea la configuración base que se le va a anexar a al smb.conf con el siguiente formato para cada usuario:

[alexandra.delarosa]
   comment = alexandra.delarosa with 5MB
   path = /mnt/smb_discs/alexandra.delarosa
   read only = no
   browseable = yes
   guest ok = yes

[arnaldo.hernandez]
   comment = arnaldo.hernandez with 5MB
   path = /mnt/smb_discs/arnaldo.hernandez
   read only = no
   browseable = yes
   guest ok = yes


[gustavo.flores]
   comment = gustavo.flores with 10MB
   path = /mnt/smb_discs/gustavo.flores
   read only = no
   browseable = yes
   guest ok = yes

Luego seria cuestión de retocar el /etc/Samba/smb.conf y reiniciar el servicio, re-mapear esto Samba share a los usuarios y listo. Aquí esta el script

LISTAUSUARIOS=`cat /tmp/usuarios.txt|sort`
RUTA_DISCOS="/smb_disks/smb_drives"
MOUNT_SMB="/mnt/smb_discs"
TMPSAMBACONF="/tmp/samba.virt.conf"

echo > $TMPSAMBACONF
mkdir -p `echo $RUTA_DISCOS`

for X in $LISTAUSUARIOS
  do echo $X | awk -F , '{print "asignando " $2 "MB a usuario "$1}'
  USUARIO=`echo $X | awk -F , '{print $1}'`
  PRE_ESPACIO=`echo $X | awk -F , '{print $2}'`
  let ESPACIO=`echo $PRE_ESPACIO`*1024
  dd if=/dev/zero of=$RUTA_DISCOS/$USUARIO.img bs=1024
  count=$ESPACIO
  /sbin/mke2fs -L $USUARIO -j $RUTA_DISCOS/$USUARIO.img
  mkdir -p $MOUNT_SMB/$USUARIO
  mount -t ext3 $RUTA_DISCOS/$USUARIO.img -o loop $MOUNT_SMB/$USUARIO
  echo "[$USUARIO]
  comment = `echo $USUARIO" with "$PRE_ESPACIO"MB"`
  path = /mnt/smb_discs/$USUARIO
  read only = no
  browseable = yes
  guest ok = yes    " >> $TMPSAMBACONF
done

echo "espacio usado en $RUTA_DISCOS: "
du -smh $RUTA_DISCOS/*.img
du -smh $RUTA_DISCOS/
mount -l | grep $MOUNT_SMB
echo "CHECK $TMPSAMBACONF AND ADD IT TO YOUR /etc/samba/smb.conf"

Como mencione anteriormente, yo nunca he trabajado con Samba en ambiente de producción yo practique o jugué un poco con Samba hace unos 5 años. este script no incluye configuraciones para estos Samba shares que proporcionen algo de seguridad. Si alguien tiene sugerencias pueden dejarlas en los comentarios.

Si experimentas problemas con el tamaño de estos discos virtuales no dudes en darle un vistazo a este articulo: El limite para 32-bits es de2147483647.

Los directorios mas importantes de NanoBlogger son data templates styles images y plugins. Anoche decidí a automatizar el respaldo de mi blog, como no tengo problemas de espacio decidí solo dejar por fuera el directorio cache. Este es el script para crear un archivo comprimido y subirlo a otro server vía SCP:

#!/bin/bash BLOG_PATH="/path/to/the/directory/that/contains/your/blog.conf/" BLOG_NAME="orvtech.com" DATE=`date +%d%b%Y-h%Hm%M` NO_BAKUP="cache/*" SCP_SERVER="" SCP_USER="" SCP_PORT="22" cd $BLOG_PATH tar -czpsf ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz --exclude "$NO_BAKUP" * ls -lah  ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz scp -P$SCP_PORT ~/$BLOG_NAME-nanoblogger.$DATE.tar.gz $SCP_USER@$SCP_SERVER:~/

Usando `du` podemos encontrar los directorios y archivos mas grande dentro de un directorio. el siguiente ejemplo muestra como listar los 10 archivos y carpetas mas grande dentro del directorio 'HOME'

du -a ~/ | sort -n -r | head -n 10

En el script de arriba, lo que estamos haciendo es listar todos los archivos y directorios que están en el directorio donde nos encontramos junto a su tamaño, luego los ordenamos numéricamente y de forma inversa y finalmente elegimos los últimos 10.

Con `find` podemos conseguir los 10 archivos mas grandes recursivamente dentro de un directorio.

find ~/ -type f -exec ls -ls {} \; | awk '{print $6"\t"$9}' | sort -k1 -n -r | head -n 10

Este script busca todos los archivos dentro de nuestro home, y los pasa por el comando ls -ls que los va a listar mostrando su tamaño. El resto de esta linea solo toma los campos seis y nueve pertenecientes a el tamaño en bloques y el nombre. Al igual que el script anterior el ultimo segmento de este script ordena numéricamente la salida y de forma inversa para luego tomar los primeros diez resultados.

Hace un par de artículos publique como tener el servicio de push desde un canal de IRC para el iPhone. Después de esa instalación quede inconforme con la forma en que hay que arrancar y parar ZNC en el servidor así que decidí crear un script de arranque.

El siguiente script permite arrancar, parar, recargar la configuración y reiniciar el servicio. Echemosle una ojeada a /etc/init.d/zncd

#!/bin/bash # # Run-level Startup script for the ZNC Boucer # description: Startup/Shutdown ZNC Boucer ZNC_FOLDER="/usr/bin" ZNC_OWNR="orvtech" if [ ! -f $ZNC_FOLDER/znc -o ! -d $ZNC_FOLDER ] then         echo "ZNC startup: cannot start, it appears that it is not installed"         exit 1 fi case "$1" in     start)             echo -n "Starting ZNC: "             su - $ZNC_OWNR -c "$ZNC_FOLDER/znc"             touch /var/lock/subsys/ZNC             echo "OK"             ;;     stop)         echo -n "Shutdown ZNC: "         kill -9 `ps -C znc | awk '{print $1}' | grep ^[0-9]`         rm -f /var/lock/subsys/ZNC         echo "OK"         ;;     reload)         echo -n "Reloading ZNC:"     kill -HUP `ps -C znc | awk '{print $1}' | grep ^[0-9]`     echo "OK"         ;;     status)         if ps -C znc > /dev/null     then       echo "ZNC Bouncer is running"     else       echo "ZNC Bouncer is not running"     fi         ;;     restart)             $0 stop         sleep 2             $0 start             ;;         *)         echo "Usage: $0 start|stop|restart|reload|status"         exit 1 esac exit 0

Si su NSLU2/Servidor esta corriendo gentoo pueden agregar el servicio así:

rc-update add zncd default

El output debería de ser algo parecido a esto

* zncd added to runlevel default