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ì)這位朋友。
內(nèi)容太長,大概的意思是說, 對(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自己機(jī)吧。
拿起心愛的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 = 1
times,_ := 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 ch
return
}
nbytes, err := io.Copy(ioutil.Discard, resp.Body)
resp.Body.Close() // don’t leak resources
if 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)
}
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í)候就得去找警察叔叔。
前行100米和警察叔叔友好交流,和警察叔叔聊了一下,發(fā)現(xiàn)了一個(gè)問題。
800元也夠不到5000元啊,但是警察叔叔讓回去收集證據(jù)了。
0×08 高防測(cè)試
這位朋友最后還是找到一家公司提供高防服務(wù),希望在自動(dòng)切換以外,可以手動(dòng)切換到高防。
因?yàn)橛泻芏嗟挠蛎尤?,在測(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)該沒掛。
作者: 糖果LUA 公眾號(hào):糖果的實(shí)驗(yàn)室