首页 > 编程语言 >Python黑客编程之扫描器

Python黑客编程之扫描器

时间:2023-02-08 21:14:29浏览次数:44  
标签:扫描器 protocol socket Python self header 黑客 address ICMP

目的

  • 在子网中进行udp广播,通过ICMP回文判断存活主机

分析

  • 相比上个实验嗅探器,同样也开启混杂模式通过原始套接字抓取流经本机的流量,不同点在于多了个主动进行udp广播,以及对ICMP回文进行了解析确认
  • 判断存活主机的依据:发送一个UDP数据报时,如果主机上的UDP端口未开启,会返回一个ICMP包来提示目标端口不可访问
  • 注意,虽然ICMP和IP同属于网络层,但是ICMP的数据是借助于IP数据包进行发送的

代码

  • udp广播,使用了ipaddress库遍历子网ip,进行子网广播很方便
def udp_sender():
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sender:
        for ip in ipaddress.ip_network(SUBNET).hosts():
            sender.sendto(bytes(MESSAGE, 'utf8'), (str(ip), 65212))
  • 开启网卡的混杂模式,通过原始套接字抓取流经的IP数据报
    • 解析IP头,判断是不是ICMP协议
    • 解析ICMP数据内容,比对消息字段,确认是存活主机的回文
SUBNET = '192.168.43.0/24'
MESSAGE = 'Z5ONK0RULES'
class Scanner:
    def __init__(self, host):
        self.host = host
        if os.name == 'nt':
            socket_protocol = socket.IPPROTO_IP
        else:
            socket_protocol = socket.IPPROTO_ICMP

        self.socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
        self.socket.bind((host, 0))
        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

        if os.name == 'nt':
            self.socket.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    def sniff(self):
        hosts_up = set([f'{str(self.host)}'])
        try:
            while True:
                raw_buffer = self.socket.recvfrom(65535)[0]
                ip_header = IP(raw_buffer[0:20])
                if ip_header.protocol == "ICMP":
                    offset = ip_header.ihl * 4
                    buf = raw_buffer[offset:offset+8]
                    icmp_header = ICMP(buf)

                    if icmp_header.code == 3 and icmp_header.type == 3:
                        src_address = ip_header.src_address
                        if ipaddress.ip_address(src_address) in ipaddress.IPv4Network(SUBNET):
                            if raw_buffer[len(raw_buffer) - len(MESSAGE) :] == bytes(MESSAGE, 'utf8'):
                                if str(src_address) != self.host and str(src_address) not in hosts_up:
                                    hosts_up.add(str(src_address))
                                    print(f'Host Up: {str(src_address)}')

        except KeyboardInterrupt:
            if os.name == 'nt':
                self.socket.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

            print('\nUser interrupted.')
            if hosts_up:
                print(f'\n\nSummary: Hosts up on {SUBNET}')
                for host in sorted(hosts_up):
                    print(f'{host}')
                print('')
                sys.exit()
  • 解析IP头
class IP:
    def __init__(self, buff=None):
        header = struct.unpack('<BBHHHBBH4s4s', buff)
        self.ver = header[0] >> 4
        self.ihl = header[0] & 0xF
        self.tos = header[1]
        self.len = header[2]
        self.id = header[3]
        self.offset = header[4]
        self.ttl = header[5]
        self.protocol_num = header[6]
        self.sum = header[7]
        self.src = header[8]
        self.dst = header[9]

        self.src_address = ipaddress.ip_address(self.src)
        self.dst_address = ipaddress.ip_address(self.dst)

        self.protocol_map = {1: "ICMP", 6: "TCP", 17: "UDP"}
        try:
            self.protocol = self.protocol_map[self.protocol_num]
        except Exception as e:
            print ('%s No protocol for %s' % (e, self.protocol_num))
            self.protocol = str(self.protocol_num)
  • 解析ICMP数据报
class ICMP:
    def __init__(self, buff):
        header = struct.unpack('<BBHHH', buff)
        self.type = header[0]
        self.code = header[1]
        self.sum = header[2]
        self.id = header[3]
        self.seq = header[4]

效果

  • 在windows主机上扫描同网段存活主机,成功扫到了我的ubuntu虚拟机和网关

标签:扫描器,protocol,socket,Python,self,header,黑客,address,ICMP
From: https://www.cnblogs.com/z5onk0/p/17103266.html

相关文章

  • Python黑客编程之嗅探器
    目的利用原始套接字,在开启了混杂模式的本地网卡上进行嗅探,获取途径本地网卡的IP数据包,并进行解包分析分析socket其实就是操作系统提供给程序员操作网络协议栈的接口,......
  • C和Python实现快速排序-三数中值划分选择主元(非随机)
    一、快排基础1.1快排的流程将数组A进行快速排序的基本步骤-quick_sort(A):递归基础情况:如果A中的元素个数是1或0,则返回。选取主元:取A中的任意一个元素v,作为主元(piv......
  • Python常用技巧
    001两数交换#两数交换a=2b=3a,b=b,aprint("a=%db=%d"%(a,b))#a=3b=2002eval函数#eval函数exp='2**2+5'eval(exp)#9运算符描述​​+​​对象相加​​-​......
  • 使用Python获取春节档电影影评,制作可视化词云图
    春节电影听巳月说都还可以,我不信,我觉得还是要看看看过的观众怎么说,于是我点开了流浪地球2…看起来好像不错的样子,8.2的评分,三十多亿的票房就是这评价也太多了,那......
  • 软件测试|手把手教你用Python来模拟绘制自由落体运动过程中的抛物线
    学过高中物理的我们都知道,当我们在一定高度上以一定速度水平抛出一个物体时,物体的运动轨迹实际上就是一条抛物线,那么,我们如何用Python将这个抛物线绘制出来呢。思路其实解决......
  • Python__25--模块
    1创建模块.py文件,文件名不与python自带的标准模块名相同,见名知意2导入模块2.1import模块名称[as别名]导入该模块所有内容使用时需要:模块名称.函数名不会出现函......
  • 一种基于简单的YAML的DSL的快速和可定制的漏洞扫描器
    介绍:Nuclei用于基于模板跨目标发送请求,从而实现零误报,并在大量主机上提供快速扫描。Nuclei提供多种协议的扫描,包括TCP、DNS、HTTP、SSL、File、Whois、WebSocket、Headless......
  • 软件测试|Python实用炫酷技能——推导式
    Python推导式判断一个程序员水平的高低,不能光看他的发量,也不能光看他的代码量,还要看他代码蕴含的思想,代码的质量。代码蕴含的思想主要体现在各种设计模式的运用上,而代码的质......
  • 软件测试|一步到位教会你Python字典操作(一)
    字典(dict)是python中的基础数据类型之一,字典的设计并不复杂,我们经常会用到这种数据类型。同时,字典也有一些比较实用的情景。学习任何一种编程语言,基础数据类型都是必备的......
  • 软件测试|手把手教你使用Python获取B站视频选集内容
    背景B站是我们年轻人最喜欢的学习网站,这句话没有任何问题!只有我们想不到的,没有B站上没有的,我们可以在B站上学做饭,学音乐,学数学,学历史......总之,B站就是如此包罗万象。言归正......