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

Post on 10-Jun-2015

5.031 views 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 of 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

• ¿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

• 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?

- 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?

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

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

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

Comandos

Comandos

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

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

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

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

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

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

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

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

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

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

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

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

sendp(NombreDelPaquete)

sendp(capa2)

Envío

send(NombreDelPaquete)

send(capa3)

Envío

send([NombreDelPaquete]*NúmeroDeVeces)

send([capa3]*10)

Envío

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

rdpcap(NombreDelFichero)

rdpcap(“capt.pcap”)

Manipulación de ficheros

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

NombreDelArray[NumeroDePaquete].show()

captura[0].show()

Manipulación de ficheros

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

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

capturalarga=sniff()

capturaacotada=sniff(50)

Manipulación de ficheros

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

paquete[IP].src=“172.16.0.1”

Edición de paquetes capturados

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

Edición de paquetes capturados

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

¿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?

GRACIAS

David Cristóbal López

“Osito”

david.cristobal@gmail.com

www.nosecnofun.com

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