Creando nuestro port Scanner en python!

Iniciado por alearea51, 28 Febrero 2015, 17:08 PM

0 Miembros y 1 Visitante están viendo este tema.

alearea51

Hola nuevamente. En esta entrada me gustaría mostrarles como crear un scanner de puertos sencillo. Como reza el título, lo haré en Python. El código se encuentra en el libro "Violent Python" , igualmente (para el que no quiera bajarse el PDF) colocaré el enlace al script al final del artículo. Para que se entienda el funcionamiento, voy a mostrar el script por porciones e iré explicando que acciones va realizando.

Para este script usaremos las librerias "optparse" y "socket"

optparse: Nos sirve para parsear opciones de línea de comando (quizás ahora suene extraño pero ya comprenderemos su funcionamiento al utilizarlo).

Warning! ---> Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the argparsemodule. (no importa, sirve a nuestros fines jeje)

socket: Esta librería, como se imaginarán, nos permite manejar los sockets; ponerlos a la escucha, recibir, enviar,data etc.


Descripción aquí ---> http://docs.python.org/library/socket.html

En la descripción veremos todas las funciones que posee esta librería. Las que nos interesan para nuestro port scanner son las siguientes:


Citarsocket.gethostbyname(hostname) – This function takes a hostname such
as www.google.com and returns an IPv4 address format such as
69.163.177.2.

socket.gethostbyaddr(ip address) – This function takes an IPv4 address
and returns a triple containing the hostname, alternative list of
host names, and a list of IPv4/v6 addresses for the same interface
on the host.

socket.socket([family[, type[, proto]]]) – This function creates an
instance of a new socket given the family. Options for the socket
family are AF_INET, AF_INET6, or AF_UNIX. Additionally, the socket
can be specified as SOCK_STREAM for a TCP socket or SOCK_DGRAM for
a UDP socket. Finally, the protocol number is usually zero and is
omitted in most cases.

socket.create_connection(address[, timeout[, source_address]]) – This
function takes a 2-tuple (host, port) and returns an instance of a
network socket. Additionally, it has the option of taking a timeout
and source address.

Comenzamos..

Como mencionamos arriba, utilizaremos las librerias optparse y socket, así que a darle al import:

Código (python) [Seleccionar]
import optparse
import   socket
from socket import *

Luego,  definimos la función que se conectará al host:

def connScan(tgtHost, tgtPort):   #definimos la función y le pasamos los parámetros
   try:
        connSkt = socket(AF_INET, SOCK_STREAM) '''definimos la familia de socket e indicamos que es un socket TCP'''

        connSkt.connect((tgtHost, tgtPort)) #Nos conectamos al host y puerto elegidos
        connSkt.send('Hi') #Enviamos algo al destino
        results = connSkt.recv(100) #Guardamos la respuesta
        print '[+]%d/tcp open'% tgtPort
        print '[+] ' + str(results) #Mostramos los resultados
        connSkt.close()
   except:
        print '[-]%d/tcp closed'% tgtPort    '''si nos devuelve un error, mostramos en pantalla que el puerto esta cerrado'''


def portScan(tgtHost, tgtPort):  #definimos la función que escaneará el puerto
  try:
        tgtIP = gethostbyname(tgtHost) '''utilizamos la función gethostbyname para resolver el host'''
  except:
        print "[-] Cannot resolve '%s': Unknown host"%tgtHost
        return
  try:
     tgtName = gethostbyaddr(tgtIP) #Resolvemos el hostname pasandole la ip
     print '\n[+] Scan Results for: ' + tgtName[0] #Mostramos el hostname resuelto
  except:
     print '\n[+] Scan Results for: ' + tgtIP
     setdefaulttimeout(1)
  print 'Scanning port ' + str(tgtPort)
  connScan(tgtHost, int(tgtPort)) '''Llamamos a la función que se conectará para traernos el resultado open/close y luego, si está abierto el puerto realizará el banner grabbing'''

Definimos la función principal:

def main():

'''Acá esta lo que comentaba mas arriba, gracias a optparse podemos manejar mucho mejor las lineas de comando a la hora de solicitar al usuario que ingrese datos. Nos permite mostrar opciones cuando el usuario no ingresa una opción (valga la redundancia cíclica jeje) o utiliza el comando help'''

parser = optparse.OptionParser('usage %prog -H ' +  '<target host> -p <target port>')
parser.add_option('-H' , dest='tgtHost', type='string' ,  help='specify target host')
parser.add_option('-p' , dest='tgtPort', type='int' ,  help='specify target port')

(options, args) = parser.parse_args()
tgtHost=options.tgtHost
tgtPort=options.tgtPort
if (tgtHost == None) | (tgtPort==None): '''Si uno de los dos parámetros no está hacemos que vuelva a ejecutarse el script (con exit(0)), mostrando el mensaje de opciones que deben ingresarse'''
     print parser.usage
              exit(0)
       portScan(tgtHost, tgtPort)

main()

Espero que sea de utilidad.

Pueden ver mas en:

http://mamaquieroserpentester.blogspot.com.ar/2015/02/armando-un-port-scanner-en-python.html

Mod: al publicar posts usa las etiquetas adecuadas (code, quote, GeSHi, etc) y publicalo en la sección correcta, esto es scripting

engel lex

optparse como viste está deprecated... es mejor adaptarse que usar una función descontinuada... y en ese caso no me tomó 5 minutos hacer la traducción sin conocimientos de esa función

Código (python) [Seleccionar]
import argparse

parser = argparse.ArgumentParser(prog='usage %prog -H ' +  '<target host> -p <target port>')
parser.add_argument('-H' , dest='tgtHost' ,  help='specify target host')
parser.add_argument('-p' , dest='tgtPort', type=int ,  help='specify target port')
values = parser.parse_args()
tgtHost=values.tgtHost
tgtPort=values.tgtPort

if (tgtHost == None) | (tgtPort==None):
      print parser.print_help()
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.