Main

network Archives

Enero 21, 2004

SHAPER (en portuges)

Ola,

tenho visto muita gente na lista pesquisando por
Controle de Trafego baseado em endereco IP!

Dah para se conseguir isto com o Traffic Shaper do Linux.
Basta criar varios shapers e adiocar uma rota estatica
de um IP para o shaper.

Vejam um pequeno exemplo:

1) crie varios shapers, faca quantos voce precisar,
cada shaper ira realiza um controle!

$ cd /lib/modules/versao_kernel/net
$ cp shaper.o shaper0.o
$ cp shaper.o shaper1.o
$ cp shaper.o shaper2.o
...

2) Atualize as dependencias parar os novos modulos:

$ depmod -a

3) Carregue os modulos necessarios:

$ insmod shaper0
$ insmod shaper1
...

Obs.: para cada modulo carregado, o kernel disponibiliza
uma interface shaperX, que sera a interface de rota para
o IP onde se quer limitar o trafeo.

4) Atache e configure a velocidade para cada shaper deveice:

$ shapecfg attach shaper0 eth1
$ shapecfg attach shaper1 eth1
$ shapecfg attach shaper2 eth1
...
$ shapecfg speed shaper0 64000
$ shapecfg speed shaper1 256000
$ shapecfg speed shaper2 64000
...

Obs: a partir das versoes 2.2.x do kernel (se nao me engano), ao
configurar uma interface, o kernel automaticamente adiciona uma rota
parao endereco de rede pela interface. Por isso deve-se remover
esta rota logo apos configurar a interface
(queremos fazer shape somente para um IP, certo?).

6) Adicione rotas para os shapers:

$ roude add -host 192.168.1.2 dev shaper0
$ route add -host 192.168.1.3 dev shaper1
$ route add -host 192.168.1.4 dev shaper1
$ route add -host 192.168.1.5 dev shaper1
$ route add -host 192.168.1.6 dev shaper2

a saida do comando route deve ser algo como:

Destino Roteador Mascara Opcoes Metrica Ref Uso Iface
200.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.2 0.0.0.0 255.255.255.255 UG 0 0 0 shaper0
192.168.1.3 0.0.0.0 255.255.255.255 UG 0 0 0 shaper1
192.168.1.4 0.0.0.0 255.255.255.255 UG 0 0 0 shaper1
192.168.1.5 0.0.0.0 255.255.255.255 UG 0 0 0 shaper1
192.168.1.6 0.0.0.0 255.255.255.255 UG 0 0 0 shaper2
0.0.0.0 200.1.1.1 0.0.0.0 UH 1 0 0 eth0

7) Pronto!

##############

Eso esta como un poco mal.. no hace falta copiar el modulo como 7 veces para tener 7 shapers xD
DDD

modprobe shaper shapers=7

xD

--
Pablo Ruiz Garcia (Pci)

Abril 28, 2004

Uptime con hping2

Algo que siempre me toca mirar en google, por que no recuerdo
los parametros (se me olvida poner el flag syn)

hping2 host -p 80 -S --tcp-timestamp

Agosto 6, 2004

Escanear con hping spoofeando usando un zombie host

Post de antirez

The Players:


host A - evil host, the attacker.
host B - silent host.
host C - victim host.


- Se comprueba que el host B es "idle" viendo que no aumenta el "id"
nuestros paquetes (+1)
#hping B -r
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms

-Se envian paquetes a C spoofeando con B mientras se comprueban los ids en otra ventana
#hping C -a B -S

--------------------------
nmap lo soporta con -sI

Agosto 23, 2004

PingScan

La mejor forma de hacer un scan (definitivamente) es con nmap, ni icmpenum
ni sing, ni leches...

nmap -sP -PM -PE -PP -PS21,22,25,53,80,110,135,143,139

Aunque no entiendo como no han metido "Information Request" (tipo 15),
como una de las opciones -Px de nmap.

Ademas del limitado numero de puertos en el parametro -PS (tcp syn)

Actualizado: Fri Aug 15 01:55:55 CEST 2008 (de charla dc de fyodor)


nmap -sP -PE -PP -PS21,23,25,80,113,31339 -PA80,113,443,10042 --source-port 53 -T4

Cuatro años después, el man explica el porque no del Information Request }:>

Diciembre 13, 2004

Control del ancho de banda (bandwith/vnstat)

Otra cosa que olvido siempre es el nombre del programita este para controlar el ancho de banda. Es muy sencillo y para ver de un vistazo el bandwith consumido me parece practico. Se llama vnStat. En su pagina web
hay 'screenshots' y todo lo necesario.


Actualizacion: Mon Dec 13 18:25:02 CET 2004
DS se ha currado un rpm para fc3:

spezialk.net

Diciembre 29, 2004

Mi shell script para tunning/performance de tcp/ip en linux

Evidentemente, estos parametros no a todo el mundo le sirven.
(Y si, se que son muy bestias)

echo "0" > /proc/sys/net/ipv4/tcp_sack
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
echo "3129344 3137536 3145728" > /proc/sys/net/ipv4/tcp_mem
echo "65536 1398080 2796160" > /proc/sys/net/ipv4/tcp_rmem
echo "65536 1398080 2796160" > /proc/sys/net/ipv4/tcp_wmem
echo "163840" > /proc/sys/net/core/optmem_max
echo "1048560" > /proc/sys/net/core/rmem_default
echo "2097136" > /proc/sys/net/core/rmem_max
echo "1048560" > /proc/sys/net/core/wmem_default
echo "2097136" > /proc/sys/net/core/wmem_max

Actualizacion: Wed Dec 29 16:42:04 CET 2004
Más elegante con sysctl (/etc/sysctl.conf):

net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_mem = 3129344 3137536 3145728
net.ipv4.tcp_rmem = 65536 1398080 2796160
net.ipv4.tcp_wmem = 65536 1398080 2796160
net.core.optmem_max = 163840
net.core.rmem_default = 1048560
net.core.rmem_max = 2097136
net.core.wmem_default = 1048560
net.core.wmem_max = 2097136

###Hardening Linux:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.ip_default_ttl = 64
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_max_syn_backlog = 256

# -Thx Crg

Abril 14, 2005

IPTables + FTP en modo pasivo

Connection tracking and ftp

Firstly, you need to load the ip_conntrack_ftp module.

Assuming you have a single-homed box, a simple ruleset to allow an ftp connection would be:

iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

(Please note, I am assuming here you have a separate ruleset to allow any icmp RELATED
to the conection. Please see my example ruleset for this).

This is not the whole story. An ftp connection also needs a data-channel, which can be
provided in one of two ways:

1) Active ftp

The ftp client sends a port number over the ftp channel via a PORT command to the ftp
server. The ftp server then connects from port 20 to this port to send data, such as a
file, or the output from an ls command. The ftp-data connection is in the opposite sense
from the original ftp connection.

To allow active ftp without knowing the port number that has been passed we need a general
rule which allows connections from port 20 on remote ftp servers to high ports
(port numbers > 1023) on ftp clients. This is simply too general to ever be secure.

Enter the ip_conntrack_ftp module. This module is able to recognize the PORT command and
pick-out the port number. As such, the ftp-data connection can be classified as RELATED
to the original outgoing connection to port 21 so we don't need NEW as a state match for
the connection in the INPUT chain. The following rules will serve our purposes grandly:

iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT

2) Passive ftp

A PORT command is again issued, but this time it is from the server to the client. The
client connects to the server for data transfer. Since the connection is in the same
sense as the original ftp connection, passive ftp is inherently more secure than active
ftp, but note that this time we know even less about the port numbers. Now we have a
connection between almost arbitrary port numbers.

Enter the ip_conntrack_ftp module once more. Again, this module is able to recognize the
PORT command and pick-out the port number. Instead of NEW in the state match for the
OUTPUT chain, we can use RELATED. The following rules will suffice:

iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state \
ESTABLISHED,RELATED -j ACCEPT


http://www.sns.ias.edu/~jns/security/iptables/iptables_conntrack.html

Abril 26, 2005

Desactivar la carga del modulo IPV6 en Linux

Se utiliza el modprobe.conf:

echo -e "alias ipv6 off\nalias net-pf-10 off\n" >> /etc/modprobe.conf

Abril 29, 2005

TUNELES GRE ASIMETRICOS

-----[ TUNELES GRE ASIMETRICOS ]-----
http://demasie.aditel.org/docs/tuneles-gre-asimetricos.txt
http://spisa.act.uji.es/~peralta/

Autor: Luis Peralta / jaxp
Fecha: 6 Julio 2000
Ultima actualizacion: 13 Julio 2000
TODO: sustituir arp por ip neigh


Definimos tunel asimetrico como aquel en el que las dos direcciones
internas del tunel no pertenecen a una red privada, sino a la propia
Internet. Esto nos va a permitir manejar ip's de una red cualquiera
en otra.

Tenemos el siguiente esquema:


/------------------\ Internet /----------------\
|demasie.aditel.org| < - - - - - - - - - > |spisa.act.uji.es|
\------------------/ \----------------/
eth0: 194.224.81.16 eth1: 150.128.81.246

Y queremos que una de las ip's de la red de demasie (194.224.81.0)
sea una ip mas de spisa.

Montamos el tunel:

demasie-> # ip tunnel add macho mode gre local 194.224.81.16 remote
150.128.81.246
spisa-> # ip tunnel add hembra mode gre local 150.128.81.246
remote 194.224.81.16

Y le asociamos a macho y hembra dos ip's de la red de demasie:

demasie-> # ip addr add 194.224.81.23 dev macho
spisa-> # ip addr add 194.224.81.22 dev hembra

Levantamos los devices:

demasie-> # ip link set macho up
spisa-> # ip link set hembra up

Añadimos rutas:

demasie-> # ip route add 194.224.81.22 dev macho
spisa-> # ip route add 194.224.81.23 dev hembra

Tenemos que jugar con el arp en la red de demasie, ya que queremos que
el trafico a 194.224.81.22 vaya a spisa:

demasie-> # arp -s 194.224.81.22 52:54:05:F5:FC:EB (MAC de demasie) pub

Y con esto hecho tenemos el tunel montado. Todo el trafico a 194.224.81.22
ira a spisa y esta podra responder. El esquema nos queda:


/------------------\ Internet /----------------\
|demasie.aditel.org| < - - - - - - - - - > |spisa.act.uji.es|
\------------------/ \----------------/
eth0: 194.224.81.16 eth1: 150.128.81.246
macho: 194.224.81.23 hembra: 194.224.81.22

Cuando llegue un paquete para 194.224.81.22 en la red de demasie, este
enrutara el paquete a traves del tunel y spisa respondera a traves de
eth1. Que puede ser lo que no queramos en realidad, puesto que en caso
de que alguno de los routers que atravesemos tenga la opcion de evitar
el "source routing" por motivos de seguridad, el tunel fallara y solo
sera accesible desde la red original. Es lo que se llama ruta triangular:


194.224.81.22 - - - - - > demasie - - - > - - - - - > - - - > spisa-tunel
^ /
| /
\ /
\- < - - spisa-eth1 <- - /

Para evitar que pase esto tendremos que usar las facilidades de "policy routing"
del kernel:

spisa-> # ip rule add from 194.224.81.22 table 13
spisa-> # ip route add default via 194.224.81.23 table 13

Ahora hemos desmontado el triangulo y nos queda la cosa:

194.224.81.22 - - - - - > demasie - - - > - - - - > - - - - > spisa-tunel
\ - - - - - - < - - - - < - - - - - - /

luis peralta / jaxp

Mayo 16, 2005

Guia rapida de tunneling IP sobre DNS

+---------------------------------------------------------------+
| Guia rapida de tunneling IP sobre DNS Alejandro Ramos |
| 29/Mar/2005 v0.2 aramosf@unsec.net |
+---------------------------------------------------------------+


/ 1.- Introduccion /
+--------------------+

El proposito de esta guia es crear un tunel IP sobre el protocolo DNS
para conseguir salir a Internet en un entorno donde al unico servicio que
podemos acceder es un DNS que nos resuelve direcciones de Internet.

Muy practico para redes wireless en las que te permiten asociarte pero solo
te dan salida una vez te has autentificado via HTTP, previo pago. Como por
ejemplo en aeropuertos y hoteles. Estos sitios suelen tener un DNS que
resuelve dominios de Internet, requisito indispensable.

El siguiente texto va a mostar un ejemplo practico de una de estas confi-
guraciones.

El funcionamiento es sencillo, se desarrolla un servidor DNS que responde
a determinadas peticiones encapsulando en Base32 (si se realizan peticiones
mediante CNAME) o en Base 64 (si son registros TXT). El cliente sera capaz de
desencapsular la codificacion de la peticion y generar el paquete correcto.


En la actualidad existen dos aplicaciones que nos permiten realizar un
tunel atraves de DNS: nstx (http://nstx.dereference.de/nstx/) y ozymandns
(http://www.doxpara.com/). Se muestra una lista comparativa:

Ventajas de ozymandns:
* Esta escrito en perl, por lo que se puede portar a cualquier sistema
que soporte este interprete.
* Es sencillo y rapido de configurar.
Inconvenientes de ozymandns:
* Solo permite realizar un SSH o hay que realizar un tunel ssh posterior.
* El software es beta e inestable.

Ventajas de nstx:
* Permite usar cualquier tipo de servicio.
* Software antiguo y mas comprobado.
* Existen paquetes para algunas distribuciones (debian sid).
Inconvenientes de nstx:
* Tanto servidor como cliente tiene que ser linux.
* Se necesita crear un tunel con tun/tap.


Ademas de estas aplicaciones existen otras que nos permiten enviar
y recibir ficheros por DNS o usarlo para encapsular VoIP.

OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO
J J
O Ambos sistemas no usan autenticacion, alguien que conozca la O
J configuracion que se ha realizado en su sistema podria usar J
O el tunel DNS. O
J J
OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO-OJO


/ 2.- Requisitos /
+------------------+

Partimos de la premisa de que tenemos un conocimiento basico de como funciona
un servidor DNS y cuales son sus tipos de registros; A, NS, TXT...

Una configuracion tipo, en la que nuestros dispositivos van marcados entre
asteriscos podria ser la siguiente:


[*PC cliente*] ~~ wireless ~~ [ AP ]
|
[ switch ]-----[ server DNS (con acceso) ]
|
[ router ]
|
/\/\/\/\/\
[*server DNS*]-------|Internet|-----[*server tunel*]
\/\/\/\/\/

Por lo que seria necesario:
- Cliente desde el que realizar el tunel.
- Servidor DNS que podamos administrar y en el que tengamos un dominio.
- Servidor tunel, donde correra la aplicacion servidor.
- Acceso como cliente a un servidor DNS


En el ejemplo que se usara a lo largo del texto se usaran los siguientes
datos:
- Server DNS (con acceso): 10.1.2.2, sera el DNS al que tengamos acceso
como cliente y que ha de ser capaz de resolver nuestro dominio.
- Server tunel: este sistema es nuestro y en el instalaremos la parte
que sirve peticiones, es necesario que un DNS pueda preguntarle y para ello
necesita el 53/udp abierto a Internet.
- Server DNS: es indistinta la IP.


/ 3.- Configuracion DNS /
+-------------------------+

Si se tiene claro el concepto de recursividad en DNS y como funciona
no tendria por que encontrar ninguna dificultad a la hora de configurar
el dominio para poder realizar el tunel.

En el ejemplo se va a utilizar el dominio 'digitalsec.net' como referencia.

Editamos el fichero de zona de digitalsec.net, en este caso (fedora core 3
con named enjaulado): /var/named/chroot/var/named/db.digitalsec.net, y se
a?aden los siguientes registros:

t.digitalsec.net. IN NS tun.digitalsec.net.
tun IN A 65.73.147.191

Con estos dos registros lo que se esta haciendo es enviar al sistema
tun.digitalsec.net (65.73.147.191) todas las peticiones que cuelgen de
t.digitalsec.net. Es decir, si alguien pregunta por 'foo.t.digitalsec.net' el
servidor DNS que esta escuchando en t.digitalsec.net (65.73.147.191) sera el
encargado de resolver esas peticiones.

En 65.73.147.191 es donde ha estar el servidor de tunel DNS.

Esta configuracion es comun para nstx y ozymandns. Las pruebas que se han
realizado han sido con bind y todo ha funcionado correctamente, por lo que he
visto en el paquete de debian, con djbdns hace falta parchear para el caso de
nstx. Asi que si no se desean complicaciones adicionales, lo mas sencillo es
usar bind.

/ 4.- Configuracion ozymandns /
+--------------------------------+

Se obtiene el software de su url oficial: http://www.doxpara.com/, en la
actualidad la ultima version es: http://www.doxpara.com/ozymandns_src_0.1.tgz.
Para que ozymandns funcione son necesarios una serie de modulos CPAN,
se puede encontrar informacion detallada de como instalarlos en la direccion:
http://www.cpan.org/modules/INSTALL.html. Muchas distribuciones tienen
algunos de estos modulos como paquetes, por lo que no seria necesario insta-
larlos manualmente y compilarlos.

Los scripts necesarios para hacer funcionar el tunel son: nomde.pl (servidor)
y droute.pl (cliente), las demas aplicaciones incluidas en el tarball son para
otros propositos.

Una vez que se haya terminado de instalar todo lo necesario al ejecutar
los scripts en perl, no ha de existir ningun problema y ha de mostrar la ayuda:

# perl nomde.pl
nomde 0.1: Experimental DNS Server
Component of: OzymanDNS Dan Kaminsky(dan@doxpara.com)
Usage: nomde -l 10.0.1.11 servername.foo.com
Options: -i [ip address]: IP address to host for all A requests
-f [filename] : Filename to host in TXT records [b64]
-p [name] : Name/IP to return for reverse lookups[ptr]
-L [name:host:port]: Forward function to address, port
(Default: sshdns:127.0.0.1:22)


Hay que tener en cuenta que esta aplicacion es una beta y tiene algunos
fallos; la ayuda no se corresponde con las opciones reales y en el caso
concreto del "nomde.pl", el parametro -L no funciona como se espera. Este punto
se vera mas adelante cuando se configure el servidor.

- PARTE SERVIDOR - :

Este es el servicio que se ejecutara en el servidor del tunel, exactamente
en la direccion tun.digitalsec.net (65.73.147.191).

El siguiente comando dejaria lista esta parte:

# ./nomde.pl -i 127.0.0.1 t.digitalsec.net
creating TCP socket...done.
creating UDP socket...done.
waiting for connections...

Esto, por defecto permite hacer un ssh a 127.0.0.1 (es decir, al servidor que
realiza el tunel o tun.digitalsec.net) al puerto 22, esto es teoricamente
modificable con la opcion "-L", pero por un bug no funciona y si se desea que
el SSH se haga contra otra IP y puerto, habra que modificarlo en el codigo
fuente:

Con cambiar la linea 32 de nomde.pl:
"Localforward"=> \$opts{forward}
por la siguiente:
"Localforward=s"=> \$opts{forward}

Tendremos solucionado el problema.

Este comando nos permitira hacer un SSH al puerto 2222 de 82.165.25.126

# ./nomde.pl -i 127.0.0.1 -L sshdns:82.165.25.126:2222 t.digitalsec.net
creating TCP socket...done.
creating UDP socket...done.
waiting for connections...

Por otro fallo el script se "cae" de vez en cuando, para que se vuelva a
ejecutar cada vez que falle, se puede utilizar alguna solucion temporal como
la siguiente:

# while true; do ./nomde.pl -i 127.0.0.1 t.digitalsec.net; done


- PARTE CLIENTE - :

Seguiremos los mismos pasos que en el servidor para instalar los modulos
CPAN necesarios para que la ejecucion del script "droute.pl" no de ningun
problema.

# ssh -p2222 -o ProxyCommand="droute.pl sshdns.t.digitalsec.net" \
aramosf@82.165.25.126

Con esto se realizara un SSH al sistema que se le especifico anteriormente en
el servidor con la opcion -L. Notese que se ha a?adido "sshdns" delante de
t.digitalsec.net. Otra apreciacion es que el usuario y direccion IP solo seran
utilizados a la hora de comprobar si existe llave privada o si el sistema remoto
es un "know host". Si se desea cambiar la direccion destino del SSH ha de ser
en el servidor de tunel (nomde.pl) con la opcion -L.


El script droute.pl si se desea ejecutar en windows, se puede hacer mediante
el perl y el ssh de cygwin, usando los modulos de CPAN. Aunque es posible que
funcionei tambien bajo el perl de ActiveState y con otro cliente de SSH que
soporte la opcion una opcion como "ProxyCommand" del cliente openssh.

/ 5.- Configuracion nstx /
+--------------------------+

Para que nstx funcione es requisito tener compilado el kernel de los
sistemas linux con soporte para ethertap/tun. Tanto cliente como servidor.

Device Drivers --->
Networking support --->
Universal TUN/TAP device driver support


Hay veces que es necesario crear el dispositivo a mano:

# mkdir /dev/net
# mknod /dev/net/tun c 10 200


NOTA: La configuracion de tun0 tanto en servidor como en cliente se realiza
DESPUES de arrancar las aplicaciones.


- PARTE SERVIDOR - :

Se instalara como en el caso de ozymandns en tun.digitalsec.net
(65.73.147.191). Descargar el software desde: http://nstx.dereference.de/nstx/.
La ultima version en la actualidad es: nstx-1.1-beta6.tgz

Como ya se explico anteriormente, es posible que existe un paquete
con los binarios necesarios. En el caso de debian sid, el paquete se llama
"nstx", y con instalarlo con el comando "apt-get install nstx" seria suficiente,
solo habria que proceder a configurarlo en el fichero: /etc/default/nstx.

Una vez descomprimido y compilado:

# tar -zxvf nstx-1.1-beta6.tgz
# cd nstx-1.1-beta6
# make

Se tendran los binarios necesarios para la ejecucion en la parte del servidor,
que sera ejecutado con la opcion para que cambie el UID del usuario a nobody y
deje el servicio en background:

# ./nstxd -u nobody -D t.digitalsec.net
Opening tun/tap-device... using device tun0
Please configure this device appropriately (IP, routes, etc.)
Opening nameserver-socket... listening on 53/UDP

Cargar el modulo de TUN:

# modprobe -a tun

Por ultimo, se configura el interfaz con una IP interna (la que se desee):

# ifconfig tun0 172.26.0.2 netmask 255.255.255.0


- PARTE CLIENTE - :

Realizar el mismo proceso de descarga y compilacion del tarball nstx para
la parte del cliente.

Cargar el modulo de TUN:

# modprobe -a tun

Lanzar el cliente apuntando a t.digitalsec.net y al DNS al que tengamos
acceso como cliente en el ejemplo, 10.1.2.2:

# ./nxstcd t.digitalsec.net 10.1.2.2

Finalmente, configurar el dispositivo tun0 con un interfaz en la misma red
que el servidor:

# ifconfig tun0 172.26.0.1 netmask 255.255.255.0

Con esto ya deberia de existir conectividad con nuestro cliente y la ip del
servidor remoto: 172.26.0.2


/ 6.- Contramedidas /
+--------------------+
Una de las posibles opciones para evitar peticiones CNAME es usando iptables
en el router/firewall con una regla similar a esta:

# iptables -t filter -A INPUT -p udp --dport 53 \
-m string --string "CNAME" -j DROP

Para utilizar "string" en iptables, es necesario aplicar el corresponidente
parche de "patch-o-matic". El problema de utilizar este metodo es la bajada de
rendimientto del sistema, y el gran numero de paquetes que se descartan que son
falsos positivos, ademas, implementar el mismo filtro para TXT resultaria una red
con excesivos paquetes eliminados.

Una alternativa es utilizar un servidor de DNS que no acepte peticiones de la
clase TXT ni CNAME, o que compruebe el tamanyo de la respuestas para localizar
posibles peticiones empaquetadas.

El siguiente ejemplo muestra un script bastante simple en perl que realiza
esta funcion.

--------------------------------------------------------------------------------

#!/usr/bin/perl
# Mon May 16 00:00:44 CEST 2005
# Last version at: http://www.unsec.net
#
# proxy-dns, check lengh of respones and deny TXT records
#
# BUGS: All Net::DNS bugs -> SLOW!
#

use Net::DNS::Nameserver;
use Net::DNS::Resolver;
use Net::DNS;
use Getopt::Long;
use POSIX qw(strftime);
use strict;

my ($daemon, $log, $verbose, $ns, $help, $length);


my $length = 100;
my $log = "/dev/stdout";
GetOptions(
"daemon" => \$daemon,
"log=s" => \$log,
"ns=s" => \$ns,
"length=s" => \$length,
"verbose" => \$verbose,
"help" => \$help);


if(defined($help)) {
print STDERR <<"EOD";
Syntax: $0 [--daemon] [--log ] [--verbose] [--ns ] [--help]
Options:
--daemon : run script as daemon
--log : log all querys to (default: STDOUT)
--ns : use instead /etc/resolv.conf
--length : use of maximum length of reply (default: 100)
--verbose : verbose output
--help : this help
EOD
exit 1;
}

if (defined($daemon)) {
defined(my $pid = fork) or die "Error: $!";
exit if $pid;
}


open LOG, ">>$log";
print LOG scalar(localtime) . " [$0] Starting service\n";
sub reply_handler {
my ($qname, $qclass, $qtype, $peerhost) = @_;
my ($rcode, @ans, @auth, @add, $ret, $r1, $r2);
my $res = Net::DNS::Resolver->new;
$res->nameservers("$ns") if defined $ns;
my $query = $res->query($qname, $qtype);
if ($query) {
foreach my $rr ($query->answer) {
next unless $rr->type eq "$qtype";
$ret = $rr->address if $qtype eq "A";
$ret = $rr->ptrdname if $qtype eq "PTR";
$ret = $rr->nsdname if $qtype eq "NS";
if ($qtype eq "MX") {
$ret = $rr->preference . " " . $rr->exchange;
}

if (($qtype ne "TXT") || length($ret) gt $length) {
my ($ttl, $rdata) = (3600, "$ret");
push @ans, Net::DNS::RR->new("$qname $ttl $qclass $qtype $rdata");
print LOG scalar(localtime) . " [$0] $qname -> $qclass $qtype " .
"from: $peerhost reply: $rdata\n";
$rcode = "NOERROR";
} else {
print LOG scalar(localtime) . " [$0] $qname -> $qclass $qtype " .
"from: $peerhost reply: REFUSED(".length($ret).")\n";
$rcode = "REFUSED";
}
}
} else {
print LOG scalar(localtime) . " [$0] $qname -> $qclass $qtype " .
"from: $peerhost reply: NO ANSWER\n";
$rcode = "NOTAUTH";
}
return ($rcode, \@ans, \@auth, \@add, { aa => 1 });
}

my $ns = Net::DNS::Nameserver->new(
LocalPort => 53,
ReplyHandler => \&reply_handler,
Verbose => $verbose,
) || die "couldn't create nameserver\n";

$ns->main_loop;

close LOG;
--------------------------------------------------------------------------------


/ 7.- Referencias /
+------------------+

http://www.doxpara.com/Black_Ops_DNS_BH.ppt
http://www.aripollak.com/wiki/Main/SSHOverDNS
http://slashdot.org/articles/00/09/10/2230242.shtml

/ 8.- Control de cambios /
+-------------------------+


lun may 16 00:53:54 CEST 2005
+ Añadido punto de contramedidas.
+ Version en ingles.
+ Añadido control de cambios.

Junio 9, 2005

ARP estatico en el inicio del sistema

En el rc.local:

arp -s $(route -n | awk '/^0.0.0.0/ {print $2}') \
$(arp -n | grep `route -n | awk '/^0.0.0.0/ {print $2}'`| awk '{print $3}')

Asi, si cambian el eth de mi default gw, no pierdo conectividad.

Mayo 30, 2006

Utilidades de proxy para tcp/udp.

Leido en pen-test:

http://tripp.dynalias.org/


http://www.imperva.com/application_defense_center/tools.asp


http://www.int0x21.com/


http://jacquelin.potier.free.fr/networkstuff/

Octubre 15, 2006

Urls de reverse whois y otros..

Nota mental: no olvidar estos links

http://www.netcraft.com
http://webhosting.info
http://www.domainsdb.net/
http://www.searchmee.com/web-info/ip-hunt.php
http://www.domaintools.com/reverse-ip/
http://www.archive.org
http://search.msn.com <-- Buscar por IP:x.x.x.x

Actualizado: Sun Oct 15 23:59:01 CEST 2006
http://www.seologs.com/ip-domains.html (thx aklis)
Actualizado: Sun Thu Mar 15 12:03:33 CET 2007
http://www.tomdns.net/index.php

Nota mental 2: usar algun dia la feature de bookmarks del browser

Noviembre 19, 2007

Escaneo de puertos con hping/scapy

Voy a postear un resumen de mi conversación (o casi entrevista, por el nivel de mis preguntas) con Pci, sobre un problemilla que tenia yo de esos de ninja-tcp/ip con un puerto abierto tras un firewall.

El caso es que hay un puerto 443 abierto al que si le lanzo un hping con el flag de syn activado no me devuelve el syn-ack, en cambio si se usa scapy o un simple telnet responde correctamente.

He tratado de copiar los parametros que lanza scapy con el hping, para reproducir el problema:

hping2 -S -s 20 -p 443 192.168.1.2 -c 1 -w 8192 -M 0

HPING 192.168.1.2 (eth1 192.168.1.2): S set, 40 headers + 0 data bytes

--- 192.168.1.2 hping statistic ---
1 packets tramitted, 0 packets received, 100% packet loss


Pero el puerto sigue dandome como cerrado (sin respuesta syn/ack).
En cambio con scapy:

# scapy
NFO: did not find python gnuplot wrapper . Won't be able to plot
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump()
Welcome to Scapy (v1.1.1 / f88d99910220)
>>> p=IP(dst="192.168.1.2")/TCP(dport=443, flags="S")
>>> sr(p)
Begin emission:
........Finished to send 1 packets.
..........*
Received 19 packets, got 1 answers, remaining 0 packets
(, )
>>> sr(p)
Begin emission:
.Finished to send 1 packets.
....*
Received 1 packets, got 1 answers, remaining 0 packets
(, )


Tras lanzar varios paquetes y hacer varias pruebas, no conseguí detectar el problema, ya que yo con mi packetyzer/wireshark veia los paquetes iguales.

Le pasé la captura a pablo y viendo el paquete en hexadecimal notó que en el SYN del hping, el flag del ACK venia con basura y por eso, el firewall lo rechazaba al no cumplir con el RFC.

# tcpdump -S -nn -vv -S -r test.pcap
reading from file test.pcap, link-type EN10MB (Ethernet)
13:29:07.860840 IP (tos 0x0, ttl 64, id 52124, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0x8702 (correct), 0:0(0) win 8192
13:29:13.161027 IP (tos 0x0, ttl 64, id 36260, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0xa474 (correct), 0:0(0) win 8192
13:29:16.469161 IP (tos 0x0, ttl 64, id 45487, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0x23e0 (correct), 0:0(0) win 8192
13:29:30.178422 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0x1483 (correct), 0:0(0) win 8192
13:29:30.225455 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto: TCP (6), length: 44) 192.168.1.2.443 > 91.121.84.156.20: S, cksum 0x8176 (correct), 1896551268:1896551268(0) ack 1 win 5840
13:29:30.225484 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: R, cksum 0x3480 (correct), 1:1(0) win 0
13:29:36.065275 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0x1483 (correct), 0:0(0) win 8192
13:29:36.111614 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto: TCP (6), length: 44) 192.168.1.2.443 > 91.121.84.156.20: S, cksum 0xb201 (correct), 1902436991:1902436991(0) ack 1 win 5840
13:29:36.111636 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: R, cksum 0x3480 (correct), 1:1(0) win 0
13:29:40.329581 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: S, cksum 0x1483 (correct), 0:0(0) win 8192
13:29:40.376197 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto: TCP (6), length: 44) 192.168.1.2.443 > 91.121.84.156.20: S, cksum 0xa04f (correct), 1906701296:1906701296(0) ack 1 win 5840
13:29:40.376226 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: TCP (6), length: 40) 91.121.84.156.20 > 192.168.1.2.443: R, cksum 0x3480 (correct), 1:1(0) win 0
13:29:45.807752 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 91.121.84.156 > 192.168.1.2: ICMP echo request, id 59697, seq 1, length 64
13:29:45.848978 IP (tos 0x0, ttl 54, id 56093, offset 0, flags [none], proto: ICMP (1), length: 84)

En esta captura se pueden ver: 3 paquetes syn lanzados con hping, 3 lanzados con scapy y los syn-ack y rst que devuelve el puerto abierto y unos pings lanzados para no tener problemas con el buffer de tcpdump.

La siguiente es la captura en hex del hping

13:29:16.469161 IP (tos 0x0, ttl 64, id 45487, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156
.20 > 192.168.1.2.443: S, cksum 0x23e0 (correct), 0:0(0) win 8192
0x0000: 4500 0028 b1af 0000 4006 4f90 5b79 549c E..(....@.O.[yT.
0x0010: aaaa aaaa 0014 01bb 0000 0000 5f0c 9196 ............_...
0x0020: 5002 2000 23e0 0000 P...#...
13:29:30.178422 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20


Y está es la captura del paquete de scapy:

13:29:30.178422 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: TCP (6), length: 40) 91.121.84.156.20
> 192.168.1.2.443: S, cksum 0x1483 (correct), 0:0(0) win 8192
0x0000: 4500 0028 0001 0000 4006 013f 5b79 549c E..(....@..?[yT.
0x0010: aaaa aaaa 0014 01bb 0000 0000 0000 0000 ................
0x0020: 5002 2000 1483 0000 P.......

Como se pude ver, hping rellena el flag no-ACK con: 5f0c 9196, no valido según el RFC causando que el firewall deniege el paquete y el puerto aparezca como cerrado.

La razón es esta linea en el código fuente (de sendtcp.c:59):
tcp->th_ack = (set_ack) ? htonl(tcp_ack) : htonl(rand());

Por alguna razon misteriosa, se decide rellenar mediante rand() ....

Para solucionar el problema, se puede lanzar ping con la siguiente sintaxis:
hping2 -S -s 20 -p 443 192.168.1.2 -c 1 -w 8192 -M 0 -L 0

Y el problema quedaría resuelto.

Febrero 9, 2008

netstat -tanp en Windows

Para conocer que procesos abren que puertos, tal y como hace linux con el parametro -p en netstat, en Windows hay que usar dos comandos

C:\> netstat -ano

Con el que se conocen el número PID asociado al puerto abierto (en estado LISTENING), y tasklist, para encontrar la relación nombre con PID

c:\> tasklist | find "PID"

En Windows XP (SP2) se puede utilizar el parametro -b de netstat directamente

Agosto 15, 2008

Aleron al Nmap

De la charla de fyodor en la defcon:

(notese que solo mira el puerto 80)

nmap -T4 --max_rtt_timeout 200 --initial_rtt_timeout 150 --min_hostgroup 512 --max_retries 0 -n
-P0 -p80 -oA Log X.X.X.X/X

About network

This page contains an archive of all entries posted to Alejandro Ramos :: personal webpage in the network category. They are listed from oldest to newest.

aplicaciones is the previous category.

otros is the next category.

Many more can be found on the main index page or by looking through the archives.

rss
unsec dot net