zoukankan      html  css  js  c++  java
  • SCAPY发送伪装包2 实现

       同绝大多数的网络协议类库一样,scapy中依旧采取分层的视图来对数据进行管理。

    本次的任务,由于是伪装MAC,所以需要调用最底层的Ethernet层,这个层次,上一篇日志已经获取了本机的MAC、路由器的MAC。

    只需要伪装的MAC地址,这个由参数传递。

    >>> ls(Ether())
    WARNING: Mac address to reach destination
    not found. Using broadcast.
    dst : DestMACField
    = 'ff:ff:ff:ff:ff:ff' (None)
    src : SourceMACField
    = '00:00:00:00:00:00' (None)
    type : XShortEnumField
    = 0 (0)

    ICMP包在协议中的位置是处于一个比较难分的,一直当做是IP扩展层来理解-^-

    因此想要发送一个伪装的ICMP,就需要先构筑“下一层”的IP数据报了。

    还是来看一下scapy中IP层的内容:

    >>> ls(IP())
    version : BitField
    = 4 (4)
    ihl : BitField
    = None (None)
    tos : XByteField
    = 0 (0)
    len : ShortField
    = None (None)
    id : ShortField
    = 1 (1)
    flags : FlagsField
    = 0 (0)
    frag : BitField
    = 0 (0)
    ttl : ByteField
    = 64 (64)
    proto : ByteEnumField
    = 0 (0)
    chksum : XShortField
    = None (None)
    src : Emph
    = '127.0.0.1' (None)
    dst : Emph
    = '127.0.0.1' ('127.0.0.1')
    options : PacketListField
    = [] ([])

    也正是IP首部的内容-20个字节的内容并不需要我们一一填充——尤其是chksum,当初花了不少时间来弄chksum,后来才发现原来checksum在scapy中是如此简单(代码中会展示出来)

    回到IP层,我们现在填充IP

    src自然要使用一个伪装的IP了,这个是从参数获取。

    dst就是我们要欺骗的目的IP,也是从参数中获取。

    type就是1,也就是表明数据报是一个ICMP包。 

    在ICMP包中,我们也只需要填充type类型——是请求(1)还是回显(8)

    完成了ICMP包,我们加入数据—RAW层,直接使用RAW(‘填充内容')来初始化一个raw包。

     1 #! /env/lib python
    2 import sys
    3 import os
    4 from scapy.all import *
    5 from usual import *
    6 conf.vert = 1
    7
    8 if __name__ == "__main__":
    9 #get hwaddress\ip\gateway and init
    10 t_hw = GetMac()
    11 t_ip = GetIp()
    12 gatemac = GetGateWay(t_ip,t_hw,False)
    13 target = '192.168.3.25'
    14 fakeip = t_ip
    15 fakemac = t_hw
    16
    17 #parse the input
    18 for i in range(1,len(sys.argv)):
    19 l = sys.argv[i].split('=')
    20 if l[0] == '-t':
    21 target = l[1]
    22 elif l[0] == '-ip':
    23 fakeip = l[1]
    24 elif l[0] == '-mac':
    25 fakemac = l[1]
    26
    27 pack_ip = IP(dst = target,src = fakeip,proto = 1)
    28 pack_icmp = ICMP(type = 8)
    29 pack_ether = Ether(src = fakemac,dst = gatemac,type = 0x0800)
    30 #add info
    31 info = Raw('ip:'+t_ip+' mac:'+ t_hw +' ')
    32 t = str(pack_ether/pack_ip/pack_icmp/info)
    33 s = Ether(t)
    34 # s.pdfdump("/home/jack13/trade.pdf")
    35 sendp(s)

     10-15行,调用上一篇日志中的函数获取相应的信息、初始化部分变量

     17-25行,解析输入变量

     27-31行,单独生成各层对象

     32-33行,整合各层对象,同时生成发送包s。(这两行就可以完成checksum的工作)

     35行,      发送伪装数据

    运行:

    sudo python send7.py -t=192.168.3.62 -ip=192.168.0.1 -mac=00:11:22:33:44:55

    包是无法返回的,但是通过wireshark的抓包,我们可以看到一个正确的包被发送。

    截图上传不了E.E

  • 相关阅读:
    SELENIUM2 使用JavascriptExecutor在页面Javascipt执行
    用Merge来改写相关更新的例子
    Oracle --获取绑定变量的值.
    [NewLife.XCode]高级统计(数据报表利器)
    [NewLife.XCode]分表分库(百亿级大数据存储)
    [NewLife.XCode]导入导出(实体对象百变魔君)
    [NewLife.XCode]角色权限
    [NewLife.XCode]实体工厂(拦截处理实体操作)
    [NewLife.XCode]百亿级性能
    [NewLife.XCode]对象字典缓存(百万军中取敌首级)
  • 原文地址:https://www.cnblogs.com/amaoxiaozhu/p/2134485.html
Copyright © 2011-2022 走看看