python渗透测试入门——流量嗅探器

1.代码及代码讲解。

代码编写工具:VsCode

(1)socket嗅探器

首先第一个脚本是最简单的原始socket嗅探器,它只会读一个数据包,然后直接退出:

import socket
import os#host to listen on
HOST = ''
#这里输入自己的IP地址def main():#create raw socket, bin to public interfaceif os.name == 'nt':socket_protocol = socket.IPPROTO_IPelse:socket_protocol = socket.IPPROTO_ICMPsniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW.socket_protocol)sniffer.bind((HOST,0))#include the IP header in the capturesniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)if os.name =='nt':sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)#read one packetprint(sniffer.recvfrom(65565))if os.name == 'nt':sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)
if __name__ == '__main__':main()

注意:这里Windows和Linux的区别是,前者允许我们嗅探任何协议的所有流入数据,而后者强制我们指定一个协议来嗅探,这里指定的是ICMP。

上面这只是一个非常简单的嗅探器,那我们将对它的功能进行进一步的拓展。

(2)ip解码器

import ipaddress
import os 
import socket
import struct
import sys#定义了一个Python结构,把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buff=None):header = struct.unpack('<BHHHBBH4s4s', buff)self.ver = header[0] >> 4self.ihl = header[0] & 0xFself.tos = header[1]self.len = header[2]self.id = header[3]self.offset = header[4]self.ttl = header[5]self.protocol = header[6]self.sum = header[7]self.src = header[8]self.dst = header[9]# human readable IP addresses#使用新打造的IP头结构,将抓包逻辑改成持续抓包和解析self.src_address = ipaddress.ip_address(self.src)self.dst_address = ipaddress.ip_address(self.dst)# map protocol constants to their namesself.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)def sniff(host):# should look familiar from previous exampleif os.name == 'nt':socket_protocol = socket.IPPROTO_IPelse:socket_protocol = socket.IPPROTO_ICMPsniffer = 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:# read a packet#将前20字节转换成IP头对象raw_buffere = sniffer.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header = IP(raw_buffere[0:20])# print the detected protocol and hosts#打印抓取信息print('Protocol: %s %s -> %s' % (ip_header.protocol, ip_header.src_address, ip_header.dst_address))except KeyboardInterrupt:# if we're on Windows, turn off promiscuous modeif os.name == 'nt':sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)sys.exit()if __name__ == '__main':if len(sys.argv) == 2:host = sys.argv[1]else:host = ''sniffer(host)

在理解这一部分的内容之前,我们首先要了解一个python库。struct库:struct库提供了一些格式字符,用来定义二进制数据的结构。这个库在解码,密码学方面经常会用到。

注:在struct库里,不存在对应于nybble格式(即4个二进制位组成的数据块,也叫作nibble)的格式字符。

self.ver = header[0] >> 4

对于IP头的第一个字节,我们只想取高位nybble(整个字节里的第一个nybble)作为ver的值。取某字节高位nybble的常规方法是将其向右位移4位,相当于在该字节的开头填4个0,把其尾部的4位挤出去。这样我们就得到了原字节的第一个nybble。

self.ihl = header[0] & 0xF

我们想把低位nybble(或者说原字节的最后4个二进制位)填进hdrlen里,取某个字节低位nybble的常规方法是将其与数字

0xF(00001111)进行按位与运算。它利用了0 AND 1 = 0的特性(0代表假,1代表真)。想要AND表达式为真,表达式两边都必须为真。所以这个操作相当于删除前4个二进制位,因为任何数AND 0都得0;它保持了最后4个二进制位不变,因为任何数AND 1还是原数字。

(3)解码ICMP

import ipaddress
import os 
import socket
import struct
import sys#定义了一个Python结构,把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buff=None):header = struct.unpack('<BHHHBBH4s4s', buff)self.ver = header[0] >> 4self.ihl = header[0] & 0xFself.tos = header[1]self.len = header[2]self.id = header[3]self.offset = header[4]self.ttl = header[5]self.protocol = header[6]self.sum = header[7]self.src = header[8]self.dst = header[9]# human readable IP addresses#使用新打造的IP头结构,将抓包逻辑改成持续抓包和解析self.src_address = ipaddress.ip_address(self.src)self.dst_address = ipaddress.ip_address(self.dst)# map protocol constants to their namesself.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)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]def sniff(host):# should look familiar from previous exampleif os.name == 'nt':socket_protocol = socket.IPPROTO_IPelse:socket_protocol = socket.IPPROTO_ICMPsniffer = 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:# read a packet#将前20字节转换成IP头对象raw_buffere = sniffer.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header = IP(raw_buffere[0:20])# if it's ICMP, we want itif ip_header.protocol == 'ICMP':print('Protocol: %s %s -> %s' % (ip_header.protocol,ip_header.src_address, ip_header.dst_address))print(f'Version: {ip_header.ver}')print(f'Header Length; {ip_header.ihl} TTL: {ip_header.ttl}')# calculate where our ICMP packet startsoffset = ip_header.ihl * 4buf = raw_buffere[offset:offset + 8]# create our ICMP structureicmp_header = ICMP(buf)print('ICMP -> Yype: %s Code: %s\n' % (icmp_header.type, icmp_header.code))except KeyboardInterrupt:if os.name == 'nt':sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)sys.exit() if __name__ == '__main':if len(sys.argv) == 2:host = sys.argv[1]else:host = '10.74.212.22'sniff(host)

这段代码在之前的IP结构下方又创建了一个ICMP结构。在负责接收数据包的主循环中,我们会判断接收到的数据包是否为ICMP数据包,然后计算出ICMP数据在原始数据包中的偏移,最后将数据按照ICMP结构进行解析。

(4)scanner.py

那前面我们已经完成了大部分工作,只剩下了一个任务——群发UDP数据包,并解析结果

import ipaddress
import os 
import socket
import struct
import sys
import threading
import time#subnet to target
SUBNET = '192.168.0.1/24'
# magic string we'll check ICMP responses for
#添加的这点代码应该很好理解。我们定义了一个简单的字符串作为“签名”,用于确认收到的ICMP响应是否是由我们发送的UDP包所触发的MESSAGE = 'PYTHONRULES!'#定义了一个Python结构,把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buff=None):header = struct.unpack('<BHHHBBH4s4s', buff)self.ver = header[0] >> 4self.ihl = header[0] & 0xFself.tos = header[1]self.len = header[2]self.id = header[3]self.offset = header[4]self.ttl = header[5]self.protocol = header[6]self.sum = header[7]self.src = header[8]self.dst = header[9]# human readable IP addresses#使用新打造的IP头结构,将抓包逻辑改成持续抓包和解析self.src_address = ipaddress.ip_address(self.src)self.dst_address = ipaddress.ip_address(self.dst)# map protocol constants to their namesself.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)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]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))class Scanner:def __init__(self, host):self.host = hostif os.name == 'nt':socket_protocol = socket.IPPROTO_IPelse:socket_protocol = socket.IPPROTO_ICMPself.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:# read a packetraw_buffer = self.socket.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header = IP(raw_buffer[0:20])# if it's ICMP, we went itif ip_header.protocol == "ICMP":offset = ip_header.ihl1 * 4buf = raw_buffer[offset:offset + 8]icmp_header = ICMP(buf)if icmp_header.code == 3 and icmp_header.type == 3:if ipaddress.ip_address(ip_header.src_address) in ipaddress.IPv4Network(SUBNET):# make sure it has our magic messageif raw_buffer[len(raw_buffer) - len(MESSAGE):] == bytes(MESSAGE, 'utf8'):tgt = str(ip_header.src_address)if tgt !=self.host and tgt not in hosts_up:hosts_up.add(str(ip_header.src_address))print(f'Host Up: {tgt}')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()if __name__ == '__main':if len(sys.argv) == 2:host = sys.argv[1]else:host = ''s = Scanner(host)time.sleep(5)t = threading.Thread(target=udp_sender)t.start()s.sniff()

其中我们引入ipaddress库,这样就能对整个子网进行主机发现扫描。

sniff函数会嗅探网络上的数据,步骤跟之前的例子差不多,唯一的区别就是这次它会把在线的主机记录下来。接收到预期的ICMP消息时,我们首先检查这个响应是不是来自我们正在扫描的子网,然后检查ICMP消息里有没有我们自定义的签名。如果所有检查都通过了,就把发送这条ICMP消息的主机IP地址打印出来。如果使用Ctrl+C组合键中断扫描过程的话,程序就会关闭网卡混杂模式(如果是Windows平台),并且把迄今为止扫描出来的主机都打印到屏幕上。

那到这里我们的流量嗅探工具已经算编写完成了,希望大家有所收获。


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具

八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到! 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis Cluster集群搭建 三主三从

Redis包下载 Linux&#xff1a; http://download.redis.io/releases/ Mac or Windows: https://redis.io/download/ 2.下载后解压进入文件夹&#xff08;本次我的Redis版本是6.2.14版本&#xff09; /redis/redis-6.2.14 开始安装 make instarll修改配置文件复制redis.conf 6…

STM32F103RCT6开发板M3单片机教程04--按键检测

原画图讲解 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 首先了硬件连接原理&#xff0c;STM32F103RCT6开发板是mini最小系统板&#xff0c;板子在没并有按键。需要自行用面包板搭建。 硬件连接&#xff1a; PC10 -> KEY1 &#xff08;MCU内部上拉…

mysql原理--InnoDB的表空间

1.概述 通过前边儿的内容大家知道&#xff0c; 表空间 是一个抽象的概念。 对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为 表名.ibd 的实际文件。可以把表空间想象成被切分为许许…

当OneNote不同步时,你需要做些什么让其恢复在线

OneNote笔记本无法同步的原因有很多。由于OneNote使用OneDrive将笔记本存储在云中,因此可能会出现互联网连接问题,与多人联机处理笔记本时会出现延迟,以及从不同设备处理同一笔记本时会发生延迟。以下是OneNote不同步时的操作。 注意:本文中的说明适用于OneNote for Windo…

急速上手搭建单节点 k8s集群实战

Minikube搭建 是一种轻量化的Kubernetes集群&#xff0c;是k8s社区为了帮助开发者和学习者能够更好学习和体验k8s功能而推出的&#xff0c;使用个人PC的虚拟化环境就快速构建启动单节点k8s机器准备&#xff1a;阿里云 CentOS 7.x &#xff0c;2核4g 安装 安装Docker # 1.先…

flask简单应用-1

目标&#xff1a; 做一个搜索网页&#xff0c;搜索当前路径下是否含有指定关键字的文件&#xff0c;如果有就列出来&#xff0c;没有返回消息 第一步&#xff1a;我们需要先显示一个搜索页面&#xff0c;页面上需要有一个可以输入的对话框&#xff0c;一个按钮执行搜索 建立ht…

nm命令使用详解,让你加快学习速度

nm 命令详解 符号是每个ELF文件的一个重要部分&#xff0c;因为它保存了程序实现或使用的所有(全局)变量和函数。符号表中保存了查找程序符号、为符号赋值、重定位符号所需要的全部信息。Linux中 nm用来列出目标文件的符号表;如果nm指令没有指出目标文件&#xff0c;则nm假定目…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目&#xff0c;本来不管作者事儿的&#xff0c;但是后来听到说是室友去网上找人花了80块买了个劣质的&#xff0c;不仅是从CSDN上抄的&#xff0c;而且使用的板子还不符合室友的要求。可叹作者心软啊&#xff0c;顺便给室友做了。 在代码实现部分会给出设…

智能优化算法应用:基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于纵横交叉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.纵横交叉算法4.实验参数设定5.算法结果6.…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI&#xff0c;是一种由人制造出来的机器&#xff0c;该机器可以模仿人的思想和行为&#xff0c;从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括&#xff1a;芯片、大数据、算法系统、网络等多项基础…

【Gradle】创建第一个项目

文章目录 1. 前提2. 创建项目并初始化1&#xff09;创建项目2&#xff09;初始化项目 3. 介绍生成的文件结构4. 执行5. 包的作成 &#xff08;非必须&#xff09;6. 推送&#xff08;非必须&#xff09; 本节将继 Gradle 之初体验 安装之后&#xff0c;创建第一个 Hello World…

C++计算(a+b)*(c-b)的值 2023年9月c++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C计算(ab)*(c-b)的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C计算(ab)*(c-b)的值 2023年9月 C编程等级考试一级编程题 一、题目要求 1、编程实现 给定3个整数a、b、c&#xff0c;计算表达…

[Android] ubuntu虚拟机上搭建 Waydroid 环境

1.安装虚拟机 略 2.安装waydroid Ubuntu/Debian and derivatives For Droidian and Ubuntu Touch, skip directly to the last step Install pre-requisites sudo apt install curl ca-certificates -y Add the official repository curl https://repo.waydro.id | sudo…

晚期食管癌肿瘤治疗线程分类

文章目录 1、肿瘤治疗的线数1.1 基础概念1.2 线程定义1.3 如何计算治疗线数 2 食管癌治疗指南2.1 食管癌诊疗指南2.1 CSCO 本文前半部分主要来源于参考文件1&#xff0c;其余部分来源于官方指南。无原创内容&#xff0c;全部为摘要。 1、肿瘤治疗的线数 1.1 基础概念 抗肿瘤药…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

GZ015 机器人系统集成应用技术样题5-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题5 选手须知&#xff1a; 本任务书共 24页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表 剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表解法1&#xff1a;中序遍历 - 递归解法2&#xff1a;中序遍历 - 迭代 剑指 Offer&#xff08;第2版&am…

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

【CMU 15-445】Lecture 12: Query Execution I 学习笔记

Query Execution I Processing ModelsIterator ModelMaterialization ModelVectorization Model Access MethodsSequential ScanIndex Scan Modification QueriesHalloween Problem 本节课主要介绍SQL语句执行的相关机制。 Processing Models 首先是处理模型&#xff0c;它定义…

基于JAVA+SpringBoot+Vue的前后端分离的学校请假管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 系统分为四个角色&…