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所示

    图片描述

  • 相关阅读:
    【转】框架集中framespacing、border和frameborder属性的关系
    使用ArcGIS GP服务之二手工建模
    使用ArcGIS GP服务之五 JavaScript的调用
    使用ArcGIS GP服务之三发布前的准备
    计算GPS WGS_84 两点的距离
    使用ArcGIS GP服务之四GP服务发布
    计算GPS WGS_84 两点的距离 更加细腻的算法
    QueryPerformanceFrequency
    cocos2dx App 图标
    cocos2dx CCTimer::timerWithTarget回调
  • 原文地址:https://www.cnblogs.com/lzkalislw/p/13625414.html
Copyright © 2011-2022 走看看