实验目的

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

实验原理

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

实验内容

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

实验环境描述

攻击机kali

用户名密码为 root toor

靶机

用户名密码为:msfadmin msfadmin

实验步骤

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

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

  1. root@kali:~# scapy
  2. INFO: Cant import python gnuplot wrapper . Wont be able to plot.
  3. WARNING: No route found for IPv6 destination :: (no default route?)
  4. Welcome to Scapy (2.2.0)
  5. >>>

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

  1. >>> ARP().display()
  2. ###[ ARP ]###
  3. hwtype= 0x1
  4. ptype= 0x800
  5. hwlen= 6
  6. plen= 4
  7. op= who-has
  8. WARNING: more No route found (no default route?)
  9. hwsrc= 00:00:00:00:00:00
  10. psrc= 0.0.0.0
  11. hwdst= 00:00:00:00:00:00
  12. pdst= 0.0.0.0

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

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

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

  1. >>> sr1(arp_request)
  2. Begin emission:
  3. .*Finished to send 1 packets.
  4. Received 2 packets, got 1 answers, remaining 0 packets
  5. <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='\x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 |>>
  6. >>>

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

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

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

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

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

从输出信息中,发现经过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所示

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

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

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

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

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

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

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

  1. root@kali:~# ./ping.py 192.168.1.0
  2. WARNING: No route found for IPv6 destination :: (no default route?)
  3. WARNING: Mac address to reach destination not found. Using broadcast.
  4. 192.168.1.3
  5. 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所示

强大的数据包处理程序scapy的更多相关文章

  1. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑

    看到知乎上有个关于linux多进程.多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584 自己项目里也对这个问题有过很多探讨和测试 ...

  2. python数据包之利器scapy用法!

    scapy介绍:  在python中可以通过scapy这个库轻松实现构造数据包.发送数据包.分析数据包,为网络编程之利器! scapy安装: pip install scapy   ======> ...

  3. scapy基础-网络数据包结构

    网络层次模型,数据包的组成是学习scapy的基础,下文主要关注模型中各个层次的用途,ethernet II和ip包数据结构.    1.五层模型简介 名称 作用 包含协议 应用层 面向程序对程序的传输 ...

  4. scapy构造打印ARP数据包

    ARP格式: 用于以太网的ARP请求/应答分组格式 各字段含义: 帧类型:表示数据部分用什么协议封装(0800表示IP,0806表示ARP,8035表示RARP). 硬件类型:表示硬件地址的类型(其中 ...

  5. scapy构造数据包

    一.进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二.查看scapy已经实现的网络协议 ls() 列出scapy中已实现的网络协议 ls(协议类型) 查看某个协议头部字段格式 l ...

  6. scapy - 基于python的数据包操作库

    简介 地址:https://github.com/secdev/scapy scapy是一个基于python的交互式数据包操作程序和库. 它能够伪造或者解码多种协议的数据包,通过使用pcap文件对他们 ...

  7. Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...

  8. 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析

    作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ...

  9. Fiddler 抓取手机APP数据包

    Fiddler是一个调试代理,下载地址http://www.telerik.com/download/fiddler 下载安装运行后,查出运行机器的IP,手机连接同一网域内的WIFI,手机WIFI连接 ...

随机推荐

  1. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  2. [STM32F10x] 从零开始创建一个基于标准库的工程

    硬件:STM32F103C8T6 平台:MDK-AMR V4.70 1.创建一个Keil uVision 的工程 要点:相同类型的源文件放在一起以便于管理       2.添加标准库源文件 3.添加几 ...

  3. Android学习笔记4

    activity配置文件 //AndroidMainifest.xml <?xml version="1.0" encoding="utf-8"?> ...

  4. 【记录一个问题】在goland中的_test.go文件中,点右键点run,无法执行测试用例

    比较奇怪的是: 在命令行下,用 test -v alloc_test.go -test.run TestAlloc_utilJoinCPUAndGpu alloc.go 可以执行测试用例 比较奇怪的是 ...

  5. CMake语法—普通变量与函数(Normal Variable And Function)

    目录 CMake语法-普通变量与函数(Normal Variable And Function) 1 CMake普通变量与函数示例 1.1 CMakeLists.txt 1.2 执行CMake配置脚本 ...

  6. MyCms 自媒体 CMS 系统 v2.7,支持自定义页面

    MyCms 是一款基于Laravel开发的开源免费的自媒体博客CMS系统,助力开发者知识技能变现. MyCms 基于Apache2.0开源协议发布,免费且不限制商业使用,欢迎持续关注我们. V2.7 ...

  7. mysql加强(3)~分组(统计)查询

    一.分组(统计) 查询 1.语法 : select [distinct] *| 分组字段1[别名] [,分组字段2[别名],...] | 统计函数 from 表名 [别名] [where 条件(s)] ...

  8. linux如何复制文件

    目录 一:复制文件 二:文件详细属性 一:复制文件 copy的缩写cp. 格式: cp [参数] [被复制文件的路径] [复制到的新路径] 参数: -r : 递归复制 -a : 保证某些属性不变 案列 ...

  9. plsql 触发器介绍 语句级别触发器、行级别触发器。

    /* 分类: 1.DDL触发器 执行create,alter,drop操作时,会激活的触发器 2.DML触发器 执行增.删除.修改时,激活的触发器 3.系统事件触发器 执行特定的系统事件时(启动.加载 ...

  10. Linux 打包压缩、软链接、硬链接、配置镜像源

    tar命令:tar -cvf 打包文件.tar  被打包文件的路径   把文件打包成tar包,但并未被压缩: [root@Server-n93yom test]# ll total 0 -rw-r-- ...