¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Hacking y Forensic
  3. La red
Extrait - Hacking y Forensic Desarrolle sus propias herramientas en Python
Extractos del libro
Hacking y Forensic Desarrolle sus propias herramientas en Python Volver a la página de compra del libro

La red

Introducción

Un ordenador sin conexión a Internet no es realmente útil en nuestros días, salvo en raras ocasiones. Lleve a cabo la experiencia de sentarse ante su equipo y desconectar la Red: no más búsquedas en Google u otros, no más chat con los amigos, no más Facebook...

Todo pasa, por tanto, a través de una conexión y, por tanto, por los sockets.

Nos encontramos como definición en Wikipedia:

«En los orígenes de Internet, las primeras computadoras en implementar sus protocolos fueron aquellas de la Universidad de Berkeley. Dicha implementación tuvo lugar en una variante del sistema operativo Unix conocida como BSD Unix. Pronto se hizo evidente que los programadores necesitarían un medio sencillo y eficaz para escribir programas capaces de intercomunicarse entre sí.

Esta necesidad dio origen a la primera especificación e implementación de sockets, también en Unix. Hoy día, los sockets están implementados como bibliotecas de programación para multitud de sistemas operativos, simplificando la tarea de los programadores. Socket designa un concepto abstracto por el cual dos programas (posiblemente situados en computadoras distintas) pueden intercambiar cualquier flujo de datos, generalmente de manera fiable y ordenada.

El término socket es también usado como el nombre de una interfaz de programación de aplicaciones...

Los sockets

1. Creación de un socket

La biblioteca socket de Python nos permitirá acceder a los servicios deseados. Si existe una biblioteca de red que conviene conocer y saber utilizar, es esta.

Veremos por supuesto posteriormente otras bibliotecas específicas a los servicios citados en la introducción, pero con la biblioteca socket podremos hacerlo todo. Esta requerirá por lo menos conocer la norma utilizada para las comunicaciones TCP, UDP y los diferentes servicios. Para esto, dejaremos que consulte las RFC correspondientes.

Creación de un socket y conexión a un sitio web: cap2_exo1.py


import socket  
print 'creación de socket ...'  
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
print 'socket efectuado' 
print "conexión al host remoto" 
s.connect(('www.ediciones-eni.com',80)) 
print 'conexión efectuada' 
 

No tenemos aquí grandes dificultades en cuanto a la comprensión de este código.

La librería socket se importa al principio del script.

Creamos entonces el objeto socket precisando mediante AF_INET que usaremos IPv4 indicándole el protocolo (SOCK_STREAM para TCP y SOCK_DGRAM para UDP).

Para conectar con el host remoto (connect) utilizaremos lo que se denomina una tupla, con un doble paréntesis conteniendo la dirección IP y el puerto.

Con la ejecución de este script no ocurrirá nada ya que establecemos una conexión sin intercambio de datos, pero estaremos conectados con el host remoto.

Para gestionar los acentos con Python, debemos añadir al principio del código fuente: # -*- coding: iso-8859-1 -*-. iso-8859-1 podrá ser sustituida por la codificación utilizada por el sistema operativo (UTF-8, windows-1252, cp-1252).

2. Intercambio de datos

Una vez establecida la conexión, podemos enviar y recibir datos. 

La comunicación con el socket podrá efectuarse con mucha facilidad gracias a dos funciones, send() y recv().

  • send() => TCP

  • sendto() => UDP

  • recv() => TCP

  • recvfrom() => UDP

cap2_exo2.py


import socket  
print 'creación de socket ...'   
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
print 'socket creado'  
print "conexión al host remoto"  
s.connect(('www.ediciones-eni.com',80))...

Creación de un servidor

1. Introducción

Debemos pasar por cuatro etapas para crear un servidor:

  • Crear el socket.

  • Proporcionar las opciones al socket (opcional).

  • Vincular a un puerto.

  • Después, estar a la escucha para las conexiones.

cap2_exo7.py


host=''   
port=1234   
s=socket.socket(socket.AF_INET,SOCK_STREAM)   
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)   
s.bind((host,port))   
s.listen(5) 
 

Si no tenemos en cuenta en el código anterior las dos líneas host y puerto, encontraremos nuestras cuatro etapas de creación del servidor, un paso por línea.

No repasaremos la creación del objeto socket que hemos visto antes.

La siguiente línea es opcional y las opciones predeterminadas son adecuadas para la mayoría de los programas, pero veamos las diferentes posibilidades.


s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
 

Las opciones

setsockopt(level,optname,value)

level: .SOL_SOCKET: trabajamos con los sockets.

optname:

  • SO_BINDTODEVICE: el socket es válido para una tarjeta de red especificada en Value (nombre de la tarjeta).

  • SO_BROADCAST: permite la transmisión y recepción de paquetes de broadcast. Value: booleano.

  • SO_DONTROUTE: se prohíbe a los paquetes pasar a través de los routers y las pasarelas. Value: booleano.

  • SO_KEEPALIVE: permite la transmisión de paquetes llamados ’’keep alive’’. Estos paquetes permiten saber a todos los nodos que la conexión sigue activa cuando no se envían datos. Value: booleano.

  • SO_REUSEADDR: el puerto utilizado puede reutilizarse de inmediato una vez que el socket se cierra. Value: booleano.

La línea siguiente permitirá vincular (bind) la dirección IP con el puerto definido.


s.bind((host,port))
 

No tenemos todavía un puerto abierto en la máquina; en nuestro ejemplo, el puerto 1234 estará vinculado a la tarjeta de red del host (host= ’ ’).

Podemos definir para host la dirección IP de la tarjeta deseada si tenemos varias tarjetas de red.


host = socket.gethostbyname(socket.gethostname())
 

Hemos seleccionado antes la interfaz de red pública (conectada a la red).

Después del código siguiente, el puerto se abre en el equipo.


s.listen(5) 
 

El número entre paréntesis es el número máximo de conexiones aceptadas...

DNS: Domain Name Server

1. Introducción

El DNS es un servidor que nos va a permitir transformar una dirección web (www.ediciones-eni.com) en una dirección IP (185.42.28.201).

Sin este servidor, nos veríamos obligados a conocer de memoria las direcciones IP de todos los sitios que deseáramos visitar.

a. ¿Qué significa DNS?

DNS significa varias cosas:

  • Domain Name System: todos los organismos que gestionan los nombres de dominio.

  • Domain Name Service: el protocolo que permite intercambiar la información correspondiente a los dominios.

  • Domain Name Server: un equipo sobre el que funciona una aplicación servidor que implementa el protocolo DNS y que puede responder a preguntas relativas a un dominio.

¿Qué ocurre cuando escribimos http://www.ediciones-eni.com/index.html?

  • Su equipo pide a los servidores DNS de su proveedor de acceso las direcciones IP de los servidores DNS del dominio "ediciones-eni.com".

  • Su equipo se conecta a un servidor DNS para pedir la dirección IP del equipo "www".

  • Su navegador se conecta a esta dirección IP en el puerto 80 y solicita la página "index.html" (empleando el protocolo HTTP).

Este escenario no es siempre cierto: la mayoría de los servidores DNS y los sistemas operativos van a servir de caché y conservar en memoria las direcciones solicitadas con mayor frecuencia.

b. Principales registros DNS

Cuando un servicio genera un tráfico importante, puede emplear la técnica del DNS Round-Robin (RR o puerta giratoria), que consiste en asociar varias direcciones IP a un nombre de dominio.

El tipo de RR se codifica en 8 bits, IANA conserva el registro de los códigos asignados. Los principales registros definidos son los siguientes:

  • A record o address record que hace corresponder un nombre de host con una dirección IPv4 de 32 bits distribuidos en cuatro bytes, por ejemplo: 123.234.1.2.

  • AAAA record o IPV6 address record que hace corresponder un nombre de host con una dirección IPv6 de 128 bits distribuidos en dieciséis bytes.

  • CNAME record o canonical name record que permite hacer que un dominio sea un alias para otro. Este alias hereda todos los subdominios del original.

  • MX record o mail exchange record que define los servidores de correo electrónico para este dominio.

  • PTR record o pointer que asocia una dirección IP a un registro de nombres de dominio...

FTP: File Transfer Protocol

1. Introducción

El estándar de la RFC es RFC959.

Puede encontrarla en www.faqs.org/rfcs/rfc959.html.

Veamos los pasos para una conexión FTP:

  • En primer lugar, el cliente FTP establece una petición de conexión al puerto del servidor FTP.

  • El cliente se autentica.

  • El cliente comienza a escuchar los datos de conexión en un nuevo puerto e informa al servidor que este nuevo puerto está abierto.

  • El servidor se conecta al puerto del cliente.

  • Luego el archivo se transfiere y la conexión de datos se cierra.

La primera aproximación al estudio de FTP con Python será un intento de entrar en un servidor FTP que acepte conexiones anónimas.

Mediante búsquedas con Google, podremos encontrar muchos sitios en los que se pueden probar sus programas.

También puede instalar en su máquina un servidor FTP como Ability Server en Windows o VsFtpd en Linux.

2. FTP anónimo

cap2_exo18.py


#!/usr/bin/env python   
# --*-- coding: UTF-8 --*--   
from ftplib import FTP   
f=FTP('ftp.obspm.fr')   
print "Hola: ",f.getwelcome()   
f.login()   
print "CWD:",f.pwd()   
f.quit() 
 

Utilizaremos, la librería ftplib.

Esta librería contiene un método FTP.

La conexión al sitio es bastante sencilla, basta con crear un objeto ftp llamado f y pasarle como parámetro la dirección del sitio deseado.

El método getwelcome() permite recuperar la cabecera devuelta por el servidor FTP en el momento de la conexión.

La función login() puede tomar varios parámetros como el nombre de usuario y la contraseña. Si se invoca sin parámetros, envía como usuario ’anonymous’ y una contraseña genérica al servidor FTP.

PWD() permite ver el directorio actual del sitio FTP remoto.

El método quit() permite cerrar de forma correcta la conexión antes establecida.

Resultado de cap2_exo18.py


javier@Debian8:~/python/cap2$ ./cap2_exo18.py  
Hola:  220 ftp.obspm.fr FTP server ready.   
CWD: / 
javier@Debian8:~/python/cap2$
 

3. Descargas de archivos ASCIII

Con FTP, se puede descargar en modo ASCII o binario (imágenes, archivos PDF, ejecutables...).

En modo ASCII, los archivos se transfieren por líneas, lo que permite al cliente almacenar...

Las expresiones regulares

1. Introducción

Hemos abordado en el capítulo Python: Los fundamentos las expresiones regulares. Vamos a retomarlas con detalle partiendo de un caso complejo como es el ADN.

Comprender las palabras y jugar con las mismas es algo imposible para nuestros ordenadores. Paradójico cuando se sabe que estos fueron en sus orígenes diseñados para tratar la información. Para remediar esto, hubo que pensar en una herramienta, tan poderosa como complejos son sus procesamientos, para comprender los objetos como las palabras y efectuar sobre ellas procesamientos, las regex (expresiones regulares).

Necesitamos con frecuencia filtrar la información, poder poner de manifiesto el elemento importante de una página web, por ejemplo, o los subdominios definidos en la página, o los mails de los empleados contenidos en la página.

Para esto, necesitamos las expresiones regulares. Una expresión regular es en informática una cadena de caracteres que a veces se conoce como un patrón y que describe un conjunto de cadenas de caracteres posibles, según una sintaxis específica.

Por ejemplo, podríamos pensar en el ADN: la representación de la escritura sería una serie de A, G, T y C (para representar las bases nitrogenadas que son la Adenina, Guanina, Timina y Citosina).

Así, para comprobar que una cadena de caracteres corresponde a la descripción de una cadena de ADN, es necesario que la expresión verifique la afirmación "cada carácter de esta cadena pertenece exclusivamente al grupo compuesto por las letras A,C,G,T".

Es un ejemplo simple de expresión regular, a continuación definiremos los términos utilizados. Hablaremos primero de la cadena de caracteres, lo que se pasa como comentario. Diremos que una cadena de caracteres corresponde o no a una expresión regular.

"ATCGCT" corresponde a nuestra expresión regular, mientras que "ATBDKL" no corresponde.

También podemos hablar de correspondencia de una expresión regular con una cadena de caracteres. Esto se expresa por el verbo to match en inglés.

Por supuesto, el caso de que la cadena completa corresponda a la expresión regular no siempre se cumple, pero si una subcadena corresponde, hablaremos entonces de correspondencia de una parte de la cadena...

La Web

1. Introducción

La "toma de huellas", es decir, la búsqueda de información sobre una persona, una entidad o empresa, es el elemento primordial para un ataque exitoso. Es la parte del trabajo que tomará más tiempo.

Se debe conocer de forma precisa al objetivo. Para esto, están disponibles herramientas y sitios web tales como Maltego, 123people, las redes sociales y otros.

Pero ocurre, y con más frecuencia de lo que se puede imaginar, que estas herramientas resultan demasiado genéricas y no responden a la necesidad o que el flujo de información recibido es demasiado voluminoso para poder ser tratado de forma rápida.

Entonces es necesario crear herramientas. Para la búsqueda de información en un sitio web, vamos a utilizar las librerías web como urllib, urllib2 y las expresiones regulares vistas antes.

2. Recuperación de una página fuente

La librería utilizada será urllib2.

Aquí nos serán útiles dos métodos: Request() y urlopen().

cap2_exo25.py


#!/usr/bin/env python   
# ­­*­­ coding: UTF­8 ­­*­­   
import sys, urllib2   
req=urllib2.Request(sys.argv[1])   
fd=urllib2.urlopen(req)   
while 1:   
    data=fd.read(1024)   
    if not len(data):   
        break   
    print data 
 

Resultado de la página de Ediciones ENI


javier@Debian8:~/python/cap2$ ./cap2_exo25.py  
http://www.ediciones-eni.com  
  
<!DOCTYPE html>  
<html id="ctl00_html" xmlns="http://www.w3.org/1999/xhtml" lang="es">  
<head id="ctl00_Head1"><title>  
        Ediciones ENI es editor de libros inform&#225;ticos  
</title>  
    <a href="https://plus.google.com/112326652557810849753"  
rel="publisher"></a>  
    <meta name="description" content="Ediciones ENI es editor de libros  
inform�ticos, soportes de curso y de formaci�n, CD-ROM de formaci�n,  
formaci�n en l�nea acompa�ada o no por un formador, soluci�n e-learning  
MEDIAplus. Venta en l�nea." /><meta name="keywords"...

Analizar páginas HTML y XHTML

1. Introducción

A veces, resulta bastante difícil construir una expresión regular para filtrar la información deseada.

Python cuenta con un módulo llamado HTMLParser que nos permitirá analizar nuestras páginas web de forma más sencilla.

2. Primer enfoque

Vamos a partir de un documento HTML sencillo que vamos a escribir nosotros mismos.

Documento de partida: cap2_HTML.html


<HTML> 
<HEAD> 
<TITLE> Título del documento </TITLE> 
</HEAD> 
<BODY> 
Aquí el cuerpo del texto 
</BODY> 
</HTML>
 

Veremos cómo recuperar de forma inmediata el título de este documento.

cap2_exo29.py


#!/usr/bin/env python   
  
from HTMLParser import HTMLParser   
import sys   
  
class TitleParser(HTMLParser):   
        def __init__(self):   
                self.title=""   
                self.readingtitle=0   
                HTMLParser.__init__(self)   
  
        def handle_starttag(self,tag,attrs):   
                if tag=='title':   
                        self.readingtitle=1   
  
        def handle_data(self,data):   
                if self.readingtitle:   
                        self.title += data   
  
        def handle_endtag(self,tag):   
                if tag=="title":   
                        self.readingtitle=0   
  
        def gettitle(self):   
                return self.title   
  
fd=open(sys.argv[1])   
tp=TitleParser()   
tp.feed(fd.read())   
print "El título es: ",tp.gettitle() 
 

Resultado...

El XML

1. Introducción

El lenguaje XML es independiente del programa, legible, normalizado por el W3C y de estructura jerárquica. Existen otros puntos fuertes interesantes en este lenguaje.

Un archivo XML es un simple archivo de texto con extensión .xml que permite almacenar información formateada siguiendo determinadas necesidades.

Cada dato se almacena entre dos tags o etiquetas XML. El ejemplo más conocido de la utilización de XML es HTML, pero también es posible utilizar XML para almacenar datos en bruto, basta con analizar luego (parsear) este archivo para recuperar su contenido.

2. Representación de un archivo XML


<?xml version= "1.0"?> 
    <Resumen> 
          <!--esto es un ejemplo--> 
                <título> Programación Python</título> 
                      <capítulo número= "1">  
                            <título> Introducción</título> 
                            <fecha año= "2012" dia="14" mes="Enero"/> 
                            <img src="logo.jpg"/>  
                            <autor>Ebel Franck</autor> 
                      </capítulo> 
                      <capítulo número= "2"> 
                            <título> Introducción</título>  
                            <fecha año= "2012" dia="15" mes="Enero"/> 
                            <img src="logo2.jpg"/> 
      ...

Los e-mails

1. Introducción

Los e-mails son hoy en día moneda corriente. Todo pasa a través de ellos.

Es posible falsificarlos con relativa facilidad una vez que se conoce su funcionamiento.

Comencemos por falsificar un e-mail usando la utilidad netcat:

Ejemplo 1: e-mail falsificado mediante netcat


Bash-3.2# nc -vv smtp.free.fr 25   
smtp.free.fr [212.27.48.4] 25 (smtp) open   
220 smtp1-g19.free.fr ESMTP Postfix   
helo free   
250 smtp1-g19.free.fr   
MAIL FROM:fasm@acissi.net   
250 Ok   
RCPT TO:franck.ebel@univ-valenciennes.fr   
250 Ok   
data   
354 End data with <CR><LF>.<CR><LF>   
Subject: mail con nc   
Date : 26 de diciembre de 2011 
hola, 
prueba de mail 
. 
 

Podemos crear con facilidad un mail a mano, el ejemplo anterior nos lo demuestra, pero por supuesto tras la recepción podemos ver que este mail no está completo y, por lo tanto, detectar el defecto.

Ejemplo 2


 #!/bin/bash   
if [[ $# != 2 ]]; then   
echo "usage: ./mail.sh mail_source mail_destination"   
exit   
fi   
{   
echo "hola smtp.univ-valenciennes.fr";   
echo "MAIL FROM:$1";   
echo "RCPT TO: $2";   
echo "data";   
echo "Message-ID: <4CDE66FB.5080406@univ-valenciennes.fr>";   
echo "Date: Thu, 27 Oct 2011 11:22:51 +0100";   
echo "From: $1";   
echo "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;   
rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6";   
echo "MIME-Version: 1.0";   
echo "To: $2";   
echo "Subject:test eni";   
echo "Content-Type: text/plain; charset=ISO-8859-1";   
echo "Content-Transfer-Encoding: 7bit";   
echo "Hola eni";   
echo "Test de mail";   
echo "Segunda línea";   
echo "Saludos";   
echo " ";   
echo " ";   
echo ".";   
echo " ";   
echo "QUIT";   
}| nc -vv direccion_de_su_servidor_mail 25
 

En este ejemplo hemos falsificado...

SSL y Python

1. Introducción

Dos módulos separados en Python ofrecen a los desarrolladores la posibilidad de incorporar SSL en sus aplicaciones.

No veremos aquí la explicación del protocolo SSL ni su funcionamiento, existen muchos libros publicados sobre el tema.

En la biblioteca socket vista antes existe un método para utilizar SSL. La implementación en socket es realmente básica y no es capaz de autenticar un cliente remoto en un servidor.

La segunda posibilidad es utilizar pyOpenSSL, otro módulo. Es una interfaz del popular OpenSSL, mucho más potente y compleja.

Utilizaremos, en lo sucesivo, este último módulo.

2. Utilización de OpenSSL

Empecemos por un ejemplo de script básico.

cap2_exo40.py


#!/usr/bin/env python   
#coding:utf-8   
  
import socket, sys   
from OpenSSL import SSL   
  
ctx=SSL.Context(SSL.SSLv23_METHOD)   
print u"Creación del socket ...",   
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
print "socket creado\n"   
  
ssl=SSL.Connection(ctx,s)   
print "Establecimiento de SSL...",   
ssl.connect(('www.openssl.org',443))   
print u"conexión efectuada"   
  
print "Consulta solicitada...",   
ssl.sendall("GET / HTTP/1.0\r\n\r\n")   
print "Consulta efectuada"   
  
while 1:   
        try:   
                buf=ssl.recv(4096)   
        except SSL.ZeroReturnError:   
                break   
        print buf   
ssl.close() 
 

Extracto del resultado del script cap2_exo40.py


javier@Debian8:~/python/cap2$   
./cap2_exo40.py   
Creación del socket ... socket creado   
  
Establecimiento de SSL... conexión efectuada   
Consulta solicitada... Consulta efectuada  
HTTP/1.1 200 OK   
Date: Sat, 14 Jan 2012 18:53:09 GMT   
Server: Apache/2.2.20 (OpenPKG/CURRENT)   
Last-Modified: Wed, 04 Jan 2012 19:42:25 GMT   
ETag: "2ef6e-3eac-4b5b903d96a40"   ...

La utilización de bases de datos

1. Introducción

Encontraremos con frecuencia en nuestra vida de informático bases de datos, ya sea en las aplicaciones o en sitios web dinámicos. Existen varios tipos de bases de datos, la base de datos relacional más popular es MySQL.

Existen varias herramientas en Python para gestionar estas distintas bases de datos.

2. MySQLdb

a. Recordatorio

Para continuar, vamos a necesitar un servidor MySQL al que vamos a añadir algunos datos:


mysql -p  
CREATE DATABASE python_db;  
USE python_db;  
CREATE TABLE IF NOT EXISTS USER(id int auto_increment PRIMARY KEY,  
pseudo text);  
INSERT INTO USER (pseudo) VALUES ('Francisco');  
INSERT INTO USER (pseudo) VALUES ('Juan');  
INSERT INTO USER (pseudo) VALUES ('Sebastián');  
INSERT INTO USER (pseudo) VALUES ('Guillermo');
 

Tenemos ahora una pequeña base de datos y una pequeña tabla, la base de datos está destinada a contener una o varias tablas.

Nuestra tabla contiene dos columnas (atributos). La primera es un entero que se incrementa de forma automática con cada inserción. La segunda contiene el pseudónimo del usuario.

Insertamos cuatro valores (los ids se incrementarán de 1 a 4). Cada línea de esta tabla se denomina tupla. Las principales acciones que se pueden llevar a cabo en una base de datos son las siguientes:

  • Conectarse

  • Listar los elementos de una tabla (comando SELECT)

  • Añadir un elemento en una tabla (comando INSERT)

  • Actualizar una tupla (comando UPDATE)

  • Actualizar una estructura (comando ALTER)

  • Destruir los datos o las tablas (comandos DROP y DELETE)

b. Utilización


import MySQLdb  
vinculo_db=MySQLdb.connect(host= "localhost", user="root",  
passwd="", db="test")
 

Importamos el módulo y luego hacemos una llamada a una de sus funciones con parámetros con etiquetas (lo que permite pasarlos sin un orden concreto).

Nos conectamos entonces a una base de datos situada en el equipo localhost, que corresponde a nuestro equipo local.

Nos conectamos como root con una contraseña vacía y a la base de datos TEST.

Por defecto, MySQL no establece una contraseña para root y deja una base de datos vacía denominada "TEST".

Contemple configurar...

Conclusión

Hemos recorrido las principales librerías y métodos para una programación de red. Existen también otras como pycurl por ejemplo. Por supuesto no podemos estudiar todas estas librerías en detalle.

Una búsqueda personal y vigilancia constante son necesarias para mantenerse actualizado en Python pero también, y sobre todo, las herramientas de hacking disponibles en Internet que, en la mayoría de los casos, están codificadas en Python (wapiti, hachoir...). 

El capítulo Red: la librería Scapy está completamente dedicado a una librería particular escrita por un francés.

Pero antes de esto, vamos a aplicar los conocimientos adquiridos a través de ejercicios prácticos.

El objetivo para un mejor aprendizaje es leer el enunciado, y luego intentar crear el script sin mirar la corrección.

Puesta en práctica

1. Caso 1: Escaneo de puertos

Enunciado

Requisitos previos: socket.

Objetivo: saber programar un socket en Python.

Enunciado:

Va a crear un script Python que escanee los puertos de un host remoto del cual conoce la dirección IP.

Los puertos escaneados serán los puertos 21, 22, 25, 53, 80, 139, 443, 1080, 3128, 8080, 8081.

Mostrará en pantalla la lista de puertos abiertos y la lista de puertos cerrados.

La dirección IP a escanear se solicitará al usuario.

Corrección

cap2_tp1.py


#!/usr/bin/env python 
#--*--coding:UTF-8--*-- 
 
 
# Importamos los módulos 
import socket 
import errno 
 
# Creación de 3 listas : para el conjunto de puertos a escanear,  
# otra para guardar los puertos abiertos y una más para los  
# puertos cerrados 
ports=[21,22,25,53,80,139,443,1080,3128,8080,8081] 
puertoabierto=[] 
puertocerrado=[] 
 
#  Introduzca la dirección IP a escanear por el usuario 
print "Dirección IP a escanear?"   
ip = raw_input() 
 
i = 0 
j = 0 
while i < 10:   
        # Creamos el socket 
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
   retourscan = s.connect_ex((ip,ports[i])) 
   # Para la conexión exitosa 
   if retourscan == 0:   
                # cerramos la conexión 
      s.shutdown(socket.SHUT_RDWR) 
      # cerramos también el socket 
      s.close() 
      # Añadimos el puerto abierto a la lista 
      puertoabierto.append(ports[i]) 
   # Para un error de conexión 
   else:   
      # Error de conexión - Puerto cerrado 
      if errno.errorcode[retourscan]=="ECONNREFUSED":   
         # añadimos el puerto cerrado a la lista 
         puertocerrado.append(ports[i]) 
      # Error de conexión - Indicamos que el host no se  
      # encuentra 
      else:   
         print "Host no encontrado" 
         j = 1 ...