Tabla de Contenidos
Recopilación de información con sockets
Módulo perteneciente al curso Python avanzado para proyectos de seguridad
Los métodos útiles para recopilar más información son:
gethostbyaddr(dirección): nos permite obtener un nombre de dominio a partir de la dirección IP.gethostbyname(hostname): nos permite obtener una dirección IP a partir de un nombre de dominio.
Podemos obtener más información sobre estos métodos con el comando de help(socket):
Ahora vamos a detallar algunos métodos relacionados con el host, la dirección IP y la resolución del dominio. Para cada uno, mostraremos un ejemplo simple:
socket.gethostbyname(hostname)
Este método convierte un nombre de host al formato de dirección IPv4. La dirección IPv4 se devuelve en forma de cadena. Este método es equivalente al comando nslookup que podemos encontrar en muchos sistemas operativos:
>>> import socket >>> socket.gethostbyname('packtpub.com') '83.166.169.231' >>> socket.gethostbyname('google.com') '216.58.210.142'
socket.gethostbyname_ex(nombre)
Este método devuelve muchas direcciones IP para un solo nombre de dominio. Significa que un dominio se ejecuta en múltiples IP
>>> socket.gethostbyname_ex('packtpub.com') ('packtpub.com', [], ['83.166.169.231']) >>> socket.gethostbyname_ex('google.com') ('google.com', [], ['216.58.211.46'])
Un dominio es un sistema de denominación servidores en Internet el cual está formado por un conjunto de caracteres que identifica un sitio de la red accesible por un usuario. Cada dominio es administrado por un servidor de dominios (DNS). Los más comunes son .com, .edu, .net, .org y .es
Otro de los métodos que disponemos en la clase sockets es el que permite obtener el nombre cualificado de un dominio:
>>> socket.getfqdn('google.com')
socket.gethostbyaddr(ip_address)
Este método devuelve una tupla (hostname, nombre, ip_address_list) donde hostname es el nombre de host que responde a la dirección IP dada, el nombre es una lista de nombres asociados con la misma dirección ip_address_list es una lista de direcciones IP para la misma interfaz de red en el mismo host.
>>> socket.gethostbyaddr('8.8.8.8') ('google-public-dns-a.google.com', [], ['8.8.8.8'])
socket.getservbyname(servicename [,nombre_protocolo])
Este método le permite obtener el número de puerto del nombre del puerto:
>>> import socket >>> socket.getservbyname('http') 80 >>> socket.getservbyname('smtp','tcp') 25
socket.getservbyport(puerto [, nombre_protocolo])
Este método realiza la operación inversa de la anterior, lo que le permite obtener el nombre del puerto a partir del número de puerto:
>>> socket.getservbyport(80) 'http' >>> socket.getservbyport(23) 'telnet'
Ejemplo para los métodos de socket
El siguiente script es un ejemplo de cómo podemos usar estos métodos para obtener información de los servidores de Google.
Puede encontrar el siguiente código en el archivo sockets_metodos.py:
# -*- encoding: utf-8 -*- import socket import sys try: print("gethostbyname") print(socket.gethostbyname_ex('www.google.es')) print("\ngethostbyaddr") print(socket.gethostbyaddr('216.58.211.228')) print("\ngetfqdn") print(socket.getfqdn('www.google.com')) except socket.error as error: print (str(error)) print ("Error de conexion") sys.exit()
socket.getfqdn obtiene el nombre de dominio que identifica unívocamente a un servidor en Internet.
Búsqueda inversa
Este comando obtiene el nombre de host de la dirección IP. Para esta tarea, podemos usar la función gethostbyaddr().
En este script, obtenemos el nombre de host de la dirección IP de 8.8.8.8.
Puede encontrar el siguiente código en el archivo socket_reverse_lookup.py
#!/usr/bin/env python # --*-- coding: UTF-8 --*-- import sys, socket try : result=socket.gethostbyaddr("8.8.8.8") print("The host name is:") print(" "+result[0]) print("\nAddress:") for item in result[2]: print(" "+item) except socket.herror as e: print("error for resolving ip address:",e)
Actividad práctica
Dado un nombre de dominio introducido por la entrada estándar por parte del usuario, obtener información relación con dicho dominio como dirección IP, host asociado y nombre cualificado del dominio.
import socket dominio = input() try: print("Obtener ip a partir del nombre dominio:") ip = socket.xxx(xxx) print(ip) print("\nObtener host a partir de la direccion ip") print(socket.xxx(str(ip))) print("\nObtener nombre cualificado de un dominio") print(socket.xxx(dominio)) except socket.error as error: print (str(error)) print ("Error de conexion")
Completar el script anterior sustituyendo las xxx por variables y métodos del módulo socket.
Solución:
import socket dominio = input() try: print("Obtener ip a partir del nombre dominio:") ip = socket.gethostbyname(dominio) print(ip) print("\nObtener host a partir de la direccion ip") print(socket.gethostbyaddr(str(ip))) print("\nObtener nombre cualificado de un dominio") print(socket.getfqdn(dominio)) except socket.error as error: print (str(error)) print ("Error de conexion")

