一些背景知識(shí):
(1) HTTP/1.0 協(xié)議中,定義了web server 和client使用代理(proxy)時(shí),在HTTP request 和response頭中,使用Via: 標(biāo)識(shí)使用的proxy server,用來防止server loop;
(2) snort 是開放源代碼的IDS(入侵檢測(cè)系統(tǒng)),可以用于主機(jī)或網(wǎng)絡(luò)IDS。具有很多IDS規(guī)則,可以對(duì)捕捉的(ip,tcp,udp,icmp)包進(jìn)行模式識(shí)別和匹配,并可產(chǎn)生相應(yīng)記錄。
(3) libnet是開放源代碼的軟件,可以作為網(wǎng)絡(luò)協(xié)議/包生成器。
(4) TCP/IP網(wǎng)絡(luò)是包交換網(wǎng)絡(luò)
(5) snort 同時(shí)具有使用libnet庫生成IP包的功能,可以通過發(fā)出TCP_RESET包,中斷TCP連接。
前提:
(1) snort 運(yùn)行于路由上(linux)或者通過交換機(jī)的port mirror功能,運(yùn)行在路由的同一網(wǎng)絡(luò)段
實(shí)施:
(1) compile snort with flexresp(flex response) feature
(2) 定義snort 規(guī)則:
alert tcp $HOME_NET any <> $EXTER_NET 80 (msg:"block proxy"; uricontent:"Via:"; resp: rst_all;)
效果:
內(nèi)部網(wǎng)絡(luò)用戶可以正常瀏覽外部網(wǎng)站,如果內(nèi)部用戶的瀏覽器設(shè)置了外部的一個(gè)代理后,HTTP REQUEST 頭和RESPONSE頭會(huì)包括Via: ...字符,snort規(guī)則會(huì)捕捉到這個(gè)連接,然后向client 和server的socket發(fā)送RST包。這樣TCP連接就被終止了。