近期收到了電子工業出版社贈送的一本網絡安全書籍《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