El "hello world" de Python, SCAPY y Pycharm en Windows (visto desde un windowsero de sistemas)

Estimados amigos de Inseguros !!!

Voy a comentar un simple script en Python que podéis usar en vuestras pruebas, pero sobre todo, como iniciación al mundo de la pitón desde el punto de vista de alguien que no es programador, ni le gusta mucho, o no sabe, o no quiere, o mil demonios.


Como podemos introducirnos en este mundo de Python?. Lo primero que debemos saber es que es un lenguaje interpretado. Qué quiero decir esto? Un programa "normal" compilado, un .exe de los que estamos acostumbrados a usar... es un código escrito por un un programador, por ejemplo en el lenguaje C. Ese código ha de transformarse en un código que el procesador entienda, el código máquina. Una vez compilado, podemos ejecutar el .exe en cualquier equipo.

Los lenguajes interpretados se compilan en tiempo de ejecución. Qué quiere decir esto? Vamos a poner el ejemplo de Java o .net. Cuando creas código en cualquiera de estos dos lenguajes, necesitas la máquina virtual Java, o el .net Framework (seguro que lo has instalado mil veces en sistemas Wintel). El paso del código "humano" a código máquina lo hace un interprete en el momento que se ejecuta el programa. Esto tiene una ventaja principal. Un código hecho en Java, que requiere la máquina virtual para ejecutar, puede ejecutarse en un Windows. El mismo código, puede ejecutarse en un Linux, ya que aunque las instrucciones sean diferentes, es la máquina virtual de Java la que transforma el código, la que compila.

Cual será más rápido? un compilado o un interpretado( que debe ser compilado "al vuelo"). Cual será mas portable o compatible entre plataformas? Cual es más cómodo?

Bien, hasta aquí lo básico, tenía que decirlo :-). Ahora vamos al asunto. Para programar en Python necesitamos tener Python instalado, para poder interpretar el código que vamos a escribir. Para escribir el código podemos usar Notepad, MS Word o cualquier editor de texto, pero hay IDE (Integrated Development Environment) que facilitan el trabajo. Entonces, para nuestro caso Windowsero, vamos a instalar Python. Hay dios versiones disponibles, rama 2 y rama 3. Para nuestro caso vamos a instalar la rama 2 (2.7.10 ahora) ya que la mayoría de módulos que vamos a usar están comprobados para esta versión, y me consta que la versión 3 es más compleja de integrar.

Una vez instalado el interprete de Python, lo que va a traducir nuestro código humano en máquina, voy a instalar Pycharm. Puedes usar el editor que quieras, como si usas Notepad. En la instalación tenemos que indicarle donde se ha instalado el interprete Python, en mi caso en c:\python\.

Ahora hacemos el Hello World y ejecutamos el programa, vemos abajo que muestra en pantalla el texto.


Si por el contrario prefieres escribir tu código desde un editor de texto normal, este sería el resultado.


Como es normal, no vas a aprender un lenguaje de programación leyendo artículos en la web, y menos de alguien como yo. Tendrás que leerte algún libro. Los tipos de datos, estructuras de control, modulos, buenas prácticas, seguridad, rendimiento, etc.

Con este artículo solo pretendo quitarte el miedo para empezar, y darte lo mínimo. Por eso ahora voy a hacer un salto grande en el espacio-tiempo y me voy a saltar toda esa parte para entrar de pleno con lo que me interesa, el hacking, la seguridad, las redes, el tcp/ip. Todo esto lo vamos a enlazar con Python mediante SCAPY. Otra cosa, es SUPER incomodo y poco efectivo hacerlo en Windows. Es mucho más fácil instalar todo en Linux. Si usas Kali o similar, lo tendrás todo por defecto configurado.

Scapy es una API, un conjunto de funciones para el manejo de protocolos de red.  Qué quiere decir esto? Que si quieres construir un paquete icmp, como hace el ping de toda la vida de tu sistema operativo, puedes hacerlo desde un entorno de desarrollo Python, que es "sencillo". Imaginas un simple programar un tcp syn desde cero en C, abriendo el socket en el sistema operativo, lanzando un paquete con todos los flags, cabeceras, etc...
Qué tipo de paquetes podemos generar con Scapy? Unos cuantos:

# scapy
>>> ls ()
ARP        : ARP
ASN1_Packet : None
BOOTP      : BOOTP
CookedLinux : cooked linux
DHCP       : DHCP options
DHCP6      : DHCPv6 Generic Message)
DNS        : DNS
DNSQR      : DNS Question Record
DNSRR      : DNS Resource Record
DUID_EN    : DUID - Assigned by Vendor Based on Enterprise Number
DUID_LL    : DUID - Based on Link-layer Address
DUID_LLT   : DUID - Link-layer address plus time
Dot11      : 802.11
Dot1Q      : 802.1Q
Dot3       : 802.3
EAP        : EAP
EAPOL      : EAPOL
Ether      : Ethernet
GPRS       : GPRSdummy
GRE        : GRE
GRErouting : GRE routing informations
HAO        : Home Address Option
HBHOptUnknown : Scapy6 Unknown Option
HCI_ACL_Hdr : HCI ACL header
HCI_Hdr    : HCI header
HDLC       : None
HSRP       : HSRP
ICMP       : ICMP
ICMPerror  : ICMP in ICMP
ICMPv6DestUnreach : ICMPv6 Destination Unreachable
ICMPv6EchoReply : ICMPv6 Echo Reply
ICMPv6EchoRequest : ICMPv6 Echo Request
ICMPv6HAADReply : ICMPv6 Home Agent Address Discovery Reply
ICMPv6HAADRequest : ICMPv6 Home Agent Address Discovery Request
ICMPv6MLDone : MLD - Multicast Listener Done
ICMPv6MLQuery : MLD - Multicast Listener Query
ICMPv6MLReport : MLD - Multicast Listener Report
ICMPv6MPAdv : ICMPv6 Mobile Prefix Advertisement
ICMPv6MPSol : ICMPv6 Mobile Prefix Solicitation
ICMPv6MRD_Advertisement : ICMPv6 Multicast Router Discovery Advertisement
ICMPv6MRD_Solicitation : ICMPv6 Multicast Router Discovery Solicitation
ICMPv6MRD_Termination : ICMPv6 Multicast Router Discovery Termination
ICMPv6NDOptAdvInterval : ICMPv6 Neighbor Discovery - Interval Advertisement
ICMPv6NDOptDstLLAddr : ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address
ICMPv6NDOptEFA : ICMPv6 Neighbor Discovery Option - Expanded Flags Option
ICMPv6NDOptHAInfo : ICMPv6 Neighbor Discovery - Home Agent Information
ICMPv6NDOptIPAddr : ICMPv6 Neighbor Discovery - IP Address Option (FH for MIPv6)
ICMPv6NDOptLLA : ICMPv6 Neighbor Discovery - Link-Layer Address (LLA) Option (FH for MIPv6)
ICMPv6NDOptMAP : ICMPv6 Neighbor Discovery - MAP Option
ICMPv6NDOptMTU : ICMPv6 Neighbor Discovery Option - MTU
ICMPv6NDOptNewRtrPrefix : ICMPv6 Neighbor Discovery - New Router Prefix Information Option (FH for MIPv6)
ICMPv6NDOptPrefixInfo : ICMPv6 Neighbor Discovery Option - Prefix Information
ICMPv6NDOptRDNSS : ICMPv6 Neighbor Discovery Option - Recursive DNS Server Option
ICMPv6NDOptRedirectedHdr : ICMPv6 Neighbor Discovery Option - Redirected Header
ICMPv6NDOptRouteInfo : ICMPv6 Neighbor Discovery Option - Route Information Option
ICMPv6NDOptShortcutLimit : ICMPv6 Neighbor Discovery Option - NBMA Shortcut Limit
ICMPv6NDOptSrcAddrList : ICMPv6 Inverse Neighbor Discovery Option - Source Address List
ICMPv6NDOptSrcLLAddr : ICMPv6 Neighbor Discovery Option - Source Link-Layer Address
ICMPv6NDOptTgtAddrList : ICMPv6 Inverse Neighbor Discovery Option - Target Address List
ICMPv6NDOptUnknown : ICMPv6 Neighbor Discovery Option - Scapy Unimplemented
ICMPv6ND_INDAdv : ICMPv6 Inverse Neighbor Discovery Advertisement
ICMPv6ND_INDSol : ICMPv6 Inverse Neighbor Discovery Solicitation
ICMPv6ND_NA : ICMPv6 Neighbor Discovery - Neighbor Advertisement
ICMPv6ND_NS : ICMPv6 Neighbor Discovery - Neighbor Solicitation
ICMPv6ND_RA : ICMPv6 Neighbor Discovery - Router Advertisement
ICMPv6ND_RS : ICMPv6 Neighbor Discovery - Router Solicitation
ICMPv6ND_Redirect : ICMPv6 Neighbor Discovery - Redirect
ICMPv6NIQueryIPv4 : ICMPv6 Node Information Query - IPv4 Address Query
ICMPv6NIQueryIPv6 : ICMPv6 Node Information Query - IPv6 Address Query
ICMPv6NIQueryNOOP : ICMPv6 Node Information Query - NOOP Query
ICMPv6NIQueryName : ICMPv6 Node Information Query - IPv6 Name Query
ICMPv6NIReplyIPv4 : ICMPv6 Node Information Reply - IPv4 addresses
ICMPv6NIReplyIPv6 : ICMPv6 Node Information Reply - IPv6 addresses
ICMPv6NIReplyNOOP : ICMPv6 Node Information Reply - NOOP Reply
ICMPv6NIReplyName : ICMPv6 Node Information Reply - Node Names
ICMPv6NIReplyRefuse : ICMPv6 Node Information Reply - Responder refuses to supply answer
ICMPv6NIReplyUnknown : ICMPv6 Node Information Reply - Qtype unknown to the responder
ICMPv6PacketTooBig : ICMPv6 Packet Too Big
ICMPv6ParamProblem : ICMPv6 Parameter Problem
ICMPv6TimeExceeded : ICMPv6 Time Exceeded
ICMPv6Unknown : Scapy6 ICMPv6 fallback class
IP         : IP
IPOption   : None
IPOption_Address_Extension : IP Option Address Extension
IPOption_EOL : None
IPOption_LSRR : IP Option Loose Source and Record Route
IPOption_MTU_Probe : IP Option MTU Probe
IPOption_MTU_Reply : IP Option MTU Reply
IPOption_NOP : None
IPOption_RR : IP Option Record Route
IPOption_Router_Alert : IP Option Router Alert
IPOption_SDBM : IP Option Selective Directed Broadcast Mode
IPOption_SSRR : IP Option Strict Source and Record Route
IPOption_Security : None
IPOption_Stream_Id : IP Option Stream ID
IPOption_Traceroute : None
IPerror    : IP in ICMP
IPerror6   : IPv6 in ICMPv6
IPv6       : IPv6
IPv6ExtHdrDestOpt : IPv6 Extension Header - Destination Options Header
IPv6ExtHdrFragment : IPv6 Extension Header - Fragmentation header
IPv6ExtHdrHopByHop : IPv6 Extension Header - Hop-by-Hop Options Header
IPv6ExtHdrRouting : IPv6 Option Header Routing
ISAKMP     : ISAKMP
IrLAPCommand : IrDA Link Access Protocol Command
IrLAPHead  : IrDA Link Access Protocol Header
IrLMP      : IrDA Link Management Protocol
Jumbo      : Jumbo Payload
L2CAP_CmdHdr : L2CAP command header
L2CAP_CmdRej : L2CAP Command Rej
L2CAP_ConfReq : L2CAP Conf Req
L2CAP_ConfResp : L2CAP Conf Resp
L2CAP_ConnReq : L2CAP Conn Req
L2CAP_ConnResp : L2CAP Conn Resp
L2CAP_DisconnReq : L2CAP Disconn Req
L2CAP_DisconnResp : L2CAP Disconn Resp
L2CAP_Hdr  : L2CAP header
L2CAP_InfoReq : L2CAP Info Req
L2CAP_InfoResp : L2CAP Info Resp
L2TP       : None
LLC        : LLC
LLMNRQuery : Link Local Multicast Node Resolution - Query
LLMNRResponse : Link Local Multicast Node Resolution - Response
MGCP       : MGCP
MIP6MH_BA  : IPv6 Mobility Header - Binding ACK
MIP6MH_BE  : IPv6 Mobility Header - Binding Error
MIP6MH_BRR : IPv6 Mobility Header - Binding Refresh Request
MIP6MH_BU  : IPv6 Mobility Header - Binding Update
MIP6MH_CoT : IPv6 Mobility Header - Care-of Test
MIP6MH_CoTI : IPv6 Mobility Header - Care-of Test Init
MIP6MH_Generic : IPv6 Mobility Header - Generic Message
MIP6MH_HoT : IPv6 Mobility Header - Home Test
MIP6MH_HoTI : IPv6 Mobility Header - Home Test Init
MIP6OptAltCoA : MIPv6 Option - Alternate Care-of Address
MIP6OptBRAdvice : Mobile IPv6 Option - Binding Refresh Advice
MIP6OptBindingAuthData : MIPv6 Option - Binding Authorization Data
MIP6OptCGAParams : MIPv6 option - CGA Parameters
MIP6OptCGAParamsReq : MIPv6 option - CGA Parameters Request
MIP6OptCareOfTest : MIPv6 option - Care-of Test
MIP6OptCareOfTestInit : MIPv6 option - Care-of Test Init
MIP6OptHomeKeygenToken : MIPv6 option - Home Keygen Token
MIP6OptLLAddr : MIPv6 Option - Link-Layer Address (MH-LLA)
MIP6OptMNID : MIPv6 Option - Mobile Node Identifier
MIP6OptMobNetPrefix : NEMO Option - Mobile Network Prefix
MIP6OptMsgAuth : MIPv6 Option - Mobility Message Authentication
MIP6OptNonceIndices : MIPv6 Option - Nonce Indices
MIP6OptReplayProtection : MIPv6 option - Replay Protection
MIP6OptSignature : MIPv6 option - Signature
MIP6OptUnknown : Scapy6 - Unknown Mobility Option
MobileIP   : Mobile IP (RFC3344)
MobileIPRRP : Mobile IP Registration Reply (RFC3344)
MobileIPRRQ : Mobile IP Registration Request (RFC3344)
MobileIPTunnelData : Mobile IP Tunnel Data Message (RFC3519)
NBNSNodeStatusResponse : NBNS Node Status Response
NBNSNodeStatusResponseEnd : NBNS Node Status Response
NBNSNodeStatusResponseService : NBNS Node Status Response Service
NBNSQueryRequest : NBNS query request
NBNSQueryResponse : NBNS query response
NBNSQueryResponseNegative : NBNS query response (negative)
NBNSRequest : NBNS request
NBNSWackResponse : NBNS Wait for Acknowledgement Response
NBTDatagram : NBT Datagram Packet
NBTSession : NBT Session Packet
NTP        : NTP
NetBIOS_DS : NetBIOS datagram service
NetflowHeader : Netflow Header
NetflowHeaderV1 : Netflow Header V1
NetflowRecordV1 : Netflow Record
NoPayload  : None
PPI        : Per-Packet Information header (partial)
PPP        : PPP Link Layer
PPP_ECP    : None
PPP_ECP_Option : PPP ECP Option
PPP_ECP_Option_OUI : PPP ECP Option
PPP_IPCP   : None
PPP_IPCP_Option : PPP IPCP Option
PPP_IPCP_Option_DNS1 : PPP IPCP Option: DNS1 Address
PPP_IPCP_Option_DNS2 : PPP IPCP Option: DNS2 Address
PPP_IPCP_Option_IPAddress : PPP IPCP Option: IP Address
PPP_IPCP_Option_NBNS1 : PPP IPCP Option: NBNS1 Address
PPP_IPCP_Option_NBNS2 : PPP IPCP Option: NBNS2 Address
PPPoE      : PPP over Ethernet
PPPoED     : PPP over Ethernet Discovery
Packet     : None
Pad1       : Pad1
PadN       : PadN
Padding    : Padding
PrismHeader : Prism header
PseudoIPv6 : Pseudo IPv6 Header
RIP        : RIP header
RIPAuth    : RIP authentication
RIPEntry   : RIP entry
RTP        : RTP
RadioTap   : RadioTap dummy
Radius     : Radius
Raw        : Raw
RouterAlert : Router Alert
SCTP       : None
SCTPChunkAbort : None
SCTPChunkCookieAck : None
SCTPChunkCookieEcho : None
SCTPChunkData : None
SCTPChunkError : None
SCTPChunkHeartbeatAck : None
SCTPChunkHeartbeatReq : None
SCTPChunkInit : None
SCTPChunkInitAck : None
SCTPChunkParamAdaptationLayer : None
SCTPChunkParamCookiePreservative : None
SCTPChunkParamECNCapable : None
SCTPChunkParamFwdTSN : None
SCTPChunkParamHearbeatInfo : None
SCTPChunkParamHostname : None
SCTPChunkParamIPv4Addr : None
SCTPChunkParamIPv6Addr : None
SCTPChunkParamStateCookie : None
SCTPChunkParamSupportedAddrTypes : None
SCTPChunkParamUnrocognizedParam : None
SCTPChunkSACK : None
SCTPChunkShutdown : None
SCTPChunkShutdownAck : None
SCTPChunkShutdownComplete : None
SMBMailSlot : None
SMBNegociate_Protocol_Request_Header : SMBNegociate Protocol Request Header
SMBNegociate_Protocol_Request_Tail : SMB Negociate Protocol Request Tail
SMBNegociate_Protocol_Response_Advanced_Security : SMBNegociate Protocol Response Advanced Security
SMBNegociate_Protocol_Response_No_Security : SMBNegociate Protocol Response No Security
SMBNegociate_Protocol_Response_No_Security_No_Key : None
SMBNetlogon_Protocol_Response_Header : SMBNetlogon Protocol Response Header
SMBNetlogon_Protocol_Response_Tail_LM20 : SMB Netlogon Protocol Response Tail LM20
SMBNetlogon_Protocol_Response_Tail_SAM : SMB Netlogon Protocol Response Tail SAM
SMBSession_Setup_AndX_Request : Session Setup AndX Request
SMBSession_Setup_AndX_Response : Session Setup AndX Response
SNAP       : SNAP
SNMP       : None
SNMPbulk   : None
SNMPget    : None
SNMPinform : None
SNMPnext   : None
SNMPresponse : None
SNMPset    : None
SNMPtrapv1 : None
SNMPtrapv2 : None
SNMPvarbind : None
STP        : Spanning Tree Protocol
SebekHead  : Sebek header
SebekV1    : Sebek v1
SebekV2    : Sebek v3
SebekV2Sock : Sebek v2 socket
SebekV3    : Sebek v3
SebekV3Sock : Sebek v2 socket
Skinny     : Skinny
TCP        : TCP
TCPerror   : TCP in ICMP
TFTP       : TFTP opcode
TFTP_ACK   : TFTP Ack
TFTP_DATA  : TFTP Data
TFTP_ERROR : TFTP Error
TFTP_OACK  : TFTP Option Ack
TFTP_Option : None
TFTP_Options : None
TFTP_RRQ   : TFTP Read Request
TFTP_WRQ   : TFTP Write Request
UDP        : UDP
UDPerror   : UDP in ICMP
USER_CLASS_DATA : user class data
VENDOR_CLASS_DATA : vendor class data
VENDOR_SPECIFIC_OPTION : vendor specific option data
VRRP       : None
X509Cert   : None
X509RDN    : None
X509v3Ext  : None
_DHCP6GuessPayload : None
_DHCP6OptGuessPayload : None
_ICMPv6    : ICMPv6 dummy class
_ICMPv6Error : ICMPv6 errors dummy class
_ICMPv6ML  : ICMPv6 dummy class
_IPOption_HDR : None
_IPv6ExtHdr : Abstract IPV6 Option Header
_MobilityHeader : Dummy IPv6 Mobility Header  

****************************

Para instalar el módulo de Scapy en un linux podríamos hacer pip install scapy. Pip es el gestor de modulos de python. Podemos instalar Pip mediante:
wget https://bootstrap.pypa.io/get-pip.py y luego python get-pip.py.

Para instalar Scapy en Windows vamos a realizar el procedimiento documentado, con una salvedad. Los módulos necesarios para que funcione Scapy sobre Windows son para Python 2.6, y no 2.7.10 como está la versión actual, por lo que desinstala y vuelve a instalar la versión necesaria. Una vez instalada la versión menor, cambio en Pycharm en File-Settings la ubicación del interprete Python.



Bajar Scapy en zip. (2.3.1) descomprimir y ejecutar python setup.py install
pywin32-214.win32-py2.6.exe
pcap-1.1-scapy-20090720.win32-py2.6.exe
dnet-1.12.win32-py2.6.exe

Si todo te ha salido bien, y has metido en el Path de windows el directorio c:\python26\ y c:\python26\scripts\ podrás entrar al cmd, a cualquier carpeta, y ejecuta scapy. Verás el prompt y podrás probar ls() para listar todos los módulos disponibles en Scapy.


En el próximo episodio probaremos mas cosas con Scapy dentro y fuera de un script Python.

Si quieres avanzar un poco más rápido que con este manual sobre Scapy, te sugiero la serie de artículos del SR. Alfon en su blog Seguridad y redes.

Gracias por leerme !!!!