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

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#include the IP header in the capture
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)

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

#read one packet
print(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] >> 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 = 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 names
    
    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)

def sniff(host):
    # should look familiar from previous example
    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:
            # read a packet
            #将前20字节转换成IP头对象
            raw_buffere = sniffer.recvfrom(65535)[0]
            # create an IP header from the first 20 bytes
            ip_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 mode
        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 = ‘’
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] >> 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 = 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 names
    
    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)

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 example
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:
            # read a packet
            #将前20字节转换成IP头对象
            raw_buffere = sniffer.recvfrom(65535)[0]
            # create an IP header from the first 20 bytes
            ip_header = IP(raw_buffere[0:20])
            # if it's ICMP, we want it
            if 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 starts
                offset = ip_header.ihl * 4
                buf = raw_buffere[offset:offset + 8]
                # create our ICMP structure
                icmp_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] >> 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 = 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 names
    
    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)

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 = 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:
            # read a packet
            raw_buffer = self.socket.recvfrom(65535)[0]
            # create an IP header from the first 20 bytes
            ip_header = IP(raw_buffer[0:20])
            # if it's ICMP, we went it
            if ip_header.protocol == "ICMP":
                offset = ip_header.ihl1 * 4
                buf = 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 message
                        if raw_buffer[len(raw_buffer) - len(MESSAGE):] == bytes(MESSAGE, 'utf8'):
                            tgt = str(ip_header.src_address)

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值