一些背景知識:
(1) HTTP/1.0 協(xié)議中,定義了web server 和client使用代理(proxy)時,在HTTP request 和response頭中,使用Via: 標識使用的proxy server,用來防止server loop;
(2) snort 是開放源代碼的IDS(入侵檢測系統(tǒng)),可以用于主機或網(wǎng)絡(luò)IDS。具有很多IDS規(guī)則,可以對捕捉的(ip,tcp,udp,icmp)包進行模式識別和匹配,并可產(chǎn)生相應記錄。
(3) libnet是開放源代碼的軟件,可以作為網(wǎng)絡(luò)協(xié)議/包生成器。
(4) TCP/IP網(wǎng)絡(luò)是包交換網(wǎng)絡(luò)
(5) snort 同時具有使用libnet庫生成IP包的功能,可以通過發(fā)出TCP_RESET包,中斷TCP連接。
前提:
(1) snort 運行于路由上(linux)或者通過交換機的port mirror功能,運行在路由的同一網(wǎng)絡(luò)段
實施:
(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è)置了外部的一個代理后,HTTP REQUEST 頭和RESPONSE頭會包括Via: ...字符,snort規(guī)則會捕捉到這個連接,然后向client 和server的socket發(fā)送RST包。這樣TCP連接就被終止了。