port_scan_group = parser.add_argument_group('port scan group',description='用于开启端口扫描相关选项')
port_scan_group.add_argument('-s',dest='scan',action='store_true',help='开启端口扫描')
port_scan_group.add_argument('--SYN',dest='SYN',action='store_true',help='开启SYN扫描')
port_scan_group.add_argument('--ACK',dest='ACK',action='store_true',help='开启ACK扫描')
port_scan_group.add_argument('--FIN',dest='FIN',action='store_true',help='开启FIN扫描')
port_scan_group.add_argument('--UPORT', dest='UPORT', action='store_true', help='开启UDP端口扫描')
utils_group = parser.add_argument_group('utils group',description='用于开启扫描过程中的一些实用选项')
utils_group.add_argument('--timeout',dest='timeout',action='store',type=float,help='设置发包超时时间,默认0.5秒')
utils_group.add_argument('--retry',dest='retry',action='store',type=int,help='设置发包重试次数,默认不重试')
args = parser.parse_args()
if not args.ping and not args.scan:
print '[-]必须通过-p/-s选项开启一种扫描'
print '\n'
parser.print_help()
exit(1)
elif not args.target:
print '[-]必须通过--target选项指定扫描的对象'
print '\n'
parser.print_help()
exit(1)
if args.ping:
if not args.ARP and not args.ICMP and not args.TCP and not args.UDP:
args.ICMP = True #若没有指定任何ping扫描方式,则默认选择ICMP扫描
print '[+]没有指定任何ping扫描方式,默认选择ICMP扫描'
if args.scan:
if not args.SYN and not args.ACK and not args.FIN and not args.UPORT:
args.SYN = True #若没有指定任何端口扫描方式,则默认选择SYN扫描
print '[+]没有指定任何端口扫描方式,默认选择SYN扫描'
if not args.port:
args.port = '1-1024' #若没有指定任何扫描端口,则默认扫描1-1024
print '[+]没有指定任何扫描端口,默认扫描1-1024'
return args
def parse_target(args):
'''
@说明:用于解析如'192.168.1.1,192.168.1.x,...或192.168.1.1-254'格式的IP为单独的IP,用于解析如'21,80,...或21-80'格式的端口为单独的端口
@param: args,一个namespace对象
@return: (ip_list,port_list)
'''
pattern1 = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
pattern2 = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}-\d{1,3}$'
pattern3 = r'\d{1,5}$'
pattern4 = r'\d{1,5}-\d{1,5}$'
ip_list,port_list = None,None
if args.target:
if re.search(pattern1,args.target):
ip_list = args.target.split(',')
elif re.match(pattern2,args.target):
_split = args.target.split('-')
first_ip = _split[0]
ip_split = first_ip.split('.')
ipdot4 = range(int(ip_split[3]), int(_split[1]) + 1)
ip_list = [ip_split[0] + '.' + ip_split[1] + '.' + ip_split[2] + '.' + str(p) for p in ipdot4]
else:
print '[-]target格式输入有误,请查看帮助!'
exit(1)
if args.port:
if re.match(pattern4,args.port):
_split = args.port.split('-')
port_list = range(int(_split[0]),int(_split[1])+1)
elif re.search(pattern3,args.port):
port_list = args.port.split(',')
else:
print '[-]port格式输入有误,请查看帮助!'
exit(1)
return ip_list,port_list