Scapy. Generación y manipulación básica de paquetes de red
-
Upload
david-cristobal -
Category
Technology
-
view
5.040 -
download
0
description
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”
www.nosecnofun.com
Arroutada 18 – A Coruña17 a 20 de Noviembre de 2011