scapy. generación y manipulación básica de paquetes de red

34
Scapy Generación y manipulación básica de paquetes de red David Cristóbal López “Osito” Arroutada 18 – A Coruña 17 a 20 de Noviembre de 2011

Upload: david-cristobal

Post on 10-Jun-2015

5.021 views

Category:

Technology


0 download

DESCRIPTION

Charla impartida en la Arroutada 18 (A Coruña) el 19 de Noviembre de 2011. Es muy básica, ya que la tuve que montar en un par de horas, pero como introducción a Scapy da una idea general de funcionamiento.

TRANSCRIPT

Page 1: Scapy. Generación y manipulación básica de paquetes de red

Scapy

Generación y manipulación básica

de paquetes de red

David Cristóbal López

“Osito”

Arroutada 18 – A Coruña17 a 20 de Noviembre de 2011

Page 2: Scapy. Generación y manipulación básica de paquetes de red

• ¿Qué es Scapy?• Protocolos• Comandos• Generación de paquetes• Apilado de capas• Visualización• Envío• Manipulación de ficheros• Edición de paquetes capturados• Preguntas - Dudas

Índice

Page 3: Scapy. Generación y manipulación básica de paquetes de red

• Es un script escrito en Python

• Genera paquetes de red

• Permite manipular capturas

• Es capaz de realizar ataques

• Funciona con los principales protocolos de comunicación

¿Qué es Scapy?

Page 4: Scapy. Generación y manipulación básica de paquetes de red

- Al ser un script, está disponible tanto para Linux como para Windows, ya que Python permite ambos sistemas

Scapy < 2.X Python 2.4

Scapy 2.X Python 2.5 o superior

-Para funcionar, necesita tener instalado Python junto con varias dependencias, según lo que necesitemos (dnet, pcap, pyreadline, pywin32, winpcap)

- Aparte, puede utilizar varias librerías para servicios avanzados (Plot, mostrar en pdf el paquete…)

¿Qué es Scapy?

Page 5: Scapy. Generación y manipulación básica de paquetes de red

Scapy es capaz de “diseccionar” la mayoría de protocolos que existen (IP, Ethernet, STP, HSRP…)

Para ver todos los protocolos que soporta, se usa el comando ls()

Protocolos

Protocolos

Page 6: Scapy. Generación y manipulación básica de paquetes de red

ARPASN1_PacketBOOTPCookedLinuxDHCPDNSDNSQRDNSRRDot11Dot11ATIMDot11AssoReqDot11AssoRespDot11AuthDot11BeaconDot11DeauthDot11DisasDot11EltDot11ProbeReqDot11ProbeRespDot11QoSDot11ReassoReqDot11ReassoRespDot11WEPDot1QDot3EAPEAPOLEtherGPRSGREHCI_ACL_HdrHCI_Hdr

Protocolos

HDLCHSRPICMPICMPerrorIPIPerrorIPv6ISAKMPISAKMP_classISAKMP_payloadISAKMP_payload_HashISAKMP_payload_IDISAKMP_payload_KEISAKMP_payload_NonceISAKMP_payload_ProposalISAKMP_payload_SAISAKMP_payload_TransformISAKMP_payload_VendorIDIrLAPCommandIrLAPHeadIrLMPL2CAP_CmdHdrL2CAP_CmdRejL2CAP_ConfReqL2CAP_ConfRespL2CAP_ConnReqL2CAP_ConnRespL2CAP_DisconnReqL2CAP_DisconnRespL2CAP_HdrL2CAP_InfoReqL2CAP_InfoResp

L2TPLLCMGCPMobileIPMobileIPRRPMobileIPRRQMobileIPTunnelDataNBNSNodeStatusResponseNBNSNodeStatusResponseEndNBNSNodeStatusResponseServiceNBNSQueryRequestNBNSQueryResponseNBNSQueryResponseNegativeNBNSRequestNBNSWackResponseNBTDatagramNBTSessionNTPNetBIOS_DSNetflowHeaderNetflowHeaderV1NetflowRecordV1NoPayloadPPPPPP_ECPPPP_ECP_OptionPPP_IPCPPPP_IPCP_OptionPPPoEPPPoEDPacket

PaddingPrismHeaderRIPRIPEntryRTPRadioTapRadiusRawSMBMailSlotSMBNegociate_Protocol_Request_HeaderSMBNegociate_Protocol_Request_TailSMBNegociate_Protocol_Response_Advanced_SecuritySMBNegociate_Protocol_Response_No_SecuritySMBNegociate_Protocol_Response_No_Security_No_KeySMBNetlogon_Protocol_Response_HeaderSMBNetlogon_Protocol_Response_Tail_LM20SMBNetlogon_Protocol_Response_Tail_SAMSMBSession_Setup_AndX_RequestSMBSession_Setup_AndX_ResponseSNAPSNMPSNMPbulk

SNMPgetSNMPinformSNMPnextSNMPresponseSNMPsetSNMPtrapv1SNMPtrapv2SNMPvarbindSTPSebekHeadSebekV1SebekV2SebekV2SockSebekV3SebekV3SockSkinnyTCPTCPerrorTFTPTFTP_ACKTFTP_DATATFTP_ERRORTFTP_OACKTFTP_OptionTFTP_OptionsTFTP_RRQTFTP_WRQUDPUDPerrorX509CertX509RDNX509v3Ext_IPv6OptionHeader

Scapy 1.2.0.2 – 150 protocolos

Page 7: Scapy. Generación y manipulación básica de paquetes de red

Para el control de Scapy, disponemos de varios comandos, que pueden ser listados con el comando lsc()

Comandos

Comandos

Page 8: Scapy. Generación y manipulación básica de paquetes de red

Hay comandos que no se muestran en la ayuda, como los de gestión de ficheros (rdpcap, wrpcap) o los de mostrar gráficos (psdump, pdfdump)

La disponibilidad de muchos de los comandos, depende de si están instaladas las librerías adicionales para dar esa funcionalidad (desencriptación WEP, dibujo, …)

Algunas de las extensiones sólo están disponibles para Linux

Comandos

Page 9: Scapy. Generación y manipulación básica de paquetes de red

Para generar paquetes, hay que utilizar los protocolos antes mencionados.

Se pueden generar paquetes tanto de capa 2 (Ethernet) como de capa 3 (IP), necesarios para la comunicación.

Después, se añaden el resto de protocolos que necesitemos

Generación de paquetes

Generación de paquetes

Page 10: Scapy. Generación y manipulación básica de paquetes de red

Para generar datos de paquete de capa 2, utilizamos el protocolo Ethernet, abreviado como Ether(), indicando MAC de origen (src) y de destino (dst). Para introducir ambos campos, se separan por una coma (,)

capa2=Ether(src=“00:00:0c:12:34:56”,dst=“00:fa:ba:da:00:01”)

Generación de paquetes

Page 11: Scapy. Generación y manipulación básica de paquetes de red

En capa 3, tenemos más campos dentro del comando, aparte de un campo de checksum. Éste campo puede rellenarse o no, ya que se puede generar al momento de enviarse

capa3=IP(src=“192.168.0.1”,dst=“10.200.250.18”)

Generación de paquetes

Page 12: Scapy. Generación y manipulación básica de paquetes de red

Crear un paquete desde cero, puede ser lioso si necesitamos introducir demasiados parámetros.

paquete=Ether(src=“00:00:0c:12:34:56”,dst=“00:fa:ba:da:00:01”)/IP(src=“192.168.0.1”,dst=“10.200.250.18”)

Podemos trabajar con varios “paquetes” de datos, cada uno en un tipo de capa

Una vez creadas todas las capas, podemos apilarlas, generando un único paquete

Apilado de capas

Apilado de capas

Page 13: Scapy. Generación y manipulación básica de paquetes de red

paquete=Ether(src=“00:00:0c:12:34:56”,dst=“00:fa:ba:da:00:01”)/IP(src=“192.168.0.1”,dst=“10.200.250.18”)

Apilado de capas

Page 14: Scapy. Generación y manipulación básica de paquetes de red

capa2=Ether(src=“00:00:0c:12:34:56”,dst=“00:fa:ba:da:00:01”)

capa3=IP(src=“192.168.0.1”,dst=“10.200.250.18”)

paquete=capa2/capa3

Apilado de capas

Page 15: Scapy. Generación y manipulación básica de paquetes de red

Evidentemente, es necesario ver de vez en cuando cómo está el paquete de datos en memoria y si lo hemos generado correctamente.

Para visualizar los paquetes en memoria, tenemos 3 comandos: show(), show2() y hexdump()

Sintaxis:

p.show() Muestra el paquete en memoria

p.show2() Muestra el paquete rellenando los campos que se deben autogenerar

hexdump(p) Vuelca el contenido hexadecimal

Visualización

Visualización

Page 16: Scapy. Generación y manipulación básica de paquetes de red

El comando show() nos muestra el contenido del paquete tal y como lo hemos introducido al generarlo. Es una función heredada en cada paquete de datos automáticamente

NombreDelPaquete.show()

Visualización

Page 17: Scapy. Generación y manipulación básica de paquetes de red

El comando show2() rellena automáticamente los campos que deben autogenerarse al enviarlo, como el checksum, para ver el paquete exacto que saldrá a la red

NombreDelPaquete.show2()

Visualización

Page 18: Scapy. Generación y manipulación básica de paquetes de red

Mediante hexdump() obtenemos el paquete de datos en formato hexadecimal, tal y como se mostraría en cualquier captura de red. Se le pasa como variable el nombre del paquete de datos

Visualización

Page 19: Scapy. Generación y manipulación básica de paquetes de red

Una vez generado el paquete de datos, es necesario lanzarlo a la red, ya que para ello se ha creado.

Podemos enviarlo como paquete de capa 2 o de capa 3, mediante los comandos sendp() y send() respectivamente.

Estos comandos, generan automáticamente campos como el Checksum. Se le pasa como variable el nombre del paquete de datos.

También podemos enviar varias veces el mismo paquete.

Envío

Envío

Page 20: Scapy. Generación y manipulación básica de paquetes de red

sendp(NombreDelPaquete)

sendp(capa2)

Envío

Page 21: Scapy. Generación y manipulación básica de paquetes de red

send(NombreDelPaquete)

send(capa3)

Envío

Page 22: Scapy. Generación y manipulación básica de paquetes de red

send([NombreDelPaquete]*NúmeroDeVeces)

send([capa3]*10)

Envío

Page 23: Scapy. Generación y manipulación básica de paquetes de red

Generar tráfico mandando paquetes de uno en uno, es lioso y complicado, aparte de lento.

Por ello, podemos cargar una captura hecha con un sniffer, tipo Wireshark o tcpdump.

De la misma manera, capturas modificadas con scapy pueden ser guardadas a un fichero pcap.

Para ello, disponemos de los comando rdpcap() y wrpcap(). También podemos capturar tráfico directamente con scapy, mediante sniff()

Manipulación de ficheros

Manipulación de ficheros

Page 24: Scapy. Generación y manipulación básica de paquetes de red

rdpcap(NombreDelFichero)

rdpcap(“capt.pcap”)

Manipulación de ficheros

Page 25: Scapy. Generación y manipulación básica de paquetes de red

Para visualizar un único paquete, se trata como a un elemento de un array.

NombreDelArray[NumeroDePaquete].show()

captura[0].show()

Manipulación de ficheros

Page 26: Scapy. Generación y manipulación básica de paquetes de red

Para guardar un paquete o un conjunto de paquetes en un fichero pcap, usamos wrpcap()

Debemos indicar el nombre del fichero y los datos a guardar.

wrpcap(NombreDelFichero,Paquete/Array)

wrpcap(“capt2.pcap”,paquete)

Manipulación de ficheros

Page 27: Scapy. Generación y manipulación básica de paquetes de red

También es posible obtener directamente el tráfico de red con scapy, sin necesidad de importarlo de otros programas, mediante el comando sniff

Podemos indicar el número máximo de paquetes que queremos recibir o dejarlo obteniendo tráfico hasta pulsar Ctrl+c

capturalarga=sniff()

capturaacotada=sniff(50)

Manipulación de ficheros

Page 28: Scapy. Generación y manipulación básica de paquetes de red

capturalarga=sniff()

capturaacotada=sniff(50)

Manipulación de ficheros

Page 29: Scapy. Generación y manipulación básica de paquetes de red

Cuando tenemos una captura completa y queremos modificar algún campo de algún paquete en concreto, tener que generar todo de nuevo mediante comandos sería extremadamente largo y tedioso.

Tampoco podemos indicarle de nuevo el mismo protocolo, ya que lo duplicaría en el paquete o eliminaría el resto de capas.

Para editar cualquier campo, es necesario indicar el paquete, el protocolo y el campo a editar.

NombreDelPaquete[Protocolo].Campo=NuevoValor

Edición de paquetes capturados

Edición de paquetes capturados

Page 30: Scapy. Generación y manipulación básica de paquetes de red

paquete[IP].src=“172.16.0.1”

Edición de paquetes capturados

Page 31: Scapy. Generación y manipulación básica de paquetes de red

capturalarga[0][Ether].dst=“ff:ff:ff:ff:ff:ff”

Edición de paquetes capturados

Page 32: Scapy. Generación y manipulación básica de paquetes de red

De esta manera, podemos capturar tráfico entre equipos (STP, HSRP, VRRP…) y replicarlo cambiando valores, para realizar ataques, contraataques, manipulaciones en la elección de servidores, envenenamientos ARP, etc.)

También generar paquetes desde cero para hacer ataques de flooding o de spoofing, ya sea en ARP, DHCP, DNS)

Edición de paquetes capturados

Page 33: Scapy. Generación y manipulación básica de paquetes de red

¿Preguntas?

¿Dudas?

"Quien pregunta lo que ignora puede pasar por tonto cinco minutos; pero quien jamás se atreve a formular pregunta alguna, será tonto toda su vida".

Proverbio chino

¿Preguntas? ¿Dudas?

Page 34: Scapy. Generación y manipulación básica de paquetes de red

GRACIAS

David Cristóbal López

“Osito”

[email protected]

www.nosecnofun.com

Arroutada 18 – A Coruña17 a 20 de Noviembre de 2011