Python编写类似nmap的扫描工具(4)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2b45c1410b4c61359c6a38d3fe390e84.html