近期收到了电子工业出版社赠送的一本网络安全书籍《python黑帽子》,书中一共24个实验,今天复现第6个实验(IP解码器),我的测试环境是mbp电脑+conda开发环境+额外一台windows电脑。因为我的mbp电脑上的所有windows系统都无法获取桥接的ip地址,搞的很崩溃,无奈使用另一台windows电脑。这个实验主要是想从网络数据包中提取协议、源IP和目的IP,并兼容windows和linux系统。
ailx10
网络安全优秀回答者
网络安全硕士
去咨询
1、在mbp上测试UDP请求
2、mbp上只抓取ICMP数据包,因此我们可以看到端口不可达的ICMP应答报文,因为8888端口没有开
3、在另一台windows系统上运行脚本,然后访问浏览器,可以看到TCP、UDP、ICMP包,测试的时候,访问了一个知名的网站,里面一堆超链接,所有产生了大量的TCP请求,可以看到既有请求,也有应答
参考代码:
# -*- coding: utf-8 -*-
# @Time : 2022/6/5 9:45 AM
# @Author : ailx10
# @File : sniffer_ip_header_decode.py
import ipaddress
import os
import socket
import struct
import sys
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)
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()
if __name__ == "__main__":
if len(sys.argv) == 2:
host = sys.argv[1]
else:
host = "192.168.0.102"
sniff(host)
发布于 2022-06-05 12:38