利用Scapy检测网卡流量

0x01. 介绍

当时在做项目的时候,有一个要求就是获得流经网卡的流量,搜索半天发现一个神库!python的scapy。下面简单介绍一下scapy

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

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

Scapy 主要做两件事:发送报文和接收回应。

接下来我们具体介绍一下scapy的简单使用

0x02. 使用

安装:
linux: pip install scapy
window: pip install scapy 但window 可能会提示缺少依赖环境, 安装相应的依赖环境就好了
运行方式: python ./name.py 就可以了

pkt:数据包

pkt.summary()    # 获得数据包的概要
pkt.show()     # 获得更加详细的数据包内容
pkt.pdfdump()   # 可以将数据包的内容以pdf形式保存

object:scapy对象

object.filter()  # 返回一个过滤后的列表
object.hexdump() # 返回对所有的数据包hex值
object.summary() # 展示所有数据包的概要信息

!Sniffing  #我们可以简单地捕获数据包,默认在所有接口上嗅探

a=sniff(filter="tcp and ( port 8080 or port 80 )")  # 获取tcp协议的数据包,且端口为8080 或者 80

了解上面的基本用法后,我们就可以开始编写我们自己的demo了!

0x03.实例代码

from scapy.all import *  # 加载模块
import iptc  # 控制linux 下的iptables模块

class wirecap:

def __init__(self, method, filter_sentence, eth, count):
    self.cpt_method = self.less_data # 输出信息模式,简单还是详细
    self.method = method # tcp或者其他协议
    self.filter = filter_sentence # 过滤语句 端口 域名等
    self.eth = eth  # 监听的网卡
    self.count = count  # 想监听的数据包数量

    if self.method != 'S' and self.method !='s':  
        self.cpt_method = self.full_data  # 简单还是详细

    if len(self.eth) == 0:  # 默认网卡
        self.eth = None

    try:  
        self.count = int(self.count)
    except: # 无输入表示默认数量
        self.count = None


def full_data(self, packet):        #详细模式,输出详细数据包内容
    if packet:
        print '[+] Here is a packet!!!'
        packet.show()       
        hexdump(packet)
        print '[-] Packet end \n'


def less_data(self, packet):   #简约模式 
    '''
    当前分析只是http协议
    '''
    if packet:
        try:
            if packet['Raw']:    #检查是否含有 http 头内容
                print '[+] Here is a packet!!!'
                print packet.summary()   #打印出简略信息
                url_data = str(packet['Raw']).split(' ')[1]   #获取http头中的url地址
                ip_data = str(packet['IP'].src)    #获取 数据包中的源ip
                self.check(url_data, ip_data)      #检查url是否有敏感字符
                print '[-] Packet end \n'
        except:
            print 'do not have http header'


def start_sniff(self):
# 如果有的话,输入用户自定义信息
    if self.eth:  
        if self.count:  
            sniff(iface=self.eth, filter=self.filter, prn=self.cpt_method, count=self.count)
        else:  # 不然则默认
            sniff(iface=self.eth, filter=self.filter, prn=self.cpt_method)
    else:
        if self.count: 
            sniff(filter=self.filter, prn=self.cpt_method, count=self.count)
        else:
            sniff(filter=self.filter,prn=self.cpt_method)


def check(self,data,ip):       #传入url和ip
    if 'order%20by' in data:     #先实现最简单的检查
        print  '[-] * Danger'
        self.control(ip)    #调用python-iptables 设置防火墙规则


def control(self,ip):
    print 'I have to ban this ip now !!'
    rule =iptc.Rule()      # 创建一个对象
    rule.in_interface= 'eth0'    # 设置网卡
    rule.src = ip       # 设置ip
    rule.protocol = 'tcp' # 设置协议
    chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), 'INPUT')  # 在filter表中的‘INPUT’链设置过滤规则 ,简而言之就是为输入的数据包设置规则
    rule.target = iptc.Target(rule,'DROP')  # 设置动作
    chain.insert_rule(rule)  #插入规则
    print 'this is ip can not reach my server anymore'

cap = wirecap('s','tcp and port 80','',300)      #设置协议‘tcp’和端口为80

cap.start_sniff()

上面的代码实现了4个功能:
1. 根据用户输入的自定义信息,构造监听语句。执行监听
2. 可以详细的查看监听的流量
3. 将流量提取信息后进行判断
4. 对不寻常的流量深入追究,获取其ip,并利用iptc 添加防火墙规则!

0x04. 总结

本次只是简单的利用scapy进行一个流量检测的功能,其实scapy的用法是及其广的。
Scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。
希望可以对大家有所帮助!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据