Iptables

Snort 正在接收流量,但似乎沒有應用規則

  • September 3, 2019

我已經通過本地網關上的 NFQUEUE 安裝了 snort 並以內聯模式執行(就像我可以走進隔壁房間並觸摸它一樣)網關。我有以下規則/etc/snort/rules/snort.rules

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET CURRENT_EVENTS D-LINK Router Backdoor via Specific UA"; flow:to_server,established; content:"xmlset_roodkcableoj28840ybtide"; http_header; pcre:"/^User-Agent\x3a[^\r\n]*?xmlset_roodkcableoj28840ybtide/Hm"; reference:url,www.devttys0.com/2013/10/reverse-engineering-a-d-link-backdoor/; classtype:attempted-admin; sid:2017590; rev:2; metadata:created_at 2013_10_13, updated_at 2013_10_13;)

此規則與在某些 DLink 路由器中發現的後門有關。我選擇了這條規則,因為它看起來很容易測試。規則本身是由來自新興威脅的 pullpork 添加的,因此我認為規則語法是正確的。

為了測試,我在面向網際網路的埠 80 上配置了帶有 lighttpd 的網關,並確認它是可訪問的。然後,在遠端機器上,我執行了 command curl -A 'xmlset_roodkcableoj28840ybtide' 'http://<EXTERNAL_IP>'。這會立即將 lighttpd 的響應列印到控制台並退出。網關上不會生成 snort 警報。

此外,netfilter 似乎只使用了我正在執行的四個 snort 程序中的兩個。我可以看到這一點,htop因為 CPU 1 和 2 上的 snort 程序在使用 bittorrent 進行測試時會產生沉重的負載……但 CPU 0 和 3 上的 snort 程序仍然完全空閒。

我的測試方法錯了嗎?或者當它應該發出警報時,snort 沒有發出警報(即因為配置錯誤)?我在哪裡可以看到為什麼 netfilter 不能平衡所有四個隊列之間的流量?

配置

我的 Snort/Netfilter 配置

我的 netfilter 鏈的具體相關部分是:

Chain wan-fw (1 references)
pkts bytes target     prot opt in     out     source               destination         
25766 2960K smurfs     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID,NEW,UNTRACKED
   4  1380 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:67:68
4267  246K tcpflags   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           
3820  550K ~comb0     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED     <<=== this one for established connections ====!
   0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED
 937 79669 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp flags:!0x17/0x02
  13   506 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 /* Ping */
   4   240 ~log0      tcp  --  *      *       <remote_server>      0.0.0.0/0            tcp dpt:80 /* Tiphares Allowed In */     <<=== this one for new connections ====!
   0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type BROADCAST
   0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type ANYCAST
   0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type MULTICAST
21506 2454K NFLOG      all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: up to 1/sec burst 10 mode srcip nflog-prefix  "IPv4 wan-fw REJECT " nflog-threshold 1
24808 2878K reject     all  --  *      *       0.0.0.0/0            0.0.0.0/0           [goto] 
Chain ~log0 (1 references)
pkts bytes target     prot opt in     out     source               destination         
   4   240 NFLOG      all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: up to 1/sec burst 10 mode srcip /* Tiphares Allowed In */ nflog-prefix  "IPv4 HTTPTest NFQUEUE " nflog-group 1 nflog-threshold 1
   4   240 NFQUEUE    all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Tiphares Allowed In */ NFQUEUE balance 0:3 bypass cpu-fanout     <<=== passes packets to one of 4 snort processes ====!
Chain ~comb0 (4 references)
pkts bytes target     prot opt in     out     source               destination         
474K  196M NFQUEUE    all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate ESTABLISHED NFQUEUE balance 0:3 bypass cpu-fanout     <<=== all established connections from 'wan' are monitored by snort ====!
   0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0      

額外的皺紋:

我不確定這是否相關。我發現在我的網關上向 Internet 上的 IP 發送 TCP 重置數據包似乎有什麼東西。並且這些數據包與現有連接無關。

鑑於在此網關後面的機器上使用 bittorrent 時會發生這種情況,並且大多數重置數據包將 torrent 埠列為源埠,對我來說唯一有意義的是,當它阻塞某些東西時,這是 snort 發送重置(是嗎? )。

但是我使用 nfqueue daq ……所以,如果它是 snort,那麼為什麼 snort 以 netfilter 視為新連接的方式發送這些數據包,而不是將數據包直接插入到 netfilter 鏈中並將它們與現有的相關聯它阻塞的連接?而且,snort 沒有設置為丟棄數據包或發送重置(僅警報)……那麼為什麼要這樣做呢?因此,為什麼我不確定這是 snort 正在做的事情。

其他資訊

根據@Lenney 的建議,我也用curl -A 'asafaweb.com' http://server-ip. 這也沒有產生警報。我仔細檢查了我的規則文件中是否存在此規則。那裡有兩個:

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET POLICY ASafaWeb Scan User-Agent (asafaweb.com)"; flow:established,to_server; content:"User-Agent|3a| asafaweb.com|0d 0a|"; http_header; reference:url,asafaweb.com; classtype:network-scan; sid:2014233; rev:2; metadata:created_at 2012_02_16, updated_at 2012_02_16;)

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"MALWARE-CNC User-Agent ASafaWeb Scan"; flow:to_server,established; content:"User-Agent|3A| asafaweb.com"; fast_pattern:only; http_header; metadata:policy balanced-ips alert, policy security-ips drop, ruleset community, service http; reference:url,asafaweb.com; classtype:network-scan; sid:21327; rev:7;)

我還更新了我的配置。顯然,我上傳的那個是舊的(在 http netfilter 規則中顯示 ACCEPT 而不是 NFQUEUE)。

在聊天中“解決”。

在調試了幾乎所有內容(iptables + NFQUEUE、systemd.service 和插入單元、snort 警報等)之後,問題出在測試完成的方式上。

通常,作為內聯 IDS/IPS 的 snort 本身並沒有被定義為檢查可疑流量,而只是檢查 HOME_NET(也稱為本地 LAN 子網),而不是在其自己的公共 IP 上。原始規則已針對該公共 IP 進行了測試,因此沒有生成任何警報,因為警報的預設值類似於EXTERNAL_NET any -> HOME_NET any.

引用自:https://serverfault.com/questions/980528