martes, 22 de junio de 2010

Bash Scripting: Recursive Search inside text files

Anteriormente había tenido la necesidad de hacer búsquedas recursivas de alguna cadena, en todos los archivos de texto de un árbol de directorios. Un ejemplo típico es un parámetro o valor usado por algún aplicativo y que no recordamos claramente en que archivo de conflagración esta, en este contexto es donde personalmente he tenido la necesidad de una herramienta así.

Les quiero compartir un script que realiza precisamente este tipo de búsquedas, este script bien se puede adaptar para realizar operaciones sobre estos archivos, permisos, modificaciones, borrados, etc. Sin embargo eso ya queda de tarea de acuerdo a sus necesidades.


#!/bin/bash

if [ "$#" != "1" ]; then
echo "usage: finder ";
exit 1;
fi

#Se consigue un listado recursivo de los archivos en el directorio actual y subdirectorios
du -a * | awk 'BEGIN{"pwd" | getline LOCAL_PATH}{print LOCAL_PATH "/" $2}' | (
#Hacemos la lectura "filebyfile" o "linebyline"
while read line; do
#Solo buscamos en archivos de texto
file $line | grep text > /dev/null;
if [ "$?" -eq "0" ]; then
echo "*** Archivo de texto: $line";
cat $line | grep $1;
echo "";
fi
done
);
exit 0;

miércoles, 2 de junio de 2010

PackETH, Builder of RAW TCP/IP Packet

Hace algunos meses encontre en los repositorios de Ubuntu, una herramienta para la construcción de paquetes TCP/IP, el PackETH. Durante mis épocas de estudiante hacíamos pruebas personalizando paquetes con raw sockets en lenguaje C (¿que..., hay otro?). El desarrollo con raw sockets a pesar de fácil, puede ser en algún momento un poco confuso, sobre todo por los nombres de los elementos de las estructuras de datos usadas y su respectiva referencia y/o relación con el TCP/IP.
A modo de presentación de esta herramienta, se realizaron unas pruebas en una topología tan simple como la que muestra la figura anterior, una red local y un servidor de internet. En la computadora de la red local tenemos la dirección MAC 90:4C:E5:63:71:C9 y la dirección de red 192.168.1.100, los detalles pueden observar en la siguiente imagen.
Usando el PackETH, construimos un paquete ICMP, dirigido a un servidor de google. Haciendo un paréntesis, debemos saber que cuando un paquete cruza parcialmente la nube de internet y pasa por varios routers, en cada salto algunos campos se comportan de la siguiente manera:
  • MAC Origen: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando su propia MAC Address.
  • MAC Destino: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando la MAC Address del equipo que recibe la trama y que esta dentro de su segmento.
  • IP Origen: Solo llega a cambiar cuando salimos de alguna red local y el gateway hace un enmascaramiento, sustituyendo la IP origen que le llega por la que tiene el propio Gateway.
  • IP Destino: Nunca cambia!.
Conociendo la información anterior, seguimos con la instrucción del paquete, llenado los campos de la siguiente manera. Una vez terminado definimos la interfaz de salida, y damos clic a "Send". El paquete en ese momento es liberado en la ostil y lenta, red publica. Para verificar la entrega del paquete, podemos consultar algún sniffer, en este caso nos apoyamos de wireshark, donde podemos ver que el paquete se envía y recibe correctamente. Espero esta información puede ser de mucha ayuda para algunas personas.

martes, 18 de mayo de 2010

Un vistazo a Iptables con DMZ


Revisando el baúl de los recuerdos me encontré con algunos trabajos escolares, y me se me ocurrió que era buena idea comentar alguno de ellos. Definitivamente uno de mis favoritos es iptables, y en este ejemplo hacemos una implementación de esas reglas para una arquitectura con DMZ.

Les voy a compartir un script, que lo que hace es activar un firewall usando iptables y que a la vez tiene finalidad de ayudarnos a protegernos a nivel de capa de red y transporte. El único requerimiento es tener instalado awk, e iptables en linux.

#!/bin/bash
#Re-adaptado por:
#Martin Edmundo Barriga Orozco

#Revisamos la dependencia de AWK
awk --version > /dev/null
if [ "$?" != "0" ]; then
echo "Se requiere AWK para continuar"
exit 1
fi

echo "Preparando interfaces..."
echo 1 > /proc/sys/net/ipv4/ip_forward

#Interfaces de red que usamos para la red LAN, DMZ e Internet
if_lan="eth1"
if_dmz="eth2"
if_pub="eth0"

#Direcciones que tenemos en cada interface
ip_pub="10.27.46.145"
ip_lan="172.16.1.254"
ip_dmz="192.168.1.254"

#Direcciones IPs conocidas.
web_server="192.168.1.1"
mail_server="192.168.1.3"
dhcp_server="192.168.1.129"
dns_server="192.168.1.2"

id_lan="172.16.0.0/16"
id_dmz="192.168.1.0/24"

#Configuracion final con el usuario
read -p "Habilitar uso para DMZ [y/N]: " enable_dmz
if [ "$enable_dmz" = "y" ]; then
if [ -n "$if_dmz" ]; then
#call metodo_valida_interfaz
echo "invocamos al metodo de validacion de interfaz"
else
echo " Interfaces Disponibles:"
#Imprimimos el listado de interfaces
ifconfig -a | awk 'BEGIN{FS="[ ]+" ; RS=""} $1!~/lo/{print " " NR ") " $1}'
read -p " Nombre de la interfaz a usar: " if_dmz

#call metodo_valida_interfaz
#echo "invocamos al metodo de validacion de interfaz"

echo -n " >>IP: " ;
#Se imprime la direccion IP de la interfaz $if_dmz
ifconfig $if_dmz | grep 'inet:' | awk 'BEGIN{FS="[ ]+"} {print $3}' | awk 'BEGIN{FS=":"}{print $2}'
read -p " Desea conservar esta IP para esta interfaz [y/N]: " tmp_ans
if [ "$tmp_ans" != "y" ]; then
read -p " Nueva IP: " ip_dmz
ifconfig $if_dmz $ip_dmz
fi
fi
fi

read -p "Habilitar el modo paranoico [y/N]: " enable_paranoico_mode


echo "Aplicando reglas del firewall..."


#Borrado de las reglas aplicadas actualmente (flush)
iptables -F #flush todas las cadenas
iptables -t nat -F
iptables -X #Borra cadenas definidas por el usuario
iptables -Z

#Activamos bitacora de reenvio
iptables -t nat -A PREROUTING -j LOG
iptables -t nat -A POSTROUTING -j LOG

#Politicas por defecto (INPUT OUTPUT FORWARD)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

#REDIRECCIONAMIENTO A SERVIDOR WEB EN DMZ DESDE LA LAN Y RED PUBLICA
iptables -t nat -A PREROUTING -i $if_lan -s $id_lan -d $ip_lan -p tcp --dport 80 -j DNAT --to 192.168.1.1:80
iptables -t nat -A PREROUTING -i $if_pub -d $ip_pub -p tcp --dport 80 -j DNAT --to 192.168.1.1:80
#iptables -t nat -A PREROUTING -i $if_lan -s 0.0.0.0 -d 255.255.255.255 -p udp --dport 67 -j DNAT --to 192.168.1.129:67

#ABRIENDO PUERTOS PARA INPUT, OUTPUT, FORWARD: TRABAJO SUCIO PERO HAY QUE HACERLO!

#Aceptamos peticiones de ICMP para la LAN.
iptables -A INPUT -i $if_lan -s $id_lan -d $ip_lan -p icmp -j ACCEPT
iptables -A OUTPUT -o $if_lan -s $ip_lan -d $id_lan -p icmp -j ACCEPT

if [ "$enable_dmz" = "y" ]; then
#Aceptamos peticiones e ICMP para la DMZ.
iptables -A INPUT -i $if_dmz -s $id_dmz -d $ip_dmz -p icmp -j ACCEPT
iptables -A OUTPUT -o $if_dmz -s $ip_dmz -d $id_dmz -p icmp -j ACCEPT
fi

#Aceptamos peticiones ICMP desde la red publica.
iptables -A INPUT -i $if_pub -s 0/0 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o $if_pub -d 0/0 -p icmp --icmp-type 0 -j ACCEPT

#Aceptamos el flujo para el DNS para la LAN. REVISAR
iptables -A INPUT -i $if_lan -p udp --dport 67 -j ACCEPT
iptables -A OUTPUT -o $if_lan -p udp --sport 67 -j ACCEPT

if [ "$enable_paranoico_mode" != "y" ]; then
#Aceptamos navegar en la web. (Opcional)
iptables -A INPUT -i $if_pub -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i $if_pub -p tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 443 -j ACCEPT

#Aceptamos las peticiones de MSNP, tenemos tolerancia. xD (Opcional)
iptables -A INPUT -i $if_pub -p tcp --sport 1863 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 1863 -j ACCEPT
fi

#Aceptamos el flujo de DNS para la red publica. REVISAR
iptables -A INPUT -i $if_pub -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p udp --dport 53 -j ACCEPT

if [ "$enable_dmz" = "y" ]; then
#Permitimos el flujo de de comununicacion entre el WEB server de la DMZ y los clientes de la LAN
#Evitamos rafagas de paquetes syn.
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $web_server -p tcp --dport 80 -m limit --limit 3/minute --limit-burst 3 state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $web_server -d $id_lan -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el DNS server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $dns_server -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $dns_server -d $id_lan -p udp --sport 53 -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de ICMP hacia el servidor web
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $web_server -p icmp -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $web_server -d $id_lan -p icmp -j ACCEPT

#Permitimos a nuestro servidor DNS, solicitar direcciones al DNS del ITMorelia
iptables -A FORWARD -i $if_dmz -o $if_pub -s $dns_server -d 200.33.171.1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_dmz -s 200.33.171.1 -d $dns_server -p udp --sport 53 -j ACCEPT

#iptables -A FORWARD -i $if_dmz -o $if_pub -p udp --dport 53 -j ACCEPT
#iptables -A FORWARD -i $if_pub -o $if_dmz -p udp --sport 53 -j ACCEPT

#Permitimos a nuestro servidor DNS, solicitar direcciones al DNS del ITMorelia
iptables -A FORWARD -i $if_dmz -o $if_pub -s $dns_server -d 200.33.171.8 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_dmz -s 200.33.171.8 -d $dns_server -p udp --sport 53 -j ACCEPT

#Permitimos exponer nuestro webserver a la red publica.
iptables -A FORWARD -i $if_pub -o $if_dmz -d $web_server -p tcp --dport 80 -m limit --limit 5/minute --limit-burst 5 -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_pub -s $web_server -p tcp --sport 80 -j ACCEPT
else
#Sino hay DMZ permitimos a los clientes LAN consultar DNS externos
iptables -A FORWARD -i $if_lan -o $if_pub -s $id_lan -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d $id_lan -p udp --sport 53 -j ACCEPT
fi

#Permitimos a las personas de la LAN, navegar en la web.
iptables -A FORWARD -i $if_lan -o $if_pub -s $id_lan -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d $id_lan -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p tcp --dport 443 -j ACCEPT ##1863 :1503 3389
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p tcp --sport 443 -j ACCEPT

#Permitimos el uso del MSNP en la computadora del SysAdmin dentro de la LAN
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p tcp --dport 1863 -j ACCEPT ##1863 :1503 3389
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p tcp --sport 1863 -j ACCEPT
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p udp --dport 1863 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p udp --sport 1863 -j ACCEPT

#ENMASCARAMIENTO DE LA RED Y LA DMZ
iptables -t nat -A POSTROUTING -o $if_pub -s $id_lan -j MASQUERADE
if [ "$enable_dmz" = "y" ]; then
iptables -t nat -A POSTROUTING -o $if_pub -s $dns_server -p udp --dport 53 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $if_pub -s $id_dmz -j MASQUERADE
iptables -t nat -A POSTROUTING -o $if_dmz -s $id_lan -d $web_server -p tcp --dport 80 -j SNAT --to-source $ip_dmz
iptables -t nat -A POSTROUTING -o $if_dmz -s ! $id_lan -d $web_server -p tcp --dport 80 -j SNAT --to-source $ip_dmz
#iptables -t nat -A POSTROUTING -o $if_dmz -s 0.0.0.0 -d $dhcp_server -p udp --dport 67 -j SNAT --to-source $ip_dmz
fi

echo "Reglas aplicadas correctamente :)"

domingo, 21 de febrero de 2010

OLPC XO, Netbook fundacion Telmex.

Hace unos días y de manera involuntaria me entere de que la fundación Telmex, hace donativos, de unas netbooks para escuelas primarias de escasos recursos, siempre y cuando la escuela lo solicite y después de hacer una evaluación la fundación telmex determina si procede el donativo o no. Estas netbooks no están en venta en México. Para mas información puedo compartir el teléfono del HelpDesk 01 800 822 02 50.

Tengo que agradecer a mi amigo Roman Aguilar quien amablemente me dejo revisar un equipo de estos y así poder compartirlo con ustedes. El diseño es muy atractivo y como juguete de pruebas seria un muy buen ambiente.

Se trata de una computadora portátil desarrollado por la organización One Laptop Per Child, cuyo objetivo es apoyar a los niños de escasos recursos de todo el mundo, poniendo a su alcaze computadoras portátiles. Para mas información podemos ver [ aquí ].

Esta diminuta computadora tiene un sistema basado en GNU/linux, y un sistema de escritorios, sugar con iconos muy grandes ideal para los niños, aquí podemos encontrar aplicaciones para colorear, navegar en Internet, juegos, una consola!. Como otras aplicaciones también tiene gcc, sshd, es un fedora así que una vez en Internet podemos instalar mas cosas.
/*** Nucleo ***/
[olpc@xo-1D-F7-DA ~]$ uname -a
Linux xo-1D-F7DA.localdomain 2.6.22-20080312.2.olpc.f3687aa7e09fd65 #1 PREEMPT Wed Mar 12 21:25:06 EDT 2008 i586 i586 i386 GNU/Linux


/*** Distribución usada ***/
[olpc@xo-1D-F7-DA ~]$ cat /etc/fedora-release

Fedora release 7 (Moonshine)
/*** Cantidad de memoria ***/
[olpc@xo-1D-F7-DA ~]$ free -m
total used free shared buffers cached
Mem: 232 218 13 0 0 120
-/+ buffers/cache: 98 134
Swap: 0 0 0

/*** HD ***/
[olpc@xo-1D-F7-DA ~]$ df -h

S.ficheros Tamaño Usado Disp Uso% Montado en
mtd0 1.0G 375M 650M 37% /
tmpfs 35M 0 35M 0% /dev/shm

/*** Perifericos PCI ***/
[olpc@xo-1D-F7-DA ~]$ lspci

00:01.0 Host bridge: Advanced Micro Devices [AMD] Unknown device 0028 (rev 21)
00:01.1 VGA compatible controller: Advanced Micro Devices [AMD] Geode LX Video
00:01.2 Entertainment encryption device: Advanced Micro Devices [AMD] Geode LX AES Security Block
00:0c.0 FLASH memory: Marvell Technology Group Ltd. Unknown device 4100 (rev 10)
00:0c.1 Generic system peripheral [0805]: Marvell Technology Group Ltd. Unknown device 4101 (rev 10)
00:0c.2 Multimedia video controller: Marvell Technology Group Ltd. Unknown device 4102 (rev 10)
00:0f.0 ISA bridge: Advanced Micro Devices [AMD] CS5536 [Geode companion] ISA (rev 03)
00:0f.3 Multimedia audio controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] Audio (rev 01)

00:0f.4 USB Controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] OHC (rev 02)
00:0f.5 USB Controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] EHC (rev 02)

/*** CPU ***/
[olpc@xo-1D-F7-DA proc]$ cat cpuinfo
processor : 0
vendor_id : AuthenticAMD ( ¿que?..., ¿hay otro? xD )
cpu family : 5
model : 10
model name : Geode(TM) Integrated Processor by AMD PCS
stepping : 2
cpu MHz : 433.386
cache size : 128 KB
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu de pse tsc msr cx8 sep pge cmov clflush mmx mmxext 3dnowext 3dnow
bogomips : 867.83
clflush size : 32

Finalmente un pequeño video: