记一次被DDoS敲诈的历程
本文轉(zhuǎn)載自微信公眾號(hào):糖果的實(shí)驗(yàn)室
0×01 背景
之前一個(gè)蜀國的朋友業(yè)務(wù)被DDOS攻擊,業(yè)務(wù)服務(wù)被機(jī)房斷網(wǎng),客戶單流失有經(jīng)濟(jì)損失,這篇具體說的就是這件事情。
背景是這樣,一個(gè)朋友網(wǎng)站業(yè)務(wù)被DDoS了,先是威脅要800元RMB,然后又轉(zhuǎn)成提供DDOS的服務(wù),然后又變成了DDOS培訓(xùn), 又變成了賣DDOS軟件,最后又變成了DDOS高防測(cè)試提供者,最后到警察叔叔那里,報(bào)警立案成功的故事。
采用高仿系統(tǒng)對(duì)于防護(hù)ddos問題當(dāng)然有效,但也要注意誤攔行為對(duì)用戶訂單的影響。每個(gè)公司的具體情況是不一樣的,解決問題也要有具體的針對(duì)性,比如當(dāng)機(jī)房不是自己的,路由防火墻設(shè)備不是自己控制的,無法從類似設(shè)備上取得第一手流量信息時(shí)(如果能用SNMP),如何處理。當(dāng)CDN是第三方提供,不能進(jìn)行黑名單阻斷設(shè)置等各種情況下,又如何處理。
0×02 來自黑客的威脅
就在這幾天,一個(gè)朋友傳來了他被DDoS的消息,正在搬磚中看到他發(fā)的消息,說他們的客服收到到0118號(hào)客人的威脅信息,說要馬上干掉你們。
這位朋友可能見過大場(chǎng)面的人,這點(diǎn)威脅就能嚇倒他嗎, 太天真了。
大家可看看下面這個(gè)圖。?
看到上面這個(gè)流量激增你們也能看出來,之后服務(wù)器真的就掛了,真的掛了,掛了。
?
這位朋友默默的看了眼高仿的價(jià)格,這個(gè)價(jià)格再次擊穿了他的心里防線。我買,我買, 我買不起。買不起是開玩笑,但這也太貴了。?
不過這個(gè)時(shí)候這位朋友想起來了,客服留言中的那個(gè)黑客微信聯(lián)系方式, 先加個(gè)微信會(huì)會(huì)這位朋友。
加了之后聊了幾句,對(duì)方大概的意思是說, 要800塊錢,并且還能幫助搞其它競(jìng)爭(zhēng)對(duì)手。這位朋友的回答就比較藝術(shù)了,沒錢,要錢向老板要去。
0×03 常見流量攻擊的形式
到這了,我們插入一段技術(shù)內(nèi)容,流量攻擊的幾種常見形式。
到7層的攻擊
1.大量肉雞產(chǎn)生的CC(ChallengeCollapsar)。
2.向WEB服務(wù)端口發(fā)送的大量的,巨型垃圾包(其實(shí)也不是很大,單條1MB以上)。
到4層的攻擊 ? ?
3.TCP sync攻擊,每次第一次tcp握手就跑,純撩閑式的方式。
除了sync方式攻擊,其它的兩種,都可以達(dá)到7層,形成WEB服務(wù)日志。
第1種和第2種,我們都可以看到nginx日志,大post的垃圾請(qǐng)求有一個(gè)問題是,發(fā)送的請(qǐng)求數(shù)據(jù),可能都不符合HTTP規(guī)范。
比較粗爆的請(qǐng)求,可以通過下面簡(jiǎn)單的方法, 加入到nginx.conf配置中,進(jìn)行非http請(qǐng)求的協(xié)議數(shù)據(jù)的過濾。
1.限定請(qǐng)求方法:
if ($request_method !~ ^(GET|HEAD)$ ) {return 444; }2.限定主機(jī)名:
if ($host !~* xxx\.com$) {return 444; }0×04 WAF防護(hù)
我們的服務(wù)有很多都是用nginx、openresy、tengine搭建的,所以用nginx lua做WAF防護(hù)也是一件很正常的事, 看看下面的配置就能知道這位朋友用的是那個(gè)WAF了吧。?
用LUA寫CC的安全策略是一個(gè)相對(duì)很便捷的過程。
威脅請(qǐng)求產(chǎn)生了大量的501和444。
命中了策略后,產(chǎn)生了對(duì)應(yīng)的命中日志。
就算我們明確知道攻擊源,要進(jìn)行攔截也是有問題的,我們?cè)诜?wù)器上部署了WAF,但前端服務(wù)還有CDN和LVS,可以在后端分析出威脅,但不能在這些設(shè)備上進(jìn)行ip block阻斷。?
并且,這位朋友的日志分析還沒有應(yīng)用到大數(shù)據(jù)層面,在手動(dòng)分析日志階段, 這樣分析和響應(yīng)速度很難和WAF協(xié)同工作。
但就算WAF可以攔截一部分威脅,當(dāng)小規(guī)模的機(jī)房和服務(wù)器還是有帶寬上限的,一旦請(qǐng)深求擁堵帶寬大于這個(gè)上限,還是一樣無響應(yīng)。
并且有機(jī)房根本沒有阻斷功能,只有報(bào)警功能,一般帶寬被占滿,業(yè)務(wù)就會(huì)被機(jī)房業(yè)斷網(wǎng)。
0×05 左右互博
攻擊是消停了,可是這位朋友感覺還是不對(duì), 要不就模擬一下自己DDoS自己吧。
拿起心愛的GO開擼:
package main import ("fmt""io""io/ioutil""net/http""os""time""strconv" ) func main() {start := time.Now()ch := make(chan string)var count int64 = 1times,_ := strconv.ParseInt(os.Args[1],10,64)url := os.Args[2]for count = 0; count <= times; count++ {go fetch(url, ch, count) // start a goroutine}for count = 0; count <= times; count++ {fmt.Println(<-ch) // receive from channel ch}fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds()) } func fetch(url string, ch chan<- string,count int64) {start := time.Now()resp, err := http.Get(url)if err != nil {ch <- fmt.Sprint(err) // send to channel chreturn}nbytes, err := io.Copy(ioutil.Discard, resp.Body)resp.Body.Close() // don't leak resourcesif err != nil {ch <- fmt.Sprintf("while reading %s: %v", url, err)return}secs := time.Since(start).Seconds()ch <- fmt.Sprintf("%7d %.2fs %7d %s",count, secs, nbytes,url)}你的代碼寫的真棒,也許有的朋友需要這代碼,老規(guī)矩放到github上:go-attacker
0×06 采用高防
朋友這段自創(chuàng)的GO就是模擬產(chǎn)生大量的GET請(qǐng)求。結(jié)果朋友發(fā)現(xiàn)自己針對(duì)自己的,服務(wù)也一樣抗不住,有反正都是造成擁塞,干脆就用WRK得了,就模擬正常的HTTP請(qǐng)求就行。
wrk -c1000-t10 -d10 --latency http://127.0.0.1:8080 /find 結(jié)果一樣扛不住,還得找那個(gè)哥哥聊聊。結(jié)果這個(gè)發(fā)起DDoS的哥們,從攻擊改成培訓(xùn)了, 傳授相關(guān)技術(shù)培訓(xùn)費(fèi)1200,上手快,時(shí)間段,經(jīng)濟(jì)效益高,但是犯法,這個(gè)不能干!
朋友先給200人家不要,不過有新情況, 不但可以培訓(xùn),還可以賣軟件,黑產(chǎn)現(xiàn)在都這么會(huì)做生意了嗎,這么多才多藝。
0×07 取證報(bào)官
朋友一看,請(qǐng)救兵吧,高防還是得買,然后報(bào)官,這時(shí)候就得去找警察叔叔。
和警察叔叔聊了一下,發(fā)現(xiàn)了一個(gè)問題。
800元也夠不到5000元啊,但是警察叔叔讓回去收集證據(jù)了。
0×08 高防測(cè)試
這位朋友最后還是找到一家公司提供高防服務(wù),希望在自動(dòng)切換以外,可以手動(dòng)切換到高仿。
因?yàn)橛泻芏嗟挠蛎尤?#xff0c;在測(cè)試階段發(fā)現(xiàn),接入高仿以后,貌似有很多的正常流量和CDN的流理被清洗掉了,這樣一天下來掉了很多單的銷量。因?yàn)檫€是在測(cè)試階段,還需要進(jìn)一步的測(cè)試確認(rèn)和加白。?
用戶->CDN->高仿->服務(wù)。
上了高防護(hù)了好不好用啊,這朋友想問問DDoS的朋友,接收不接收測(cè)試的活。
到這個(gè),就想問一句,抗DDOS的硬盤能不能也給來一塊。
持續(xù)一段時(shí)間的攻擊來了,但是服務(wù)貌似應(yīng)該沒掛。
0×09 立案成功
文章的最后就是,這位朋友成功的立案了,還是警察叔叔給力, 能不能抓到威脅要800元的朋友要看后續(xù)。?
0×10 學(xué)習(xí)安全技術(shù)
這位朋友高仿也上了,也立案了,利用間歇時(shí)間趕緊抓緊間學(xué)習(xí)安全知識(shí), 上Freebuf找公開課看,安全技術(shù)書到用時(shí)方恨少。有人問安全有什么用,像這位朋友如果服務(wù)被攻擊,每天會(huì)丟失的訂單,訂單的成本應(yīng)該遠(yuǎn)遠(yuǎn)不是800元這個(gè)金額。
0×11 ?高防外的可能方案
實(shí)際上,因?yàn)槲覀冞@位蜀國朋友的服務(wù)不在自建機(jī)房,實(shí)際上機(jī)房的具體報(bào)警策略,機(jī)房提供商不會(huì)給被服務(wù)者提供的,當(dāng)機(jī)房中的某個(gè)IP流量過大,就可能觸發(fā)流量報(bào)警,甚至后續(xù)的斷網(wǎng)。
假設(shè)整個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)的抽象結(jié)構(gòu)是下面這樣:
機(jī)房網(wǎng)絡(luò)設(shè)備-> 防火墻->CDN->WAF->WEB服務(wù)
1.什么做不到
1.1 ?不能在機(jī)房和CDN層面時(shí)行攔截
那機(jī)房網(wǎng)絡(luò)設(shè)備、防火墻是沒法干預(yù)的,攔截策略也是不知道的。
就算我們自己從WEB服務(wù)中分析出異常的訪問, 也沒有辦法在機(jī)房設(shè)備上攔截。如果CDN提供商也不支持IP封禁接口,也不能在cdn上進(jìn)行攔截。
1.2 不能過濾80和443以外的流量
在這位朋友的網(wǎng)格結(jié)構(gòu)中沒有提到LVS等負(fù)載的情況, 這樣的話,就不具備LVS過濾80和443端口以外數(shù)據(jù)的能力。
2.什么能做到
實(shí)際的WAF和業(yè)務(wù)服務(wù)器這位朋友是可以操作的,如果可以4層流量中取得HTTP日志,可在4層階段讓日志落地。但實(shí)際如果在WAF結(jié)果之前都不能做攔截動(dòng)作, 就只能直接在7層通過Openresty解析出HTTP數(shù)據(jù)和日志再做分析,這樣那個(gè)效率高,具體看情況。
2.1 ?做日志分析
Openresty落地的HTTP日志都是可以分析,如是不是通過大流量的網(wǎng)絡(luò)聚合日志,一般的ELK對(duì)單個(gè)WEB日志的數(shù)據(jù)就可以分析,分析出威脅可疑的IP,發(fā)現(xiàn)其中的集團(tuán)攻擊行為,也可以與威脅情報(bào)庫碰撞,發(fā)現(xiàn)異常被控肉機(jī)等。
2.2 停止域名解析
因?yàn)榫W(wǎng)站多域名解析的設(shè)計(jì),可以在機(jī)房斷網(wǎng)之前,停止被攻擊的域名解析。一個(gè)域名停制解析不會(huì)大面積影響訂單。這樣就需要找到一個(gè)報(bào)警閥值,這個(gè)值與機(jī)房斷網(wǎng)的閥值相關(guān),當(dāng)WAF分析出可能會(huì)造成機(jī)房斷網(wǎng)的那個(gè)極限量時(shí),就提前觸發(fā)停止域名解析。
3.期望能做到什么
期望第三方CDN可以提供IP攔截接口,期望高仿支持接口手動(dòng)切換高仿。??
期待這位朋友,在沉迷于網(wǎng)絡(luò)安全技術(shù)學(xué)習(xí)的同時(shí),不在被攻擊困擾。
總結(jié)
以上是生活随笔為你收集整理的记一次被DDoS敲诈的历程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 低效能人士的七个习惯
- 下一篇: GitHub 标星 15K,这个牛逼开源