python 扫描局域网主机、爆破端口

import telnetlib
from multiprocessing import Pool 
import threading
import time
import sys
import re
import os



class Scan():
    def __init__(self,ip,mode):
        self.__ip=ip
        self.__open=[]
        self.__mode=mode


    def check_host(self,ip):
        output = os.popen('ping -n 1 {}'.format(ip)).readlines()
        if('无法访问目标主机' not in ''.join(output)):
            return ip
    
    def scanning(self):    #探测ip类型  
        ip_list=[]
        if(re.match(r'^\d+?\.\d+?\.\d+?\.\d+?$',self.__ip)):             #单一ip
            output = os.popen('ping -n 1 {}'.format(self.__ip)).readlines()
            if('无法访问目标主机'not  in ''.join(output)):                
                ip_list.append(self.__ip)
        

        elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?)/24$',self.__ip)):    #检测局域网存活主机
            ip_list.clear()
            t=self.__ip.split()[0]
            ip_result=[re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)/24',self.__ip).group(1)+str(i) for i in range(0,256)]

            with  Pool(10) as pool:
                ip_result=pool.map(self.check_host,ip_result)
                for i in ip_result:
                    if(i!=None):
                        ip_list.append(i)

                

        elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)$',self.__ip)):   #检测范围内ip
            ip_list.clear()
            min=int(re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)',self.__ip).group(2))
            max=int(re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)',self.__ip).group(4))+1
            
            ip_result=[re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+?)',self.__ip).group(1)+str(i) for i in range(min,max)]
            with  Pool(10) as pool:
                ip_result=pool.map(self.check_host,ip_result)
                for i in ip_result:
                    if(i!=None):
                        ip_list.append(i)

        elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?),',self.__ip)):   #检测多个自定义ip
            ip_list.clear()
            list_result=self.__ip.split(',')
            for ip in list_result:
                if(re.match(r'\d+?\.\d+?\.\d+?\.\d+?',ip)):
                    output = os.popen('ping -n 1 {}'.format(ip)).readlines()
                    if('无法访问目标主机'not in ''.join(output)):
                        ip_list.append(ip)

        else:
            sys.exit('\n\nthe input of ip is wrong! please try again!')

        if(len(ip_list)==0):
            sys.exit('\n\nthe host of ip inputed is not exits!!!\n\n')
            
        print("\n\n","扫描进行中".center(21,'*'),"\n")   
        print("\n存活的主机:\n\n"+'\n'.join(ip_list)+'\n\n')
        for ip in ip_list:
            self.__ip=ip
            
            if(self.__mode==0):
                port_list=[80,8080,443,3306,3389,21,22]
            elif(self.__mode==1):
                port_list=[x for x in range(1,65535)]
            else:
                sys.exit('\nthe input of mode is wrong! please try again!')


            pool=Pool(6)
            list_result=pool.map(self.is_open,port_list)
            pool.close()      
            pool.join()    
            for i in list_result:
                if(i != None):
                    self.__open.append(i)
            self.__open.sort()
            self.Get()
                
    def is_open(self,port): #判断是否开启
        check=telnetlib.Telnet()  #扫描函数
        try:
            check.open(self.__ip,port)
            return str(port)
        except:
            pass


        
    def Get(self):
        if(len(self.__open)!=0):
            print("\n "+self.__ip+"开放的端口: \n "+'\n '.join(self.__open)+"\n")
        else:
            print("\n "+self.__ip+"开放的端口: \n "+'\n 没有开放端口'+"\n")
if __name__ == "__main__":
    start=time.time()
    
    s=Scan(input('\n\nthe type of ip  1. xxx.xxx.xxx.xxx  2. xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx\
    3. xxx.xxx.xxx.xxx/24 4. xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx,…… \ninput ip: '),int(input("\n\n0. scan the usual ports  1. scan all ports\nmode: ")))

    s.scanning()
    # s.Get()
    print("\n扫描用时: "+str(round(time.time()-start,2))+ "s")
    print("\n\n","扫描完成,欢迎下次使用".center(21,'*'),'\n\n')






本程序采用了多线程来自动扫描指定局域网主机、端口

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值