转载 

Python之Scapy 面向监狱编程

分类:python    365人阅读    IT小君  2021-06-06 19:49

关于Scapy

首先声明scapy和scrapy绝对没关系 ^_^

Scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。

换言之,Scapy 是一个强大的操纵报文的交互程序。它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdumptshark 的功能。


登场

scapy安装: pip install scapy ======> scapy不是内置模块,故需要额外安装

 导入scapy方式: from scapy.all import *


网络编程大家都学过吧?

socket -> bind -> listen -> accept-> recv/recvfrom -> send/sendto

一气呵成,什么select、poll、epoll多路复用模型信手拈来。

但这一套东西,只是开发建立在传输层TCP、UDP之上的应用程序。

你有没有想过,如何编程批量发送一批TCP SYN握手包,来进行端口扫描?

如何编程来发送一个伪造了IP地址的ARP数据包和IP数据报文?

甚至,如何编程来发送一个伪造了MAC地址的以太网数据帧?

一旦你掌握了上面几招,玩转数据包不是问题,开发各种神器不在话下。但一定要用在正途上,不要面向监狱编程哦~


那到底如何构造发送各种各样的数据包呢?今天给大家介绍一个强大的玩意:scapy

这是一个强大的数据包构造工具,你可以在Python中使用它,是时候喊一声:Python大法好了!

ARP

我们拿ARP开刀,ARP是地址解析协议,局域网中通信需要使用网卡的MAC地址,而网络层通信使用的是IP地址,在应用程序的数据包被发送出去之前,在IP报文前面添加以太网帧头时,需要填写收件人的MAC地址。

如果是局域网内部通信,这个收件人地址就是目的电脑的网卡MAC地址,而如果是互联网上的公网IP地址,这个收件人地址就是网关的MAC地址。

无论怎样,总得有个MAC地址才行,那怎么来呢?这就是ARP协议要干的事,它能将一个IP地址转换成一个MAC地址。

ARP解析的过程这里就不详述了,简单来说,比如要查询192.168.1.100的MAC地址,主机使用ARP协议在局域网中发出一声广播:192.168.1.100,我叫你一声你敢答应吗?

局域网中所有人都能收到这个广播(因为它的收件人MAC地址是FF-FF-FF-FF-FF-FF),但只有IP地址是192.168.1.100的这个家伙会回一句:爷爷在此!我的MAC地址是xxxxxx。

注意,在我们平时应用程序通信时,以上过程都是操作系统底层协议栈自动完成的,我们的应用程序感知不到这些。

我们可以使用Scapy这个库,来发起一次ARP解析。

from scapy.all import *
def arp_scan(ip):
    answer, uanswer = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip), inter=0.1, timeout=2, verbose=False)
    mac_list = []
    for send, recv in answer:
        if recv[ARP].op == 2:
            mac_list.append((recv[ARP].psrc, recv[Ether].hwsrc))
        return mac_list

上面这段代码,通过scapy库中的srp函数发送了一个以太网帧,收件人是ff:ff:ff:ff:ff:ff,表明这是个广播包,链路层之上是ARP协议,需要解析的IP是传入待解析的IP地址参数。

上面的函数一执行,你就能在wireshark中抓到数据包了:



上面说过,正常情况下,只有目标地址是我查的那个主机才会回复我。

但假如你的局域网中有人不怀好意,抢在真正的主机之前回答我:爷爷在此!我的MAC地址是yyyyyy。

那事情就糟了,后面的的通信报文都发给这个假冒的家伙那里去了,这就是大名鼎鼎的ARP欺骗攻击

再试想一下,如果查询的IP地址是网关的IP地址,那后果更严重,所有的网络通信都发到这家伙来了。

既然能发送ARP查询报文,你把上面的代码改一下,自然也能发送ARP应答报文···

ARP的故事先说到这里,咱们再来看一下,用scapy做一个端口扫描器。

端口扫描

TCP端口扫描,通过发送三次握手的第一次SYN数据包,根据返回的结果来判断端口的打开情况:

如果返回ACK+SYN,也就是flags字段是18,则说明端口开启:


如果返回ACK+RST,也就是flags字段是20,则说明端口关闭:


下面的函数就能实现:

from scapy.all import *
def port_scan(port):
    answer, uanswer = sr(IP(dst="192.168.1.1") / fuzz(TCP(dport=int(port), flags="S")))
    for s, r in ans:
        if r[TCP].flags == 18:
            print("port is Open")
        if r[TCP].flags == 20:
            print("port is Closed")

抓包来看:


握手包和服务器的返回包都能清楚看到,如果在循环中不断调用该函数,传入不同的端口,则可以实现批量端口扫描。

scapy构造数据包的能力这只是冰山一角,更多强大的功能等着你去研究。

学习计算机网络,不要只停留在看书和看博文的基础上,如果能自己编程收发数据包,去实现ARP、ICMP、DHCP、DNS的功能,或者开发一些简单的网络工具,绝对比别人掌握的更加深刻。

最后,给大家留一个思考题,如何通过构造IP报文实现traceroute的路由跟踪功能呢,想一想,这该如何实现?


点击广告,支持我们为你提供更好的服务

HTML5现代家居装潢公司网站模板

现代时尚家具公司网站模板

css+js实现的颜色渐变数字时钟动画特效

HTML5数字产品服务公司网站模板

有机水果蔬菜HTML5网站模板

网页设计开发公司网站模板

响应式时尚单品在线商城网站模板

响应式咖啡饮品宣传网站模板

中小型创意设计服务公司网站模板

css鼠标跟随文字模糊特效

html5 canvas彩色碎片组合球形旋转动画特效

html5图标下拉搜索框自动匹配代码

小众时尚单品在线电子商务网站模板

html5 canvas进度条圆环图表统计动画特效

js+css3抽奖转盘旋转点餐代码

响应式太阳能能源公司网站模板

canvas炫酷鼠标移动文字粒子特效

jQuery右端悬浮带返回顶部特效

HTML5 Canvas竖直流动线条背景动画特效

html5 svg夜空中星星流星动画场景特效

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务