扫描子网范围,Python 2.7端口扫描程序

扫描子网范围,Python 2.7端口扫描程序,python,python-2.7,sockets,Python,Python 2.7,Sockets,我已经创建了一个基本的Python端口扫描程序,它允许我扫描IP地址或主机名,并且可以指定特定的端口,或者定义要扫描的端口范围。我的代码如下: # import modules used in port scanner import optparse from socket import * from threading import * # connect-scan function, deals with connecting to the host / determining if p

我已经创建了一个基本的Python端口扫描程序,它允许我扫描IP地址或主机名,并且可以指定特定的端口,或者定义要扫描的端口范围。我的代码如下:

# import modules used in port scanner
import optparse
from socket import *
from threading import *

# connect-scan function, deals with connecting to the host / determining if 
ports are open / closed, takes arguments tgtHost, tgtPort
def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket(AF_INET, SOCK_STREAM)
        connSkt.connect((tgtHost, tgtPort))
        connSkt.send('\r\n')

        result = connSkt.recv(100)
        # prints result if port is open
        print '[+] ' + str(tgtPort) + '/tcp open'

    except:
        # prints result if port is closed
        print '[-] ' + str(tgtPort) + '/tcp closed'

    finally:
        connSkt.close()

# port-scan function, takes arguments tgtHost, tgtPorts 
def portScan(tgtHost, tgtPorts):
    try:
        # tries to get target IP address
        tgtIP = gethostbyname(tgtHost)
    except:
        # if unsuccesful, prints out following result
        print '[-] cannot resolve ' + tgtHost + ': unknown host'
        return

    try:
        # tries to get target address
        tgtName = gethostbyaddr(tgtIP)
        print '\n[+] scan results for: ' + tgtName[0]
    except:
        print '\n[+] scan results for: ' + tgtIP
    # sets default time out to 1
    setdefaulttimeout(1)
    # for every port in tgtPorts
    for tgtPort in tgtPorts:
    # creates thread, target is connScan function, arguments are tgtHost, int(tgtPort)
        t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
        # starts the thread 
        t.start()

def main():
    parser = optparse.OptionParser('usage %prog -t <target-host> -p <target-port(s)>')
    parser.add_option('-t', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port(s), seperated by a comma, seperate ranges with a -')
    (options, args) = parser.parse_args()

    if (options.tgtHost == None) | (options.tgtPort == None):
        print parser.usage
        exit(0)
    else:
        tgtHost = options.tgtHost
        # allows ranges of ports to be used, when seperated by a -
        if '-' in str(options.tgtPort):
            tgtPorts = options.tgtPort.split('-')
            tgtPorts = range(int(tgtPorts[0]),int(tgtPorts[1]))
        else:
            tgtPorts = str(options.tgtPort).split(',')

    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    main()
#导入端口扫描仪中使用的模块
导入optpass
从套接字导入*
从线程导入*
#连接扫描功能,处理连接到主机/确定是否
端口是打开/关闭的,接受参数tgtHost、tgtPort
def连接扫描(tgtHost、tgtPort):
尝试:
connSkt=插座(自动线、插座流)
连接((tgtHost,tgtPort))
connSkt.send('\r\n')
结果=connSkt.recv(100)
#如果端口打开,则打印结果
打印“[+]”+str(tgtPort)+“/tcp open”
除:
#如果端口关闭,则打印结果
打印'[-]'+str(tgtPort)+'/tcp closed'
最后:
connSkt.close()
#端口扫描函数,采用参数tgtHost、tgtPorts
def端口扫描(tgtHost、tgtPorts):
尝试:
#尝试获取目标IP地址
tgtIP=gethostbyname(tgtHost)
除:
#如果未成功,则打印以下结果
打印'[-]无法解析'+tgtHost+':未知主机'
返回
尝试:
#尝试获取目标地址
tgtName=gethostbyaddr(tgtIP)
打印“\n[+]的扫描结果:”+tgtName[0]
除:
打印“\n[+]扫描结果:”+tgtIP
#将默认超时设置为1
setdefaulttimeout(1)
#对于tgtPorts中的每个端口
对于tgtPorts中的tgtPorts:
#创建线程,目标是connScan函数,参数是tgtHost,int(tgtPort)
t=Thread(target=connScan,args=(tgtHost,int(tgtPort)))
#开始线程
t、 开始()
def main():
parser=optparse.OptionParser('用法%prog-t-p')
parser.add_选项('-t',dest='tgtHost',type='string',help='specify target host')
parser.add_选项('-p',dest='tgtPort',type='string',help='specify target port,用逗号分隔,用“-”分隔范围)
(options,args)=parser.parse_args()
如果(options.tgtHost==None)|(options.tgtPort==None):
打印语法分析器.用法
出口(0)
其他:
tgtHost=options.tgtHost
#允许使用的端口范围,当由-
如果str(options.tgtPort)中有“-”:
tgtPorts=options.tgtPort.split(“-”)
tgtPorts=range(int(tgtPorts[0]),int(tgtPorts[1]))
其他:
tgtPort=str(options.tgtPort).split(','))
端口扫描(tgtHost、tgtPorts)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
我知道所有这些代码是如何工作的,但我需要实现一个功能,允许我扫描IP地址的本地子网,因此如果我以(python-portscanner.py-t 192.168.1.0-p1-50)运行程序,它将扫描本地子网中的所有IP,即192.168.1.1-192.168.1.255

我不知道如何实现这个功能,已经在网上查过了也没有用。如果您有任何帮助,我们将不胜感激。

我们将为您提供帮助。链接文档页面包括以下示例:

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> for x in net4.hosts():
...     print(x)  
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254
<>我强烈建议您考虑使用IP地址范围,如图所示,因为库可以直接处理表示。 由于从注释中可以看出,您需要一个最后一个字节为零的IP地址,才能被视为
/24
子网,因此我建议您在
main
函数中使用类似的方法:

tgtHost = options.tgtHost
if tgtHost.endswith('.0'):
    hosts = ipaddress.ip_network(tgtHost+'/24')
else:
    hosts = [tgtHost]
...
# port handling stuff
...
for tgtHost in hosts:
    portScan(tgtHost, tgtPorts)

好的,这些都很有用,谢谢。当我运行我的程序时,它如下所示:pythonportscanner.py-t-p,它输出一个列表,显示我为该目标IP定义的打开或关闭的端口。我需要程序知道,当我将目标ip定义为192.168.1.0时,它将扫描本地子网内的所有ip地址,并显示我为每个ip地址定义的端口是否打开/关闭。因此,请使用类似于
192.168.1.0/24
的CIDR块作为参数,然后可以在定义的范围内进行迭代,如图所示。程序必须知道子网的大小——或者你想仅仅从IP地址推断网络大小吗?我需要程序知道,当目标IP以.0结尾时(例如192.168.1.0/192.168.34.0),它将扫描整个IP地址范围,从.1到.255。最后,如果将以.0结尾的地址定义为目标IPOkay,程序将能够扫描单个IP地址/主机名或整个IP地址范围,我已在上面的代码部分中添加了,当我使用VM子网10.0.2.0运行它时,出现了一个错误:ipaddress.AddressValueError:“10.0.2.0/24”似乎不是IPv4或IPv6网络。是否传入了字节(Python 2中的str)而不是unicode对象?在Python 3中,参数必须是unicode字符串。bytes对象将抛出您报告的异常。如果您使用的是Python2,则必须从中安装模块-我尚未对此进行调查。