扫描子网范围,Python 2.7端口扫描程序
我已经创建了一个基本的Python端口扫描程序,它允许我扫描IP地址或主机名,并且可以指定特定的端口,或者定义要扫描的端口范围。我的代码如下:扫描子网范围,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
# 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,则必须从中安装模块-我尚未对此进行调查。