Snortのalertログで遊ぶ

■Snortのalertログで遊ぶ。
 snort-mysql/snortpostgresの環境で行ったが、今回はDBは無関係。

 debianには「--with-snmp」オプションも「--enable-flexresp」も無いらしい。
 SNMPトラップ通知も無ければ、検知後のブロックも出来ないというわけだ。

 以下によれば、ソースを持ってきて、ヘッダファイルを追加して、「automake」すれば?とのこと。
 とりあえず数多くのアーキテクチャの各サーバにこれは面倒なのでパス。

 /usr/share/doc/snort-doc/README.PLUGINS

■ルールを設定したら、設定が正しいか確認するには、以下が便利。
 設定したら、リロードする。

$  sudo /etc/init.d/snort config-check && sudo /etc/init.d/snort reload

 今回はマニュアルを参考にした。
 http://www.snort.org/assets/166/snort_manual.pdf

■sidは1,000,000 以上はローカルとして使用可能とのことだが、実際にはもっと大きい数がある。

$ sudo grep "(.*sid.*)" /etc/snort/rules/* | \
   sed s/".*sid\:"//g | \ 
   sed s/";.*"//g | \
   sort -nu | tail -1 | \
   awk '{printf "%3d,%03d,%03d\n", 
   ($1-($1%1000000)) /1000000,
   (($1%100000)-($1%1000))/1000,
   $1%1000}'
100,000,934

■上記を踏まえ、私のローカルロールを決める。

 先頭は20を自分用(既に10がある場合は加算する)
 次の2桁は繰り上がり用に予約
 一般に4桁のsidが多いのでそこをメインにし、
 最後の一桁はテスト用とか実験中とか本番用とかのフラグとして使う。
 以下のような感じになる。

 20 00 nnnn 1

■それではサンプルを探す。
 echo requestのtracerouteにマッチするよくあるサンプルルールを探す。

$ grep "itype:8;" /etc/snort/rules/* | grep traceroute | sed s/";\|:"/"&\n"/g
/etc/snort/rules/icmp-info.rules:
 alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP traceroute";
 itype:8;
 ttl:1;
 reference:arachnids,118;
 classtype:attempted-recon;
 sid:385;
 rev:4;
)

■以下のように定義する。
 ただのどんなICMPにもマッチするルールなのだが、それっぽい。

$ grep icmp /etc/snort/rules/local.rules
alert icmp any any -> any any (msg:"ICMP Test"; sid:200003851; rev:1;)
$ sudo /etc/init.d/snort config-check && sudo /etc/init.d/snort reload

■出力先はsyslogとtcpdumpログ。

$ sudo grep output /etc/snort/snort.conf | grep -v "#"
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: tcpdump.log

■以下のようなログが載る。
 計算するまでも無く、元のsidは「385」である。

$ sudo tail -10 /var/log/auth.log | grep snort | sed s/"`hostname -s` snort\[[0-9]*\]\: "//g
Aug 21 19:46:56 [1:200003851:1] ICMP Test {ICMP} 192.168.72.1 -> 192.168.72.188
Aug 21 19:46:56 [1:200003851:1] ICMP Test {ICMP} 192.168.72.188 -> 192.168.72.1
Aug 21 19:46:57 [1:200003851:1] ICMP Test {ICMP} 192.168.72.1 -> 192.168.72.188
Aug 21 19:46:57 [1:200003851:1] ICMP Test {ICMP} 192.168.72.188 -> 192.168.72.1

■「local.rules」の方が先に読まれるので先のICMPルールをコメントアウトし、
 「snort.conf」注のコメントアウトを外して、「threshold.conf」を有効にする。

$ sudo grep "local.rules\|threshold.conf" /etc/snort/snort.conf | grep -v "#"
include $RULE_PATH/local.rules
include threshold.conf

■「threshod.conf」を設定する。
 8秒間の内、最初の1パケットのみアラート通知する。

$ sudo grep icmp /etc/snort/threshold.conf
alert icmp any any -> any any (msg:"ICMP Test"; threshold:type limit,track by_dst, count 1, seconds 8; sid:200003852; rev:1;)
$ sudo /etc/init.d/snort config-check && sudo /etc/init.d/snort reload

■CSV出力する
 SQLのクエリで繋ぎ合わせるのは面倒。かといって、バイナリからの詳細までは要らない。
 即座に欲しいなら、CSV出力という手もある。
 ※あくまでテストなので、高負荷にならないように注意。

$ sudo grep alert_CSV /etc/snort/snort.conf 
output alert_CSV:alert.csv default

$ sudo /etc/init.d/snort config-check && sudo /etc/init.d/snort reload

■snmptrapdの最小構成

 Squeezeでsnmpトラップの送受信テスト
 http://d.hatena.ne.jp/labunix/20120526

$ sudo apt-get install -y snmp snmpd
$ sudo grep TRAPDRUN /etc/default/snmpd
TRAPDRUN=yes
$ sudo grep trapprivate /etc/snmp/snmptrapd.conf
authCommunity log,execute,net trapprivate
$ sudo /etc/init.d/snmpd restart
 
■snortのOID/MIB

 SNMP オブジェクトナビゲータ
 http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?local=ja&translate=Translate&objectInput=1.3.6.1.6.3.1.1.4

■SNMPTrap送信。

$ sudo grep "^`date '+%m/%d-%H,%M' | \
     awk -F\, '{print $1":"($2-($2%10))/10}'`[0-9]" /var/log/snort/alert.csv |  \
   awk -F\, '{print "time="$1",sid="$3",msg="$5",proto="$6",src="$7",dst="$9}' | \
   snmptrap -v 1 -c trapprivate localhost .1.3.6.1.6.3.1.1.4 localhost   6 1 '' .1.3.6.1.6.3.1.1.4.1 s "`xargs`"

$ sudo tail -10 /var/log/syslog | grep snmptrapd | sed s/"`hostname -s` snmptrapd\[[0-9]*\]\: "//g | \
   sed s/","/"&\n"/g
Aug 21 20:48:51 2012-08-21 20:48:51 localhost [127.0.0.1] (via UDP: [127.0.0.1]:59166->[127.0.0.1]) TRAP,
 SNMP v1,
 community trapprivate#012#011iso.3.6.1.6.3.1.1.4 Enterprise Specific Trap (1) Uptime: 12 days,
 19:41:35.33#012#011iso.3.6.1.6.3.1.1.4.1 = STRING: "time=08/21-20:40:55.282751 ,
sid=100000160,
msg=COMMUNITY SIP TCP/IP message flooding directed to SIP proxy,
proto=TCP,
src=192.168.72.1,
dst=192.168.72.188 "

■他のOIDについて。
 トラップメッセージはもっと細かく分けた方がよさそうだ。

 SnortSNMP
 http://www.cysol.co.jp/contrib/snortsnmp/

$ mkdir snortoid && cd  snortoid
$ wget http://www.cysol.co.jp/contrib/snortsnmp/SnortSnmpMod-2.2.0-02.tgz
$ tar zxvf SnortSnmpMod-2.2.0-02.tgz
$ cd SnortSnmpMod-2.2.0-02/
$ gunzip SnortSnmp-2.2.0-02.gz

$ grep "define *_OID" SnortSnmp-2.2.0-02 | sed s/".*OID_"//g
sidaAlertGenericOID       ".1.3.6.1.4.1.10234.2.1.3.3"
sidaAlertScanStatus       ".1.3.6.1.4.1.10234.2.1.3.4"
sidaSensorID              ".1.3.6.1.4.1.10234.2.1.1.1.1"
sidaSensorDescription     ".1.3.6.1.4.1.10234.2.1.1.1.2"
sidaSensorVersion         ".1.3.6.1.4.1.10234.2.1.1.1.3"
sidaSensorLocation        ".1.3.6.1.4.1.10234.2.1.1.1.4"
sidaSensorAddressType     ".1.3.6.1.4.1.10234.2.1.1.1.5"
sidaSensorAddress         ".1.3.6.1.4.1.10234.2.1.1.1.6"
sidaSensorInterfaceIndex  ".1.3.6.1.4.1.10234.2.1.1.1.7"
sidaSensorManufacturer    ".1.3.6.1.4.1.10234.2.1.1.1.8"
sidaSensorProductName     ".1.3.6.1.4.1.10234.2.1.1.1.9"
sidaSensorProductID       ".1.3.6.1.4.1.10234.2.1.1.1.10"
sidaAlertID               ".1.3.6.1.4.1.10234.2.1.2.1.1"
sidaAlertTimeStamp        ".1.3.6.1.4.1.10234.2.1.2.1.2"
sidaAlertActionsTaken     ".1.3.6.1.4.1.10234.2.1.2.1.3"
sidaAlertMsg              ".1.3.6.1.4.1.10234.2.1.2.1.4"
sidaAlertMoreInfo         ".1.3.6.1.4.1.10234.2.1.2.1.5"
sidaAlertSrcAddressType   ".1.3.6.1.4.1.10234.2.1.2.1.6"
sidaAlertSrcAddress       ".1.3.6.1.4.1.10234.2.1.2.1.7"
sidaAlertDstAddressType   ".1.3.6.1.4.1.10234.2.1.2.1.8"
sidaAlertDstAddress       ".1.3.6.1.4.1.10234.2.1.2.1.9"
sidaAlertSrcPort          ".1.3.6.1.4.1.10234.2.1.2.1.10"
sidaAlertDstPort          ".1.3.6.1.4.1.10234.2.1.2.1.11"
sidaAlertStartTime        ".1.3.6.1.4.1.10234.2.1.2.1.12"
sidaAlertOccurrences      ".1.3.6.1.4.1.10234.2.1.2.1.13"
sidaAlertImpact           ".1.3.6.1.4.1.10234.2.1.2.1.14"
sidaAlertSrcAddressList   ".1.3.6.1.4.1.10234.2.1.2.1.15"
sidaAlertDstAddressList   ".1.3.6.1.4.1.10234.2.1.2.1.16"
sidaAlertSrcPortList      ".1.3.6.1.4.1.10234.2.1.2.1.17"
sidaAlertDstPortList      ".1.3.6.1.4.1.10234.2.1.2.1.18"
sidaAlertScanDuration     ".1.3.6.1.4.1.10234.2.1.2.1.19"
sidaAlertScannedHosts     ".1.3.6.1.4.1.10234.2.1.2.1.20"
sidaAlertTCPScanCount     ".1.3.6.1.4.1.10234.2.1.2.1.21"
sidaAlertUDPScanCount     ".1.3.6.1.4.1.10234.2.1.2.1.22"
sidaAlertScanType         ".1.3.6.1.4.1.10234.2.1.2.1.23"
sidaAlertEventStatus      ".1.3.6.1.4.1.10234.2.1.2.1.24"
sidaAlertEventPriority    ".1.3.6.1.4.1.10234.2.1.2.1.25"
sidaAlertSrcMacAddress    ".1.3.6.1.4.1.10234.2.1.2.1.26"
sidaAlertDstMacAddress    ".1.3.6.1.4.1.10234.2.1.2.1.27"
sidaAlertProto            ".1.3.6.1.4.1.10234.2.1.2.1.28"
sidaAlertRuleID           ".1.3.6.1.4.1.10234.2.1.2.1.29"
sidaAlertRuleRevision     ".1.3.6.1.4.1.10234.2.1.2.1.30"
sidaAlertPacketPrint      ".1.3.6.1.4.1.10234.2.1.2.1.31"
EngineID                  ".1.3.6.1.6.3.10.2.1.1.0"