Archivo para la GNU/Linux categoría

Descubriendo claves en WiFi

Publicado en GNU/Linux, InfoSec el Noviembre 27, 2008 por armaged0n

Un amigo en la empresa donde me encuentro trabajando me dió algunos tips -por no decir que me enseñó- cómo descubrir claves WiFi. El tema requiere más paciencia que ciencia así que describiré el escenario.

Lo que aquí escribo es una constancia de las pruebas que realicé, no me hago responsable de nada ni por nadie. Las pruebas las realicé sobre kubuntu pero pueden funcionar con cualquier otra distro. Hay una distro que se llama Wifislax, está basada en Slackware sin embargo los programas que se usarán serán:

  1. airmon-ng
  2. aircrack-ng
  3. airodump-ng
  4. aireplay-ng

Todos estos programas se encuentran en aircrak-ng, para más información pueden descargar y leer desde aquí http://www.aircrack-ng.org/doku.php

Los pasos para descubrir claves es muy sencillo, aquí veremos un ejemplo paso por paso:

1. Paso inicial

Se debe cambiar el estado de la tarjeta de red wifi a modo MONITOR. En mi caso la tarjeta wifi es una Intel IPW2200 identificada como eth1 así que ejecuto:

airmon-ng start eth1

Debe observarse que el mensaje en pantalla indique que se tiene el modo monitor enable.


2. Descubriendo redes cercanas a las que posiblemente podamos conectarnos

Aquí pondré a escuchar y observar todas las redes e información relevante como ser, essid, bssid, channel y lo más importante el parámetro DATA. Sólo ejecuto lo siguiente:

airodump-ng eth1

En mi caso al hacer esto, apareció esta información:

CH  1 ][ Elapsed: 4 s ][ 2008-11-26 23:31

BSSID              PWR  Beacons    #Data, #/s  CH  MB  ENC  CIPHER AUTH ESSID

00:1B:FC:DD:51:2E  175        0        2    0   6  -1  WEP  WEP         <length:  0>
00:1E:58:C1:32:A9  174        2        0    0   6  54. WEP  WEP         <length:  0>
00:14:D1:37:01:F9  175        2        0    0   6  54  WEP  WEP         cra1
00:0B:B4:EE:B0:45  173        2        0    0   6  54  WEP  WEP         default
00:17:9A:62:E0:D9  176        2        0    0   6  54. WEP  WEP         Masterchecho Net
00:19:5B:DA:BA:CC  177        4        0    0   6  54. WEP  WEP         uzta
00:02:CF:95:5E:F8  176        4        0    0   6  54. WEP  WEP         Depto
00:1D:7E:44:E9:53  178        6        0    0   6  48  WEP  WEP         Seis
00:19:5B:D9:29:CE  184        5        1    0  11  54. WEP  WEP         redcasa
00:0F:CB:FC:3E:62  174        4        1    0   1  54. WEP  WEP         <length:  0>
00:02:CF:CC:9F:FA  194       13        9    4   6  54. WEP  WEP         cramos
00:1C:F0:3B:5D:81  183       13        0    0   6  54. WPA  TKIP   PSK  dlink
00:1B:FC:F1:E8:E4  185        7      120   52   6  48  WEP  WEP         jancab

BSSID              STATION            PWR   Rate  Lost  Packets  Probes

00:02:CF:CC:9F:FA  00:15:AF:7E:78:60  204  54-54    17        9

Observo que la conexión identificada con el essid jancab tiene en parámetro DATA mayor, es un buen indicio así que trabajaré con esa conexión.

3. Analizando la conexión:

Ejecutaré el siguiente comando para capturar la data sólo del enlace que deseo y almacenaré el tráfico capturado para un análisis posterior, este análisis se realizará con otro programa.

airodump-ng –ivs -w archivo_captura –channel 6 –bssid 00:1B:FC:F1:E8:E4

Es importante esperar que el campo data llegue a por lo menos 15,000. Esto puede demorar tiempo pero podemos generar tráfico inyectando paquetes con aireplay-ng. El sistema generará un archivo de nombre archivo_captura-01.ivs

4. Analizando la data captura

Ahora analizaré la data almacenada, si no logro obtener los resultados tendré que ejecutar nuevamente el paso anterior cuidando de borrar el archivo que contiene la data capturada para generar uno nuevo.

aircrack-ng archivo_captura-01.ivs

Aquí debo esperar un poco hasta que se muestre la clave o KEY. La clave se mostrará en el siguiente formato, por ejemplo: cb:c6:66:55:44

Al usar la clave obtenida se obvia los  :

Así de simple….

Bonding en GNU/Linux

Publicado en GNU/Linux el Agosto 17, 2008 por armaged0n

Siguiendo con los mini How To toca el turno de escribir sobre bonding. Esta semana tuve la oportunidad de instalar uno y es de lo más sencillo. El escenario es el siguiente:

1. Se cuenta con un enlace -enlace 1- conectado a eth0.

2. Se cuenta con otro enlace -enlace 2- conectado a eth2.

3. Se cuenta con una tarjeta de red -eth1- que mira hacia la Lan.

4. Eth0 tiene por IP 192.168.1.252.

5. Eth2 tiene por IP 192.168.1.252.

6. Eth1 tiene por IP 192.168.3.254.

Procedimiento:

Bonding requiere de soporte en el kernel por ello si fuese necesario habrá que compilar nuestro kernel, en mi caso no ha sido necesario. Además será necesario contar con el programa ifenslave el mismo que puedo descargar -ifenslave.c- y compilar o descargar si se usa apt. Luego de contar con el soporte en el kernel y con el programa indicado ejecuto esto:

modprobe bonding mode=0 miimon=100

ifconfing bond0 192.168.1.252 netmask 255.255.255.0

ifenslave eth0 eth2

Y eso es todo.

Al ejecutarse ifconfig observaremos que bond0 posee el IP 192.168.1.252 mientras que eth0 y eth2 indicarán que se encuentran como “slave”, además se observará que la MAC de las 3 interfaces -bond0, eth0, eth2- es la misma. En mi caso la interfaz eth1 no la he tocado ya que es que mira hacia la Lan.

En el servidor tengo corriendo un VPN basado en SSL y también QoS, estos funcionan perfectamente bién. Ahora como paso final es importante modificar algunas reglas del firewall. Si antes por ejemplo tenía esta línea:

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE

Ahora lo que debo hacer es modificar la regla anterior cambiando eth0 por bond0. Se debe modificar las reglas que sean necesarias según el caso.

De ahora en adelante, cuando uno de los enlaces falle -corte en el servicio- nuestro servidor seguirá conectado a Internet y sus servicios estarán disponibles gracias al segundo enlace existente, por ello es importante contar con enlaces de diferentes proveedores. Bonding tiene muchos parámetros por usar, aquí sólo expliqué un beneficio a obtener. Cosas de la vida.

Priorizar tráfico – QoS

Publicado en GNU/Linux el Agosto 15, 2008 por armaged0n

El día de hoy se presentó el caso de un amigo que necesitaba priorizar el tráfico entre sus oficinas. La calidad de los enlaces ADSL que posee no es buena, la latencia es alta y en horas punta la oficina sucursal tiene problemas para conectarse a los recursos de la oficina principal.

Como el aplicativo tiene algunas deficiencias no es posible conectarse mediante el cliente y hacer una consulta SQL limpia, por ello debe usar una conexión Terminal Service, aquí el script que elaboré para priorizar el tráfico y asegurar anchos de banda mínimos:

——————————————————————————————-

root@fw.server:/# cat /root/qos_servidor
#! /bin/bash

DEVWAN=”ppp0″
DEVTUN0=”tun0″
IPT=”iptables -t mangle”
TC=”/sbin/tc”

###Gestion Ancho de Banda###################

$TC qdisc del dev $DEVWAN root
$TC qdisc del dev $DEVTUN0 root

$IPT -F
$IPT -X

$TC qdisc add dev $DEVWAN root handle 1: htb default 11
$TC qdisc add dev $DEVTUN0 root handle 1: htb default 11

$TC class add dev $DEVWAN parent 1: classid 1:1 htb rate 150kbit ceil 150kbit
$TC class add dev $DEVTUN0 parent 1: classid 1:1 htb rate 100kbit ceil 100kbit

#Banda WAN
$TC class add dev $DEVWAN parent 1:1 classid 1:10 htb rate 110kbit ceil 150kbit prio 1
$TC qdisc add dev $DEVWAN parent 1:10 handle 10: sfq perturb 10
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10

$TC class add dev $DEVWAN parent 1:1 classid 1:11 htb rate 40kbit ceil 150kbit prio 2
$TC qdisc add dev $DEVWAN parent 1:11 handle 11: sfq perturb 10
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11

#Banda tun0
$TC class add dev $DEVTUN0 parent 1:1 classid 1:10 htb rate 70kbit ceil 100kbit prio 1
$TC qdisc add dev $DEVTUN0 parent 1:10 handle 10: sfq perturb 10
$TC filter add dev $DEVTUN0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10

$TC class add dev $DEVTUN0 parent 1:1 classid 1:11 htb rate 30kbit ceil 100kbit prio 2
$TC qdisc add dev $DEVTUN0 parent 1:11 handle 11: sfq perturb 10
$TC filter add dev $DEVTUN0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11

#Conexiones iniciales
$IPT -A PREROUTING -m tos –tos Minimize-Delay -j TOS –set-tos 0×10
$IPT -A PREROUTING -m tos –tos Minimize-Delay -j RETURN
$IPT -A PREROUTING -m tos –tos Minimize-Cost -j TOS –set-tos 0×02
$IPT -A PREROUTING -m tos –tos Minimize-Cost -j RETURN
$IPT -A PREROUTING -m tos –tos Maximize-Throughput -j TOS –set-tos 0×08
$IPT -A PREROUTING -m tos –tos Maximize-Throughput -j RETURN

$IPT -A OUTPUT -m tos –tos Minimize-Delay -j TOS –set-tos 0×10
$IPT -A OUTPUT -m tos –tos Minimize-Delay -j RETURN
$IPT -A OUTPUT -m tos –tos Minimize-Cost -j TOS –set-tos 0×02
$IPT -A OUTPUT -m tos –tos Minimize-Cost -j RETURN
$IPT -A OUTPUT -m tos –tos Maximize-Throughput -j TOS –set-tos 0×08
$IPT -A OUTPUT -m tos –tos Maximize-Throughput -j RETURN

$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN

$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN

#SSH
$IPT -A PREROUTING -p tcp –dport 22 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 22 -j RETURN
$IPT -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 22 -j RETURN

$IPT -A OUTPUT -p tcp –sport 22 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –sport 22 -j RETURN
$IPT -A OUTPUT -p tcp –sport 22 -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –sport 22 -j RETURN

$IPT -A OUTPUT -p tcp –dport 22 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –dport 22 -j RETURN
$IPT -A OUTPUT -p tcp –dport 22 -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –dport 22 -j RETURN

#TS
$IPT -A PREROUTING -p tcp –sport 3389 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –sport 3389 -j RETURN
$IPT -A PREROUTING -p tcp –sport 3389 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –sport 3389 -j RETURN

$IPT -A PREROUTING -p tcp –dport 3389 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 3389 -j RETURN
$IPT -A PREROUTING -p tcp –dport 3389 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 3389 -j RETURN

#NetBios
$IPT -A PREROUTING -p tcp –sport 445 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN
$IPT -A PREROUTING -p tcp –sport 445 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN

$IPT -A PREROUTING -p tcp –dport 445 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 445 -j RETURN
$IPT -A PREROUTING -p tcp –dport 445 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 445 -j RETURN

#ICMP
$IPT -A PREROUTING -p icmp -j TOS –set-tos 0×10
$IPT -A PREROUTING -p icmp -j RETURN
$IPT -A PREROUTING -p icmp -j MARK –set-mark 1
$IPT -A PREROUTING -p icmp -j RETURN

$IPT -A OUTPUT -p icmp -j TOS –set-tos 0×10
$IPT -A OUTPUT -p icmp -j RETURN
$IPT -A OUTPUT -p icmp -j MARK –set-mark 1
$IPT -A OUTPUT -p icmp -j RETURN

#DNS
$IPT -A PREROUTING -p udp –dport 53 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p udp –dport 53 -j RETURN
$IPT -A PREROUTING -p udp –dport 53 -j MARK –set-mark 1
$IPT -A PREROUTING -p udp –dport 53 -j RETURN

$IPT -A OUTPUT -p udp –dport 53 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p udp –dport 53 -j MARK –set-mark 1
$IPT -A OUTPUT -p udp –dport 53 -j RETURN

———————————————————————————————-

Como puede verse, se posee una interfaz ppp0 -enlace ADSL-, una interfaz tun0 que interconecta ambas oficinas.

Como dato importante se observa que el ancho de banda de subida declarado sobre ppp0 es de 150Kbps, como sobre la misma interfaz se crea la interfaz virtual tun0 aquí genero otra banda y la acoto a 100Kbps. Genero dos bandas, la banda 10 con prioridad máxima -1- y  la banda 11 con prioridad 2 y dónde pasará todo lo que no se encuentre declarado en el script.

La priorización de tráfico en este caso es para conexiones 3389 -terminal service, icmp, dns- sé que hay algunas lineas demás -innecesarias- pero no interfieren con lo que se desea lograr. Otro dato importante es que en la oficina principal también inserté un script similar para asegurar la priorización en ambos lados.

El script sirve para muchos casos, sólo se debe modificar lo necesario y si hay alguna duda por parte del alguien que lea esto pregunte o lea en google.

Proxy transparente con soporte para MAC

Publicado en GNU/Linux con etiquetas , , , , el Julio 19, 2008 por armaged0n

Hoy documentaré como instalo un proxy transparente con soporte para MAC. Esto funciona en cualquier distribución, sólo se requiere descargar el código fuente, compilar, instalar, configurar y ejecutar. Algunas veces empleo el soporte para MAC para evitar que el usuario cambie el IP del terminal y logre acceder a privilegios de navegación no asignado. Si bien es cierto que el usuario podría cambiar la MAC de la tarjeta de red del terminal esto resulta siendo más tedioso, en fin, si el usuario desea saltar los controles siempre encontrará una forma de hacerlo por eso es recomendable monitorear los servicios de red para identificar anomalías e intentos de uso de servicios no autorizados.

Para este documento descargaré y compilaré desde el código fuente ya que puedo habilitar opciones que no se encuentran disponibles con un programa pre-compilado o en un programa empaquetado para una distribución en especial, por eso descargo el último código fuente desde y usando:

wget -c http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE8.tar.gz

Una vez descargado el código fuente, suelo desempaquetar en /opt, así que me ubico en /opt y ejecuto esto, como se observa en el ejemplo, el código fuente fué descargue en /tool:

root@armaged0n:/opt# tar -zxvf /tool/squid-3.0.STABLE8.tar.gz

Luego ingreso a la carpeta:

root@armaged0n:/opt$ cd  squid-3.0.STABLE8

Ahora ejecuto la siguiente linea:

root@armaged0n:/opt/squid-3.0.STABLE8# ./configure –enable-linux-netfilter  –enable-arp-acl

Espero un momento mientras se compila. Aquí lo que estoy haciendo es compilar habilitando el soporte para MAC y además para proxy transparente. Luego se ejecuta:

root@armaged0n:/opt/squid-3.0.STABLE8# make && make install

Esa es básicamente la instalación, a partir de este momento debo considerar las siguientes carpetas de trabajo:

/usr/local/squid —> Carpeta creada por la instalación indicada.

/usr/local/squid/etc/acls –> Carpeta donde localizo info de MAC y dominios permitidos -crear-.

/cache —> Carpeta donde alojaré la estructura de directorios de soporte al caché. -crear-.

/var/log/squid/ —> Carpeta donde se alojará los log de squid. Si no existe, crear.

Luego hacemos lo siguiente:

chown -R nobody:nobody /cache  /var/log/squid

chmod -R g+w /cache /var/log/squid

Ahora procedo a editar el archivo squid.conf para ello lo edito, aquí use el editor preferido, en mi caso:

root@armaged0n:/opt/squid-3.0.STABLE8# mcedit /usr/local/squid/etc/squid.conf

El archivo tiene muchas partes o secciones, sólo colacaré lo que es necesario:

#       WELCOME TO SQUID 3.0.STABLE8
#       —————————-

# ACCESS CONTROLS
# —————————————————————————–
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

acl restringido arp “/usr/local/squid/etc/acls/restringido” –> regla 1
acl listaweb dstdomain “/usr/local/squid/etc/acls/listaweb” –> regla 2
acl superior arp “/usr/local/squid/etc/acls/superior” –> regla3

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

http_access allow restringido listaweb –> asocio regla 1 y regla 2
http_access allow superior –> permito la regla 3 sin restriccion de acceso

http_access deny all
icp_access deny all
htcp_access deny all

# NETWORK OPTIONS
# —————————————————————————–
http_port 192.168.0.254:8080 transparent –> asocio la interfaz que escuchará y el port

# MEMORY CACHE OPTIONS
# —————————————————————————–
cache_mem 64 MB
maximum_object_size_in_memory 8 KB
memory_replacement_policy lru

# DISK CACHE OPTIONS
# —————————————————————————–
cache_replacement_policy lru
cache_dir ufs /cache 1000 16 256  –> la carpeta /cache tiene 1GB de espacio
maximum_object_size 4096 KB
cache_swap_low 90
cache_swap_high 95

# LOGFILE OPTIONS
# —————————————————————————–
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
logfile_rotate 10
mime_table /usr/local/squid/etc/mime.conf
pid_filename /var/log/squid/squid.pid

# OPTIONS FOR FTP GATEWAYING
# —————————————————————————–
ftp_user Squid@server.com
ftp_list_width 32
ftp_passive off  –> recomendable

# OPTIONS FOR TUNING THE CACHE
# —————————————————————————–
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern (cgi-bin|\?)    0       0%      0
refresh_pattern .               0       20%     4320

# HTTP OPTIONS
# —————————————————————————–
ie_refresh on

# ADMINISTRATIVE PARAMETERS
# —————————————————————————–
cache_effective_user nobody
cache_effective_group nobody

# ICP OPTIONS
# —————————————————————————–
icp_port 3130

# ERROR PAGE OPTIONS
# —————————————————————————–
error_directory /usr/local/squid/share/errors/Spanish -> El nombre lo dice

# DNS OPTIONS
# —————————————————————————–
dns_nameservers 208.67.222.222  200.48.225.146

Ahora procedo a declarar las MAC de los terminales con restricción -regla 1-

root@armaged0n:/usr/local/squid/etc/acls# cat restringido
00:1B:78:B7:3A:5D   ## ip 192.168.0.10
00:14:85:AC:4C:91   ## ip 192.168.0.11
00:14:85:AC:7C:53   ## ip 192.168.0.12

Ahora procedo a declarar los dominios que asociaré a la regla 1 -regla 2-

root@armaged0n:/usr/local/squid/etc/acls# cat listaweb
.dominiox1.com
.dominiox2.net

Ahora procedo a declarar las MAC de terminales sin restriccón -regla 3-

root@armaged0n:/usr/local/squid/etc/acls# cat superior
00:1B:78:B7:4A:5D   ## ip 192.168.0.13
00:14:85:AC:5C:91   ## ip 192.168.0.14

Casi terminado ejecuto esto: /usr/local/squid/sbin/squid -z  –> Creo la estructura de squid localizada en la carpeta /cache.

Luego ejecuto: /usr/local/squid/squid -D –> Ejecuto el demonio squid

Ejecuto netstat -l -n -v  y verifico que el port 8080 se encuentre escuchando, en mi caso:

tcp        0      0 192.168.0.254:8080      0.0.0.0:*               LISTEN

Para el firewall sólo es necesario colocar esta regla:

iptables -t nat -A PREROUTING -p tcp -i eth1 –dport 80 -j REDIRECT –to-port 8080

En la regla anterior debo considerar que la interfaz eth1 del equipo se encuentra mirando hacia la Lan, por ello cambie según corresponda. Está de más decir que el IP asignado a eth1 es 192.168.0.254 por ello lo declaré así en squid.conf.

Con lo anteriormente indicado sólo necesito probar en un terminal de la red mientras monitoreo mediante el comando:

tail -f /var/log/squid/access.log

Game over.

Bridge sobre GNU/Linux

Publicado en GNU/Linux con etiquetas , , el Julio 13, 2008 por armaged0n

Esta vez escribiré sobre como instalar un bridge sobre GNU/Linux. En algunas ocasiones me tocó instalar algunos bridge, de hecho son muy fáciles de instalar. Aquí indico algunos motivos en los que servirá contar con uno:

  1. Filtrado de puertos sin tener que estar modificando los segmentos de la red ya existente.
  2. Unir dos redes.
  3. Análisis de tráfico sobre la red.

Las características requeridas del equipo no son exigentes, incluso podría emplearse un equipo antiguo, sin disco duro, sólo con un lector de CD y un live CD -no creo que ahora hayan muchos de esos equipos- la distribución GNU/Linux a usar puede ser cualquiera, da lo mismo usar Slackware, Debian, Centos, lo que sea, esto no es relevante.

También se requieren 02 tarjetas de red de buena performance aunque si se cuenta con bahías disponibles podría emplearse 04 tarjetas de red, todo depende de lo que se necesite. La instalación como indiqué es sencilla, no se requiere compilar el kernel, en las actuales versiones de las distribuciones anteriormente indicadas sólo basta instalar el sistema operativo, el soporte ya viene en el kernel aunque es probable que necesite instalar un paquete, este es el paquete “bridge-utils” así que una vez instalado dicho paquete sólo necesita ejecutar esto:

brctl addbr br0
brctl addif  br0 eth0
brctl addif  br0 eth1
ifconfig eth0 0.0.0.0 promisc
ifconfig eth1 0.0.0.0 promisc
ifconfig br0 up

ifconfig br0 0.0.0.0

Eso es todo, se debe recordar que es necesario contar con cables cross over para eth0 y eth1. El esquema más o menos sería así:

LAN — SWITCH —- eth1|BRIDGE| eth0 —- ROUTER

El esquema anterior lo usaría para hacer una análisis de tráfico pero podría variar dependiendo de lo que se necesite. Con este esquema capturaría los paquetes entrantes a la Lan y  paquetes salientes.

Al hacer un ifconfig deberá observar una interfaz br0, a partir de ahora puede empezar a darle uso al bridge, si requiere hacer análisis de tráfico puede emplear tcpdump, wireshark, si  desea filtrar paquetes se requiere emplear iptables, debe trabajarse con FORWARD. No estaría de más empezar a jugar un poco y ver que se puede lograr, suerte.

Instalar GNU/Linux en una memoria USB

Publicado en GNU/Linux con etiquetas , , el Julio 11, 2008 por armaged0n

No diré que muchas, pero si algunas veces necesité usar un equipo ya sea para realizar una charla y usar una de mis presentaciones, redactar un documento pero usando OpenOffice -sólo en casos excepcionales uso una muy conocida suite de oficina propietaria- o a veces necesito instalar GNU/Linux en el equipo, los motivos pueden ser muchos, sin embargo estar cargando un porta CD puede ser algo molestoso. Lo más práctico para mí es llevar una memoria USB en el bolsillo -a veces perdido entre las monedas como es mi caso-.

He hecho el procedimiento con varias distribuciones como Debian, Ubuntu, KUbuntu, BackTrack -distro para ejecutar pruebas de seguridad y detectar vulnerabilidades- y quizá alguna más que no recuerdo, bueno en todos los casos el procedimiento es bastante similar. Yo uso una memoria USB de 1GB -yo compré esta memoria cuando costaba algo de 35 dólares, ahora no llegan ni a 9 dólares-. Así que manos a la memoria.

Política Pilatos: Se debe tener cuidado de no formatear una partición existente en el disco duro así que no asumo ninguna responsabilidad si llegara a ocurrir esto.

Todo lo que aquí explico lo hago desde mi laptop, actualmente uso Kubuntu, pero si tienes otra distro instalada da lo mismo, pienso que mucha gente cree que las cosas se hacen diferente entre una distro y otra, no creo lo mismo. Desde equipos con MS Windows no hice esto, aún.

1. Se tiene el equipo encendido y con una sesión activa.

2. Insertar la memoria USB. Si el sistema pregunta si montará la memoria para poder acceder a ella, indicamos NO.

3. Esta parte es interesante, ejecutamos fdisk -l    hago esto para poder ver cómo es que la memoria ha sido reconocida en el sistema, la forma como lo reconoce no necesariamente será siempre la misma, en mi caso sin haber insertado la memoria USB y ejecutando el comando anterior se presenta esto:

root@armaged0n:/# fdisk -l

Disposit. Inicio    Comienzo      Fin  Bloques  Id  Sistema
/dev/sda1   *           1          12       96358+  83  Linux
/dev/sda2              13        1349    10739452+  83  Linux
/dev/sda3            1350        6906  44636602+   5  Extendida
/dev/sda5            1350        1373  192748+  83  Linux
/dev/sda6            1374        1495  979933+  83  Linux
/dev/sda7            1496        1617  979933+  83  Linux
/dev/sda8            1618        1860  1951866   83  Linux
/dev/sda9            1861        2589  5855661   83  Linux
/dev/sda10           2590        3197 4883728+  83  Linux
/dev/sda11           3198        3440 1951866   83  Linux
/dev/sda12           3441        4048 4883728+  83  Linux
/dev/sda13           4049        5872 14651248+  83  Linux
/dev/sda14           5873        6784 7325608+  83  Linux
/dev/sda15           6785        6906 979933+  82  Linux swap / Solaris

Ahora insertando la memoria USB -se recuerda que no debe montarse- aparece una nueva linea al final:

Disco /dev/sdb: 1001 MB, 1001127936 bytes
16 cabezas, 32 sectores/pista, 3819 cilindros
Unidades = cilindros de 512 * 512 = 262144 bytes
Identificador de disco: 0×0e323193

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdb1   *           1        3819      977648    e  W95 FAT16 (LBA)

Ahora ya sé que el dispositivo ha sido reconocido como /dev/sdb1 y evito aplicar algún comando -formateo, particionamiento- sobre una partición del disco duro.

Algunos podrian particionar la memoria USB con la finalidad de poder contar con una partición donde iría el sistema operativo y otra particion donde podrían almacenar sus archivos, incluso podrían optar por particionar el sector donde guardarán sus archivos bajo ext3 con la finalidad de que no sea detectada por equipos con MS Windows, en fin, yo no necesito eso asi que sólo formatearé la memoria USB usando el siguiente comando -me aseguro que el dispositivo no esté montado-:

mkfs.vfat /dev/sdb1

Ahora podemos montar el dispositivo con el siguiente comando o si lo deseas quita e inserta de nuevo, se entiende que /media/disk es una carpeta existente, en fin da igual donde montes el dispositivo, en mi caso:

mount  /dev/sb1  /media/disk

Ahora es necesario tener los siguientes paquetes instalados “syslinux” y “mtools” como indiqué uso kubuntu así que ejecuto apt pero si tienes otra distro, descarga los fuentes e instalalos, no habrá problema -usa google para saber de donde descargar los fuentes-, en mi caso uso:

apt-get install syslinux mtools

Ahora ejecuto lo siguiente  syslinux /dev/sdb1  esto es para poder iniciar o bootear desde la memoria USB.

Para el siguiente paso necesitamos el iso de la distro a copiar en el USB, también puedes usar el CD si es que ya lo tienes, si sólo tienes el archivo ISO deberás descomprimirlo para tener acceso a los archivos -tal como si estuvieras viendo el contenido del CD- obviamente si tienes el CD deberás obviar este paso:

mount -t iso9669 -o loop kubuntu-8.04-desktop-i386.iso /mnt/carpeta

Aquí /mnt/carpeta ya existe, si no es así procede a crearla o usa otra carpeta que se encuentre disponible -vacía-

Luego ingresa a /mnt/carpeta y se copia todo el contenido de la carpeta al dispositivo USB que ya se encuentra montado:

cp -rf casper disctree dists install pics pool preseed .disk isolinux/* md5sum.txt README.diskdefines ubuntu.ico casper/vmlinuz casper/initrd.gz /media/disk

Ignorar los mensajes de cannot create symbolic link que se presentarán, luego casi terminando se ejecuta el siguiente comando para descargar el archivo:

wget pendrivelinux.com/downloads/U710fix.zip

Para terminar descomprimimos el archivo en la memoria USB

unzip -o -d /media/disk/  U710fix.zip”

Con el paso anterior se copiarán los archivos syslinux.cfg e isolinux.txt. Eso es todo sólo queda reiniciar el equipo y verificar que el primer dispositivo de arranque o inicio sea la memoria USB.

Crear un VPN Road Warrior o bajo demanda

Publicado en GNU/Linux con etiquetas , el Junio 28, 2008 por armaged0n

Siguiendo con los mini – howto explicaré como crear un VPN bajo demanda empleando para ello pptp. Es bastante simple, sin embargo a veces cuando lo instalo me olvido de algunos detalles y debo empezar a recordar cosas que espero no volver a recordar así que para eso redacto este artículo.

He instalado esto bajo RedHat, Slackware, Debian / Ubuntu y no recuerdo que otros más, en todos los casos los pasos a realizar son similares. Aquí explicaré mi última experiencia con Ubuntu, el proceso se resume a estos simples pasos:

1. Tener el sistema instalado, este tutorial no tocará los temas previos de instalación, configuración, puesta a punto y lo que sea que se requiera previamente, para más de estos detalles ve a google.

2.  Usaremos APT, sin embargo también puedes descargar los fuentes desde http://www.poptop.org, si usas otra distribución ve y descarga los fuentes y compilas. En este caso usaré.

apt-get install pptpd

3. Editaremos el archivo /etc/pptpd.conf, siendo el contenido principal lo que aquí aparece:

ppp /usr/sbin/pppd
option /etc/ppp/pptpd-options
debug
logwtmp
localip  192.168.0.90-92
remoteip 192.168.20.10-12

Los parámetros localip y remoteip indican la cantidad de conexiones que habilitaremos y las IP que se crearán -origen y destino- por cada conexión que generen los usuarios remotos. En mi caso son 3 conexiones.

4.  Editar el archivo /etc/ppp/pptpd-options, en mi caso lo principal es esto:

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
nodefaultroute
debug
lock
nobsdcomp

Más detalles de cada opción y del por qué en google.

5. Ahora ejecutamos el comando pptpd y observamos mediante netstat -l -n -v si el servicio está escuchando, en este caso debo observar que el port 1723 se encuentra escuchando.

tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN

6. Ahora falta afinar algunas cosas en el firewall que como mínimo debe tener esto:

iptables -t nat -A PREROUTING -i ppp+ -j ACCEPT

iptables -I INPUT -p 47 -j ACCEPT
iptables -I OUTPUT -p 47 -j ACCEPT
iptables -I INPUT -p tcp –dport 1723 -j ACCEPT
iptables -I FORWARD -p tcp –dport 1723 -j ACCEPT

iptables -I FORWARD -p tcp –sport 1723 -j ACCEPT

iptables -A FORWARD -i ppp+ -j ACCEPT

Como puedes observar, debes tener el soporte para ip_gre -no necesitas instalar nada, por lo menos con las distros que mencioné antes el soporte viene en el kernel- ahora debes convocarlo mediante

modprobe ip_gre

Esto puedes convocarlo desde el inicio del sistema así te evitas de hacerlo manualmente.

7. para los casos que tengas un sólo IP y este se encuentre en el router deberás pasar la solicitud de conexión que llegue al router hacia el servidor GNU/Linux, algo de esto lo toqué en un artículo anterior sobre VPN basado en SSL. Si posees un enlace con IP pública dinámica, el artículo anterior aplica sin problema alguno.

8. Ahora en el cliente con MS Windows, debes configurar la conexión para conectarte al server que has instalado, si no sabes como aquí hay un artículo que se encuentra en el mismo poptop http://poptop.sourceforge.net/dox/pptp_winxp/VPN_Verbindungsaufbau_mittels_PPTP.pdf , está en alemán -yo no sé nada de alemán ni de las alemanas, pero con los grafiquitos es más que suficiente, si aún no entiendes tienes dos posibilidades: estudiar alemán o buscar otro artículo en google, wtf-

9. Ahora creas los usuarios que realizarán la conexión, edita /etc/ppp/chap-secrets

# client        server  secret                  IP addresses
usuario1           *       clave               192.168.20.10
usuario2         *       clave                192.168.20.11

Aquí indico que usuario y con que clave se permitirá la conexión, también indico que IP se asignará a dicha conexión, lee los archivos de configuración en la parte donde dice remoteip.

Yo además de esto meto algo de QoS para asegurar mínimos de ancho de banda y priorizar tráfico, de esta manera logro una mejor performance y evito saturaciones. Aquí no tocaré QoS.

11. Cuando realices la conexión desde un terminal remoto observarás que se crea una interfaz pppX por cada conexión vpn. Si tienes problemas mira en.

tail -f /var/log/messages

tail -f /var/log/syslog

12. Ya puedes pasar por caja, cobrar tu cheque y ser felíz. Si te sirvió el artículo, haz una donación para comprarme un Audi A6, ya me falta poco.

Instalar un VPN basado en SSL

Publicado en GNU/Linux con etiquetas , , el Junio 9, 2008 por armaged0n

Hoy contaré mi experiencia instalando VPN basados en SSL. Aquí explicaré algunos casos comunes que espero ayuden a quién requiera interconectar dos o más oficinas. No hablaré de cómo funciona SSL ni los aspectos detrás de cámara, sólo explicaré lo básico y funcional. Si alguien toma esto como guía lo mas probable es que logre su objetivo, sin embargo podrían presentarse algunos casos que requieren de otros aspectos que escaparán a este artículo. Si es tu caso, pide y reza a san google…

Requerimiento en la oficina principal

1. PC corriendo Debian, Slackware, Centos, White Box, Ubuntu, lo que sea. He probado y en todas ellas lograrás lo mismo. El PC tendrá 2 o 3 tarjetas de red dependiendo si deseas una zona Lan o una zona Lan + zona DMZ (la 1era tarjeta mira hacia Internet, la 2da tarjeta mira a la Lan y la 3ra mira a la DMZ). Mediante el comando mii-tool deberás identificar que tarjeta mira o conecta hacia donde. El artículo trata el caso de un servidor con 2 tarjetas de red, se desea interconectar dos oficinas.

2. Openvpn –> www.openvpn.org

3. Lzo —> http://www.oberhumer.com/opensource/lzo/

4. Se requiere OpenSSH.

Proceso de instalación y configuración en la oficina principal

1. La instalación de GNU/Linux no será tratado en este artículo. Usa aquella distribución con la que te sientas mejor. Si tienes duda sobre la instalación de GNU/Linux entonces es hora de leer algo y luego podrás continuar aquí. Yo recomiendo instalar servidores sin entorno gráfico, personalmente estoy acostumbrado a usar consola y no uso herramientas gráficas para configurar ni personalizar, solo edito archivos. Esto no tiene que ser una regla, es mi elección.

2. Dependiendo de la distribución que estes usando es probable que puedas descargar los paquetes openvpn y lzo mediante apt u otro gestor. Sin embargo aquí explicaré la forma “tradicional”

3. Todos los pasos indicados de aquí en adelante deberán hacerse bajo el usuario root o equivalente a root.

4. Instalando LZO.

root@armaged0n:/tool# wget -c http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz

root@armaged0n:/tool# tar -zxvf lzo-2.03.tar.gz

root@armaged0n:/tool# cd lzo-2.03.tar.gz

root@armaged0n:/tool/lzo-2.03# ./configure && make && make check && make test && make install

Aquí habrá que esperar un momento mientras se compila e instala. En caso se muestre algún mensaje de error deberá observar el mensaje, es seguro que no se instaló una libreria o paquete de soporte como por ejemplo make u otro. Resuelva esto y corra nuevamente el comando ./configure && ……

El proceso indicado anteriormente se resume en lo siguiente: descargo el paquete a una carpeta, desempaqueto, ingreso a la carpeta y finalmente compilo e instalo.

5. Instalando Openvpn

root@armaged0n:/tool# wget -c http://openvpn.net/release/openvpn-2.0.9.tar.gz (aquí descargo)

root@armaged0n:/tool# tar -zxvf openvpn-2.0.9.tar.gz (aquí desempaqueto)

root@armaged0n:/tool# cd openvpn-2.0.9 (aquí entro a la nueva carpeta creada al desempaquetar)

root@armaged0n:/tool/openvpn-2.0.9# ./configure && make && make install

Asegurese de instalar primero LZO ya que openvpn lo necesitará al momento de compilar.

6. Si llegó a este punto, alégrese, sólo le falta un 80% :) . Ahora vaya a  /etc y verifique que existe la carpeta openvpn, si no existe, entonces deberá crearlo con mkdir /etc/openvpn

7. Crearemos la llave que será la mismas para ambos servidores / oficinas.

root@armaged0n:/etc/openvpn# openvpn –genkey –secret key1

8. Ahora creamos el archivo que permitirá interconectar ambas oficinas:

root@armaged0n:/etc/openvpn# touch oficina.conf

El contenido del archivo oficina.conf será algo similar a esto:

local  ip_publico_asignado_en_el_server_local
remote  ip_publico_asignado_en_el_server_remoto
dev tun0
port 5000
comp-lzo
user nobody
ping 15
ifconfig 192.168.10.61  192.168.10.60
secret /etc/openvpn/key1
up /etc/openvpn/routeoficina
Breve explicación sobre este archivo:

local aquí deberá indicar el IP público que posee una de las interfaces instaladas en el servidor (asumamos que eth0 posee este IP). Este seria el caso cuando su enlace posee varios IP públicos. Si su enlace sólo tiene un IP público entonces tienes dos alternativas, la primera es dejar que el router proporcionado por el proveedor del enlace tome el IP público asignado y sólo configuras el router para que toda solicitud de conexión hacia el router pase al servidor que estas instalando. La segunda alternativa es convertir el router en modo bridge y que sea el servidor quién tome el IP público. También puede suceder que el enlace posea un IP público dinámico, entonces aquí deberás considerar crear una cuenta por ejemplo en dyndns.org y asociar ese dominio con un programa como ipcheck aunque hay otros y mediante cron asociar y declarar el ip del enlace, si este es tu caso deberas colocar el host.dyndns.org en reemplazo del ip_publico_asignado.

remote exactamente igual al caso anterior solo que declaras como se indica el otro extremo al que se conectara el servidor VPN.

dev tun0 corresponde a la interfaz que se creará para crear el túnel VPN

port 5000 el puerto por donde se conectarán ambos servidores

comp-lzo la compresión a usar.

user nobody el usuario a cargo del demonio.

ping 15 cada 15 segundos se emitirá una ping para determinar si el tunel esta levantado y/o mantenerlo activo.

ifconfig 192.168.10.61  192.168.10.60 el IP de origen y el IP de destino que se asociarán a las interfaces tun0 en cada lado

secret /etc/openvpn/key1 localización de la llave a compartir entre ambos servidores.
up /etc/openvpn/routeoficina un script que permitirá declarar rutas y permitir que las redes con segmentos internos diferentes puedan verse.

9. Ahora se deberá crear el archivo /etc/openvpn/routeoficina que contendrá lo siguiente:

#!/bin/bash
/sbin/route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.10.60

Observa el contenido anterior, estoy declarando que el segmento de red de la oficina sucursal es 192.168.2.0 y que la puerta de enlace a dicho segmento es 192.168.10.60 (el ip asignado a la tarjeta tun0 del otro extremo). Para el ejemplo aqui descrito, el segmento de la oficina principal es 192.168.1.0. Cambie estos valores para su caso. Haga ejecutable este archivo mediante chmod +x  /etc/openvpn/routeoficina

10. Como paso final sólo queda levantar el servicio, esto se hace así:

openvpn –daemon 5 –verb /etc/openvpn/oficina.conf

Listo!

Obviamente aún no se tiene el servidor en el otro extremo para conectar pero compruebe que el servicio VPN se encuentra corriendo mediante el comando netstat -l -n -v   deberá observar el port 5000 sino es así algo malo ocurrió asi que revise los log mediante tail -f /var/log/messages para ver que ocurre, de seguro no le será dificil identificar el problema y corregirlo.

Ahora en la oficina sucursal

Se asume que ya instaló GNU/Linux en el servidor de esta oficina. El proceso de instalación del VPN es similar salvo los siguientes cambios a realizar:

1. Copie mediante ssh o un dispositivo usb el archivo /etc/openvpn/key1 localizado en la oficina principal (ahora remoto), copielo en el servidor  local en la misma localización (directorio).

2. Edite el archivo   /etc/openvpn/configuracion.conf

local ip_publico_asignado_en_el_server_local
remote ip_publico_asignado_en_el_server_remoto (ahora oficina principal)
dev tun0
port 5000
comp-lzo
user nobody
ping 15
ifconfig 192.168.10.60  192.168.10.61 (vea el cambio con el archivo anterior)
secret /etc/openvpn/key1
up /etc/openvpn/routeoficina

3. Edite el archivo /etc/openvpn/routeoficina que deberá presentar esto:

#!/bin/bash
/sbin/route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.10.61

Observe los cambios y compare con el archivo anteriormente indicado para la oficina principal.

4. Inicie el VPN

openvpn –daemon 5 –verb /etc/openvpn/oficina.conf

Eso es todo.

Hasta este momento ambos servidores se encuentran corriendo, sin embargo es posible que no logre enlazar las oficinas. Aqui tiene un modelo de Firewall que viene con el openvpn descargado:

Para oficina principal:

#!/bin/bash

# eth0 is connected to the internet.
# eth1 is connected to a private subnet.
PRIVATE=192.168.1.0/24
LOOP=127.0.0.1
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -F

iptables -t nat -F

iptables -t mangle -F

# Allow local loopback
iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT

# Allow incoming pings (can be disabled)
iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT

# Allow services such as www and ssh (can be disabled)
iptables -A INPUT -p tcp –dport ssh -j ACCEPT

#Openvpn
iptables -A INPUT -p udp –dport 5000 -j ACCEPT

# Allow packets from TUN/TAP
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

# Allow packets from private subnets
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT

# Keep state of connections from local machine and private subnets
iptables -A OUTPUT -m state –state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state –state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

# Masquerade local subnet
iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
Para la oficina sucursal, modifique los parametros que sean requeridos.

Eso es todo…