zoukankan      html  css  js  c++  java
  • 强大的数据包处理程序scapy

    实验目的

    利用scapy工具构造arp、icmp数据包,发送到目标主机,根据应答包推测出目标系统存活情况

    实验原理

    Scapy是Python写的一个功能强大的交互式数据包处理程序,可用来发送、嗅探、解析和伪造网络数据包,常常被用到网络攻击和测试中。

    实验内容

    Scapy发送、嗅探、解析和伪造网络数据包

    实验环境描述

    攻击机kali

    用户名密码为 root toor

    靶机

    用户名密码为:msfadmin msfadmin

    实验步骤

    一、使用Scapy工具实施第二层扫描发现(理论部分,可跳过)

    1.1启动Scapy工具。在终端下输入命令scapy,输出信息显示了启动Scapy成功,其中>>>提示符表示成功登录Scapy的交互界面。

    root@kali:~# scapy
    INFO: Can't import python gnuplot wrapper . Won't be able to plot.
    WARNING: No route found for IPv6 destination :: (no default route?)
    Welcome to Scapy (2.2.0)
    >>>
    

    1.2输入命令“ARP().display()”发送一个ARP请求包,显示出数据报模板。

    >>> ARP().display()
    ###[ ARP ]###
      hwtype= 0x1
      ptype= 0x800
      hwlen= 6
      plen= 4
      op= who-has
    WARNING: more No route found (no default route?)
      hwsrc= 00:00:00:00:00:00
      psrc= 0.0.0.0
      hwdst= 00:00:00:00:00:00
      pdst= 0.0.0.0
    

    1.3在发送数据包前,需要设置一下参数。

    >>> arp_request=ARP()
    >>> arp_request.hwsrc="52:54:00:d1:f7:28"   //本机MAC地址(根据实际情况)
    >>> arp_request.psrc="192.168.1.2"        //本机IP地址
    >>> arp_request.pdst="192.168.1.3"        //目标主机IP地址
    >>> arp_request.display()                  //显示ARP数据包参数
    ###[ ARP ]###
      hwtype= 0x1
      ptype= 0x800
      hwlen= 6
      plen= 4
      op= who-has
      hwsrc= 52:54:00:d1:f7:28
      psrc= 192.168.1.2
      hwdst= 00:00:00:00:00:00
      pdst= 192.168.1.3
    

    1.4数据包参数设置完毕,输入命令“sr1(arp_request)”发送数据包。display()函数也可以应用于创建ARP对象,用来验证已经更新配置的值。sr1()函数可以用来发送ARP请求包,并且可以返回响应。但是sr1()函数,只能接收一个响应包。例如,使用sr1()函数发送一个请求,并收到响应,执行命令如下所示:

    >>> sr1(arp_request)
    Begin emission:
    .*Finished to send 1 packets.
    Received 2 packets, got 1 answers, remaining 0     packets
    <ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=is-at hwsrc=52:54:00:3d:10:66 psrc=192.168.1.3 hwdst=52:54:00:d1:f7:28 pdst=192.168.1.2 |<Padding  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>
    >>>
    

    从输出信息中,可以看到成功发送了一个包,并得到一个响应包。其中,输出的详细信息是ARP响应包。从响应的包信息中可以看到包的源MAC地址、源IP地址、目标MAC地址、目标IP地址等。

    1.5 如果目标主机处于关机和不存在状态,sr1()函数会继续分析传入的流量,按下Ctrl+C强制停止,或者使用参数timeouts,在指定的时间内,将会停止sr1()函数。下面设置arp_request.pdst参数为一个不存在的主机地址,然后发送ARP数据包。

    >>> arp_request=ARP()
    >>> arp_request.pdst="192.168.1.3"
    >>> sr1(arp_request)
    Begin emission:
    ........................................................................................................................................................................................................................WARNING: Mac address to reach destination not found. Using broadcast.
    Finished to send 1 packets.
    ...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
    Received 1607 packets, got 0 answers, remaining 1 packets
    

    1.6从以上输出信息中,可以看到发送了一个包,接收到1607个包。但是,响应包数为0。这里响应的包数为0,表示主机192.168.1.3不存在或者关机状态。所以,无法接收到该响应包。下面设置一下timeout参数值,然sr1()函数在1秒钟后停止运行。执行命令如下所示:

    >>> sr1(arp_request,timeout=1)
    Begin emission:
    ....................................................................................................................................................................................................................    WARNING: Mac address to reach destination not found. Using broadcast.
    Finished to send 1 packets.
    .........................................................................................................
    Received 317 packets, got 0 answers, remaining 1 packets
    >>>
    

    从输出信息中,发现经过1秒钟后,函数sr1()自动停止。

    二、使用scapy对目标主机扫描

    2.1单击桌面空白处,右键菜单选择“在终端中打开”。如图1所示

    图片描述

    2.2在终端中,输入scapy,打开scapy控制台。如图2所示

    图片描述

    2.3指定一个初始变量ip,在提示符下输入>>> ip=IP()。然后查看ip参数,在提示符下输入>>> ip.display(),输出信息显示了,Ip变量的默认配置信息,根据实际情况更改src和dst参数。如图3所示

    图片描述

    2.4将目标地址dst修改为192.168.1.3,执行命令>>> ip.dst="192.168.1.3",输出信息中显示目标dst地址修改为192.168.1.3,源IP地址也修改为网卡IP地址192.168.1.2。如图4所示

    图片描述

    2.5在IP层上创建第二层数据包icmp参数,定义ICMP模板数据包ping。在提示符下输入ping=ICMP()。如图5所示

    图片描述

    2.6利用“/”把创建的两个数据包组装,执行命令>>> ping_request=(ip/ping),以上输出信息显示数据包封装完毕,可以发送出去了。如图6所示

    图片描述

    2.7利用函数sr1()发送,执行如下命令>>> ping_reply=sr1(ping_request),输出信息中,显示一共收到3个数据包,包含一个响应包,ICMP类型为echo-reply。 如图7所示

    图片描述

    2.8用同样的操作,响一个不存在的主机发送数据包(目标地址:192.168.1.200),输出信息中,显示响应数据包为0,说明主机无法访问。函数sr1()会一直监听,知道接收到回应包。这里按Ctrl+C强制停止了发送数据包。如图8所示

    >>> ip.dst="192.168.1.200"
    >>> ping_request=(ip/ping)
    >>> ping_reply=sr1(ping_request)
    

    图片描述

    2.9下面设置sr1()函数的一个超时时间,输入命令>>> ping_reply=sr1(ping_request,timeout=1),输出信息在sr1()函数发送数据包1秒钟后,自动停止。如图9所示

    图片描述

    ###三、利用脚步扫描主机 3.1创建一个扫描脚本ping.py,实现对多个IP地址的ICMP扫描。

    root@kali:~# vi ping.py
    import logging
    logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
        print "Usage - ./pinger.py [/24 network address]"
        print "Example will perform an ICMP scan of the 192.168.1.0/24 range"
    #!/usr/bin/python
    from scapy.all import *
    if len(sys.argv) != 2:
        print "Example - ./pinger.py 192.168.1.0"
        sys.exit()
    address = str(sys.argv[1])
    prefix = address.split('.')[0] + '.' + address.split('.')[1] + '.' + address.split('.')[2] + '.'
    for addr in range(150,158):  //根据具体环境填写参数
        answer=sr1(ARP(pdst=prefix+str(addr)),timeout=1,verbose=0)
        if answer == None:
                pass
        else:
                print prefix+str(addr)
    

    3.2赋予ping.py可执行权限。

    root@kali:~# chmod +x ping.py
    root@kali:~# ls -al|grep ping.py
    -rwxr-xr-x  1 root root   406  6月 22 16:06 ping.py
    root@kali:~#
    

    3.3 运行ping.py脚本文件,扫描活跃主机。

    root@kali:~# ./ping.py 192.168.1.0
    WARNING: No route found for IPv6 destination :: (no default route?)
    WARNING: Mac address to reach destination not found. Using broadcast.
    192.168.1.3
    root@kali:~#
    

    四、利用scapy发送TCP ACK数据包扫描主机

    4.1在终端中输入scapy命令。如图10所示

    图片描述

    4.2设置一个变量名n,利用IP()函数初始化变量n。输入命令>>> n=IP(),查看默认参数,输入命令>>> n.display()。如图11所示

    图片描述

    4.3修改dst参数,输入命令>>>n.dst="192.168.1.3" ,查看n修改后参数,输入命令>>>n.display(),输出信息中,参数dst已经修改了,并且参数src也自动修改。如图12所示

    图片描述

    4.4设置TCP()函数变量t,输入命令>>> t=TCP()。查看变量t的默认参数,输入命令>>> t.display()。如图13所示

    图片描述

    4.5设置t变量参数flags,输入命令>>> t.flags=‘A’。查看t变量的参数,输入命令>>> t.display(),输出信息显示TCP标志位已经设置为ACK。如图14所示

    图片描述

    4.6将两个变量n和变量t组装数据包发送,输入命令>>> request=(n/t)。查看组装的数据包,输入命令>>> request.display()。如图15所示

    图片描述

    4.7利用sr1()函数,发送数据包request。输入命令>>> response=sr1(request),查看收到的回应包,输入命令>>> response.display(),输出信息,表示目标主机响应了发送主机一个数据包。如图16所示

    图片描述

    4.8下面访问一个不存在的主机(192.168.1.200),输入命令>>> n.dst=” 192.168.1.200”。从新封装数据包,输入命令>>> request=(n/t)。显示新封装的数据包,输入命令>>>request.display()。如图17所示

    图片描述

    4.9利用函数sr1()发送新封装的数据包,输入命令>>>response=sr1(request),输出信息数据包无法到达。结束监听需要按ctrl+c键。如图18所示

    图片描述

    4.10在函数sr1()增加一个timeout=1参数,输入命令>>>response=sr1(request,timeout=1)。如图19所示

    图片描述

  • 相关阅读:
    jackson 枚举 enum json 解析类型 返回数字 或者自定义文字 How To Serialize Enums as JSON Objects with Jackson
    Antd Pro V5 中ProTable 自定义查询参数和返回值
    ES6/Antd 代码阅读记录
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
    Antd Hooks
    使用.Net Core开发WPF App系列教程(其它 、保存控件内容为图片)
    使用.Net Core开发WPF App系列教程( 三、与.Net Framework的区别)
    使用.Net Core开发WPF App系列教程( 四、WPF中的XAML)
    使用.Net Core开发WPF App系列教程( 二、在Visual Studio 2019中创建.Net Core WPF工程)
    使用.Net Core开发WPF App系列教程( 一、.Net Core和WPF介绍)
  • 原文地址:https://www.cnblogs.com/lzkalislw/p/13625414.html
Copyright © 2011-2022 走看看