天天看點

python滲透測試入門之ip解碼器

作者:ailx10
python滲透測試入門之ip解碼器

近期收到了電子工業出版社贈送的一本網絡安全書籍《python黑帽子》,書中一共24個實驗,今天複現第6個實驗(IP解碼器),我的測試環境是mbp電腦+conda開發環境+額外一台windows電腦。因為我的mbp電腦上的所有windows系統都無法擷取橋接的ip位址,搞的很崩潰,無奈使用另一台windows電腦。這個實驗主要是想從網絡資料包中提取協定、源IP和目的IP,并相容windows和linux系統。

python滲透測試入門之ip解碼器

ailx10

網絡安全優秀回答者

網絡安全碩士

去咨詢

1、在mbp上測試UDP請求

python滲透測試入門之ip解碼器

2、mbp上隻抓取ICMP資料包,是以我們可以看到端口不可達的ICMP應答封包,因為8888端口沒有開

python滲透測試入門之ip解碼器

3、在另一台windows系統上運作腳本,然後通路浏覽器,可以看到TCP、UDP、ICMP包,測試的時候,通路了一個知名的網站,裡面一堆超連結,所有産生了大量的TCP請求,可以看到既有請求,也有應答

python滲透測試入門之ip解碼器

參考代碼:

# -*- 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)           
python滲透測試入門之ip解碼器

釋出于 2022-06-05 12:38

繼續閱讀