python socket 嗅探器

import socket
# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# receive a package
print s.recvfrom(65565)
# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
import socket

def sniffer(count, bufferSize=65565, showPort=False, showRawData=False):
    # the public network interface
    HOST = socket.gethostbyname(socket.gethostname())

    # create a raw socket and bind it to the public interface
    s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.IPPROTO_IP)

    # prevent socket from being left in TIME_WAIT state, enabling reuse
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, 0))

    # Include IP headers
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # receive all packages
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    for i in range(count):

        # receive a package
        package = s.recvfrom(bufferSize)
        printPacket(package, showPort, showRawData)

    # disabled promiscuous mode
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

def printPacket(package, showPort, showRawData):

    # index values for (data, header) tuple
    dataIndex = 0
    headerIndex = 1

    # index values for (ipAddress, port) tuple
    ipAddressIndex = 0
    portIndex = 1

    print('IP:', package[headerIndex][ipAddressIndex])
    if(showPort):
        print('Port:', package[headerIndex][portIndex])           
        print ('') #newline
    if(showRawData):
        print ('Data:', package[dataIndex])

sniffer(count=10,showPort=True,showRawData=True)

 

import socket
import os 
import struct
import threading 
import time 

#导入netaddr包处理子网ip地址
from netaddr import IPNetwork,IPAdress
from ctypes import *

#扫描主机号
host="192.168.65.133"
#扫描子网号
subnet="192.168.65.0/24"
magic_message="PYTHONRULES"
def udp_sender(subnet,magic_message):
    time.sleep(5)
    sender=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    for ip in IPNetwork(subnet):
        try:
            #发送数据到子网内所有主机
            sender.sendto(magic_message,("%s" % ip,65212))
        except:
            pass

#对Ip数据报报头进行解析
class IP(Structure):
    _fields_=[
        ("ihl",c_ubyte,4),
        ("version",c_ubyte,4),
        ("tos",c_ubyte),
        ("len",c_ushort),
        ("id",c_ushort),
        ("offset",c_ushort),
        ("ttl",c_ubyte),
        ("protocol_num",c_ubyte),
        ("sum",c_ushort),
        ("src",c_uint32),
        ("dst",c_uint32)
    ]
    
    def __new__(self,socket_buffer=None):
        return self.from_buffer_copy(socket_buffer)
    
    def __init__(self,socket_buffer=None):
        self.protocol_map={1:"ICMP",6:"TCP",17:"UDP"}
        
        self.src_address=socket.inet_ntoa(struct.pack("@I",self.src))
        self.dst_address=socket.inet_ntoa(struct.pack("@I",self.dst))
        
        try:
            self.protocol=self.protocol_map[self.protocol_num]
            
        except:
            self.protocol=str(self.protocol_num)

#对ICMP报头进行解析
class ICMP(Structure):
    _fields_=[
        ("type",c_ubyte),
        ("code",c_ubyte),
        ("checksum",c_ushort),
        ("unused",c_ushort),
        ("next_hop_mtu",c_ushort)
    ]
    
    def __new__(self,socket_buffer):
        return self.from_buffer_copy(socket_buffer)
    
    def __init__(self,socket_buffer):
        pass

if os.name =="nt":
    #windows下允许嗅探到所有数据包
    socket_protocol=socket.IPPROTO_IP
else :
    #linux下只能嗅探到ICMP包,所以区分进行参数设置
    socket_protocol=socket.IPPROTO_ICMP
#套接字初始化,选择使用原始套接字sock_RAW
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":
    #发送IOCTL数据到网卡驱动上启动混杂模式,混杂模式下可以嗅探网卡上流经的所有数据包
    sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
    
#启动向子网发送数据报的线程
t = threading.Thread(target=udp_sender,args=(subnet,magic_message))
t.start()

try:
    while True:
        #读取接收内容
        raw_buffer=sniffer.recvfrom(65565)[0]
        #前20字节为ip数据报报头
        ip_header=IP(raw_buffer[0:20])
        print ("Protocol:%s %s ->%s"% (ip_header.protocol,ip_header.src_address,ip_header.dst_address))
        if ip_header.protocol == "ICMP":
            #得到ip数据报报头真实长度,作为偏移量
            offset = ip_header.ihl*4
            #取ip数据报报头之后的数据
            buf=raw_buffer[offset:offset+sizeof(ICMP)]
            icmp_header=ICMP(buf)
            print("ICMP -> Type:%d Code:%d" % (icmp_header.type,icmp_header.code))
            #code和type都为3的时候,是目标不可达信息
            if icmp_header.code==3 and icmp_header.type==3:
                if ipaddress(ip_header.src_address) in IPNetwork(subnet):
                    if raw_buffer[len(raw_buffer)-len(magic_message):]==magic_message:
                        print ("Host Up: %s" % ip_header.src_address)
                        
except KeyboardInterrupt:
    if os.name=="nt":
        sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

 

import socket

def sniffer(count, bufferSize=65565, showPort=False, showRawData=False):
    # the public network interface
    HOST = socket.gethostbyname(socket.gethostname())

    # create a raw socket and bind it to the public interface
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

    # prevent socket from being left in TIME_WAIT state, enabling reuse
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, 0))

    # Include IP headers
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # receive all packages
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    for i in range(count):

        # receive a package
        package = s.recvfrom(bufferSize)
        printPacket(package, showPort, showRawData)

    # disabled promiscuous mode
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

 def printPacket(package, showPort, showRawData):

    # index values for (data, header) tuple
    dataIndex = 0
    headerIndex = 1

    # index values for (ipAddress, port) tuple
    ipAddressIndex = 0
    portIndex = 1

    print('IP:', package[headerIndex][ipAddressIndex], end=' ')
    if(showPort):
    print('Port:', package[headerIndex][portIndex], end=' ')            
    print('') #newline
    if(showRawData):
        print('Data:', package[dataIndex])

 sniffer(count=10,showPort=True,showRawData=True)    

 

posted @ 2022-11-09 20:40  myrj  阅读(177)  评论(0编辑  收藏  举报