lunes, 11 de febrero de 2019

5 minutos o menos: Modulo bisect en Python

“5 minutos o menos”, es una sección del blog, en la cual te enseño algo sobre Python, y que no duraras mucho en leer.
Hola amigos de Internet. Mi nombre es Luis, y les doy la bienvenida a Mi Diario Python.
En el articulo de hoy, veremos como utilizar el modulo bisect de Python para mantener una lista ordenada a medida que se insertan los datos.
Sí, sí, ya lo se. En Python tenemos la función sort para ordenar elementos de una lista.
Pero utilizar bisect es mucho más eficiente. Con bisect, los
datos se ordenan al introducirlos en la lista. Mucho mejor que llamar a sort cada vez que se inserte un nuevo dato.
Sin más preámbulos, comencemos.

El modulo bisect

El modulo bisect, utiliza un algoritmo de bisección para mantener una lista ordenada a la vez que se insertan nuevos datos.
Veamos los métodos que nos proporciona bisect.

bisect.bisect

El método bisect recibe como parámetros: una lista, y un nuevo elemento.
bisect retorna el índice en el cual el elemento debería insertarse para mantener la lista ordenada.
Recalco que, este método no inserte el elementos, solo nos devuelve el índice en el cual este debería introducirse.
Veamos un ejemplo:
>>> import bisect
>>> lista = [1,3,5,6]
>>> bisect.bisect(lista, 2)
1
>>>
Como pueden observar, el método a retornado el indice en el cual se debe insertar el elemento 2.
Y te preguntaras… de que me sirve esto?.
Por que explicártelo si te puedo mostrar un ejemplo:
>>> def ordenar_al_insertar(lista, elemento):
...  indice = bisect.bisect(lista, elemento)
...  lista.insert(indice, elemento)
>>> nums = [1,7,9,10]
>>> ordenar_al_insertar(nums, 8)
>>> print(nums)
[1,7,8,9,10]
Muy ingenioso No?. Como pueden observar, he utilizado el método insert, el cual recibe como parámetros el indice y el elemento a insertar.

bisect.insort

El método insort es el que hace la magia. Realiza lo que hace la función que he escrito anteriormente. Ordena los datos al insertarlos.
El método, igual que bisect, recibe una lista y el elemento a insertar.
>>> nums = [23,56,78,100]
>>> bisect.insort(nums, 96)
>>> print(nums)
[23,56,78,96,100]
Excelente, todo esta ordenado, como debe estar.
¿Alguna duda? ¿Alguna sugerencia? Déjanos tu comentario y con mucho gusto te responderemos.
Sin más nada que decir. Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Seguir Leyendo

miércoles, 6 de febrero de 2019

Nmap y Python: Escaneo de Puertos

Hola amigos de Internet. Mi nombre es Luis, y les doy la bienvenida a Mi Diario Python.
En el articulo de hoy, veremos como podemos escanear puertos con nmap desde ¨Python.
Te mostrare lo fácil que es extraer información de un host utilizando nmap.
Sin más preámbulos, comencemos.

Instalación de nmap

Para instalar nmap, lo único que debemos hacer, es ingresar el siguiente comando en nuestra terminal o consola.
windows:
py -m pip install python-nmap

Linux:
python -m pip install python-nmap
Muy fácil ¿No crees?. La instalación no durara más de un minuto.
Y listo. Ya podemos empezar a utilizar nmap.

Escaneando puertos

Muy bien, ya podemos empezar a realizar la magia.
Nmap nos proporciona la clase PortScanner(), que como habrás imaginado, nos permite realizar el escaneo.
>>> import nmap
>>> nscan = nmap.PortScanner()
Luego utilizamos el método scan (adivina para que). Al método scan le pasamos dos argumentos: la IP o el host, y el rango de puertos a escanear.
>>> nscan.scan('scanme.nmap.org','22/443')
{'nmap': {'command_line': 'nmap -oX - -p 22-443 -sV scanme.nmap.org', 'scaninfo': {'t
cp': {'method': 'syn', 'services': '22-443'}}, 'scanstats': {'timestr': 'Wed Feb 06 1
4:05:16 2019', 'elapsed': '42.29', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1
'}}, 'scan': {'45.33.32.156': {'hostnames': [{'name': 'scanme.nmap.org', 'type': 'use
r'}, {'name': 'scanme.nmap.org', 'type': 'PTR'}], 'addresses': {'ipv4': '45.33.32.156
'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'reset'}, 'tcp': {22: {'state':
 'open', 'reason': 'syn-ack', 'name': 'ssh', 'product': 'OpenSSH', 'version': '6.6.1p
1 Ubuntu 2ubuntu2.11', 'extrainfo': 'Ubuntu Linux; protocol 2.0', 'conf': '10', 'cpe'
: 'cpe:/o:linux:linux_kernel'}, 23: {'state': 'filtered', 'reason': 'no-response', 'n
ame': 'telnet', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''
}, 25: {'state': 'filtered', 'reason': 'no-response', 'name': 'smtp', 'product': '',
'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 80: {'state': 'open', 'reaso
n': 'syn-ack', 'name': 'http', 'product': 'Apache httpd', 'version': '2.4.7', 'extrai
nfo': '(Ubuntu)', 'conf': '10', 'cpe': 'cpe:/a:apache:http_server:2.4.7'}}}}}
scanme.nmap.org es un host que nos proporciona nmap para realizar nuestras pruebas. ‘22/443’ significa que escanearemos desde el puerto 22 hasta el 443.
El resultado es información muy relevante. Sabemos que el sistema operativo del servidor es Ubuntu. La dirección IP es 45.33.32.156. El puerto 22 y 80 están abiertos. Y bueno, mucha información. Sabemos que con esta información se pueden saber las debilidades de un sistema para luego poder explotarlas. Así que te pido que utilices con mucha responsabilidad y ética, estas herramientas. Como dice el viejo adagio: “Un gran poder, conlleva a una gran responsabilidad”.
Muy bien, prosigamos.

Extracción de información

Nmap nos proporciona funciones para extraer la información de manera mas eficiente. Veamos algunas de ellas:
>>> nmscan.all_hosts() # Obtener todos los host
['45.33.32.156']
>>> nmscan.scaninfo() # Informacion sobre el escaneo
{'tcp': {'method': 'syn', 'services': '22-443'}}
>>> nmscan['45.33.32.156'].all_protocols() # Obtener protocolos
['tcp']
>>> nmscan['45.33.32.156'].hostsnames() # nombre del host
[{'name': 'scanme.nmap.org', 'type': 'user'}, {'name': 'scanme.nmap.org', 'type': 'PT
R'}]
>>> s['45.33.32.156'].state() # estado del host
'up'

Sistema operativo del host

Si, ya sabemos que es Ubuntu. Pero con nmap podemos extraer más información. Para ello utilizaremos los argumentos de las siguiente manera:
>>> ScanOS = s.scan("scanme.nmap.org", arguments="-sS -O")
{'nmap': {'command_line': 'nmap -oX - -p 22-443 -sS -O scanme.nmap.org', 'scaninfo':
{'tcp': {'method': 'syn', 'services': '22-443'}}, 'scanstats': {'timestr': 'Wed Feb 0
6 15:33:05 2019', 'elapsed': '36.37', 'uphosts': '1', 'downhosts': '0', 'totalhosts':
 '1'}}, 'scan': {'45.33.32.156': {'hostnames': [{'name': 'scanme.nmap.org', 'type': '
user'}, {'name': 'scanme.nmap.org', 'type': 'PTR'}], 'addresses': {'ipv4': '45.33.32.
156'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'reset'}, 'uptime': {'second
s': '3126784', 'lastboot': 'Tue Jan 01 11:00:01 2019'}, 'tcp': {22: {'state': 'open',
 'reason': 'syn-ack', 'name': 'ssh', 'product': '', 'version': '', 'extrainfo': '', '
conf': '3', 'cpe': ''}, 23: {'state': 'filtered', 'reason': 'no-response', 'name': 't
elnet', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 25: {
'state': 'filtered', 'reason': 'no-response', 'name': 'smtp', 'product': '', 'version
': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 80: {'state': 'open', 'reason': 'syn
-ack', 'name': 'http', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'c
pe': ''}}, 'portused': [{'state': 'open', 'proto': 'tcp', 'portid': '22'}, {'state':
'closed', 'proto': 'tcp', 'portid': '24'}, {'state': 'closed', 'proto': 'udp', 'porti
d': '40889'}], 'osmatch': [{'name': 'Linux 3.10 - 4.8', 'accuracy': '98', 'line': '60
500', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux',
 'osgen': '3.X', 'accuracy': '98', 'cpe': ['cpe:/o:linux:linux_kernel:3']}, {'type':
'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '4.X', 'accuracy'
: '98', 'cpe': ['cpe:/o:linux:linux_kernel:4']}]}, {'name': 'Linux 3.2 - 4.8', 'accur
acy': '97', 'line': '62168', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux
', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '97', 'cpe': ['cpe:/o:linux:linux
_kernel:3']}, {'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'os
gen': '4.X', 'accuracy': '97', 'cpe': ['cpe:/o:linux:linux_kernel:4']}]}, {'name': 'L
inux 3.16 - 4.6', 'accuracy': '96', 'line': '61251', 'osclass': [{'type': 'general pu
rpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '96', 'cp
e': ['cpe:/o:linux:linux_kernel:3']}, {'type': 'general purpose', 'vendor': 'Linux',
'osfamily': 'Linux', 'osgen': '4.X', 'accuracy': '96', 'cpe': ['cpe:/o:linux:linux_ke
rnel:4']}]}, {'name': 'Linux 2.6.32 - 3.13', 'accuracy': '96', 'line': '53811', 'oscl
ass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '
2.6.X', 'accuracy': '96', 'cpe': ['cpe:/o:linux:linux_kernel:2.6']}, {'type': 'genera
l purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '96',
 'cpe': ['cpe:/o:linux:linux_kernel:3']}]}, {'name': 'Linux 2.6.22 - 2.6.36', 'accura
cy': '95', 'line': '49107', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux'
, 'osfamily': 'Linux', 'osgen': '2.6.X', 'accuracy': '95', 'cpe': ['cpe:/o:linux:linu
x_kernel:2.6']}]}, {'name': 'Linux 3.10', 'accuracy': '94', 'line': '60119', 'osclass
': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X
', 'accuracy': '94', 'cpe': ['cpe:/o:linux:linux_kernel:3.10']}]}, {'name': 'Linux 4.
4', 'accuracy': '94', 'line': '64163', 'osclass': [{'type': 'general purpose', 'vendo
r': 'Linux', 'osfamily': 'Linux', 'osgen': '4.X', 'accuracy': '94', 'cpe': ['cpe:/o:l
inux:linux_kernel:4.4']}]}, {'name': 'Linux 2.6.32', 'accuracy': '94', 'line': '52612
', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'o
sgen': '2.6.X', 'accuracy': '94', 'cpe': ['cpe:/o:linux:linux_kernel:2.6.32']}]}, {'n
ame': 'Linux 2.6.32 - 3.10', 'accuracy': '93', 'line': '53781', 'osclass': [{'type':
'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '2.6.X', 'accurac
y': '93', 'cpe': ['cpe:/o:linux:linux_kernel:2.6']}, {'type': 'general purpose', 'ven
dor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '93', 'cpe': ['cpe:/o
:linux:linux_kernel:3']}]}, {'name': 'HP P2000 G3 NAS device', 'accuracy': '93', 'lin
e': '32611', 'osclass': [{'type': 'storage-misc', 'vendor': 'HP', 'osfamily': 'embedd
ed', 'osgen': None, 'accuracy': '93', 'cpe': ['cpe:/h:hp:p2000_g3']}]}]}}}
>>>
De esta manera tendremos información más especifica acerca del sistema operativo.
Excelente. ¿Alguna duda? ¿Alguna sugerencia? Déjanos tu comentario y con mucho gusto te responderemos.
Sin más nada que decir. Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Seguir Leyendo
Powered by Blogger .