[SOLUCIONADO] Problema con Script en Python

Iniciado por Electrónico, Diciembre 09, 2016, 05:30:17 AM

Tema anterior - Siguiente tema

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

Diciembre 09, 2016, 05:30:17 AM Ultima modificación: Diciembre 11, 2016, 02:00:18 PM por Stiuvert
Buenas a tod@s:

Aprovechando el Black Friday, me compré unos cuantos libros de la editorial 0xWorld para poder profundizar en el mundillo de la seguridad informática.

He empezado con el libro "Python para pentesters" y estoy probando todos y cada uno de los scripts propuestos para poder analizarlo, y entender qué hace y como lo hace, etc.

Pero he llegado en un script con la biblioteca nmap, que no me peta, pero sin embargo no me devuelve nada. Debido a que el código en el libro, se presenta en dos páginas, me debo perder en el tema de la tabulación. Y a pesar de que he probado diversas opciones, ninguna me devuelve nada después de ejecutar el script. Tampoco me devuelve ningún error.

He comparado línea por línea y no he visto ninguna diferencia respecto el script original. Con lo cual, me gustaría a ver si vosotros que tenéis más experiencia me sabéis decir donde está el fallo (si es que existe)

Os dejo el script a bajo:

Código: python
#!/usr/bin/env python

import nmap

class NmapHost:
def __init__(self):
self.host = None
self.state = None
self.reason = None
self.openPorts = []
self.closedFilteredPorts = []

class NmapPort:
def __init__(self):
self.id =None
self.state = None
self.reason = None
self.port = None
self.name = None
self.version = None
self.scriptOutput = None

def parseNmapScan (scan):
nmapHosts = []

for host in scan.all_hosts():
nmapHost = NmapHost()
nmapHost.host = host

if scan[host].has_key('status'):
nmapHost.state  = scan[host]['status']['state']
nmapHost.reason = scan[host]['status']['reason']

for protocol in ["tcp","udp","icmp"]:

if scan[host].has_key(protocol):
ports = scan[host][protocol].keys()

for port in ports:
nmapPort = NmapPort()
nmapPort.port = port
nmapPort.state = scan[host][protocol][port]['state']

if scan[host][protocol][port].has_key('script'):
nmapPort.scriptOutput = scan[host][protocol][port]['script']

if scan[host][protocol][port].has_key('reason'):
nmapPort.reason = scan[host][protocol][port]['reason']

if scan[host][protocol][port].has_key('name'):
nmapPort.name = scan[host][protocol][port]['name']

if scan[host][protocol][port].has_key('version'):
nmapPort.version = scan[host][protocol][port]['version']

if scan[host][protocol][port].has_key('state'):
nmapPort.state = scan[host][protocol][port]['state']

else:
nmapHost.closedFilteredPorts.apend(nmapPort)

nmapHosts.append(nmapHost)

else:
print "[-] There's no match in the Nmap scan with the specified protocol %s" %(protocol)
return nmapHosts

if __name__ == '__main__':
nm = nmap.PortScanner()
nm.scan('192.168.1.1','22-8080')
structureNmap = parseNmapScan(nm)




Muchas gracias de antamno

Hola, el script no devuelve nada porque no estás imprimiendo nada y no devuelve un error porque todo está bien.

Ahora, la función parseNmapScan() te devuelve una lista donde cada elemento es una instancia de la clase NmapHost, así que para ver el resultado tienes que recorrer esta lista y mostrar los datos que quieras ver, por ejemplo:

Código: python

        for host in structureNmap:
                print host.host
                print host.state
                print host.reason
                print host.openPorts
                print host.closedFilteredPorts


Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buenas a tod@s:

Ostia, pues en el script del libro no sale nada de las líneas que comentas. Ya lo había revisado pero lo he vuelto a revisar y nada. En teoría son 100% funcionales los scripts, sin embargo, me extraña que se hayan comido estas líneas así por las buenas....


A parte, estoy intentando poner las líneas en el código y me salta error. Donde se deberían colocar? Entiendo que al final del método.

Gracias

Hola, el script como dije antes, es completamente funcional, simplemente hay que imprimir los datos, pero todo funciona bien.

Las líneas se tienen que añadir después de llamar al método, en el código del primer post, sería en la línea 72.

Saludos!








No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buenas a tod@s:

Al final he tenido que formatear un poco todo el código porque me decía que no estaba bien el formato con los tabuladores. Ahora ya lo tengo OK.

Sin embargo me salta este error sobre estas dos líneas:
Código: php
Traceback (most recent call last):
  File "./NmapHost.py", line 74, in <module>
    structureNmap = parseNmapScan(nm)
  File "./NmapHost.py", line 59, in parseNmapScan
    nmapHost.closedFilteredPorts.apend(nmapPort)
AttributeError: 'list' object has no attribute 'apend'

Código: php
else:
                                nmapHost.closedFilteredPorts.apend(nmapPort)



Sin embargo, si las comento, al ser un else, el código funciona, sin embargo... según el libro creo que me debería de devolver más info. Porque a mi solo me devuelve esto:

192.168.1.1
up
syn-ack
[]
[]


Gracias por la ayuda, y poco a poco vamos aprendiendo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Al final he tenido que formatear un poco todo el código porque me decía que no estaba bien el formato con los tabuladores. Ahora ya lo tengo OK.

Eso sucede porque estás usando tabulaciones para tabular y yo uso cuatro espacios para tabular. Te recomiendo que te acostumbres también a usar cuatro espacios como tabulador. La mayoría de los IDE's permiten cambiar la forma en que se tabula, solo busca en las configuraciones. Y la razón es simple, aunque Python permite tabular como uno quiera se ha establecido como estandar los cuatro espacios, así que la mayoria de los códigos que encontrarás en la web estaran tabulados de esta manera y si tabulas de otra forma vas a tener este tipo de errores siempre. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Código: php
Traceback (most recent call last):
  File "./NmapHost.py", line 74, in <module>
    structureNmap = parseNmapScan(nm)
  File "./NmapHost.py", line 59, in parseNmapScan
    nmapHost.closedFilteredPorts.apend(nmapPort)
AttributeError: 'list' object has no attribute 'apend'

Código: php
else:
                                nmapHost.closedFilteredPorts.apend(nmapPort)



Eso es porque estás intentando invocar al método apend de una lista que no existe (y por eso el error) lo correcto es append y este método te permite agregar un nuevo elemento a una lista, lo que nos lleva lo siguiente:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Sin embargo, si las comento, al ser un else, el código funciona, sin embargo... según el libro creo que me debería de devolver más info. Porque a mi solo me devuelve esto:

192.168.1.1
up
syn-ack
[]
[]

Si comentas esa línea (o está mal escrita) no se agrega nada a la lista y no tendrás nada que mostrar en pantalla, por eso aparecen los [] que representa a una lista vacía.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buenas a tod@s:

Muchas gracias. Vaya crack estás hecho. Espero algun día, después de leer y prácticar mucho, ser tan bueno como los que tenemos por aquí.

Tenías razón, faltaba una "p" jeje

Ahora me devuelve lo siguiente:

Citar192.168.1.1
192.168.1.1
up
syn-ack
[]
[<__main__.NmapPort instance at 0x7f68a6262950>]

Entiendo que aún me falta algo por corregir porque aún me sale una lista vacía....

Y tampoco entiendo porque esta parte en el código original en el libro no estaba si los scripts son 100% funcionales... :S (Si es un error de edición... vaya cagada)

Los puertos abiertos y filtrados que devuelve son objetos NmapPort por lo que para mostrar los datos se debe har casi lo mismo que antes:

Código: python

    for puerto in host.closedFilteredPorts:
                print puerto.id
                print puerto.state
                print puerto.reason
                print puerto.port
                print puerto.name
                print puerto.version
                print puerto.scriptOutput


Y hay que hacer lo mismo,pero en lugar de los puertos filtrados, para los puertos abiertos.

El libro la verdad no lo conozco y no sé que nivel maneja, pero si es orientado para usuarios con pocos conocimientos en Python me parece terrible que falten tantas cosas que no son triviales para alguien que apenas comienza. Si el libro está orientado para usuarios con conocimientos medios en Python, no debería ser un problema.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buenas a tod@s:

Gracias por la respuesta.

La verdad es que en teoría son para iniciarse. Hay que saber algo, pero en teoría se te explica todo. Sino, te dan webs y links de interés para que te documentes mejor en alguna área en concreto.

He ido probando todos los scripts y me han funcionado bien. Este a lo mejor se les ha colado.

Buenas a tod@s:

Esta tarde, después del trabajo he podido probar estas últimas líneas que me has facilitado para completar el script.

Lo he puesto al final del script a continuación de las línias que agregué la última vez.

Ahora ya me salen más resultados:

Código: php
192.168.1.1
up
syn-ack
[]
[<__main__.NmapPort instance at 0x7fd626b48908>]
None
open
syn-ack
443
http
0.94.13
None



Muchas gracias :)