Professional Documents
Culture Documents
Ver. 1.0.0
Introducción
Todos los días, en todo el mundo, las redes de ordenadores y hosts son violados. El nivel
de sofisticación de estos ataques varia ampliamente; mientras hay una creencia
generalizada que la mayoría de estas intrusiones tienen éxito debido a la debilidad de los
passwords, hay todavía un gran numero de intrusiones que hacen uso de técnicas más
avanzadas para entrar. Poco es sabido acerca de este ultimo tipo de intrusiones, debido
principalmente a su naturaleza y a su dificultad de ser detectadas.
ERT. SRI. The Nic. NCSC. RSA. NASA. MIT. Uunet. Berkeley.Purdue. Sun.
Cualquier sistema en Internet (y muchos que no lo están) son susceptibles de ser violados
fácilmente. Son estos objetivos inusuales? Que ocurrió?
Joven, con pelo rubio y grasiento, sentado en una habitación oscura. La habitación esta
iluminada solamente por la luz de la pantalla de 40 caracteres de un C64. Tomando otra
larga calada de su Benson & Hedges, su cansado sistema cracker “Telnetea” a otro site
“.mil” anónimo de su lista de víctimas. No importa. Tiene toda la noche….lo tacha de su
lista, y cansinamente teclea la siguiente víctima potencial….
Esta parece ser la imagen habitual de un cracker de sistemas. Joven, sin experiencia, y
con un montón de tiempo que perder, tan solo para entrar en otro sistema. Sin embargo,
hay un tipo de cracker mucho mas peligroso rondando por ahí. Uno que sabe todo lo
ultimo acerca de seguridad de sistemas y herramientas cracking, que puede modificarlas
para llevar a cabo ataques específicos, y que puede curarse sus propios programas. Uno
que no solo se dedica a leer sobre los últimos agujeros de seguridad, sino que también
descubre bugs y puntos débiles. Una “criatura mortal” que puede tanto golpear
“envenenadamente” , como ocultar su rastro sin un solo susurro o pista. El cybercracker
esta aquí..
Las victimas no son arbitrariamente escogidas – hay un propósito, tanto como si es por
conseguir fines monetarios, un ataque “golpea y corre” para robar información, o un
desafió para golpear un prestigioso-gran site o red personalmente. Un cybercracker es
difícil de detectar, mas aun de parar, y aun mas si cabe de mantenerlo alejado de tu site
por tu bien.
Overview
En un esfuerzo por verter algo de luz sobre como ocurren estas intrusiones cada vez mas
avanzadas, este texto reseña varios mecanismos usados actualmente por los crackers para
obtener acceso a los sistemas y, adicionalmente, algunas técnicas que sospechamos están
usando, o hemos usado nosotros mismos en tests o ambientes autorizados / amigables.
Nuestra motivación a la hora de escribir este texto ha sido el hecho de que los
administradores de sistemas no son muy a menudo conscientes del peligro existente por
cualquier cosa mas allá de los ataques más triviales.
Mientras por todos es sabido que el nivel de protección apropiado depende de que es lo
que debe ser protegido, muchos sites parecen estar faltos de los recursos para valorar que
nivel de protección es adecuada.
Dando a conocer lo que los intrusos pueden hacer para ganar acceso a un sistema remoto,
intentamos ayudar a los administradores de sistemas a tomar decisiones sobre como
proteger su site – o como no hacerlo. Limitaremos la discusión a técnicas que pueden
posibilitar el acceso a intrusos a shells en un host corriendo UNIX. Una vez hecho esto, los
detalles acerca de como conseguir privilegios root están mas allá del ámbito de este texto,
consideramos que son o dependen del site y, en muchos casos, muy triviales para merecer
discutirse.
El propósito de este texto es el de tratar de que el alumno vea su sistema de una forma
nueva / diferente – una forma que posiblemente le permita tener la oportunidad de
entender como su propio sistema puede estar comprometido, y como.
También queremos reiterar que el propósito de este texto es el de enseñar al lector como
testear la seguridad de su propio site, y no como irrumpir en sistemas ajenos. Las técnicas
de intrusión ilustradas aquí dejaran muy a menudo huellas en los logs de tu sistema –
seria constructivo examinarlos después de intentar alguno de estos ataques, para ver
como seria un ataque verdadero. Ciertamente otros sites y administradores de sistemas
tomaran una visión fugaz de tus actividades si es que decides usar sus hosts para hacer
tests de seguridad sin autorización avanzada; de hecho, es posible que se tomen medidas
legales contra tu persona si lo perciben como un ataque.
2 Conceptos de Seguridad
El problema es que todo el mundo necesita acceso al fichero de contraseñas, cada vez que
se hace un ls, se verifica el fichero de contraseñas, de modo que ¿cómo se consigue
almacenar todas las contraseñas con seguridad y a la vez mantenerlas legibles por el
mundo? Durante muchos años, la solución ha sido bastante simple y efectiva,
simplemente, haz un hash de las contraseñas y guarda el hash, cuando un usuario
necesite autentificar, toma la contraseña que introduce, pásala por el hash y si coincide,
evidentemente se trataba de la misma contraseña.
Parece lo suficientemente simple, pero hasta hace bien poco, implementar el shadow era
una ardua tarea. Había que recompilar todos los programas que verificasen la contraseña
(login, ftpd, etc, etc) y esto, por supuesto, implica una considerable cantidad de esfuerzo.
Es aquí donde brilla Red Hat, con su confianza en PAM.
NOTA:
Los distintos unix trabajan con distintos ficheros, donde la forma de encriptación
en cada uno de ellos, por supuesto es distinta.
AIX:
/etc/passwd
/etc/security/passwd
Solaris
/etc/passwd
/etc/shadow
/etc/passwd
/etc/shadow
FreeBsd, OpenBsd
/etc/passwd
/etc/master.passwd
Para implementar contraseñas con shadow hay que realizar dos cosas. La primera es
relativamente simple, cambiar el fichero de contraseñas, pero la segunda puede ser un
calvario. Hay que asegurarse que todos tus programas tienen soporte para contraseñas
con shadow, lo cual puede ser bastante penoso en algunos casos (esta es una más que
importante razón por la cual un mayor número de distribuciones deberían venir con PAM).
La mayoría del resto de distribuciones también tienen soporte para contraseñas con
shadow, y la dificultad de implementación varía de un modo u otro. Ahora, para que un
atacante mire las contraseñas con hash, tiene que esforzarse un poco más que
simplemente copiar el fichero /etc/passwd. También asegúrate de ejecutar cada cierto
tiempo pwconv, para tener la certeza de que todas las contraseñas efectivamente tienen
shadow. Hay veces que las contraseñas se quedan en /etc/passwd en lugar de enviarse a
/etc/shadow como deberían, lo cual hacen algunas utilidades que editan el fichero de
contraseñas.
Crack
Saltine cracker
Espero que esto sea suficiente motivo para utilizar contraseñas con shadow y un hash más
robusto como el MD5 (el cual soporta Red Hat 6.0, en adelante).
Aquí dejamos una comparativa de estos crackeadores, en la misma máquina y con los
mismos ficheros de passwords y de palabras. Algunos de ellos tardaban demasiado, y
aborté el proceso de petar passwords. En estos casos, calculé el tiempo estimado que
tardarían en acabar en función del tiempo que llevaban (1 hora) y las palabras que habían
provado hasta el momento. Estos son los resultados, ordenados por velocidad:
Comparaciones
Cracker Tiempo Observaciones
por Segundo
John the ripper 1.4 6'15'' 26667c/s .
John the ripper 1.31 6'30'' 25641c/s .
John the ripper 1.0 8'05'' 20619c/s .
Star Crack 0.64ß 9'15'' 18018c/s .
Star Crack 0.51ß 11'25'' 14599c/s .
Cracker Jack 1.4 13'33'' 12300c/s .
Cracker Jack 1.3 386 14'55'' 11173c/s .
Cracker Jack 1.3 8086 22'22'' 7452c/s .
Hades 1.00a 47'05'' 3540c/s .
Brute 2.00 (est)59'54'' 2782c/s .
Sólo soporta ficheros de
PCUPC 2.01 (est)135'37'' 1229c/s passwords
de menos de 500 linias.
Sólo soporta ficheros de
Guess 2.1 (est)141'58'' 1174c/s passwords de menos
de 1000 linias.
Sólo soporta ficheros de
Killer Cracker 9.5 (est)151'12'' 1105c/s passwords
de menos de 1000 linias.
Xit 2.0 (est)195'37'' 852c/s .
Hellfire Cracker 1.3 infinito 0c/s Se colgó y no pudo ser provado.
Este test fue realizado en un Pentium 133, con 16 Mb de RAM, con los datos en el disco
duro, con una cache de lectura de 2 Mb y sin hacer ningún preprocesado en el fichero de
passwords ni en el de palabras. El fichero de palabras contenia 10000 palabras y el de
passwords 1000 passwords. Tenian que encontrar 554 passwords.
Algunos de ellos no los dejé acabar ya que tardaban demasiado y estimé el tiempo en
función de lo que habían crackeado hasta el momento de pararlos, por lo tanto no sé si
hubieran encontrado todos los passwords. Sólo los he incluido en la comparativa por si
alguno de vosotros los usa, para que vea que hay cosas mejores.
Como se puede ver, el John the ripper encripta casi el doble de passwords por segundo
que el Cracker Jack. He de reconocer que el fichero con el que hize la prueba parece ser
especialmente adecuado para el John the ripper, ya que 20000c/s no se consiguen
habitualmente. De todas formas, la comparativa es significativa de la velocidad a la que se
petan passwords con cada uno de los programas.
3 Ataques
El spoof tradicional es cuando los 'atacantes' falsean el origen de los paquetes haciendo
que la victima piense que estos son de un host de confianza o autorizado para saltar un
firewall o que la victimas no nos detecten.
/etc/host.allow
supongamos que es una red local y yo 192.168.0.1 soy el Server y nada mas quiero que
ellos usen mis servicios
AllowHosts
caos.qqmelo.com.ar,192.168.0.2
kuazar.qqmelo.com.ar,192.168.0.3
bach.qqmelo.com.ar,192.168.0.4
giba.qqmelo.com.ar,192.168.0.5
hellraiser.qqmelo.com.ar,192.168.0.6
/etc/host.deny
DenyHosts
gerente.qqmelo.com.ar, 192.168.0.7
cinic.qqmelo.com.ar, 192.168.0.8
sperman.qqmelo.com.ar, 192.168.0.9
$telnet 192.168.0.4 23
wingate>192.168.0.1 21...conected
200 Qqmelo Server (wu-ftp 6.9) on host powertech.qqmelo.com.ar
ftp>user ftp
331 Anonymous access allowed, send identity (e-mail name) as password pass
email@email.com
230 Anonymous user logged in.
0-----0
Tenemos un Webserver y tenemos al CLASICO atacante, vamos a dar el servicio rhosts que
es un buen ejemplo porque rhosts hace una conexión de confianza entre dos maquinas
porque tiene 'autentificación remota 'rlogin,rsh,rcp y rcmp porque los usuarios que tienen
acceso a estos servicios son confiados y están autorizados a entrar a: sistema local sin
passwd
node1.qqmelo.com.ar caos
node2.qqmelo.com.ar kuazar
node3.qqmelo.com.ar giba
node4.qqmelo.com.ar bach
node5.qqmelo.com.ar qrmelo
Cuando el circuito virtual esta establecido, los dos hosts tienen que tener iguales maneras
de verificación que los datos sean transferidos limpiamente.
Por esto TCP usa en (ingles) sequence numbers. TCP le asigna a cada paquete un numero
como index identificatorio. Los dos hosts usan este numero para chequear errores y
reportarlos. Es mas, este proceso de pasar los números secuenciales cuando el circuito ya
esta establecido.
La secuencia es usada para aceptar los datos que llegan. Al principio de la conexión, el
cliente que manda los paquetes TCP con un numero en secuencia inicial, pero no certificada
(no puede haber una ahora). Si la aplicación del Server esta corriendo del otro lado de la
conexión, el Server
manda de vuelta el paquete con su propia inicial de numero secuencial desde el paquete del
cliente más uno. Cuando el sistema cliente recibe este paquete, lo debe mandar de vuelta
con su propia
confirmación: el numero inicial del Server mas uno.
http://esperosun.chungnam.ac.kr/-jmkim/hacking/1997/11/mendax_linux.tgz
gunzip mendax_linux.tgz
tar -xvf mandax_linux.tar
make
./mendax
estas son las opciones
-p Port
-s Port
-l Username
-r Username
-c command
-w Port
-d
-t
-L TERM
-S PORT
spoofing rshd
ARP Spoofing es la variación de IP Spoofing porque explota una debilidad del protocolo
TCP/IP.
ARP "autentificación" es también basado en la "Source Adress" dirección de donde
provienen los paquetes, lo que lo diferencia a ARP es que se fija en una dirección en el
Hardware.
El Guardes: son valores únicos, que están "quemados" en tu tarjeta de red por el
fabricante, que identifica tu dirección física. Estas consisten en 48-bits (12 caracteres).
HWaddr 00:00:E8:57:82:6B
ARP significa en ingles "Address Resolution Protocol". ARP resuelve la IP a una dirección
física. Cuando un host quiere una sesión, manda para afuera un ARP broadcast llevando la
IP de su objetivo deseado. Sin embargo, por conveniencia, nuestro sistema crea lo que se
podría llamar
"ARP cache" así la maquinas se pueden conectar a Host conocidos mas rápidamente sin
hacer un broadcast. Es con este cache que los atacantes pueden utilizarlo para spooferase
ya que lo que guarda es la hardware address.
DNS spoofing es cuando el atacante compromete al Domanin Name Server (DNS) y altera
la tabla con los Hostnames y IP. Estos cambios son escritos adentro de la base de datos de
traduccion del
DNS Server. Cuando el cliente hace un nslookup a un host el DNS le da la IP y también el
revez, esta dirección queda en la manos del atacante.
Normalmente ejemplo:
Non-authoritative answer:
Name: www.qqmelo.com.ar
Address: 63.65.251.8
Non-authoritative answer:
Name: ar.yahoo.com
Addresses: 200.49.66.82, 200.49.66.83
Aliases: www.yahoo.com.ar, ar.rc.yahoo.com
Pero supongamos que el atacante ingresa al DNS de impsat y con un programa que
automatice la tarea de cambiar. Si alguien busca www.yahoo.com el DNS le pone el IP de
qqmelo.com.ar, redirecionandolo.
Con este programa, también si estas en LAN podes poner en función el snifer sin ingresar
al DNS ya que trabaja igual que un snifer normal pone la tarjeta de red en modo
promiscuo e intercepta el paquete del Query y lo cambia haciendo lo que comente antes.
"hackeado" ejemplo:
Non-authoritative answer:
Name: ar.yahoo.com
Addresses: 63.65.251.8 <-------IP de qqmelo
Aliases: www.yahoo.com.ar, ar.rc.yahoo.com
Y entonces todos aquellos que usen el DNS de impsat y quiera ir a yahoo verán la pagina
de qqmelo.
En el paquete de programas que le comente de ADM hay un sniffer que ante CUALQUIER
request o query, o como lo llamen lo mandara a qqmelo, o a la dirección que elijamos.
-=Jizz=-
author: unknown
OS: *NIX ,MS-DOS
-=ERECT=-
-=Snoof=-
author:DOC_Chaos [RoC]
OS:*NIX
http://www.anticode.com
IPchains
IPfwadm
IP filter
• Activar él modulo del kernel rp_filter, en muchas distros lo activan por default por
ejemplo Debian, lo que tienen que hacer es poner en /etc/rc.d/rc.local la siguiente
línea:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
X Windows
Servicios R, (rlogin, rsh. rexec)
Servicios RCP
TCP Wrappers
Cualquier servicio que use IP para autentificar
OpenSSH
OpenSSL
SSH
SSH2
FtpSSL
Ya les explique como es esta ataque acá vemos como protegernos del mismo. Hay muchas
maneras de defenderse de esto, la mejor manera es grabar nuestra HWaddr en piedra,
pero seria algo incomodo.
Los ataques de ARP spoofing son muy limitados en muchas maneras. Una de la maneras
es que las nuevas tarjetas de red le hacen un update al cache mas o menos cada 5
minutos haciendo que el ataque no sea de gran riesgo a una red.
"ARP": Una Herramienta para manipular tablas de ruteo. ARP, te permite interactuar y
manipular el cache de arp, acá voy a explicar como usar esta herramienta:
Opción Función
-a [hostname]
Especifica la HWaddr al Host seleccionado.
[address_type]
Para las distintas tipo de entrada por Ej.:
-t [type]
ether, ax25, arcnet, and pronet (token ring)
Si igual quieren estar seguros que no les hagan este ataque instalen en su sistema
"ARPwatch" que observa los cambios de IP/Ethernet, se detectan cambios o nuevas
direcciones este programa le envía un mail al root.
DNS spoofing en muy fácil detectar. Si sospechas de tu DNS, hace nslookup desde varias
maquinas de tu red fijarse en los procesos , en la tabla cron para ver si están corriendo un
programa "desconocido" o si lo inicia y fijarse si su tarjeta de red esta en modo promiscuo,
Salvo si tu DNS haya sido comprometido por algún tiempo va a ser rápidamente
descubierta ya que si esto es hecho en un ISP los usuario se quejaran.
Pero revisando las maquinas capas no puede ser suficiente, por eso recomiendo que
utilicen este fabuloso programa, este se llama DOC (Domain Obsenity Control) que viene
con mucha documentación.
http://coast.cs.purdue.edu/pub/tools/unix/doc.2.0.tar.gz
Otro tipo de ataque a programas privilegiados son los llamados ”link attacks”.
Por el trabajo inseguro que estos programas realizan en directorios públicos, sería posible
pasar datos a ficheros muy distintos de lo pensado, consiguiendo con ello información
restringida sobre el sistema.
Para reducir la cantidad de ficheros tipo suid y sgid, Linux ofrece a través de la posibilidad
de asignar los permisos sobre los ficheros, de tal modo que el acceso a ellos sea seguro.
Se puede comprobar los ficheros /etc/permissions.secure y /etc/permissions.paranoid para
ver los permisos modificados. Antes de llegar al nivel de seguridad paranoica, es
conveniente comprobar que la funcionalidad del propio sistema no esté demasiado
restringida.
Los Buffer overflows representan, directamente por detrás del ”sniffing” (la lectura pasiva
de datos para espiar ej. contraseñas), la manera más frecuente de poner en peligro la
seguridad del sistema. En realidad cualquier servicio que sea accesible desde afuera,
representa un problema potencial de seguridad ( ej. Mail, Webserver, POP3, etc.) Todos
los servicios imprescindibles solo deberían ser accesibles a través de una configuración de
Firewall del kernel de Linux (mediante ipchain) y solo se debería brindar servicios a
determinados solicitantes.
Si esto no fuera posible, lo mejor es realizar el servicio en cuestión con una versión
especialmente segura ( ej. paquete postfix en lugar de paquete sendmail). Además los
expertos tienen la posibilidad de ejecutar cada servicio en su propio entorno chroot.
Denial of Service
El viejo "ping de la muerte", asolo varios servidores. Fue el típico ataque por inundación, y
lo que hacia mandaba "pines" sobredimensionados, donde la victima quedaba Knockout.
Internet worm, o i worm, son los famosos virus o gusanos, que se dispersan via email
"melissa o i love you".
4 Scanners
Como sabemos todos, tenemos los denominados puertos en los sistemas Linux, y estos
brindan servicios. Hemos vistos como proteger estos, pero también, tenemos que saber (
"o auditar", los servicios que estamos corriendo.
Para ello lo que haríamos es crear un sistema, un soft, que tenga la capacidad de
conectarse a un determinado puerto.
El sistema operativo Linux, posee las capacidades de los Sockets Bsd, e incluye las
librerías necesarias para crear un scanner. Sobre scanners, tenemos en la red varios,
siendo uno de los mejores el nmap, que lo podemos descargar gratuitamente
www.insecure.org/nmap. Este personalmente, considero que es uno de los mejores
scanners.
Nmap, queso y posiblemente otros programitas que podemos descargar de la red, tienen
la habilidad de detectar remotamente el sistema operativo, leyendo del stack de TCP.
Según la ley, el scaneo de puertos esta permitido, y un scaneo de puertos, nos mostrara
información muy importante. Pero, que pasaría si nosotros tenemos una red grande, y no
exclusivamente de Linux, si no compartiendo NT's y otros unixes.
Simple, nmap tiene una gran característica muy interesante, que me deja barrer toda una
red, por ejemplo, si nuestra red es la 192.168.0.xxx, lo que haríamos es lo siguiente:
#nmap 192.168.0.1-255 y aquí barrimos toda la red, pero esto, no nos serviría
de mucho, puesto que lo interesante seria tener un reporte, o sea que lo redireccionamos
Para aquellos que quieran personalizar sus scanners, y posteriormente utilizarlo como
"herramienta de auditoria", acá veremos muy básicamente como programar un scan en c.
Lo primero que debemos ver, es que todo se guarda en una estructura, la cual se llama
sockaddr_in, una vez echo esto, debemos crear una instancia de esta, que lo haremos con
un puntero.
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> main() {
int port=80;
int sock;
struct sockaddr_in cucu;
cucu.sin_family = AF_INET;
cucu.sin_addr.s_addr = inet_addr("127.0.0.1");
cucu.sin_port = htons(port);
sock=socket(AF_INET,SOCK_STREAM,0); if (connect(sock, (struct sockaddr *)&cucu,
sizeof(cucu)) < 0) {
printf("el puerto esta cerrado \n");
close(sock);
exit(0);
}
printf("Puerto abierto \n");
close(sock); }
Mas allá de esto, sabemos que con solo el nmap, podemos descubrir muchas cosas. Con la
practica, veremos que lo que nos convendría, quizás es realizar un scaneo del tipo
donde con esto, vemos que lo que estamos haciendo es q a la salida, la vamos a llamar
salida.log, y con ello, tendremos un scan
Primero, tan solo haremos un scan hacia nosotros mismos, donde veremos que tipo de
información podemos recolectar de allí.
# nmap 127.0.0.1
Esto nos muestra algunos puertos abiertos, y por ejemplo, nos muestra que podemos
tener puertos abiertos innecesariamente, como puede ser el puerto de ftp si este no le
damos utilización, ya que esto podría quedar expuesto a un stack buffer overflow.
Otro puerto que es innecesario que quede abierto es el 79, o puerto de finger, ya que
puede revelar información importante a los atacantes, y puede llegar a peligrar nuestro
sistema si esto pasa.
Es la vieja técnica, donde lo que es mas común que se haga un finger user@victima.com
donde queda la información del archivo /etc/passwd “al aire libre”.
Otro puerto que buscaran los piratas para tratar de ingresar a nuestro sistema, es el
25,cuando el viejo sendmail soporta verificación (vrfy) y expansión de usuarios (expn).
Lo que pueden hacer, es tratar de conectarse a ese puerto y realizar un ataque” por
diccionario”, o sea aplicar esto para sacar usuarios del sistema.
Los hackers con la practica saben como explotar estos servicios, y existen sitios como
pàcketstorm.securify.com, donde normalmente hablan de estos servicios, sus fallas y sus
soluciones.
Ahora, lo que realizaremos con nmap es detectar el sistema operativo, para ello haremos
lo siguiente:
#nmap -O 127.0.0.1
Hemos visto lo que nmap puede realizar, nos puede traer un dolor de cabezas, pero en
buena medida sirve para darnos una ayuda, para saber que servicios estamos dejando
abiertos.
Si prestamos atención al archivo /etc/services, nos daremos cuenta que existe un servicio
llamado sun-rpc, el cual permite la instalación y uso de los comandos “r”, de berkeley, los
que han caído en desuso.
Pero hay que tener cuidado con este servicio, ya que se detecto una vulnerabilidad en el
servicio rpc.statd, con lo cual los piratas podían llegar a tener nivel de r00t, en los
sistemas que el quisiera atacar ( mas información statdx.c, en
www.packetstorm.securify.com).
Este es un scaner de puerto, pero existen scaners mas completos, donde se pueden sacar
varios tipos de vulnerabilidades del cgi-bin.
Muchos de ellos, como el cgi-scan, que fue el primitivo, y desde allí, hasta hoy se
registraron 317 fallos del cgi-bin.
Para NT, también existen scanners, y quizás mejores, por el hecho de que NT es una
plataforma mas pobre, en el sentido de que es mas fácil “hackearlo”. Una de las grandes
fallas de las que se aprovechan los scanners de NT, es la llamada “sesión nula”, por la cual
es posible obtener usuarios.
Como es posible? Si, como se ha leído este gran error, nos deja leer los usuarios del
sistema.
Programas que se aprovechan de este gran error son entre otros, ntis, cis, y retina.
• Ntis: este pequeño programa tiene una desventaja, que corre sobre dos, y encima,
pidiendo winnt. No presenta interfaz grafica, solo puede ser útil en un script.
• Retina: “El Sr. scanner de NT”, nos posibilita entre otras cosas listar los usuarios,
mientras que a la vez intenta un mini brute force attack. Tiene una gran base de datos
e errores reportados, y es mas nos indica como repararlos.
Podemos descargar una versión evaluación de este producto de la siguiente pagina.
http://www.eeye.com
• Cis: este es un pequeño programa, muy útil, pero que no tiene tantas
funcionalidades como el retina. Lo podemos descargar de http://www.astake.com .
En esta parte hablaremos de unos programas que sirven para "pinchar" la red, en estos
momentos que se escuchan tantas noticias, de que el correo ha sido pinchado, y todas
esas cosas.
Un cybercafe, donde la mayoría de la gente, chatea, navega, y escribe algún que otro
mail.
Para colmo, en ese cybercafe, tenemos un administrador medio despistado, que usa como
servidor de Internet, un Microsoft Proxy Server.
Al ver que este mismo cibercafe, no tiene una red switcheada, sino que toda la difusión la
hace un hub, vemos que las posibilidades de sniffear son bastante elevadas.
Existen varios tipos de sniffers, y para distintas plataformas, pero veamos un par de ellos.
Comenzaremos nombrando uno de ellos, para Windows, como puede ser el distinto, donde
nos proponen bajarnos una versión gratuita a modo de prueba, y como no, que la
bajaremos.
Una vez allí, veremos que tenemos para seleccionar un adaptador, que en este caso es
nuestra plaqueta de red, y que vemos un embudito, para poder filtrar los paquetes. Una
vez que hacemos esto, vemos los paquetes viajando, y a la vez, vemos que esta la
codificación en hexadecimal, y la correspondiente traducción a su lado.
Nuestro amigo, el de la maquina de al lado, resulta que esta chateando, en un chat XXX,
es posible que le capturemos varias secciones de su chat.
Este programa tiene como pro lo fácil de configurar y/o usar, y como dificultad, que la
información contiene demasiada "basura".
Ahora bien, estamos a la espera de que el administrador se conecte, y que largue la pass
de dominio, se conecta, y nada!
Muy bien, lo que sucede es que para poder capturar esa contraseña, no necesitamos un
sniffer cualquiera, si no, sniffers especiales, a los que haremos mención ahora.
4.8.4 Lophtcrack
Este tan conocido y usado, lopthcrack, en su versión 2.5 y posteriores, incluye un sniffer,
llamado smb capture, que captura las contraseñas, y luego el mismo la puede crackear.
http://www.lopht.com
4.8.5 Smbsniff
4.8.6 Winsniff
Realmente este programa no lo probamos mucho, pero nos gusto, por que puede
funcionar en conjunto con el unicode. Se puede dejar corriendo en background. y pueden
redirigirse todos los paquetes capturados hacia un archivo de passwords, en el cual
estarán alojados estos.
http://www.350cc.com
Estos son los sniffers, que hemos visto por aquí, es una presentación rápida, luego los
veremos en mayor profundidad.
TCPDUMP
SNIFFIT
LIN-SNIFF
Y OTROS.
aquí, con las teclas F1 a F4 podremos seleccionar los ip de destino, de origen y los puertos
de ellos.
Pero, si nosotros quisiéramos que capture los passwords,. y dejarlo corriendo en segundo
plano, no nos serviría de mucho. Para esto sniffit, posee unas grandes opciones para la
línea de comando, y lo que haremos es lo siguiente.
y esto logra sniffear tanto las conexiones de entrada como las de salida de ese puerto,
aunque lo mejor seria enganchar a un "target" fijo.
Un jefe quería saber que actividad tenia el informix, y quería saber quien realizaba un
cambio de
permisos o un GRANT.
a) Primero se sniffio todas las conexiones de una lan hacia el puerto del informix, que es
el 1525, y esto , lo se direccionaba hacia un archivo ascii llamado "save".
b) el archivo "save", seria procesado por un programita en c, cuya función era detectar
la cadena GRANT, y mandar un mail avisando al administrador del sistema.
Como vemos, un sniffer puede sernos de gran ayuda, para quien lo administre con buenos
fines.
Otro "sniffer" o analizador de red, es el monitor de red, que trae windows nt. Con este se
captura todo el trafico de la red, inclusive contraseñas POP.
Lo que básicamente realiza un sniffer es poner la placa de red en modo promiscuo, o sea
decir que todas las comunicaciones en la red, pasan por esta interface. Podremos ver esto
si realizamos un:
ifconfig,
y el resultado nos demuestra un promisc, significa que ese equipo ha estado snifeando!
Pero, esto no es muy practico, considerando que un sniffer hay que detectarlo en forma
remota, ya que no podemos ir por todas las maquinas viendo esto, para eso, hay un
proggie llamado "Antisniff" de los laboratorios l0pht.
5 Firewall de TCP / IP
5.1 Introducción
La seguridad resulta cada vez más importante tanto para las compañías como para los
individuos. Internet les ha proporcionado una poderosa herramienta para distribuir
información entre ellos y para obtener información de otros, pero también les ha expuesto
a peligros de los que habían estado exentos hasta entonces. La criminalidad informática, el
robo de información y el daño malintencionado constituyen peligros potenciales.
Una persona no autorizada y sin escrúpulos que consiga el acceso al sistema de una
computadora puede que averigüe contraseñas del sistema o que se aproveche de los
errores y del comportamiento particular de ciertos programas para obtener una cuenta
funcional en dicha máquina. Una vez que sea capaz de entrar en la máquina, puede que
tenga acceso a información que podría resultar dañina, información tan sensible
comercialmente como los planes de negocio, detalles de nuevos proyectos o las bases de
datos con información de los clientes. Un daño a este tipo de datos o su modificación
puede causar severos retrasos a la compañía.
La forma más segura de evitar daños de tanto alcance consiste en impedir que las
personas no autorizadas puedan obtener el acceso a la máquina. Aquí es donde
intervienen los firewall.
Como administrador de una red, es importante que usted entienda la naturaleza de los
posibles ataques a la seguridad informática. Se describirán brevemente los tipos de
ataques más importantes para que usted pueda comprender mejor y de forma más precisa
de qué le protegerá un firewall sobre Linux. Debería realizar alguna lectura adicional para
asegurarse de que está capacitado para proteger su red de otros tipos de ataques. Aquí
están algunos de los más importantes métodos de ataque y las maneras de protegerse
contra ellos:
Acceso no autorizado
Esto simplemente quiere decir que personas que no deberían utilizar los servicios de su
computadora son capaces de conectarse y utilizarlos. Por ejemplo, personas de fuera
de su compañía podrían intentar conectarse a la máquina con las cuentas de su
compañía o a su servidor de NFS.
Existen varias formas de evitar este ataque especificando con cuidado quién puede
tener acceso a estos servicios. Usted puede evitar el acceso a la red a todo el mundo
excepto a los usuarios deseados.
Aprovechamiento de las debilidades conocidas de un programa
Algunos programas y servicios de red no fueron diseñados originalmente teniendo en
cuenta una elevada seguridad y son inherentemente vulnerables a los ataques. Los
servicios remotos del tipo BSD (rlogin, rexec, etc.) constituyen un ejemplo.
La mejor manera de protegerse contra este tipo de ataque consiste en deshabilitar los
servicios vulnerables o en encontrar alternativas. Con 'software' de código abierto
resulta muchas veces posible reparar sus debilidades.
Denegación de servicio
Los ataques de denegación de servicio causan que el servicio o programa deje de
funcionar o impide que otros hagan uso de ese servicio o programa. Estos ataques
pueden ser realizados al nivel de red enviando datagramas cuidadosamente preparados
y malintencionados de tal forma que puedan causar que las conexiones de red fallen.
También pueden realizarse a nivel de aplicación, donde órdenes cuidadosamente
construidas se envían contra un programa para tratar que se vuelva muy ocupado o
que pare su funcionamiento.
Impedir que el tráfico de red sospechoso alcance sus máquinas y que lleguen órdenes
y peticiones de programa sospechosos son las mejores formas de minimizar el riesgo
de un ataque de denegación de servicio. Resulta muy útil conocer los detalles del
método de ataque, por lo que debería aprender usted mismo todo lo posible de cada
tipo nuevo de ataque que se haga público.
Suplantación de identidad
Este tipo de ataque causa que un 'host' o aplicación simule las acciones de otro.
Típicamente, el atacante se hace pasar por un 'host' inocente siguiendo el rastro de las
direcciones IP contenidas en los paquetes de red. Por ejemplo, un 'exploit' bien
documentado del servicio de tipo BSD rlogin puede utilizar esta técnica para simular
una conexión de TCP desde otro 'host' prediciendo los números de secuencia de TCP.
Para protegerse contra este tipo de ataque, verifique la autenticidad de los datagramas
y órdenes. Evite el encaminamiento de datagramas con direcciones de origen no
válidas. Introduzca impredicibilidad en los mecanismos de control de la conexión, como
los números de secuencia de TCP y la asignación dinámica de puertos.
'Eavesdropping'
Éste es el método de ataque más simple. Un 'host' se configura para escuchar" y
capturar los datos no destinados a él. Programas de fisgoneo cuidadosamente escritos
pueden obtener los nombres de usuario y sus contraseñas a partir de las conexiones de
red con ingresos de usuarios en el sistema. Redes de difusión como las de tipo
Ethernet son especialmente vulnerables a este tipo de ataques.
Para protegerse contra este tipo de amenazas, evite el uso de tecnologías de red con
difusiones e imponga el uso de encriptación de los datos.
Los firewalls de IP resultan muy útiles para evitar o reducir los accesos no autorizados, los
ataques de denegación de servicio a nivel de red, y los ataques de suplantación de
identidad. No resultan muy útiles para evitar el aprovechamiento de las debilidades de los
servicios de red o programas ni el ['eavesdropping'].
Un firewall es una máquina segura y confiable que se asienta entre una red privada y una
red pública. La máquina firewall se configura con un conjunto de reglas que determinan a
qué tráfico de red se le permitirá pasar y cuál será bloqueado o rechazado. En algunas
organizaciones grandes, puede que encuentre un firewall localizado dentro de la red
corporativa para separar áreas sensibles de la organización de otros empleados. Algunos
casos de criminalidad informática acontecen dentro de la misma organización, no sólo
provienen de fuera.
Sin embargo, típicamente los firewall son máquinas únicas que sirven todas estas
funciones. Esto es algo menos seguro, porque si hay alguna debilidad en la propia
máquina del firewall que le permita a alguien conseguir el acceso al mismo firewall, la
seguridad de toda la red habrá sido comprometida. Sin embargo, estos tipos de firewall
son más baratos y fáciles de mantener que la configuración más sofisticada descrita
arriba. La Figura 5-1 ilustra los dos tipos más comunes de configuración de firewall.
Llegado este punto, resulta muy importante comprender que el filtrado de IP es una
utilidad en la capa de red. Esto significa que este mecanismo no entiende nada acerca de
la aplicación que utiliza las conexiones de red, sólo sabe acerca de las conexiones mismas.
Por ejemplo, usted puede denegar el acceso a usuarios a su red interna por el puerto de
defecto de telnet, pero si se apoya únicamente en el filtrado de IP, no podrá evitar que se
utilice el programa de telnet en un puerto por el que usted permite el paso a través de su
firewall. Puede evitar este tipo de problemas haciendo uso de servidores intermediarios
para cada servicio que permita que cruce su firewall. Los servidores intermediarios
comprenden la aplicación para la que fueron diseñados y por tanto evitan los abusos, tales
como utilizar el programa de telnet para pasar a través de un firewall utilizando el puerto
de 'World Wide Web'. Si su firewall soporta un servidor intermediario de 'World Wide Web',
aquella conexión de telnet será siempre respondida por el servidor intermediario que sólo
permitirá que pasen peticiones HTTP. Existe un gran número de programas servidores
intermediarios. Algunos son 'software' libre y muchos otros son productos comerciales. El
documento 'Firewall-HOWTO' expone un subconjunto popular de aquellos, pero esto queda
fuera del alcance de este libro.
• datagramas con una dirección de origen dentro de la red de Virtual Brewery, una
dirección de destino cualquiera y con un puerto de destino igual a 80 (el de WWW)
Nótese que se han utilizado dos reglas aquí. Se tiene que permitir que nuestros datos
salgan fuera, pero también que la correspondiente respuesta vuelva. En la práctica, como
se verá en breve, Linux simplifica esto y nos permite especificar lo mismo en una sola
orden.
Se hablará un poco del importante paso hacia delante que netfilter representa en una
sección dedicada más adelante en este capítulo.
Considérese cómo una máquina Unix, o de hecho cualquier máquina capaz de realizar
encaminamiento de IP, procesa los datagramas de IP. Los pasos básicos, mostrados en la
Figura 5-2 son:
El firewall de IP del núcleo de Linux es capaz de aplicar filtrados en varias etapas de este
proceso. Es decir, se pueden filtrar los datagramas de IP que entren en su máquina,
aquellos que estén siendo reenviados a través de su máquina y aquellos que estén
preparados para ser transmitidos.
En iptables, una regla de tipo 'Input' se aplica al flujo 2 del diagrama, una regla de tipo
'Forwarding' al flujo 3 y una regla de tipo 'Output' al flujo 4. Esto tiene implicaciones
importantes sobre cómo se deben estructurar los conjuntos de reglas, pero los principios
generales permanecen válidos para todos los tipos de firewall de Linux.
Todo esto puede parecer complicado de forma innecesaria en un primer momento, pero
proporciona una flexibilidad que permite construir configuraciones muy sofisticadas y
poderosas.
Mientras desarrollaba el firewall 'IP Chains', Paul Russell decidió que realizar funciones de
firewall de IP debería ser algo menos difícil; pronto asumió como tarea simplificar los
aspectos de procesamiento de datagramas en el código de firewall del núcleo y produjo un
esquema de filtrado que era mucho más claro y mucho más flexible. Denominó este nuevo
esquema netfilter.
Pero, ¿qué era lo que no estaba bien con las cadenas de IP de ipchains? Habían
aumentado de forma importante la eficiencia y la gestión de las reglas del firewall. Pero la
forma que tenían de procesar los datagramas eran todavía complejas, en especial en
conjunción con características relacionadas con las funciones de firewall como el
enmascaramiento de IP y con otras formas de traducciones de direcciones. Parte de esta
complejidad era debida a que el enmascaramiento de IP y la traducción de direcciones de
red fueron funciones desarrolladas independientemente del código de firewall e integradas
más tarde, en vez de haber sido diseñadas como partes mismas del código del firewall
desde el principio. Si un desarrollador deseara añadir todavía más características a la
secuencia de procesamiento de datagramas, entonces se encontraría con dificultades para
encontrar el lugar donde insertar el código y se habría visto obligado a realizar cambios en
el núcleo.
Veamos dos de los cambios claves realizados. La Figura 5-3 ilustra cómo se procesan los
datagramas en la implementación de 'IP Chains', mientras que Figura 5-4 ilustra cómo se
procesan en la implementación de netfilter. Las diferencias claves consisten en la
eliminación de la función de enmascaramiento del código central y de un cambio en la
localización de las cadenas de entrada y de salida. En acompañamiento a estos cambios,
se creó una herramienta de configuración nueva y extensible que se denominó iptables.
En 'IP Chains' la cadena de entrada se aplica a todos los datagramas recibidos por el
'host', independientemente de si están destinados al 'host' local o de si serán encaminados
a otro 'host'. En netfilter, la cadena 'input' de entrada se aplica solamente a los
datagramas destinados al 'host' local, y la cadena 'forward' de reenvío se aplica sólo a los
datagramas destinados a otro 'host'. De forma similar, en 'IP chains', la cadena 'output' de
salida se aplica a todos los datagramas que abandonen el 'host' local, independientemente
de si el datagrama se genera en el 'host' local o ha sido encaminado desde otro 'host'. En
netfilter, la cadena 'output' de salida se aplica solamente a los datagramas generados en
este 'host' y no se aplica a los datagramas que están siendo encaminados provenientes de
otro 'host'. Este cambio por sí solo ofrece una enorme simplificación de muchas
configuraciones de firewall.
En la Figura 5-3, los componentes etiquetados como “demasq” y “masq” son componentes
separados de núcleo que son responsables del procesamiento de los datagramas
enmascarados entrantes y salientes. Estos componentes han sido reimplementados como
módulos de netfilter.
Considérese el caso de una configuración para la que la política por defecto para cada una
de las cadenas 'input', 'forward' y 'output' es deny. En 'IP Chains', se necesitarían seis
reglas para permitir cualquier sesión a través del 'host' firewall; dos para cada una de las
cadenas 'input, 'forward' y 'output' (una cubriría el camino en un sentido y la otra en el
sentido contrario). Puede imaginarse cómo esto puede llegar a resultar extremadamente
complejo y difícil de gestionar cuando se mezclan sesiones que pueden ser encaminadas y
sesiones que podrían conectarse al 'host' local sin que deban ser encaminadas. 'IP chains'
le permite crear cadenas que le simplificarían esta tarea un poco, pero su diseño no
resulta evidente y requiere de un cierto nivel de experiencia.
Los dos módulos de netfilter del núcleo denominados ipfwadm.o e ipchains.o proporcionan
la compatibilidad hacia atrás para ipfwadm e ipchains. Sólo puede cargarse uno de estos
módulos a la vez, y utilizarlo sólo si el módulo ip_tables.o no está cargado. Cuando se ha
cargado el módulo apropiado, entonces netfilter funciona exactamente de la misma forma
que la anterior implementación del firewall.
rmmod ip_tables
modprobe ipchains
ipchains ...
Antes de que se pueda utilizar la orden iptables, se debe cargar el módulo del núcleo de
netfilter que proporciona el soporte para ello. La forma más fácil de hacerlo es con la
orden modprobe:
modprobe ip_tables
Veamos alguna de las opciones con detalle, y después se revisarán algunos ejemplos.
5.7.2.1. Órdenes
Existen varias formas de manipular las reglas y los conjuntos de reglas con la orden
iptables. Las relevantes para la función de firewall de IP son:
-A cadena
Añade una o más reglas al final de la cadena especificada. Si se proporciona un
nombre de 'host' tanto como origen como destino y se resuelve a más de una dirección
IP, se añadirá una regla por cada una de esas direcciones.
-I cadena número_de_regla
Inserta una o más reglas al comienzo de la cadena especificada. De nuevo, si se
proporciona un nombre de 'host' en la especificación de la regla, se añadirá una regla
por cada una de las direcciones que se resuelvan.
-D cadena
Borra de la cadena especificada una o más reglas que concuerden con la especificación
de regla de la cadena especificada.
-D cadena número_de_regla
Borra la regla que ocupa la posición número_de_regla en la cadena especificada. Las
posiciones de reglas comienzan en el 1 para la primera regla de la cadena.
-R cadena número_de_regla
Reemplaza la regla que ocupa la posición número_de_regla en la cadena especificada
por la regla proporcionada en la especificación.
-C cadena
Comprueba el datagrama descrito por la especificación de la regla contra la cadena
especificada. Esta orden devolverá un mensaje que describe cómo el datagrama
procesa la cadena. Resulta de la mayor utilidad para las pruebas de la configuración
del firewall por lo que se contemplará con más detalle más adelante.
-L [cadena]
Muestra las reglas de la cadena especificada, o de todas las cadenas si no se especifica
ninguna.
-F [cadena]
Borra todas las reglas de la cadena especificada, o de todas las cadenas si no se
especifica ninguna.
-Z [cadena]
Pone a cero los contadores de datagramas y bytes en todas las reglas de la cadena
especificada, o de todas las cadenas si no se especifica ninguna.
-N cadena
Crea una nueva cadena con el nombre especificado. No puede existir antes una cadena
del mismo nombre. Así es cómo se crean las cadenas de usuario.
-X [cadena]
Borra la cadena de usuario especificada, o todas las cadenas de usuario si no se
especifica ninguna. Para que este comando tenga éxito. no deben existir referencias a
la cadena especificada desde cualquier otra cadena de reglas.
-P cadena política
Establece la política por defecto de la cadena especificada a la política especificada. Las
políticas válidas de firewall son ACCEPT, DROP, QUEUE, y RETURN. ACCEPT permite
pasar a los datagramas. DROP causa que el datagrama sea descartado. QUEUE causa
que el datagrama sea pasado al espacio de usuario para posterior procesamiento. La
política RETURN causa que el código del firewall de IP vuelva a la cadena que llamó a la
que contenía esta regla, y que continúe con la regla situada tras la regla desde la que
se hizo la llamada.
5.7.2.3. Opciones
Las siguientes opciones de iptables son más generales por naturaleza propia. Algunas de
ellas controlan características bastante esotéricas del 'software' de netfilter.
-v
Hace que iptables sea más explícito en su salida. Proporcionará más información.
-n
Hace que iptables muestre las direcciones de IP y los números de puertos en forma de
números sin intentar resolverlos contra sus correspondientes nombres.
-x
Fuerza que los números de salida de iptables parezcan con sus valores exactos sin
ninguna aproximación.
- -line-number
Causa que se muestren los números de línea en los listados de los conjuntos de reglas.
El número de línea corresponderá con la posición de la regla dentro de la cadena.
5.7.2.4 Extensiones
Se dijo antes que la utilidad iptables es extensible a través de módulos de bibliotecas
compartidas. Existen alguna extensiones estándares que proporciona algunas de las
De nuevo, supóngase que se dispone en nuestra organización de una red y que se está
utilizando una máquina firewall basada en Linux para permitir a nuestros usuarios que
sean capaces de acceder a servidores WWW de Internet, y para impedir el paso de
cualquier otro tipo de tráfico.
Si nuestra red tiene una máscara de red de 24 bits (clase C) y tiene como dirección
172.16.1.0, entonces se podría utilizar las siguientes reglas de iptables:
# modprobe ip_tables
# iptables -F FORWARD
# iptables -P FORWARD DROP
# iptables -A FORWARD -m tcp -p tcp -s 0/0 --sport 80 -d 172.16.1.0/24 /
--syn -j DROP
# iptables -A FORWARD -m tcp -p tcp -s 172.16.1.0/24 --sport /
80 -d 0/0 -j ACCEPT T
Los bits del campo de tipo de servicio (TOS) son un conjunto de cuatro indicadores de un
bit de la cabecera de IP. Si uno de estos indicadores de bit vale 1, un encaminador puede
manipular el datagrama de forma diferente del caso en el que ningún indicador valiera 1.
Cada uno de los cuatro bits tiene un propósito diferente y sólo uno de los bits de TOS
puede valer 1 al mismo tiempo, es decir, las combinaciones no están permitidas. Estos
indicadores de bit se denominan de "tipo de servicio" porque permiten que la aplicación
que transmite los datos informe a la red del tipo de servicio de red que requiere.
Recuérdese que las dos posibilidades generalmente se utilizarán juntas, pero que también
pueden ser utilizadas de forma independiente si se quiere una configuración que así lo
requiera.
Mnemónico Hexadecimal
Normal-Service 0x00
Minimize-Cost 0x02
Maximize-Reliability 0x04
Maximize-Throughput 0x08
Minimize-Delay 0x10
Un método más rápido y sencillo está disponible con la implementación del firewall de
Linux. Permite generar pruebas y ejecutarlas contra el firewall como si se estuviera
haciendo la prueba con datagramas reales. Todas las variedades de 'software' del firewall
del núcleo de Linux, ipfwadm, ipchains, e iptables, dan soporte a este tipo de
comprobaciones. La implementación involucra el uso de la orden de comprobación
relevante.
Veamos lo que podría ser la trascripción de una comprobación manual de nuestro ejemplo
simple con iptables. Recuerde que la red local del ejemplo era 172.16.1.0 con una
máscara de red de 255.255.255.0, y que se permitían las conexiones de TCP hacia
servidores Web de fuera de la red. La cadena de reenvío 'forward' no permitía pasar nada
más. Empiece con una transmisión que sabemos debería funcionar, una conexión desde el
'host' local a un servidor Web de fuera:
Fíjese en los argumentos que se han proporcionado y en la forma en que se utilizan para
describir el datagrama. La salida de la orden indica que se aceptó el datagrama para su
reenvío, que es lo que se esperaba.
Ahora hagamos otra prueba, esta vez con una dirección de origen que no pertenece a
nuestra red, y, que por tanto, debería ser rechazada.
Realice algunas comprobaciones más, con el mismo nivel de detalle que la primera
comprobación pero con diferentes protocolos. También deberían ser rechazados:
Pruebe con otro puerto de destino, de nuevo esperando que sea rechazado:
Tendrá que recorrer un largo camino para estar tranquilo pues tendrá que diseñar una
serie de comprobaciones muy exhaustiva. Aunque a veces esto resulta tan complicado
como el diseño de la propia configuración del firewall, también es la mejor forma de saber
si su diseño proporciona la seguridad que esperaba.
Se han discutido los fundamentos de la configuración del firewall. Veamos ahora qué
aspecto tendría una configuración real del firewall.
Se ha diseñado la configuración de este ejemplo con vistas a que sea fácilmente extensible
y personalizable. Se proporcionan una versión de iptables.
#!/bin/bash
#######################################################
# VERSIÓN PARA IPTABLES
# Este configuración está pensada como ejemplo de configuración de
# un firewall sobre un 'host' único que no hospede él mismo ningún
# servicio
#######################################################
# Los servicios de TCP que deseamos permitir que pasen - un "" vacío
# significa todos los puertos
# nota: separados por espacios
TCPIN="smtp,www"
TCPOUT="smtp,www,ftp,ftp-data,irc"
# Los servicios de UDP que deseamos permitir que pasen - un "" vacío
# significa todos los puertos
# nota: separados por espacios
UDPIN="domain"
UDPOUT="domain"
# Los servicios de ICMP que deseamos permitir que pasen - un "" vacío
# significa todos los tipos
# referencia para los números de los tipos: /usr/include/netinet/ip_icmp.h
# nota: separados por espacios
ICMPIN="0,3,11"
ICMPOUT="8,3,11"
#######################################################
# Borra las reglas de la cadena de entrada
$IPTABLES -F FORWARD
# SUPLANTACIÓN DE IDENTIDAD
# No se debería aceptar ningún datagama proveniente de fuera con una
# direccción de origen coincidente con una de las nuestras, por
# eso las rechazamos.
$IPTABLES -A FORWARD -s $OURNET -i $ANYDEV -j DROP
# 'SMURF'
# No se permiten difusiones dirigidas de ICMP a nuestra red para evitar
# los ataques del estilo denominado 'Smurf'.
$IPTABLES -A FORWARD -m multiport -p icmp -i $ANYDEV -d $OURNET -j DENY
# TCP
# Aceptaremos todos los datagramas de TCP que pertenezcan a una
# conexión ya existente (i.e. cuyo bit de ACK valga 1)
# en el caso de los puertos de TCP que estamos permitiendo.
# Esto debería capturar más del 95% de todos los paquetes válidos de TCP.
$IPTABLES -A FORWARD -m multiport -p tcp -d $OURNET --dports $TCPIN /
! --tcp-flags SYN,ACK ACK -j ACCEPT
$IPTABLES -A FORWARD -m multiport -p tcp -s $OURNET --sports $TCPIN /
! --tcp-flags SYN,ACK ACK -j ACCEPT
En muchas situaciones simples, para utilizar el ejemplo todo lo que necesitará será editar
la sección superior del fichero denominado “SECCIÓN CONFIGURABLE POR EL USUARIO”
para especificar qué protocolos y tipos de datagramas desea que se les permita su entrada
y su salida. Para el caso de configuraciones más complejas, se necesitará también editar la
sección inferior. Recuerde que el ejemplo es simple, por tanto examínelo cuidadosamente
para asegurarse de que hace lo que usted desea cuando lo implemente.
4.1 Introducción
No hace falta tener una memoria excelente para recordar los días en los que sólo las
grandes compañías se podían permitir disponer de un cierto número de máquinas
conectadas por una red local. Frente a aquello, hoy los precios de la tecnología de red han
bajado y bajado hasta producir dos consecuencias: La primera, que las redes locales sean
algo común, presentes incluso en entornos domésticos. Es seguro que muchos de los
lectores, usuarios de Linux, tendrán en su casa dos o más computadoras conectadas por
algún tipo de ethernet. La segunda, que los recursos de red, y de forma especial las
direcciones IP, hayan llegado a ser algo escaso y, aunque no están lejanos los tiempos en
que eran gratuitos, sean ahora objeto de compraventa.
La mayor parte de la gente que disponga de una LAN deseará también disfrutar de una
conexión a Internet que todas las máquinas de su red puedan utilizar al mismo tiempo.
Las reglas del encaminamiento IP son muy estrictas respecto a la forma de manejar esta
situación. Las soluciones tradicionales a este problema hubieran pasado por solicitar un
conjunto de direcciones IP, probablemente un rango de clase C, dar a cada máquina de la
LAN una dirección del rango asignado, y utilizar un router para conectar la LAN a la
Internet.
En el actual escenario de una Internet mercantilizada, esa solución saldría bastante cara.
En primer lugar habría que pagar por el rango de direcciones asignado, en segundo lugar
habría que pagar con toda probabilidad al Proveedor de Servicios de Internet (ISP) por el
privilegio de disponer de una ruta hacia la red local en sus máquinas, de tal forma que el
resto de la Internet supiera como llegar a ellas. Esto puede sonar posible para algunas
empresas, pero en una instalación doméstica los costes no estarían justificados.
Tenemos una pequeña red ethernet en la que utilizamos uno de los rangos de direcciones
reservadas. La red dispone de un router con enmascaramiento, una máquina Linux, por
La máquina local cree que se está comunicando directamente con el host remoto. El host
remoto no sabe nada de la existencia de la máquina local y cree que ha establecido una
conexión con la máquina Linux enmascaradora. La máquina Linux enmascaradora sabe
que las otras dos máquinas están hablando entre sí y en qué puertos, y realiza las
traducciones de direcciones y puertos necesarias para que la comunicación tenga lugar.
Todo lo anterior puede parecer un poco confuso, y puede que lo sea, pero funciona y es
verdaderamente simple de poner a punto. Así que no se preocupe si aún no comprende
todos los detalles.
4.1 Efectos colaterales
Ninguna de las máquinas en la red detrás del router enmascarador son jamás vistas
directamente desde la Internet. Consecuentemente, solamente se necesita una dirección
IP válida y rutable para permitir que todas las máquinas establezcan conexiones hacia la
internet. Esto tiene un lado no tan bueno: ninguna de esas máquinas es visible desde la
Internet, y por lo tanto no se puede conectar directamente a ellas desde la Internet. La
única máquina visible en una red enmascarada es el propio router enmascarador. Se trata
de algo importante cuando se piensa en servicios como el correo o el FTP. Resulta de
utilidad decidir qué servicios deberían ser provistos por la máquina enmascaradora y para
cuáles debería actuar como proxy o tratar de algún otro modo especial.
Segundo, dado que ninguna de las máquinas enmascaradas son visibles, se encuentran
relativamente protegidas de ataques del exterior. Eso puede simplificar (o eliminar) la
necesidad de puesta a punto de funcionalidades de firewall en la máquina enmascaradora.
No se debe confiar demasiado en esto, puesto que la red local estará únicamente tan
segura como lo esté la máquina enmascaradora. Así, si la seguridad es un punto
importante, se debería utilizar un firewall para protegerla.
Para usar la función del enmascaramiento IP el núcleo debe ser compilado precisamente
con soporte de enmascarmiento. Los núcleos de la serie 2.4 no presentan el soporte de
enmascaramiento Ip como una opción de la compilación. En su lugar, se debe seleccionar
la opción del filtrado de paquetes de red:
En los núcleos de la serie 2.2 cierto número de módulos de asistencia para ciertos
protocolos se crean durante la compilación del núcleo. Algunos protocolos comienzan
estableciendo una conexión hacia fuera y entonces reciben una conexión desde fuera en
otro puerto. Normalmente eso no podría ser enmascarado, puesto que no hay forma para
la máquina Linux de asociar la segunda conexión con la primera sin meterse dentro del
propio protocolo. Los módulos asistentes hacen justamente eso: examinan los datagramas
y permiten que el enmascaramiento funcione para los protocolos que soportan. Protocolos
que de otra forma serían imposibles de enmascarar. Los protocolos soportados son:
Module Protocol
ip_masq_ftp FTP
ip_masq_irc IRC
ip_masq_raudio RealAudio
ip_masq_cuseeme CU-See-Me
ip_masq_vdolive Para VDO Live
ip_masq_quake Quake, de IdSoftware
Esos módulos deben ser cargados manualmente mediante la orden insmod. Nótese que
no pueden ser cargados por el demonio kerneld. Cada uno de esos módulos acepta como
argumento el puerto en el que debe escuchar. Para el módulo RealAudio™ se podría
poner:
Las reglas de enmascaramiento son una clase especial de reglas de filtrado. Solamente se
puede enmascarar datagramas que se reciban por una interfaz y que vayan a ser rutados
por otra. Una regla de enmascaramiento se construye de forma parecida a una regla de
encaminamiento de firewall, pero incluyendo unas opciones especiales que le dicen al
núcleo que debe enmascarar el datagrama IP. El programa iptables utiliza la opción -j
MASQUERADE para indicar que los datagramas que cumplan las condiciones especificadas
por la regla deben ser enmascarados.
Nuestra estudiante primeramente configura una máquina Linux para que se encargue del
enlace telefónico y para que actúe como router de la red local. La dirección IP que la
asignan cuando se conecta telefónicamente no es importante. Configura el router Linux
para que haga enmascaramiento IP y usa uno de los rangos privados de direcciones IP
para la red local: 192.148.1.0. Se asegura de que todas las computadoras de la red tienen
como ruta por defecto una que apunte al router Linux.
Todo lo que se necesita para que el enmascaramiento funcione en ese escenario son las
siguientes invocaciones del programa con iptables:
Ahora siempre que alguna de las máquinas de la red local traten de acceder a un servicio
en una máquina remota, sus datagramas serán automáticamente enmascarados por el
router enmascarador Linux. La primera regla en cada uno de los ejemplos impide que la
máquina Linux rute cualquier otro datagrama y proporciona cierta seguridad.
Para listar las reglas de enmascaramiento que se hayan creado, se utiliza la opción -l para
el programa ipfwadm, exactamente como se dijo ya al referirnos a los firewall.
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Las reglas de enmascaramiento aparecen aquí también con MASQUERADE como target.
Es posible, por ejemplo, configurar reglas NAT que traduzcan sólo ciertas direcciones o
rangos de direcciones y dejen las demás intactas, o que traduzcan rangos de direcciones
en rangos en vez de en direcciones individuales (que es lo que hace el enmascaramiento).
Se puede de hecho utilizar el programa iptables para crear reglas NAT que conviertan casi
cualquier cosa, con combinaciones de condiciones que utilicen atributos estándares tales
como dirección origen o destino, tipo de protocolo, puerto, etc.
7 El Día Después
Todo parece muy normal. Llegamos a nuestra oficina, nos ponemos en el servidor, y de
repente, al acceder a nuestra pagina, vemos, que esta no esta, si no que existe una mera
burla de alguien que quizá, amparado en la oscuridad de la noche, ha atacado nuestros
servidores.
Luego, una vez que la bronca que nos causa todo se ha ido y de preguntarnos: ¿Por que lo
han echo?, ¿Si en nuestro servidor no tenemos información Vital?, comienza un fino
trabajo de reconstrucción de los hechos.
Lo primero que debemos ver y analizar, si podemos, siempre que el atacante no haya sido
maligno, es ver por que servicio se nos han filtrado a nuestros servidores.
1) Evaluación del sistema operativo que estamos corriendo nosotros en este momento
Sun Solaris
Windows NT/2000
Linux
BSD
SCO, AIX, IRIX, otros
POP3
IMAP
FTP
HTTP (Muy especialmente si estamos corriendo IIS)
DNS (Muy especialmente si estamos corriendo alguna version de Bind)
SMTP (sendmail o Exchange)
RPC
una vez que hayamos detectado esto, lo mejor seria ir a alguna pagina de seguridad
informática, y ver que falla presentan estos servicios.
Por ejemplo: Si estamos corriendo NT, con IIS 4 , o win2k con IIS5, es muy probable que
el atacante haya ingresado las primeras veces por aquí, pero el problema es que entonces,
el atacante gano privilegios, o que el sistema estaba mal seteado, ya que para abusar de
este fallo, el atacante cuenta con privilegios de Cuenta invitada de Internet.
Un grave error, que he visto en varias ocasiones, es que los administradores cambian de
ubicación el default site, y crean los directorios en otro lugar. Windows NT, por defecto, a
estos directorios, le da control total a everyone!!!, si! a todos, y lo mas triste es que no
han deshabilitado el default website, que es la puerta de entrada de cualquier atacante.
Por suerte, el directorio donde se guardan los logs, esta protegido, y solo tienen acceso los
usuarios administradores y System, una cuenta interna de Windows NT.
Los Logs del IIS, nos pueden ser de vital importancia a la hora de recopilar información
sobre un ataque, estos por defecto se ubican en:
c:\winnt\system32\Logfiles
El tema, es que si esto ha pasado, lo que nos queda es tomar medidas para contrarrestar
la situación. Lo mejor en estos casos, es estar constantemente actualizados con los
Services Pack, en este caso el Service Pack 6, y el Service Pack 6.a nos solucionan este
tipo de problemas.
Ahora, veamos otro caso, que puede ser mucho mas peligroso. Es sabido que el NT, tiene
la llamada null session, que entre otras cosas, permite una enumeración remota de
usuarios, lo que compromete gravemente al sistema operativo.
Imaginémonos que un intruso ha dado, por adivinación o fuerza bruta con la password de
administrador, acá el peligro es múltiple, por que no solo compromete a la maquina que el
ha atacado, si no que compromete también a todas las maquinas que se encuentren en la
misma subred, ya que como sabemos, existen programas para poner en modo promiscuo
una interfaz Ethernet.
El tema, es que no es tan sencillo lograr esto en NT, pero con astucia, los intrusos se las
ingenian para lograrlo, sencillamente poniendo un programa de dos, y volcándolo en algún
directorio que pueda ser ejecutable por un navegador, vemos de nuevo que nos
encontramos en problemas....
A esta altura, lo mejor seria plantearse seriamente de aislar el equipo y analizar paso a
paso lo que ha ocurrido, antes de ponerlo nuevamente en producción.
Colocar una backdoor en un sistema Unix, es muy simple. Necesitamos solo tener el
status de root, y ya estamos, solo necesitamos agregar una linea en el /etc/services, que
nos permita, que la conectarnos a cierto puerto de cierta IP, nos de una shell interactiva
que nos de el status de root.
Nuestro Problema seria ahora como localizar esta backdoor?. Bueno, no es tan difícil, es
obvio que tenemos un puerto nuevo a la escucha, entonces, lo que haríamos seria lanzar
un scaneo hacia nosotros mismos, para esto utilizaremos el famoso nmap.
#nmap localhost
si vemos que tenemos una "bind shell" o shell escucha, lo que tenemos que hacer es
dirigirnos al archivo /etc/services y borrar la entrada correspondiente a la bind shell.
Realizando una review, de lo que hemos aprendido sobre sistemas operativos Unix,
recordemos que existen los archivos suid....
Estos se caracterizan por tener un +s como bit de tipo, o en forma octal, tener un 4.
Estos archivos pueden ser potencialmente una amenaza a nuestros servidores, siempre y
cuando algún intruso halla hecho una copia de algún programa maligno, o haya copiado el
interprete de
comandos (bash, sh, tsh, ksh, el que sea) a otro archivo, y a este le haya dado permisos
suid...
veamos....
el intruso como root ejecuta lo siguiente....
y allli tenemos una shell suid para que cuando el individuo, se loguee como usuario
adquiera el status de root.
$user:/tmp/.config
Para detectar esto, lo piola seria como usuario del sistema, realizar una búsqueda de estos
archivos peligrosos.
Varias veces, he visto varios firewalls muy bien configurados, muy acertadas las cadenas de
filtrado, y un desastre la seguridad tras de esta...
Caso numero 1:
He visto casos donde se cuida mucho la seguridad, (?), y es sorprendente, como se cree
que se esta seguro...
Administradores que cuidan de no tener el telnet abierto, pero dejan ssh, y con
contraseñas muy fáciles de crackear...
Es increíble, las contraseñas del tipo juan:juan... es de recordar, que si les dejamos a los
usuarios que asignen sus contraseñas, corremos el riesgo, que estos por comodidad
asignen contraseñas muy obvias.
Es Muy grande el riesgo que se corre, si estos usuarios ponen contraseñas iguales a sus
nombres de usuario, y dejan todo el sistema expuesto a stack buffer overflows.
Por eso, a veces, con solo tener un cliente ssh, nuestra seguridad puede estar expuesta...
Recordemos esto....
Nunca está demás crackear nuestras propias contraseñas, y advertirle a los usuarios que
estas deberían ser cambiadas, como parte de nuestra política de seguridad.
Por que aunque cerremos telnet, una contraseña fácil, nos deja expuesto todo nuestro
sistema.
Caso numero 2:
Administrador un poco vago, no tiene muchas ganas de trabajar. Entonces, como viene,
deja el servidor, ni bien esta instalado....
Todo estaba corriendo en perfecta condiciones, pero un buen día revisando el servidor... ,
se encuentra con un nc, puesto en C:\InetPub\scripts.....
El mismo administrador piensa ¿Que es esto, si yo no uso estas cosas?, pero en ese
momento, recuerda que le habían comentado una pagina de seguridad informática y no
duda tan solo un momento en ir a verla.
Este bug, se conoce como el unicode, y es conocido, afecta al IIS4 y A IIS5, ni bien este
ha sido instalado.
Caso numero 3:
Muy bien protegido el servidor. Tiene reglas de filtrado. Muy protegido. Pero tiene el FTP
anónimo... No dura mucho hasta, que un exploit, Rompe con la seguridad de este.
Este servicio no es otro que el wu-ftp.2.6.0(1) que por defecto viene con el sistema
operativo Red Hat Linux 6.2. Es increíble, la cantidad de servidores que están expuestos a
este ataque. Lo mejor sería denegar el ftp anónimo en el archivo /etc/ftpusers
Lo haríamos de la siguiente manera:
Como hemos visto, se aplica, la vieja leyenda de la frazada corta, no solo es necesario
cubrirnos, si no estar al tanto de las novedades, y de los stack buffer overflows.
Intentar correr los Stack Buffer Overflows, Bad format string, y DoS en nuestros
sistemas.
NOTA: Los dos primeros (Stack Buffer Overflows permiten lograr la escalada de
privilegios en el sistema, mientras que el DOS, o Denial of Service, lo que hace, es
dar de baja un servicio, o lograr la paralización del sistema operativo).
La mayoría de los logs, que se refieren a los eventos, y a los servicios, de Linux, se
encuentran alojados en /var/log. Quizás, para los que vengan de NT, este directorio les
brindaría la misma información que les puede brindar el Event Viewer.
Tenemos los logs de servicio y los logs referenciado a la seguridad del sistema.
lastlog lista los usuarios del /etc/passwd, y se fija si alguna vez se han logueado en el
sistema.
8.2 wtmp
Este guarda las ultimas entradas de los usuarios. Es invocado por el comando last, y nos
puede advertir si un intruso ha ingresado a nuestro sistema.
Esta lista es mucho mas larga, pero por cuestiones de espacio solo imprime esta parte.
extraigamos la primera línea, y vamos a analizarla de a poco.
Nos damos cuenta aquí, que el primer campo que vemos es el usuario que se conecto, o
sea root.
El segundo campo, es la terminal que uso, en este caso veremos que uso la terminal tty3,
o sea que se conecto localmente.
El tercer campo esta vacio en este caso, por que fue un acceso local.
El cuarto campo indica fecha y hora de ingreso.
El quinto campo indica el tiempo de permanencia de ese usuario, en este caso esta
logueado aun.
Todo muy lindo, pero imaginémonos que algún intruso entra a nuestro sistema y logra el
status de root, entonces, lo primero que va a tratar de hacer es borrar todas las huellas
que el dejo...
La mas grosera, y obvia, es hacer un rm -fr /var/log, así borra sus huellas el atacante, y
otra es utilizar algún programa "zappers", para editar estos archivos a mano.
Nuestro atacante, deberá ser lo suficientemente inteligente como para evitar dejar
"huellas" sobre sus "andanzas". Alguna vez, he leído acerca del "crimen perfecto", sobre
borrar los logs, directamente en rm -fr /var/log.
Así no lo encontraríamos mas a nuestro atacante, pero nos daríamos fácilmente cuenta, ya
que no encontraremos nada en nuestros logs.
Otra cosa, que suelen hacer los intrusos, es vaciar el contenido del /var/log/wtmp.
Si al llegar una mañana nos encontramos con lo siguiente
y casualmente, es 25 de Mayo, Ahhh, alguien nos hizo una visita nada amigable.
Lo que hacen "nuestros visitantes", es utilizar algún tipo de programa para tratar de
disfrazar sus entradas.
Con algún editor de wtmp, con simples líneas de programación en C, podrán saltearse
nuestras auditorias. Lo mejor en estos casos, es adquirir algún producto comercial de
auditorias o probar, con alguno de los tantos gratuitos, que descargaremos en
www.freshmeat.net.
5 DMZ
Mucha gente, piensa que crear DMZ en Linux aun no es posible. Quizá, por que solo han
oído
hablar de IPCHAINS... y piensan, que únicamente el forwardeo es de "adentro hacia
afuera".
Puesta en escena:
Ahora, supongamos que somos una empresa que brinda servicio de Correo Electrónico.
Sencillamente, podríamos imaginarnos, que cada servicio se ejecuta, en una maquina
distinta.
Es mas, imaginémonos que hasta corren en sistemas operativos diferentes....
Mail Server
(Sendmail)
Por una disposición de la empresa de debemos instalar Microsoft Windows NT, con la
consecuencia a nivel seguridad que ello trae aparejado...
router IP 200.200.200.32
Mail IP 200.200.200.33
DNS IP 200.200.200.34
www IP 200.200.200.35
Nueva disposición
Mail Server
(Sendmail)
Router Firewall
DNS Server
INTERNET (Bind)
Web Server
(Internet
Information
Server)
Un firewall comercial por software, son muy costosos y algunos poco efectivos.
Un firewall por hardware, está fuera de nuestro presupuesto.
Deberíamos decirle al fw que nos proteja toda la red interna, y que los servidores, ahora
se hallan
en nuestra LAN. Para hacer esto:
"TODO lo que nos llega al puerto 80, redirigirlo hacia el puerto 80 de nuestra LAN"
Pero vemos que tendríamos que cambiar todo el modelo anterior....
router IP 200.200.200.32
Mail IP 200.200.200.33
DNS IP 200.200.200.34
www IP 200.200.200.35
router IP 200.200.200.32
Firewall IP 200.200.200.33
Mail 192.168.1.100
DNS 192.168.1.101
www 192.168.1.102
Así, estamos ahorrando IPs publicas, protegiendo nuestros servers, y balanceando las
cargas.
Tendríamos que decir que todo lo que llegue a la IP del fw por el puerto 80, se reenvíe
hacia
el puerto 80 de la maquina con IP 192.168.1.102, que es la que verdaderamente publica
en el 80.
Todos los servicios, DNS, MAIL, WWW tendrían que apuntar ahora hacia el
200.200.200.33
entonces, en el dns server, tendríamos que tener las siguientes entradas.
ya que con lo que resolverá hacia que dirección IP interna se dirige para resolver la
petición, es el
puerto con el que viene la petición.
telnet misitio.com 25
Así, podremos tener nuestros servidores protegidos, y hasta tener distintas "Tecnologías
de sistemas operativos, corriendo sobre una misma IP".
No era tan común por esos tiempos ya encontrarse con el bug del phf, y menos aun,
encontrarse con sistemas que no tuvieran el archivo /etc/shadow... ya que la diversión era
encontrar sistemas con el archivo /etc/passwd, y las contraseñas sin sombrear.
Revisando por allí, alguien me dijo, que había una forma de escalar privilegios
"explotando" los archivos con permisos suid.
Una demostración, valió mas que mil palabras, pero ahora, me interesa saber como se
hacen estos programitas...
Introducción
En algunas ocasiones, necesitaremos ejecutar como usuarios programas que son propios
de root...
Por ejemplo: /usr/bin/passwd
Veamos una cosita, que los archivos que tienen el flag suid, llevan una s, vamos a hacerle
un ls -l a /usr/bin/passwd.
ls –l /usr/bin/passwd
-r-s--x--x 1 root root 11440 Dec 9 1999 /usr/bin/passwd*
vemos que este archivo tiene una s, esto significa que cuando lo ejecutemos seriamos
root, pero cuando termina ese archivo, solo volvemos a ser usuarios...
Para finalizar con esta introducción a flag suid, diré como otorgarles el flag suid a estos
archivos...
Para cederles el flag suid, hacemos de la siguiente manera.
#chmod +s archivo
#chmod -s archivo
y Listo!...
Cadenas desbordadas en C
Por ejemplo, si queremos definir una variable, hola, podríamos hacer lo siguiente...
char hola[10];
Ahora, que pasaría si a hola le quiero copiar una cadena de mas de 10 caracteres?... la
respuesta es sencilla... se desborda!!...
#include <stdio.h>
#include <string.h>
int main(void)
{
char crash[10];
char boing[]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
strcpy(crash,boing);
}
Vemos aquí que cuando corro este programa, se produce un core dump, o sea que se
vuelca todo el contenido de la memoria a disco...
Ahora, pensemos que pasaría si tenemos un comando y le pasamos una cadena gigante
como argumento...
o mejor, pensémoslo de esta manera, arreglaremos nuestro programita para que reciba
argumentos...
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Por favor, especifique un argumento \n");
exit(0);
}
char demo[10];
strcpy(demo,argv[1]);
}
#./demo
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
y vemos la siguiente salida... que nos dice que no existe el fichero o directorio...
Pero, como somos muy inquietos, seguimos metiendo pua...
ahora, lo que hacemos es:
y lo que nos dice aquí es que no existe fichero o directorio, pero lo que verdaderamente
nos ocupa, es lo siguiente...
Desbordando a la Pila
El tema, es que cuando por algún buffer overflow, se produce una sobre escritura de la
dirección de retorno, se pueden lograr inyectar códigos arbitrarios.
Si el programa que "desbordamos" estaba corriendo como root, no quieran pensar lo
nefasto que quedara nuestro sistema.
Lo que nos traerá estos problemas, de posibles buffer overflows, son los archivos que
tienen suid.
Recuerden hacer:
11.1 Introducción
Hoy, mucha gente tiene múltiples cuentas de correo. Un usuario habitual puede tener una
cuenta personal de algún proveedor de Internet , un cuenta laboral en la red local de su
empleador, y una o varias PCs en su casa. También puede tener permiso para utilizar
otras cuentas pertenecientes a familiares o amigos.
Si tiene múltiples cuentas, es natural querer hacer conexiones entre ellas. Por ejemplo, se
puede querer copiar archivos entre computadoras en una red, ingresar a una cuenta
remotamente desde otra, o transmitir comandos para ejecutar en una computadora
remota. Existen varios programas para estos propósitos, como el ftp o el rcp para
transferencia de archivos, telnet y rlogin para ingreso remoto, y rsh para la ejecución
remota de comandos.
Nuestra descripción está simplificada, pero debería dar una idea general de qué hace SSH.
Profundizaremos más tarde. Por ahora, sólo basta recordar que los clientes SSH se
comunican con servidores SSH con conexiones de red encriptadas.
Un producto basado en SSH podría incluir clientes, servidores, o ambos. Los productos
Unix generalmente contienen a ambos; otras plataformas son usualmente sólo clientes,
aunque están comenzando a aparecer servidores basados en Windows.
Un usuario de Unix encontraría que SSH es una forma segura de los comandos r: rsh
(remote shell), rlogin (remote login), y rcp (remote copy). De hecho, el SSH original para
Unix incluye los comandos de nombre similar ssh, scp, y slogin como reemplazos fáciles y
seguros para los comandos r. La curva de aprendizaje es pequeña, y la seguridad es muy
superior.
Supongamos que un usuario está fuera de su ciudad en un viaje de negocios y desee leer
su correo electrónico, que se encuentra en una máquina Unix que pertenece al proveedor
de internet, shell.isp.com. Un amigo de una universidad cercana le permite ingresar a su
cuenta Unix en la máquina local.university.edu, y luego ingresar remotamente en la suya.
Para el ingreso remoto se pueden utilizar los programas telnet o rlogin, pero como hemos
visto, esta conexión entre máquinas es insegura. (Sin duda algún estudiante subversivo
tomaría la clave y la utilizaría para convertirla en un servidor renegado para software
pirata y MP3 de artistas innombrables) Afortunadamente, tanto la máquina Unix del amigo
como la propia tienen instalado un producto SSH.
Esto lleva a la situación que se muestra en la Figura 2-1. El comando ssh corre un
cliente que se contacta con el servidor SSH en shell.isp.com por Internet, pidiendo
ser ingresado en la cuenta remota con el nombre de usuario pat*. También se
puede proveer la sintaxis user@host en lugar de la opción –l para lograr lo mismo:
$ ssh pat@shell.isp.com
Es importante recordar que el canal seguro existe sólo entre las máquinas cliente y
servidor SSH. Luego de ingresar a shell.isp.com a través de ssh, si luego se utilizan
telnet o ftp hacia una tercera máquina, insegura.isp.com, la conexión entre
shell.isp.com e insegura.isp.com no es segura. Sin embargo, se puede correr otro
cliente ssh desde shell.isp.com hasta insegura.isp.com, creando así otro canal
seguro, que mantiene la cadena de conexiones protegida.
Hemos cubierto sólo el uso más simple de ssh. El Capítulo X profundiza mucho más
sobre sus muchas características y opciones.
*Si los nombres usuario local y remoto son idénticos se puede omitir la opción –l
(-pat) y sólo tipear ssh
shell.isp.com.
Continuando con la historia, supongamos que mientras el usuario lee su correo electrónico
se encuentra con un mensaje que contiene un adjunto que le gustaría imprimir. Para
enviar el archivo a la impresora local de la universidad, primero se debe transferir el
archivo a local.university.edu. Una vez más, el usuario rechaza los métodos tradicionales
de transferencia de archivos, como ftp y rcp, por inseguros. En cambio, utiliza otro
programa cliente SSH, scp, para copiar el archivo a través de la red por un canal seguro.
El programa scp posee una sintaxis muy similar a la del tradicional programa cp de Unix, y
casi idéntica a la del inseguro programa rcp. Es, a grandes rasgos:
El archivo es transferido a través de una conexión asegurada por SSH. Los archivos de
fuente y destino pueden ser especificados no sólo por el nombre de archivo, sino también
por nombre de usuario (pat en nuestro ejemplo) y nombre de host (shell.isp.com),
indicando la ubicación del archivo en la red. De acuerdo a las necesidades del usuario,
varias partes de la fuente y del destinatario pueden omitirse, y utilizar valores por defecto.
Por ejemplo, omitir el nombre de usuario y el signo de arroba (pat@) hace que scp asuma
que el nombre de usuario remoto es el mismo que el local.
Como ssh, scp se alista para la clave remota y la pasa al servidor SSH para verificación. Si
la operación es exitosa, scp ingresa a la cuenta pat en shell.isp.com, copia el archivo
remoto print-me al archivo local print-me, y sale de
shell.isp.com. El archivo local print-me puede ser enviado ahora a una impresora.
No es necesario que el nombre de archivo del destino sea el mismo que el del remoto. Por
ejemplo, si se está sintiendo francés, podría llamar al archivo imprime-moi:
El sesión de ejemplo anterior brindó una introducción rápida a los programas cliente más
ampliamente utilizados – ssh y scp – en un formato a seguir mientras se está sentado
frente a la computadora. Ahora que se tienen las bases, continuaremos con el ejemplo
pero incluiremos situaciones y complicaciones comentadas por primera vez. Éstos incluyen
la característica de seguridad de los “hosts conocidos” y el caracter de escape de SSH.
La primera vez que un cliente SSH se encuentra con una máquina remota, hace algo de
trabajo extra e imprime un mensaje como el siguiente:
Este mensaje aparece sólo la primera vez que se realiza una conexión con un host remoto
particular. El mensaje es una característica de seguridad relacionada con el concepto de
hosts conocidos de SSH.
Supongamos que un adversario desea obtener la clave del usuario. Él sabe que el usuario
utiliza SSH, así que no puede monitorear su conexión fisgoneando en la red. En cambio, él
subvierte el servicio de nombres que utiliza el host local de manera que el nombre del host
remoto deseado, shell.isp.com, se traduce en falso a la dirección de IP de una
computadora corrida por él. Entonces instala un servidor SSH alterado en el host remoto
falso y espera. Cuando el usuario ingresa a través del cliente SSH confiable, el servidor
alterado SSH graba la clave para su uso posterior. El servidor falso se puede desconectar
con un mensaje de error pre-planeado, como “ sistema en mantenimiento – por favor
intente nuevamente luego de las 16:00 hs. “. O peor, puede engañar al usuario por
completo utilizando su clave para ingresar al verdadero shell.isp.com y pasar información
transparentemente entre el usuario y el servidor, monitoreando así la sesión completa.
Esta estrategia hostil se llama ataque del hombre del medio. A menos que el usuario
piense en comprobar la dirección de IP originante de la sesión en el servidor, él nunca se
dará cuenta del engaño.
Por supuesto, es mejor guardar la (public host key) del servidor antes de conectarse por
primera vez, porque si no el usuario está técnicamente expuesto a un ataque esa primera
vez. Los administradores pueden mantener listas de hosts conocidos en todo un sistema
para un conjunto dado de hosts, pero esto no es de mucha utilidad para conectarse a
hosts aleatorios alrededor del mundo. Hasta que exista un método seguro, confiable y
ampliamente desplegado de recuperar tales (keys) (como un DNS seguro, o una
infraestructura de (public key) basada en X.509) , este mecanismo de grabar al primer uso
es un compromiso aceptable.
Si la respuesta es sí, ssh permite la conexión, pero inhabilita varias características como
una precaución de seguridad y no actualiza la base de hosts conocidos personales con la
nueva (key); el usuario debe hacerlo él mismo para que el mensaje desaparezca.
Como dice el texto del mensaje, si el usuario ve esta alarma, no está necesariamente
siendo hackeado: por ejemplo, el host remoto puede haber cambiado legítimamente su
(host key ) por alguna razón. En algunos casos, incluso luego de haber leído este manual,
el usuario no conocerá la causa de estos mensajes. La recomendación es contactar al
administrador del sistema si se necesita ayuda, antes de tomar un riesgo y comprometer
la clave.
2. El hostname del host que contiene el archivo o directorio, seguido por dos
puntos. Esta parte es opcional si la ruta está presente y falta el nombre de
usuario. Si se omite, el valor es localhost. SSH2 permite un número de puerto
TCP opcional para la conexión SSH que se inserta entre el hostname y los dos
puntos, precedido por un signo de discusión.
Aunque cada campo es opcional, no se pueden omitir todos al mismo tiempo, dejando la
cadena vacía. El hostname (2) o la ruta de directorio (3) deben estar presentes. Algunos
ejemplos:
MyFile
El archivo ./MyFile en localhost
MyDirectory
El directorio ./ MyDirectory en localhost
El directorio actual en localhost
server.example.com:
El directorio – usermane en server.example.com
server.example.com
Un archivo local llamado “server.example.com” (¿faltan los dos puntos al final? es un
error común)
server.example.com: MyFile
El archivo MyFile en el directorio home del usuario remoto en
server.example.com
bob@ server.example.com:
El directorio –bob en server.example.com
bob@ server.example.com
Un archivo local llamado “bob@ server.example.com” (faltan los dos puntos otra vez)
bob@ server.example.com:MyFile
El archivo –bob/MyFile en server.example.com
server.example.com:dir/MyFile
El archivo dir/MyFile en el directorio home del usuario remoto en
server.example.com
server.example.com:/dir/MyFile
El archivo /dir/MyFile en server.example.com (nótese la ruta absoluta)
bob@server.example.com:dir/MyFile
El archivo –bob/dir/MyFile en server.example.com
bob@server.example.com:/dir/MyFile
El archivo /dir/MyFile en server.example.com (aunque se autentica como bob, la ruta
es absoluta)
server.example.com#2000:
El directorio home del usuario remoto en server.example.com, a través de el puerto
TCP 2000 (sólo SSH2)
scp para SSH1 y OpenSSH no posee soporte especial para () wildcards() en los nombres
de archivo. Simplemente, permite que la shell las expanda:
$scp1 server.example.com:*.txt
La shell Unix intenta expandir la ()wildcard() antes de que se invoque scp1, pero el
directorio actual no contiene ningún nombre de archivo que coincida con
“server.example.com:*.txt” . C shell y sus derivados informarán que no hay coincidencia y
no ejecutarán scp1. Shells estilo Bourne, notando que no hay coincidencia en el directorio
actual, pasarán la () wildcard() sin expandir a scp1, y la copia puede ser exitosa como fue
planeado, pero no se debe confiar en este comportamiento aleatorio. Lo más
recomendable es evitar siempre las () wildcards() de manera que sean explícitamente
ignoradas por la shell y pasadas a scp1:
$scp1 server.example.com:\*.txt .
scp2 hace su propia expresión regular combinando luego de que la expansión shell- ()
wildcard() está completa. La manpage sshregex para SSH2 describe a los operadores
soportados. Aun así, escápele a los caracteres () wildcard () si desea que la shell local no
se entrometa.
*Estas limitaciones también ocurren cuando se copian archivos simples, pero por lo menos
el resultado erróneo salta a la vista rápidamente. En el caso de los directorios, se puede
copiar una () jerarquía () incorrectamente sin notarlo.
Cuando scp copia archivos, los archivos de destino son creados con ciertos atributos. Por
defecto, los permisos adhieren a un umask en el host de destino, y la hora de
modificación y último acceso será la hora de la copia. Alternativamente, se le puede decir
a scp que duplique los permisos y las horas de los archivos originales. La opción –p es la
que realiza este trabajo:
Por ejemplo, para transferir un directorio home completo a una máquina remota, lo más
probable es que se desee mantener los atributos de archivo iguales a los originales:
Luego de copiar un archivo, scp2 ofrece la opción de borrar el original. La opción de línea
de comandos –u especifica esto*:
# SSH2 only
$ scp2 myfile server.example.com:
$ ls myfile
myfile
$ scp2 –u myfile.server.com:
$ ls myfile
myfile: No such file or directory
Para agregar un comando de “transporte seguro”, además de una copia segura, se puede
definir uno en términos de scp2 –u :
Esta opción es necesaria sólo cuando se está copiando un archivo simple. Si se copian
archivos múltiples o un directorio, todas las implementaciones scp confirman por defecto
que el destino remoto sea un directorio.*
Otra característica de seguridad de scp2 es la opción –n, que instruye al programa a
describir sus acciones pero no realiza ninguna copia. Esto es útil para verificar el
comportamiento de scp2 antes de ejecutar un comando potencialmente riesgoso.
# SSH2 only
$ scp2 –n myfile server.example.com:
Not transferring myfile -> server.example.com:. myfile (1k)
Supongamos que se tiene una máquina H que corre un lector de correo electrónico capaz
de IMAP y se la desea conectar a un servidor en la máquina S para leer y enviar correo
electrónico. Normalmente, esta conexión será insegura, con la clave de acceso de la
cuenta de correo transmitida como texto simple entre el programa de correo y el servidor.
Con el reenvío de puertos de SSH, se puede re-rutear la conexión IMAP de manera
transparente (como se encuentra en el puerto TCP 143 del servidor S) para que pase a
través de SSH, encriptando con seguridad los datos de la conexión*. Para brindar una
protección real, la máquina servidor IMAP debe estar corriendo un servidor SSH para
reenvío de puertos.
• Acceder a varias clases de servidores TCP (por ej.: SMTP, IMAP, POP, LDAP, etc.)
a través de una firewall que impide el acceso directo.
• Proveer protección para las sesiones con estos mismos servidores TCP,
impidiendo la revelación o alteración de claves u otro contenido que de otra
manera debería ser enviado sin proteger como parte de la sesión.
• Encauzar (tunnel) la conexión control de una sesión FTP, para encriptar el nombre
de usuario, la clave y los comandos. (Sin embargo, usualmente no es posible
proteger los canales de datos que transportan los contenidos de archivos.)
• Utilizar los servidores SMTP de ISP para enviar correo electrónico, aunque se esté
conectado fuera de la red de ISP y el ISP prohíba el relevo de correo electrónico
desde la ubicación actual.
Nota:
El reenvío de puertos no funciona con protocolos que no estén construídos en TCP, como
los basados en UDP (DNS, DHCP, NFS y NetBIOS**) o con protocolos que no estén
basados en IP, como AppleTalk o SPX/IPX de Novell.
* Este ejemplo de reenvío de puertos protege la conexión IMAP pero no protege realmente
a los mensajes de correo electrónico. Antes de alcanzar al servidor IMAP, los mensajes
pasan a través de otros servidores de correo y pueden ser interceptados durante el
tránsito. Para que la seguridad sea completa, tanto el transmisor como el receptor deben
utilizar herramientas como PGP o S/MIME para firmar y/o encriptar los mensajes.
** Esto es un tanto impreciso. DHCP está basado íntegramente en UDP, de manera que el
reenvío de puertos de SSH no puede hacer nada con él. Los otros, sin embargo, utilizan
TCP y UDP para diferentes propósitos o pueden ser configurados, a veces, para correr
sobre TCP, aunque generalmente utilizan UDP. De todas maneras, en las situaciones más
comunes, SSH no puede reenviarlos.
IMAP utiliza el puerto TCP 143, esto significa que un servidor IMAP estará “escuchando” a
la espera de conexiones en el puerto 143 de la máquina servidor. Para encauzar (tunnel)
la conexión IMAP a través de SSH, se necesita elegir un puerto local en alguna máquina H
(entre 1024 y 65535) y reenviarlo al receptáculo (socket) remoto (S,143). Suponiendo
que se elige al azar el puerto 2001, el siguiente comando crea entonces el túnel:
$ ssh –L2001:localhost:143 S
Para comprender el reenvío de puertos, es importante conocer algunos detalles sobre TCP,
el Protocolo de Control de Transmisión (Transmission Control Protocol). TCP es un ladrillo
fundamental de Internet. Construído encima de IP, es el mecanismo de transporte para
muchos protocolos de Internet del nivel de aplicación como FTP, Telnet, HTTP, SMTP, POP,
IMAP, y el mismo SSH.
TCP viene con fuertes garantías. Una conexión TCP es un circuito virtual, () full-duplex()
entre dos partes que se comunican, actuando como un puente de dos vías. Cualquiera de
las partes puede escribir en el puente cualquier número de bytes en cualquier momento, y
los bytes llegarán al otro lado con la garantía de que permanecerán inalterados y
ordenados. Los mecanismos que implementan estas garantías, sin embargo, están
diseñados para contrarrestar los problemas de transmisión en la red, como el ruteo
(routing) alrededor de links fallidos, o la retransmisión de datos corrompidos por ruidos o
perdidos debido a la congestión temporaria de la red. Éstos no son efectivos contra
intentos deliberados de robar una conexión o alterar datos en tránsito. SSH provee esta
protección que TCP por sí mismo no puede brindar.
Cuando un programa establece una conexión TCP a un servicio, necesita dos piezas de
información: la dirección IP de la máquina destino y una manera de identificar el servicio
deseado. TCP (y UDP) utilizan un entero (integer) positivo, llamado número de puerto,
para identificar un servicio. Por ejemplo, SSH utiliza el puerto 22, telnet el 23, e IMAP el
143. Los números de puerto permiten servicios múltiples en la misma dirección IP.
Para que un intento de conexión a un receptáculo sea exitoso, algo debe estar
“escuchando” en ese receptáculo. Esto es, un programa que corre en la máquina destino
debe pedirle a TCP que acepte los pedidos de conexión en ese puerto y que pase las
conexiones al programa. Cuando al intentar una conexión TCP se recibe la respuesta
“conexión denegada”, significa que la máquina remota está funcionando, pero nada está
“escuchando” en el receptáculo objetivo.
¿Cómo sabe el programa cliente el número de puerto objetivo de un servidor que está
escuchando? Los números de puerto de muchos protocolos están estandarizados,
asignados por la IANA, Autoridad de Números Asignados de Internet (Internet Assigned
Numbers Authority). (La lista completa de números de puerto de la IANA se encuentra en
http://www.isi.edu/in-notes/iana/assignments/port-numbers.) Por ejemplo, el número de
puerto TCP asignado al protocolo NNTP (Usenet news), es el 119. Por lo tanto, los
servidores de noticias escuchan en el puerto 119, y los lectores de noticias (clientes) se
conectan a ellos por medio del puerto número 119. Más específicamente, si un lector de
noticias es configurado para hablar con un servidor de noticias en la dirección IP 10.1.2.3,
requiere una conexión TCP al receptáculo (10.1.2.3,119).
Los números de puerto no están siempre () hardcoded() dentro de los programas. Muchos
sistemas operativos permiten que las aplicaciones se refieran a los protocolos por nombre,
en lugar de número, definiendo una tabla de nombres y números de puertos TCP. Los
programas pueden entonces buscar los números de puerto por el nombre del protocolo.
Bajo Unix, la tabla está a menudo contenida en el archivo /etc/services o el mapa de
servicios NIS, y las preguntas (queries) se realizan utilizando las rutinas de biblioteca
getservbyname () , getservbyport (), y procedimientos relacionados. Otros ambientes
permiten que los servidores registren sus puertos de escucha de manera dinámica a través
de un servicio de nombres, como el AppleTalk Name Binding Protocol o los records WKS y
SRV de DNS.
Hasta ahora, la discusión estuvo basada en el número de puerto utilizado por un servidor
TCP cuando un programa cliente TCP desea conectarse. Llamamos a esto número de
puerto objetivo. El cliente también utiliza un número de puerto, llamado número de puerto
fuente, de manera que el servidor pueda transmitir al cliente. Si se combinan la dirección
de IP del cliente con su número de puerto fuente, se consigue el receptáculo (socket) del
cliente.
Al contrario de los números de puerto objetivo, los números de puerto fuente no son
estándar. En la mayor parte de los casos, ni al cliente ni al servidor le interesa qué número
de puerto fuente utiliza el cliente. A menudo un cliente permitirá que TCP seleccione un
número de puerto sin usar por fuente. (Sin embargo, los comandos –r de Berkeley se
interesan por los puertos fuente.) Si se examinan las conexiones TCP existentes en una
máquina con un comando tal como netstat –a o lsof-i tcp, se verán conexiones a los
números de puertos conocidos para los servicios comunes (por ej.: 23 para Telnet, 22
para SSH), junto con números de puerto fuente largos, aparentemente al azar en el otro
extremo. Esos puertos fuente fueron elegidos del rango de puertos no asignados por TCP
en las máquinas que iniciaron esas conexiones.
Una vez establecida, una conexión TCP es determinada completamente por la combinación
de sus receptáculos fuente y objetivo. Por lo tanto, múltiples clientes TCP pueden
conectarse al mismo receptáculo objetivo. Si las conexiones se originan en diferentes
hosts, las porciones de dirección IP de los receptáculos fuente diferirán, distinguiendo las
conexiones. Si vienen de dos programas diferentes corriendo en el mismo host, TCP
asegura en ese host que tengan diferentes números de puerto fuente.
La opción –L especifica el reenvío local, en el cual el TCP cliente está en la máquina local
con el cliente SSH. A la opción la siguen tres valores separados por dos puntos: un puerto
local en el que escuchar (2001), el nombre de la máquina remota o la dirección IP (S), y el
número de puerto objetivo remoto (143).
El comando anterior ingresa a S, así como si se tipeara ssh S. Sin embargo, esta sesión
SSH ha reenviado el puerto TCP 2001 en H al puerto 143 en S; el reenvío sigue en efecto
hasta que el programador se retire de la sesión. Para hacer uso del túnel, el paso final es
decirle al lector de correo electrónico que utilice el puerto reenviado. Normalmente el
programa de correo electrónico se conecta al puerto 143 en la máquina servidor, eso es, al
receptáculo (S,143). En cambio, está configurado para conectarse al puerto 2001 en la
máquina home H (localhost,2001). De manera que el camino de la conexión es ahora
como sigue:
El reenvío de puertos puede ser especificado sólo cuando se crea una conexión SSH. No se
puede agregar un reenvío a una conexión existente con ninguna implementación SSH de la
que tengamos conocimiento, aunque no hay nada intrínseco al protocolo SSH que lo evite,
y sería, a veces, una característica útil. En lugar de utilizar la opción –L para establecer un
reenvío local se puede usar la palabra clave LocalForward en el archivo de configuración
del cliente:
# SSH1, OpneSSH
LocalForward 2001 localhost:143
# SSH2 solamente
LocalForward “2001:localhost:143”
Nótense las pequeñas diferencias en sintaxis. En SSH1 y OpenSSH, hay dos argumentos:
el número de puerto local, y el receptáculo remoto expresado como host:port. En SSH2, la
expresión es igual que en la línea de comando, excepto que debe ser encerrada entre
comillas. Si se omiten las comillas, ssh2 no se queja, pero tampoco reenvía el puerto.
Nuestro ejemplo con la máquina home H y el servidor IMAP S se puede mostrar así:
# SSH1, OpenSSH
Host local-forwarding-example
Hostname S
LocalForward 2001 localhost:143
# Corrido en la máquina home H
$ ssh local-forwarding-example
En SSH1 y OpenSSH, por defecto, sólo el host que corre el cliente SSH puede conectarse a
puertos reenviados localmente. Esto es porque ssh sólo escucha en el interfaz ()
loopback() en busca de conexiones al puerto reenviado; une el receptáculo
(localhost,2001), también conocido como (127.0.0.1,2001), y no (H,2001). De manera
que, en el ejemplo anterior, sólo la máquina H puede utilizar el reenvío; los intentos de
# SSH1, OpenSSH
$ ssh1 –g –L<localport>:<remotehost>:<remoteport> hostname
# SSH1, OpenSSH
GatewayPorts yes
Hay una razón por la que GatewayPorts y –g están deshabilitados por defecto:
representan un riesgo para la seguridad.
Un puerto reenviado remotamente es igual a uno local, pero las direcciones están
invertidas. Esta vez el cliente TCP es remoto, su servidor es local, y se inicia una conexión
reenviada desde la máquina remota.
Continuando con nuestro ejemplo, si se está en la máquina S, donde está corriendo el
servidor IMAP, se puede crear un túnel seguro para que los clientes remotos alcancen al
servidor IMAP en el puerto 143. Una vez más, se selecciona un número de puerto para
reenviar (digamos, 2001 nuevamente) y se crea el túnel:
$ ssh –R2001:localhost:143 H
La opción –R especifica el reenvío remoto. La siguen tres valores, separados por dos
puntos como antes, pero interpretados con una ligera diferencia. El puerto remoto para ser
reenviado (2001) va ahora primero, seguido por el nombre de la máquina o la dirección IP
(localhost) y el número de puerto (143). SSH puede ahora reenviar conexiones desde
(localhost,143) a (H,2001).
Una vez corrido este comando, se ha construído un túnel seguro desde el puerto 2001 en
la máquina remota H, al puerto 143 en la máquina servidor S. Ahora cualquier programa
en H puede utilizar el túnel seguro conectándose a (localhost,2001). Como antes, el
comando también corre una sesión terminal SSH en la máquina remota H, al igual que ssh
H.
Como en el reenvío local, se puede establecer un reenvío remoto utilizando una palabra
clave en el archivo de configuración del cliente. La palabra clave RemoteForward es
análoga a LocalForward, con la misma diferencia sintáctica entre SSH1 y SSH2:
# SSH1, OpenSSH
RemoteForward 2001 S:143
# SSH2 solamente
RemoteForward “2001:S:143”
# SSH2 solamente
remote-forwarding-example:
Host H
RemoteForward “2001:S:143”
$ ssh2 remote-forwarding-example
Nota:
Se podría pensar que la característica GatewayPorts discutida más arriba se aplica
igualmente bien al reenvío de puertos remoto. Esto debería tener sentido como una
característica, pero no ocurre. Debería haber una manera para que el cliente comunique
este parámetro al servidor para un reenvío dado, y esa característica no ha sido incluída
en el protocolo SSH. En SSH1 y SSH2, los puertos reenviados remotamente siempre
escuchan en todas las interfaces de red y aceptan conexiones desde cualquier parte. El
servidor OpenSSH acepta la opción de configuración GatewayPorts, y se aplica
globalmente a todos los reenvíos remotos establecidos por ese servidor.
Disclaimer
Todo el contenido y materiales (tanto impresos como software) son para un fin educativo.
Digital Thinking Group ni ninguno de sus Instructores se responsabilizan por el mal uso
que puedan darle a estos.
1. Introducción 1
1.1 Overview 1
2 Conceptos de Seguridad 2
2.1 Seguridad de Contraseñas 2
2.2 Rompiendo contraseñas (Cuando necesitamos recuperar contraseñas) 3
2.3 Recuperación de contraseñas en Microsoft Windows NT 5
2.3.2 Crackeando los passwords en Windows NT 5
2.3.2.1 Introducción 5
2.3.2.2 Crackeando los passwords en Windows NT 5
2.3.2.3 Obteniendo el archivo SAM 6
2.3.2.4 Volcando los passwords desde el registro 6
2.4 Usando un sniffer 7
2.4.1 Donde conseguir los programas que necesitamos? 7
3 Ataques 8
3.1 Que es el Spoofing? 8
3.2 TCP y IP spoofing 8
3.3 Caso de spoof básico 8
3.4 Ataque Spoof de números secuenciales 8
3.5 Un caso de ataque secuencial 9
3.6 ARP Spoofing 10
3.7 DNS spoofing 10
3.8 Previniendo IP Spoofing 11
3.9 Previniendo ARP Spoof 12
3.10 Previniendo DNS Spoofing 12
3.11 Buffer Overflows y otros ataques 12
3.12 Ping of death 13
3.13 Internet worm 13
4 Scanners 14
4.1 Introducción Scanners 14
4.2 Técnicas de Finger Printing 14
4.3 BSD sockets 14
4.4 Ejemplo de nmap 15
4.5 Mas allá del nmap 16
4.6 Otros tipos de scanners 16
4.7 NT también existe 16
4.8 Sniffers, la amenaza interna 17
4.8.1 Pensemos este escenario 17
4.8.2 Pero, vayamos por pasos, y veamos algo de teoría 17
4.8.3 Ejemplo practico 17
4.8.4 Lophtcrack 17
4.8.5 Smbsniff 17
4.8.6 Winsniff 17
4.9 Linux también existe 18
4.9.1 Vamos a citar un ejemplo de la vida real. 18
4.9.2 Detectando un sniffer 18
5 Firewall de TCP / IP 19
5.1 Introducción 19
5.2. Métodos de ataque 20
5.3 ¿Qué es un firewall? 21
5.4 ¿Qué es el filtrado de IP? 22
5.5 Configuración de Linux como firewall 23
5.5.1. Núcleo configurado con firewall de IP 23
5.5.2 La utilidad iptables 23
5.6 Las formas posibles de filtrado 24
7 El Día Después 43
7.1 El Día Después 43
7.2 Que pasa en un sistema Unix 44
7.3 Backdoors en Sistemas Unix 44
7.4 Detectando troyanos 44
7.5 Casos Prácticos 44
7.6 Medidas Mínimas de Seguridad 45
9 DMZ 49
9.1 Creando Zonas Desmilitarizadas 49
Disclaimer 65