天天看点

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

继续阅读