2 Manipulación Avanzada de Paquetes TCP IP PDF
2 Manipulación Avanzada de Paquetes TCP IP PDF
2 Manipulación Avanzada de Paquetes TCP IP PDF
1
-‐
Introducción
Toda
la
Internet
está
basada
en
el
contínuo
manipulación
de
paquetes
TCP/IP
o
UDP/IP
intercambio
de
paquetes
entre
los
distintos
para
llevar
a
cabo
un
determinado
objetivo.
nodos
de
la
red,
con
el
objetivo
de
establecer
Por
lo
tanto,
es
esencial
que
el
lector
conozca
comunicaciones.
Al
nivel
más
primitivo,
estos
los
lineamientos
básicos
de
estos
protocolos
paquetes
son
una
serie
de
pulsos
digitales
de
comunicación.
De
todas
formas,
a
modo
bien
definidos
que
viajan
en
cables
de
cobre
de
repaso
se
explican
la
mayoría
de
los
alrededor
del
mundo.
Además,
la
conceptos
utilizados.
arquitectura
de
Internet
es
tal
que
todos
estamos
conectados
con
todos,
con
el
2.
Programación
en
general:
Como
veremos,
objetivo
de
maximizar
la
eficiencia
a
la
hora
Scapy
está
basado
en
el
intérprete
de
Python
establecer
comunicaciones.
Es
evidente
que
y
a
lo
largo
del
artículo
se
presentan
algunos
una
red
en
la
que
hay
que
establecer
nuevas
conceptos
relacionados
con
dicho
lenguaje.
conexiones
físicas
cada
vez
que
se
quiera
Además
vamos
a
utilizar
conceptos
de
utilizar
algún
servicio
va
a
ser
muchísimo
más
programación
como
variables,
enteros,
lenta
que
una
red
en
la
que
está
todo
cadenas
de
texto,
etc.
No
se
requieren
conectado
de
antemano.
conocimientos
previos
de
Python,
sin
embargo
supongo
que
cuando
estés
tan
Para
evitar
que
la
red
sea
un
completo
caos,
emocionado
con
el
tema
como
lo
estoy
yo,
nace
el
concepto
de
conexión
virtual
que
querrás
aprender
inmediatamente.
permite
que
una
comunicación
entre
dos
Personalmente,
lo
que
más
me
gusta
de
nodos
no
sea
escuchada
por
otras
personas
Python
es
que
puedes
escribir
cualquier
cosa
ajenas
a
la
conversación.
En
otras
palabras,
que
crees
que
debería
funcionar
y
con
el
protocolo
TCP/IP
de
por
medio,
se
FUNCIONA.
puede
aislar
una
conversación
entre
dos
nodos
de
la
red
evitando
que
terceras
Finalmente,
para
motivarlos
a
que
lean
el
personas
ilegítimas
participen
en
la
artículo,
enumero
las
cosas
que
podrían
conversación.
hacer
usando
Scapy:
Pero
como
en
este
mundo
nada
funciona
1.
Crear
y
manipular
fácilmente
paquetes
como
debería,
trabajando
en
un
nivel
TCP/IP.
adecuado
se
pueden
modificar
paquetes
correspondientes
a
una
conversación
ajena
y
2.
Reproducir
en
muy
pocas
líneas
con
un
hasta
inyectar
datos
maliciosos
en
dicha
grado
de
dificultad
muy
bajo,
herramientas
conversación.
En
este
artículo
se
cubren
como:
traceroute,
tcptraceroute,
arpspoof,
técnicas
que
involucran
la
construcción
y
dnsspoof,
algún
escaner
de
puertos,
etc.
El
manipulación
de
paquetes
para
``controlar''
objetivo
de
esto
no
es
``reinventar
la
la
red
y
alterar
su
normal
funcionamiento.
pólvora''
sino
comprender
a
fondo
el
Para
eso,
vamos
a
introducir
una
funcionamiento
de
dichas
aplicaciones,
que
herramienta
muy
poderosa
llamada
Scapy.
muchos
de
nosotros
en
algún
momento
las
Antes
de
empezar,
voy
a
listar
los
utilizamos
como
``cajas
negras''
y
conocimientos
básicos
que
debería
tener
un
personalizarlas
para
llevar
a
cabo
tareas
muy
posible
lector,
particulares.
1.
Conocimiento
sobre
el
protocolo
TCP
y
3.
Crear
gráficos
2D
y
3D
de
traceroutes.
UDP:
Básicamente,
este
artículo
se
trata
de
la
4.
Reproducir
en
muy
pocas
líneas
un
snnifer
y
modificar
paquetes
TCP/IP
en
tiempo
real.
Para
descargar
Scapy,
en
la
página
web
http://www.secdev.org/projects/scapy
hay
5.
Scapy
es
una
herramienta
muy
fácil
de
bastante
información
sobre
la
instalación
de
usar
que
puede
ayudar
a
una
persona
a
la
versión
más
reciente.
En
la
mayoría
de
los
comprender
a
fondo
el
protocolo
TCP/IP
y
sistema
operativos
basados
en
Debian,
otros
protocolos
a
nivel
de
aplicación.
simplemente
basta
hacer
``sudo
apt-‐get
install
scapy''.
La
herramienta
está
pensada
6.
Infinitas
cosas
más,
limitadas
sólo
por
la
para
entornos
de
tipo
Unix,
pero
también
se
imaginación
y
el
grado
de
conocimiento
del
la
puede
instalar
en
Windows.
usuario.
2.1
Creación
de
un
paquete
UDP
El
escenario
en
este
simple
ejemplo
se
muestra
en
la
figura
1.
Hay
dos
máquinas,
una
con
IP
192.168.0.100
(máquina
A)
y
otra
con
IP
192.168.0.106
(máquina
B)
que
tiene
el
puerto
1024
UDP
abierto
y
a
la
escucha
(LISTENING)
con
el
netcat
(con
la
opción
``-‐u''
,
que
indica
modo
UDP).
Por
lo
tanto,
la
máquina
192.168.0.106
está
esperando
un
paquete
UDP
por
el
puerto
1024.
A
continuación,
vamos
a
armar
un
paquete
UDP
arbritario
en
la
máquina
A
con
Scapy
y
se
lo
mandamos
a
la
máquina
B.
En
la
figura
2
se
muestran
los
comandos
ejecutados
que
a
continuación
pasamos
a
explicar.
Fig
3.
Escenario
simple
donde
la
máquina
B
intercambia
paquetes
UDP
con
la
máquina
C.
El
atacante,
en
la
máquina
A,
logra
comprometer
el
segmento
de
red
entre
B
y
C
e
inyecta
paquetes
ilegítimos
en
la
conversación
``UDP''.
En
resumen,
el
atacante
en
la
máquina
A
sabe
que
la
máquina
B
va
a
recibir
y
procesar
correctamente
paquetes
UDP
que
provengan
de
la
IP
192.168.0.107
con
puerto
de
origen
49392,
independientemente
de
como
y
donde
se
creen.
Los
únicos
cuatro
parámetros
que
definen
unívocamente
la
conversación
entre
B
y
C
son:
1. IP
de
la
máquina
B:
192.168.0.106
2. IP
de
la
máquina
C:
192.168.0.107
3. Puerto
UDP
de
la
máquina
B:
1024
4. Puerto
UDP
de
la
máquina
C:
49392
Con
algún
objetivo
malicioso,
el
atacante
en
la
máquina
A
busca
suplantar
la
identidad
de
la
máquina
C
inyectando
paquetes
ilegítimos
en
la
conversación.
Para
eso,
lleva
a
cabo
una
sesión
interactiva
en
Scapy
que
se
muestra
en
la
figura
4,
e
inyecta
un
paquete
UDP
que
tiene
como
payload
la
cadena
``HOLA
106,
soy
100
pero
me
estoy
haciendo
pasar
por
107\n''.
A
continuación,
pasamos
a
detallar
los
comandos
ejecutados
para
realizar
dicha
acción:
• capa_IP=IP(src="192.168.0.107",
dst="192.168.0.106"):
De
forma
análoga
al
caso
anterior,
establecemos
la
IP
de
origen
del
paquete
como
la
192.168.0.107
(máquina
C,
que
es
la
que
el
atacante
quiere
suplantar)
y
la
IP
de
destino
como
192.168.0.106
(máquina
B).
• capa_IP:
Imprimimos
en
pantalla
los
cambios
que
realizamos
sobre
los
valores
por
defecto.
• capa_UDP=UDP(sport=49392,
dport=1024):
Configuramos
los
puertos
de
origen
y
destino
del
paquete.
• capa_UDP:
De
vuelta,
imprimimos
los
cambios
realizados
para
controlar
que
todo
esté
bien.
• payload="HOLA
106,
soy
100
pero
me
estoy
haciendo
pasar
por
107\n":
Inicializamos
una
cadena
de
caracteres
que
se
utilizará
como
payload
del
paquete
UDP.
• paquete=capa_IP/capa_UDP/payload:
Finalmente
armamos
el
paquete
que
vamos
a
enviar.
• paquete:
Verificamos
el
paquete
por
última
vez,
para
asegurarnos
de
que
todos
los
parámetros
``seteados''
sean
correctos.
• str(paquete):
Realiza
una
``disección''
del
paquete
y
lo
imprime
en
pantalla
como
una
serie
de
caracteres
hexadecimales.
• send(paquete):
Enviamos
el
paquete
y,
como
se
puede
observar
en
la
consola
superior
derecha
de
la
figura
4,
llegó
a
la
máquina
B.
El
escenario
anterior
muestra
con
que
facilidad
podemos
suplantar
la
identidad
de
un
host
en
una
``conversación''
de
tipo
UDP.
Aunque
el
ejemplo
anterior
parezca
un
poco
tonto
y
carente
de
sentido
no
está
muy
lejos
de
ser,
por
ejemplo,
una
respuesta
DNS
de
un
servidor
de
nombres
de
dominio
a
un
determinado
cliente.
El
caso
anterior
generalmente
se
da
cuando
se
intercambian
datos
utilizando
un
protocolo
no
orientado
a
conexión
(UDP).
En
ese
caso,
la
capa
de
transporte
no
tiene
implementado
ni
un
mecanismo
que
identifique
el
flujo
de
información
y
que
evite
que
terceros
``inyecten''
paquetes
deliberadamente
en
la
conversación
(aunque
se
podría
implementar
uno
en
la
capa
de
aplicación,
como
el
caso
del
protocolo
DNS).
Fig 6. Inyección de un paquete TCP en una conversación ajena.
• Capa_IP=IP(src="192.168.0.107",
dst="192.168.0.106"):
De
forma
análoga
a
los
casos
anteriores,
establecemos
la
IP
de
origen
del
paquete
como
la
192.168.0.107
(máquina
C)
y
la
IP
de
destino
como
192.168.0.106
(máquina
B).
• Capa_IP:
Imprimimos
en
pantalla
los
cambios
que
realizamos
sobre
los
valores
por
defecto.
• Capa_TCP=TCP(sport=35434,
dport=5678):
Al
igual
que
en
el
caso
de
un
paquete
UDP,
configuramos
los
puertos
de
origen
y
destino
del
paquete.
• ls(capa_TCP):
Imprimimos
en
pantala
los
campos
de
la
clase
capa_TCP
que
podemos
modificar
(que
obviamente
son
todos
los
de
la
capa
TCP).
En
particular,
observamos
que
hay
dos
campos
que
hacen
referencia
al
número
de
secuencia
y
de
acuse
de
recibo:
seq
y
ack,
respectivamente.
• Capa_TCP.seq=672267354:
Este
comando
modifica
el
campo
seq
de
la
clase
capa_TCP
con
el
valor
que
nosotros
queramos,
que
en
este
caso
es
el
672267354.
Si
observan
detalladamente
la
figura
5,
el
último
paquete
que
la
máquina
B
envió
a
la
máquina
C
es
un
paquete
ACK,
con
número
de
secuencia
igual
a
680033760
y
número
de
acuse
de
recibo
672267354.
Por
lo
tanto,
el
próximo
paquete
PSH/ACK
que
espera
la
máquina
B
de
la
máquina
C
debe
tener
un
número
de
secuencia
igual
a
672267354
y
un
número
de
acuse
de
recibo
igual
a
680033760
(``intercambiamos''
los
números).
• Capa_TCP.ack=680033760:
Este
comando
modifica
el
campo
ack
de
la
clase
capa_TCP
con
el
valor
que
nosotros
queramos,
que
en
este
caso
es
el
680033760.
• Capa_TCP:
Este
comando
imprime
en
pantalla
los
valores
de
los
campos
que
modificamos.
• capa_TCP.flags='PA':
Con
este
comando
se
indica
que
el
paquete
debe
tener
los
flags
PSH
y
ACK
levantados.
• payload="HOLA
106,
soy
100
pero
me
estoy
haciendo
pasar
por
107\n":
Inicializamos
una
cadena
de
caracteres
que
se
utilizará
como
payload
del
paquete
UDP.
• paquete=capa_IP/capa_TCP/payload:
Armamos
el
paquete
que
vamos
a
enviar.
• paquete:
Verificamos
el
paquete
por
última
vez,
para
asegurarnos
de
que
todos
los
parámetros
``seteados''
sean
correctos.
• send(paquete):
Enviamos
el
paquete
y,
como
se
puede
observar
en
la
consola
superior
derecha
de
la
figura
6,
llegó
a
la
máquina
B.
Como
vemos,
el
atacante
fue
capaz
de
suplantar
la
identidad
de
la
máquina
C
en
la
conexión
TCP
que
ya
estaba
establecida.
Es
más,
si
la
IP
del
atacante
(192.168.0.100)
fuera
una
IP
NO
AUTORIZADA
a
comunicarse
con
B,
éste
método
igual
hubiera
funcionado,
ya
que
suplantamos
la
IP
del
cliente
legítimo
(IP
Spoofing).
La
pregunta
es,
¿qué
pasa
con
la
sesión
legítima
iniciada
en
la
máquina
C?
¿Qué
pasa
si
el
cliente
en
la
maquina
C
desea
enviar
algún
dato
a
la
máquina
B?
La
respuesta
es
que
no
pasa
absolutamente
nada.
Sus
números
de
secuencia
y
acuse
de
recibo
van
a
estar
totalmente
``desfasados''
en
la
conexión
y
la
máquina
B
(que
se
adhiere
estrictamente
al
protocolo
TCP)
va
a
rechazar
cada
uno
de
los
paquetes
que
envíe
C.
El
atacante
ahora
desea
deshacerse
del
cliente
en
la
máquina
C,
para
lo
cual
lleva
a
cabo
la
sesión
en
Scapy
que
se
muestra
en
la
figura
7.
Básicamente,
arma
un
paquete
TCP
con
el
flag
``RESET''
para
suplantar
a
la
máquina
B
y
enviárselo
a
la
máquina
C.
Como
el
atacante
tiene
conocimiento
de
los
números
SEQ
y
ACK
que
espera
la
máquina
C
de
la
máquina
B,
lo
puede
armar
convenientemente
adhiriéndose
al
protocolo
TCP
(los
números
SEQ
y
ACK
se
muestran
en
la
figura
Figura
5.
Como
se
puede
ver
en
la
figura
8,
la
sesión
de
netcat
en
la
máquina
C
se
cierra
automáticamente
luego
de
que
A
envía
el
paquete
RESET.
La
explicación
de
los
comandos
utilizados
es
análoga
al
caso
anterior,
con
la
única
diferencia
de
que
ahora
el
campo
flags
de
la
clase
capa_TCP
es
'R'.
Con
respecto
al
número
de
secuencia
utilizado,
antes
de
que
la
máquina
A
inyectara
el
paquete
ilegítimo
en
la
conversación,
el
último
paquete
que
la
máquina
B
envió
a
la
máquina
C
es
un
paquete
ACK,
con
número
de
secuencia
igual
a
680033760.
Por
lo
tanto,
este
debe
ser
el
número
de
secuencia
del
paquete
RESET
que
tiene
que
crear
el
atacante.
Una
vez
que
el
atacante
dejó
fuera
del
escenario
a
la
máquina
C,
puede
llevar
a
cabo
un
ataque
de
denegación
de
servicio
y
dejar
de
redireccionar
los
paquetes
de
C
a
la
máquina
B
(pero
sin
dejar
de
hacer
ARPSpoofing).
Esto
se
puede
lograr
simplemente
haciendo
``echo
0
>
/proc/sys/net/ipv4/ip_forward''.
Una
técnica
un
poco
más
sutil
sería
usar
IPTABLES
para
evitar
que
la
máquina
C
vuelva
a
establecer
una
conexión
con
el
puerto
5678
de
la
máquina
B.
De
cualquier
forma,
si
la
máquina
C
lograra
establecer
nuevamente
una
conexión
con
B,
no
pasaría
nada
con
la
sesión
robada
por
la
máquina
A
ya
que
C
utilizaría
otro
puerto
de
origen
y
otros
números
de
secuencia.
Lo
que
si
es
esencial
tener
en
cuenta
es
que,
una
vez
robada
la
sesión,
el
atacante
A
debe
dejar
de
redireccionar
los
paquetes
de
la
máquina
B
a
la
C.
En
caso
contrario,
seguirían
llegando
paquetes
a
C
de
una
conexión
que
ya
fue
cerrada
lo
cual
es
SOSPECHOSO
y
también
provocaría
una
ráfaga
de
paquetes
RESET
de
la
máquina
C
a
la
B,
que
podrían
causar
que
el
atacante
pierda
la
conexión
robada.
Finalmente,
en
la
figura
8
se
muestra
una
sesión
de
Scapy
donde
el
atacante
continua
la
``conversación''
con
la
máquina
B
suplantando
la
identidad
de
la
máquina
C.
Fig 8. El atacante en la máquina A logra suplantar la identidad de la máquina C
continuando la conversación TCP con la máquina B.
Para
concluir,
notamos
que
todo
lo
expuesto
en
este
artículo
tiene
solamente
un
interés
académico.
Los
parámetros
y
las
variables
a
controlar
en
un
proceso
de
hijacking
de
una
sesión
TCP/IP
son
muchos
y
hacen
que
sea
imposible
aplicarlo
en
una
situación
real
(sesiones
HTTP,
FTP,
POP3,
SMTP,
etc)
de
una
forma
tan
rústica
como
lo
hicimos
nosotros.
Es
evidente
que
hay
que
``automatizar''
las
distintas
tareas
y
coordinar
adecuadamente
el
ARPSpoofing,
el
monitoreo
del
tráfico
y
la
inyección
de
paquetes.
Afortunadamente,
la
aplicación
Scapy
junto
con
el
entorno
de
programación
de
Python
hacen
posible
la
construcción
de
una
herramienta
práctica
de
hijacking.
Scapy
puede
trabajar
en
la
capa
de
enlace
realizando
ARPSpoofing,
puede
monitorear
los
paquetes
que
pasan
a
través
de
nuestra
máquina
y
obtener
los
números
de
secuencia
y
de
acuse
de
recibo
para
``colarse''
en
una
conexión
TCP/IP
de
terceros.
Todas
esas
tareas
concurrentes
se
pueden
``administrar''
correctamente
usando
la
programación
de
threadings
en
Python.
Para
no
alargar
más
este
artículo,
dejamos
todos
esos
temas
para
otra
ocasión.
4
Conclusión
La
conclusión
(bastante
obvia)
que
podemos
obtener
de
esta
práctica
es
que
las
computadoras
son
ESTÚPIDAS.
Nosotros
somo
seres
INTELIGENTES
y
podemos
aprovecharnos
de
ellas.
Nunca
perdamos
de
vista
que
los
nodos
de
una
red
se
comunican
con
``unos''
y
``ceros''
que
viajan
a
través
del
``ciberespacio''
en
estructuras
bien
definidas
(y
conocidas
públicamente)
llamadas
PAQUETES.
Una
computadora
va
a
procesar
los
``unos''
y
``ceros''
que
reciba
si
tienen
algún
sentido,
independientemente
de
donde
se
armaron
y
de
como
llegaron.
Por
lo
tanto,
si
una
computadora
recibe
un
paquete
que
estaba
esperando,
lo
va
a
tratar
correctamente
acatando
las
normas
o
reglas
con
las
cuales
fue
programada.