• 【Try to Hack】masscan


    📒博客主页:开心星人的博客主页
    🔥系列专栏:Try to Hack
    🎉欢迎关注🔎点赞👍收藏⭐️留言📝
    📆首发时间:🌴2022年6月23日🌴
    🍭作者水平很有限,如果发现错误,还望告知,感谢!

    文章内容均来自互联网,仅作为自己学习的使用

    🍫masscan简述

    masscan号称是世界上最快的扫描软件,可以在3分钟内扫描整个互联网端口,但是这个是由条件的4核电脑,双端口10G网卡。
    扫描整个Imternet的权限归国防部所有,不要轻易扫描互联网。
    masscan 0.0.0.0/0 -p0-65535 扫描全网

    🍫为什么masscan比nmap快很多

    采用了异步传输、无状态扫描方式(异步传输意味着扫描器在发送探测数据包之后不必等待回复)。

    nmap需要记录tcp/ip的状态,而OS能处理的tcp/ip的最大链接数只有1500左右;masscan采用的是不建立完整的tcp链接方式,在收到SYN/ACK之后,直接发送RST结束链接(RST表示复位,用来结束关闭异常的链接)。 附:--banner除外

    🍫常用参数

    1、快速扫描,默认情况下,Masscan扫描速度为每秒100个数据包,这是相当慢的。为了增加这一点,只需提供该--rate选项并指定一个值。

    扫描100个常见端口的B类子网,每秒2000个数据包
    masscan 192.168.0.0/16 --top-ports 100 --rate 2000

    2、扫描结果保存
    -oX test.xml
    -oJ test.json
    -oL test.list

    masscan 192.168.0.0/16 -p80 -oX test.xml

    3、获取banner信息,支持少量的协议
    --banners

    4、指定和排除目标

    --exclude <ip/range> IP地址范围黑名单,防止masscan扫描
    --excludefile <filename> 指定IP地址范围黑名单文件
    --includefile,-iL <filename> 读取一个范围列表进行扫描
    --adapter-ip 指定发包的ip地址
    --adapter-port指定发包源端口
    --adapter-mac指定发包的源MAC地址
    --router-mac指定网关MAC地址
    --wait 指定发包后的等待时间

    masscan -p 0-65535 -iL test.txt --rate=2000

    扫描全网,可以通过设置黑名单来让扫描器扫描时忽略一些网段。
    masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt -oJ res.json --max-rate 100000

    5、主机存活扫描
    --ping
    masscan –-ping 192.168.88.132/24 --rate 1000

    🍫nmap和masscan配合使用

    先使用masscan快速的扫描端口后,masscan扫描完后会生成一个json文件,然后从中提取相关端口信息。再用nmap进行详细扫描,识别端口对应的服务。

    github地址

    # -*- coding: utf-8 -*-
    #  首先运行2或3个并发的Masscan任务,所有的65535个端口分为4-5个更小的范围;
    #  获取主机列表以及Masscan扫描出的开放端口的组合列表;
    #  使用这些列表作为Nmap的扫描目标并执行常规Nmap扫描。
    
    import subprocess
    #  import pysnooper
    import threading
    import os
    import nmap
    import argparse
    import re
    import json
    from IPy import IP
    
    iolock = threading.Lock()
    class Task:
        def __init__(self,ip,ports_list):
             self.ip=ip
             ports_list.sort()
             self.ports=','.join([str(x) for x in ports_list])
    
    class Mas_Scanner(threading.Thread):  
        def __init__(self,task_list):
            threading.Thread.__init__(self)
            self.task_list=task_list
            self.result={}
        
        #  @pysnooper.snoop()
        def analyze(self,data,ip):#analyze and add task scan result to scanner result
            ports_list=[]
            for line in data.split('\n'):
                if line!='':
                    port = line.split()[3] # xx/tcp
                    port = port.split('/')[0] 
                    ports_list.append(port)
    
            if ip in self.result:
                self.result[ip]=self.result[ip]+ports_list
            else:
                self.result[ip]=ports_list
    
            if ports_list !=[]:
                iolock.acquire()
                print('find ports on host:',ip,':')
                print(ports_list)
                iolock.release()
    
        #  @pysnooper.snoop()
        def start_task(self,task): #one task scan only one ip with different ports
            iolock.acquire()
            print("masscan scanning ip:",task.ip)
            iolock.release()
            cmd = 'masscan {ip} -p{ports} --wait 0 --rate 1500'.format(ip=task.ip,ports=task.ports)
            proc = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            proc.wait()
            stdoutdata=proc.stdout.read().decode('UTF-8')
            stderrdata = proc.stderr.read().decode('UTF-8')
            #  print(stdoutdata)
            self.analyze(stdoutdata,task.ip)
        
        def run(self):
            for task in self.task_list:
                self.start_task(task)
            # p = subprocessPopen(cmd,)
    
    # for namp scanner, a task inlude one ip with its all ports
    class Nmap_Scanner:
        def __init__(self,task_list):
            self.task_list = task_list
            self.result={}
    
    
        def start_task(self,task):
            print('start determine service/version of ports on host:',task.ip)
            nm = nmap.PortScanner()
            nm.scan(hosts=task.ip,ports=task.ports,arguments='-T4 -sV -Pn -sS',sudo=True)
            #  if task.ip in nm:
            self.result[task.ip]=nm[task.ip]
            #  else:
                #  self.result[task.ip]=None
    
        def print_scan_result(self):
            for ip in self.result:
                print('----------------------------------------------------')
                print('Host : {}'.format(ip))
                print('--------------------')
                ports_dict = sorted(self.result[ip]['tcp'])
                for port in ports_dict:
                    portinfo=self.result[ip]['tcp'][port]
                    str_buffer = 'port : {port}\tstate : {state}\t{name} {product} {version}'.format(port=port,
                                                                                                   state=portinfo['state'],
                                                                                                   name=portinfo['name'],
                                                                                                   product=portinfo['product'],
                                                                                                   version=portinfo['version'])
                    print(str_buffer)
        def output_file(self,filename):
            json_data = {}
            for ip in self.result:
                ports_dict = sorted(self.result[ip]['tcp'])
                json_data[ip]={}
                for port in ports_dict:
                    portinfo=self.result[ip]['tcp'][port]
                    json_data[ip][port] = {
                        'state':portinfo['state'],
                       'name':portinfo['name'],
                       'product':portinfo['product'],
                       'version':portinfo['version']
                       }
            with open(filename, 'w') as f:
                json.dump(json_data, f)
    
        def run(self):
            for task in self.task_list:
                self.start_task(task)
    
    # @pysnooper.snoop()
    def split_task(ip): #split ports range in 5 pieces and return a list
        if not re.match(r'\d+\.\d+\.\d+.\d+', ip):
            raise Exception("Invalid IP format: '"+ip+"'")
        ports_list = [str(x) for x in range(1,65536)]
        n = int(65535/5)
        task_list = []
        for x in range(5):
            list_ = ports_list[n*x:n*x+n]
            task = Task(ip,list_)
            task_list.append(task)
        
        return task_list
    
        
    
    
    
    
    #  @pysnooper.snoop()
    def main():
        if os.getuid() != 0:
            print('please run this script with root!')
            exit()
    
    
        parser = argparse.ArgumentParser()
        parser.add_argument('host',nargs='?',help='read ip from a file',default=None)
        parser.add_argument('-r','--input',help='read ip from a file')
        parser.add_argument('-c','--cidr',help='scan a range of ip')
        parser.add_argument('-o','--output',help='output filename')
        args = parser.parse_args()
        task_list=[]
        if args.host != None:
            task_list += split_task(args.host)
        if args.input != None:
            f = open(args.input,'r')
            for line in f:
                task_list += split_task(line.replace('\n','').replace('\r',''))
            f.close()
        if args.cidr != None:
            for ip in IP(args.cidr):
                task_list += split_task(ip)
    
        if task_list==[]:
            print('Please input at least one target!')
            exit()
    
        masscaner_num = 2
        task_per_scanner = int(len(task_list)/masscaner_num)
        masscanner_list = []
    
        for x in range(masscaner_num):
            scanner = Mas_Scanner(task_list[x*task_per_scanner:x*task_per_scanner+task_per_scanner])
            masscanner_list.append(scanner)
            scanner.start()
    
        for scanner in masscanner_list:
            scanner.join()
            
        
        masscan_result = {}
        for scanner in masscanner_list:
            for ip in scanner.result:
                if ip not in masscan_result:
                    masscan_result[ip]=scanner.result[ip]
                else:
                    masscan_result[ip]+=scanner.result[ip]
    
        print('masscan scan complete:')
        print(masscan_result)
        nmap_task_list = []
        for ip in masscan_result:
            if len(masscan_result[ip])!=0:
                nmap_task_list.append(Task(ip,masscan_result[ip]))
    
        nm_scanner = Nmap_Scanner(nmap_task_list)
        nm_scanner.run()
        nm_scanner.print_scan_result()
        if args.output !=None:
            nm_scanner.output_file(args.output)
    
    
    if __name__=='__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
  • 相关阅读:
    华为智能高校出口安全解决方案(3)
    【CSS 画个梯形】
    为何学linux及用处
    一步一步分析ChatGPT,1 粘性,2 传染性, 3 双边网络效应
    DRF统一返回格式
    Linux ARM平台开发系列讲解(自旋锁) 3.3.1 Linux内核自旋锁描述
    Windows x64隐藏可执行内存
    【力扣每日一题】1470. 重新排列数组
    centos7上安装 apache-tomcat-mysql
    解决ios 调用微信JSSDK 签名失败
  • 原文地址:https://blog.csdn.net/qq_55675216/article/details/125422061