python渗透编程之道

本文介绍了使用Python进行网络渗透编程,包括原始套接字和流量嗅探,深入讲解了Windows和Linux上的包嗅探、IP与ICMP层解码、子网扫描。此外,通过Scapy库展示了如何窃取Email认证、执行ARP缓存投毒以及处理PCAP文件。最后,探讨了Python在Web攻击中的应用,如urllib2库的使用和Web应用安装问题。
摘要由CSDN通过智能技术生成

1、了解python
2、网络知识
3、渗透知识

第三章 网络:原始套接字和流量嗅探

1、Windows和Linux上的包嗅探

# _*_coding:utf-8_*_
import socket
import os

# P41 windows和linux上的包嗅探
# 监听的主机。受害主机
host = "192.168.137.132"

# 创建原始套接字,,然后绑定在公开接口上
# 通过构建套接字对象对网络上的数据包嗅探进行必要到参数设置
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))

# windows能嗅探到所有协议的数据包,而linux只能允许嗅探到ICMP数据包
# 使用混杂模式,在windows上需要管理员权限,linux上需要root权限
# 设置在捕获的数据包中包含IP头
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)

# 在windows平台上,我们需要设置IOCTL以启动混杂模式
if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# 读取单个数据包
print sniffer.recvfrom(65565)

# 在windows平台上关闭混杂模式
if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

运行:
这里写图片描述

2、解码IP层

# _*_coding:utf-8_*_
# 解码IP层,将嗅探到的二进制数形式到IP头信息提取出协议类型、源IP地址和目的地址等有用的信息
# 这个代码在linux上运行不出来,博客说在树莓派上还有windows上运行出来了
import socket
import os
import struct
from ctypes import * # 创建类似于C的结构体

# 监听的主机(受害主机)
host = "192.168.137.132"


# IP头定义
class IP(Structure):
    _fields_ = [
        ("ih1",         c_ubyte,4), # ip head length头长度,后面的4是比特位标志,说明字段按比特位计算
        ("version",     c_ubyte,4), # 版本号
        ("tos",         c_ubyte),   # 服务类型
        ("len",         c_ushort),  # IP数据包总长
        ("id",          c_ushort),  # 标识符
        ("offset",      c_ushort),  # 片偏移
        ("ttl",         c_ubyte),   # 生存时间
        ("protocol_num",c_ubyte),   # 协议类型,协议数字,后面有提到
        ("sum",         c_ushort),  # 校验和
        ("src",         c_ulong),   # 源IP
        ("dst",         c_ulong)    # 目的IP
    ]

    # __new__(cls, *args, **kwargs):创建对象时调用,返回当前对象的一个示例,第一个参数cls是class本身
    # 将原始缓冲区中到数据(从网络上获取到数据)填充到结构中
    def __new__(self, socket_buffer=None):
        return self.from_buffer_copy(socket_buffer)

    # __init__(self):创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回到实例初始化
    # 参数self是对象本身,在__new__那里是class本身
    # 当调用init方法时,new方法已经完成了对缓冲区中数据到处理
    # init方法对数据进行了内部处理,输出了可读性更强到协议类型和IP地址
    def __init__(self,socket_buffer=None):
        # 协议字段与协议名称对应
        self.protocol_map= {
  1:"ICMP",6:"TCP",7:"UDP"}
        # 可读性更强的IP地址(就是将32位的IPV4地址转换为平常看到的点分十进制形式)
        self.src_address=socket.inet_ntoa(struct.pack("<L",self.src))
        self.dst_address=socket.inet_ntoa(struct.pack("<L",self.dst))

        # 协议类型
        try:
            self.protocol=self.protocol_map(self.protocol_num)
        except:
            self.protocol=str(self.protocol_num)

if os.name == "nt":
    socket_protocol=socket.IPPROTO_IP
else:
    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":
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

try:
    while True:
        # 读取数据包
        raw_buffer=sniffer.recvfrom(65565)[0]
        # 将缓冲区的前20个字节按IP头进行解析
        ip_header=IP(raw_buffer[0:20])
        # 输出协议和通信双方的IP地址
        print "Protocol: %s %s -> %s" % (ip_header.protocol, ip_header.src_address, ip_header.dst_address)
# 处理结束键入CTRL-Z/CTRL-C
except KeyboardInterrupt:
    # 如果运行在windows上,关闭混杂模式
    if os.name=="nt":
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

3、解码ICMP层

# _*_coding:utf-8_*_
# 先把sniffer_ip_header_decode的代码复制过来

import socket
import os
import struct
from ctypes import * # 创建类似于C的结构体

# 监听的主机(受害主机)
host = "192.168.137.132"


# IP头定义
class IP(Structure):
    _fields_ = [
        ("ihl",         c_ubyte,4), # ip head length头长度,后面的4是比特位标志,说明字段按比特位计算
        ("version",     c_ubyte,4), # 版本号
        ("tos",         c_ubyte),   # 服务类型
        ("len",         c_ushort),  # IP数据包总长
        ("id",          c_ushort),  # 标识符
        ("offset",      c_ushort),  # 片偏移
        ("ttl",         c_ubyte),   # 生存时间
        ("protocol_num",c_ubyte),   # 协议类型,协议数字,后面有提到
        ("sum",         c_ushort),  # 校验和
        ("src",         c_ulong),   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值