首页 > 编程语言 >Python黑客编程之嗅探器

Python黑客编程之嗅探器

时间:2023-02-08 20:58:16浏览次数:42  
标签:protocol socket Python IP self 嗅探器 header 黑客 ip

目的

  • 利用原始套接字,在开启了混杂模式的本地网卡上进行嗅探,获取途径本地网卡的IP数据包,并进行解包分析

分析

  • socket其实就是操作系统提供给程序员操作网络协议栈的接口,是内核提供的,不是库提供的
  • 原始socket可以和内核一样直接对所有层进行操作(除了物理层),可以更改mac更改ip更改端口
  • 原始socket可以访问经过网卡的所有数据,普通的socket只能访问发送给自己端口的数据
  • 开启混杂模式能让网卡获取流经的所有数据,不只是目的地是自己的数据
  • 因此嗅探的关键在于原始套接字+网卡的混杂模式

代码

  • 开启混杂模式,并接收所有流经数据
def sniff(host):
    if os.name == 'nt':
        socket_protocol = socket.IPPROTO_IP
    else:
        socket_protocol = socket.IPPROTO_ICMP

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

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

    try:
        while True:
            raw_buffer = sniffer.recvfrom(65535)[0]
            ip_header = IP(raw_buffer[0:20])
            print('Protocol: %s %s -> %s' % (ip_header.protocol, ip_header.src_address, ip_header.dst_address))

    except KeyboardInterrupt:
        if os.name == 'nt':
            sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
            sys.exit()
  • 解析捕获的IP数据包:读取数据包的前20字节的IP头,格式如下所示,可以使用ctypes或struct库将读取到的二进制数据转化为python字符串
    • ctypes库:像IP字段定义到一个c结构体里,通过new和init方法,将字段的二进制值转化为python成员变量
    • struct库:按照格式化字符串来解析二进制数据,赋值给python对象
    • 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)

运行结果

  • 在windows主机上嗅探流经的数据包,ping百度以后,可以看到成功收到了163.177.151.110的ICMP数据包

标签:protocol,socket,Python,IP,self,嗅探器,header,黑客,ip
From: https://www.cnblogs.com/z5onk0/p/17103211.html

相关文章

  • 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别名]导入该模块所有内容使用时需要:模块名称.函数名不会出现函......
  • 软件测试|Python实用炫酷技能——推导式
    Python推导式判断一个程序员水平的高低,不能光看他的发量,也不能光看他的代码量,还要看他代码蕴含的思想,代码的质量。代码蕴含的思想主要体现在各种设计模式的运用上,而代码的质......
  • 软件测试|一步到位教会你Python字典操作(一)
    字典(dict)是python中的基础数据类型之一,字典的设计并不复杂,我们经常会用到这种数据类型。同时,字典也有一些比较实用的情景。学习任何一种编程语言,基础数据类型都是必备的......
  • 软件测试|手把手教你使用Python获取B站视频选集内容
    背景B站是我们年轻人最喜欢的学习网站,这句话没有任何问题!只有我们想不到的,没有B站上没有的,我们可以在B站上学做饭,学音乐,学数学,学历史......总之,B站就是如此包罗万象。言归正......
  • ubuntu18容器中安装python3.10
    在python官网https://www.python.org/下载python3.10的tgz的源码包。安装编译环境apt-getupdateaptinstallwgetbuild-essentialcheckinstallaptinstalllibreadline......
  • Kong Customize Python Plugin
    KongCustomizePythonPlugin前情提要:由于公司业务需求,需要针对Kong自定义插件,而Kong的插件主要是Lua语言,公司的技术栈是Python,所以升级了Kong版本到3.1。Kon......