snort-mysqlの導入、DNSバージョンチェック、シグニチャの確認

■snortクリーンインストール

$ sudo apt-get install -y snort
$ sudo dpkg-reconfigure snort
$ sudo /etc/init.d/snort restart

■snort-mysqlに切り替え

$ sudo apt-get install -y mysql-server mysql-client
$ sudo /etc/init.d/mysql status > /dev/null 2>&1 && echo "ok"
ok
$ sudo apt-get install -y snort-mysql
$ su
# mysql -u root -p
mysql> CREATE DATABASE snort;
mysql> GRANT CREATE,SELECT,INSERT,UPDATE ON snort.* to snort@localhost;
mysql> SET PASSWORD FOR snort@localhost=PASSWORD('パスワード');
mysql> exit
# cd /usr/share/doc/snort-mysql
# zcat create_mysql.gz | mysql -u snort -D snort -p
Enter password:

■簡易チェック
 必要なものが揃っていること。
 テーブルは初期では空。

# echo "\s" | mysql -u snort -p snort | grep ^Current
Enter password:
Current database:       snort
Current user:           snort@localhost
Current pager:          stdout

# mysql -u snort -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| snort              |
+--------------------+
2 rows in set (0.00 sec)

mysql> \u snort -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_snort  |
+------------------+
| data             |
| detail           |
| encoding         |
| event            |
| icmphdr          |
| iphdr            |
| opt              |
| reference        |
| reference_system |
| schema           |
| sensor           |
| sig_class        |
| sig_reference    |
| signature        |
| tcphdr           |
| udphdr           |
+------------------+
16 rows in set (0.00 sec)
mysql> select * from sensor;
Empty set (0.00 sec)
mysql> select count(*) from event;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
mysql>exit

■snortの再起動
 「dpkg-reconfigure snort-mysql」で上記で確認した必要な情報を入力します。

 「/etc/snort/db-pending-config」が見つかったらいけないようだったので、一旦退避。
 同ファイルは中身が空、snortも起動することを確認した為、削除。

# dpkg-reconfigure snort-mysql
# sudo /etc/init.d/snort restart
Starting Network Intrusion Detection System : snort/etc/snort/db-pending-config file found ... failed!
Snort will not start as its database is not yet configured. ... failed!
Please configure the database as described in ... failed!
/usr/share/doc/snort-{pgsql,mysql}/README-database.Debian ... failed!
and remove /etc/snort/db-pending-config ... failed!
# mv /etc/snort/db-pending-config /etc/snort/db-pending-config.bak
# sudo /etc/init.d/snort restart
Starting Network Intrusion Detection System : snort (eth0 using /etc/snort/snort.conf ...done).
# /etc/init.d/snort status
Status of snort daemon(s):  eth0  OK.

# wc -l < /etc/snort/db-pending-config.bak
0
# rm -f /etc/snort/db-pending-config.bak

■snort-mysqlのDB連携の確認
 パスワードが平文なのでご注意を。
 一応、アクセス権は640。rootユーザがrw、snortグループがr。

# grep ^output /etc/snort/database.conf | sed s/"password=.* "/'password=********'/
output database: log, mysql, user=snort password=********
# ls -l /etc/snort/database.conf
-rw-r----- 1 root snort 727 2012-08-09 02:18 /etc/snort/database.conf

$ sudo grep "snort" /var/log/syslog | grep mysql
Aug  9 02:19:25 vmsqueeze-amd64i snort[3060]: database: compiled support for (mysql)
Aug  9 02:19:25 vmsqueeze-amd64i snort[3060]: database: configured to use mysql

■「snort.conf」の設定変更

$ sudo cp -pi /etc/snort/snort.conf /etc/snort/snort.conf.org
$ sudo diff /etc/snort/snort.conf /etc/snort/snort.conf.org
50c50
< var HOME_NET DEBIAN_SNORT_HOME_NET
---
> var HOME_NET any
53c53
< var EXTERNAL_NET !$HOME_NET
---
> var EXTERNAL_NET any
681c681
< output alert_syslog: LOG_AUTH LOG_ALERT
---
> # output alert_syslog: LOG_AUTH LOG_ALERT
765,770c765,770
< ruletype redalert
< {
<   type alert
<   output alert_syslog: LOG_AUTH LOG_ALERT
<   output database: log, mysql, user=snort dbname=snort password=******** host=localhost
< }
---
> # ruletype redalert
> # {
> #   type alert
> #   output alert_syslog: LOG_AUTH LOG_ALERT
> #   output database: log, mysql, user=snort dbname=snort host=localhost
> # }


■DNSバージョンチェックのルール
 外部のIPから内部のUDP/53宛てに、「bind.version」の文字列を含むとアラートを出す。

$ sudo grep -i "dns.*version" /etc/snort/rules/* | \
  grep udp | sed s/":"/"&\n"/ | sed s/"\;"/"&\n  "/g
/etc/snort/rules/dns.rules:
alert udp $EXTERNAL_NET any -> $HOME_NET 53 (msg:"DNS named version attempt";
   content:"|07|version";
   offset:12;
   nocase;
   content:"|04|bind|00|";
   offset:12;
   nocase;
   reference:arachnids,278;
   reference:nessus,10028;
   classtype:attempted-recon;
   sid:1616;
   rev:7;
  )

$ sudo grep "^include" /etc/snort/snort.conf | grep dns
include $RULE_PATH/dns.rules

■DNSバージョンチェックの攻撃。
 バージョン出たらまずいのですが、デフォルトなのでw。。。

> nslookup -type=txt -class=chaos version.bind 192.168.72.188
Server:  vmsqueeze.localdomain
Address:  192.168.72.188

version.bind    text =

        "9.7.3"
version.bind    nameserver = version.bind

$ dig @192.168.72.188 chaos txt version.bind | grep "TXT"
;version.bind.                  CH      TXT
version.bind.           0       CH      TXT     "9.7.3"

■「reference:nessus,10028;」に一致する行があることを確認。

$ echo "select * from reference;" | mysql -u snort -D snort -h localhost -p | sed s/"\t"/","/g
Enter password:
ref_id,ref_system_id,ref_tag
1,1,10028
2,2,278
3,3,2002-0013
4,3,2002-0012
5,4,4132
6,4,4089
7,4,4088

$ echo "select * from event;" | mysql -u snort -D snort -h localhost -p  | wc -l
Enter password:
229

■とりあえず、検出はしている様子。
 「DNS named version attempt」

$ echo "select * from signature;" | mysql -u snort -D snort -h localhost -p | sed s/"\t"/"\,"/g
Enter password:
sig_id,sig_name,sig_class_id,sig_priority,sig_rev,sig_sid,sig_gid
1,COMMUNITY SIP TCP/IP message flooding directed to SIP proxy,1,2,2,100000160,1
2,(spp_ssh) Protocol mismatch,0,3,1,4,128
3,WEB-IIS cmd.exe access,2,1,7,1002,1
4,DNS named version attempt,3,2,7,1616,1
5,(portscan) TCP Portscan,0,3,NULL,1,122
6,(portscan) Open Port,0,3,NULL,27,122
7,SNMP request tcp,3,2,11,1418,1
8,SNMP AgentX/tcp request,3,2,11,1421,1

■シグニチャテーブルをHTML化。
 ※HTMLのままで使う分には、borderを1にすると良い。
  テキストで出力すると表示が崩れるので、ここでは0とした。

$ echo "<html><head><title>signature</title></head><body><table border=\"0\">" > signature.html
$ echo "select * from signature;" | mysql -u snort -D snort -h localhost -p | sed s/"\t"/"\,"/g | \
  sed s%"\,"%"</td><td>"%g | sed s/"^"/"<tr><td>"/g | sed s%"\$"%"</td></tr>"%g >> signature.html
Enter password:
$ echo "</table></html>" >> signature.html
$ w3m -dump -no-proxy signature.html

sig_id sig_name             sig_class_id sig_priority sig_rev sig_sid   sig_gid
       COMMUNITY SIP TCP/IP
1      message flooding     1            2            2       100000160 1
       directed to SIP
       proxy
2      (spp_ssh) Protocol   0            3            1       4         128
       mismatch
3      WEB-IIS cmd.exe      2            1            7       1002      1
       access
4      DNS named version    3            2            7       1616      1
       attempt
5      (portscan) TCP       0            3            NULL    1         122
       Portscan
6      (portscan) Open Port 0            3            NULL    27        122
7      SNMP request tcp     3            2            11      1418      1
8      SNMP AgentX/tcp      3            2            11      1421      1
       request

■おまけ。
 ※上記で検出している「cmd.exe」の攻撃(Web)
  これは、IISでなくても良いので、apache2に向けて実行。

$ telnet 192.168.72.188 80
GET cmd.exe HTTP/1.0

■ディレクトリトラバーサル

$ telnet 192.168.72.188 80
GET ../../../index.html HTTP/1.0

■今日はここまで。

■2012/08/09追記

■ログは「auth.log」に載る。
 「WEB-IIS」はログに無いのだが。。。

# MYHOST=`hostname -s`;grep Portscan /var/log/auth.log | sed s/"$MYHOST snort\[[0-9]*\]\: "//g
Aug  9 07:36:25 [122:1:0] (portscan) TCP Portscan[Priority: 3]: {PROTO:255} 192.168.72.1 -> 192.168.72.188

# MYHOST=`hostname -s`;grep "WEBROOT" /var/log/auth.log  | sed s/"$MYHOST snort\[[0-9]*\]\: "//g
Aug  9 09:53:57 [119:18:1] (http_inspect) WEBROOT DIRECTORY TRAVERSAL[Priority: 3]: {TCP} 192.168.72.1:4455 -> 192.168.72.188:80

■前回のsyslogでsnortデーモンをチェックするのをベースに、
 アラートをメールするように修正。ホスト名はFromで分かるので、削除しました。
 両方ともcronで動かすようにした。
 メールを見たら、「auth.log」と異なり、1イベントに対して複数行ある「/var/log/snort/alert」もチェックする。

 https://raw.github.com/labunix/snort_log/master/snort2mail.sh

$ sudo env EDITOR=vim crontab -l
MAILTO=""
*/10 * * * * /home/labunix/myscripts/syslog2mail.sh m
*/10 * * * * /home/labunix/myscripts/snort2mail.sh m

$ sudo grep -A 10 "^Subject" /var/spool/mail/`whoami` | grep -v ^Mess
Subject: snort alert 1 hour ago report
Date: Thu,  9 Aug 2012 10:16:30 +0900 (JST)
From: root@vmsqueeze.localdomain (root)

Aug  9 09:39:31 [128:4:1] (spp_ssh) Protocol mismatch[Priority: 3]: {TCP} 192.168.72.1:4269 -> 192.168.72.188:22
Aug  9 09:39:31 [128:4:1] (spp_ssh) Protocol mismatch[Priority: 3]: {TCP} 192.168.72.1:4269 -> 192.168.72.188:22
Aug  9 09:39:32 [128:4:1] (spp_ssh) Protocol mismatch[Priority: 3]: {TCP} 192.168.72.1:4269 -> 192.168.72.188:22
Aug  9 09:39:32 [128:4:1] (spp_ssh) Protocol mismatch[Priority: 3]: {TCP} 192.168.72.1:4269 -> 192.168.72.188:22
Aug  9 09:39:32 [128:4:1] (spp_ssh) Protocol mismatch[Priority: 3]: {TCP} 192.168.72.1:4269 -> 192.168.72.188:22


■ついでにmysqlのテーブルを直接。
 ※パスワードをファイルから読むようにするなどワンクッション置けば、とりあえずcronで自動実行できます。
  「schema」テーブルは「create_mysql.gz」と同様、バックスラッシュでエスケープしないとエラーになります。
   HTML化も簡単にしました。「<br/>」が効いてない気がするのはスルーで。。。

$ cat snort_table.spl
select * from event order by cid desc limit 1;
select * from reference;
select * from reference_system;
select * from `schema`;
select * from sensor;
select * from sig_class;
select * from sig_reference;
select * from signature;

$ mysql -u snort -D snort --password=XXXXX < snort_table.spl > snort_table.log
$ cat snort_table_html.sh
#!/bin/bash
SQLPATH=/use/local/bin/myscripts
PASSWORD="XXXX"
echo "<html><head><title>snort table report</title></head><body><table border=\"0\">&nbsp;<br\/>"
mysql -u snort -D snort --password=${PASSWORD} < ${SQLPATH}/snort_table.spl | sed s/"\t"/"\,"/g  | sed s/"\t"/"\,"/g | \
  sed s%"\,"%"</td><td>"%g | \
  sed s/"^"/"<tr><td>"/g | \
  sed s%"\$"%"</td></tr>"%g | \
  sed s%"^[A-z]"%"</table><br/><br/><br/><table border=\"0\">&nbsp;<br/>"%
echo "</table></html>"

$ w3m -dump sqltable.html

sid           cid                    signature    timestamp
1             1833                   1            2012-08-09
                                                  10:50:37
ref_id        ref_system_id          ref_tag
1             1                      10028
2             2                      278
3             3                      2002-0013
4             3                      2002-0012
5             4                      4132
6             4                      4089
7             4                      4088
ref_system_id ref_system_name
1             nessus
2             arachNIDS
3             cve
4             bugtraq
vseq          ctime
107           2012-08-09 01:57:39
sid           hostname               interface    filter       detail  encoding  last_cid
1             192.168.72.188         eth0         NULL         1       0         1104
sig_class_id  sig_class_name
1             attempted-dos
2             web-application-attack
3             attempted-recon
sig_id        ref_seq                ref_id
4             1                      1
4             2                      2
7             1                      3
7             2                      4
7             3                      5
7             4                      6
7             5                      7
8             1                      3
8             2                      4
8             3                      5
8             4                      6
8             5                      7
sig_id        sig_name               sig_class_id sig_priority sig_rev sig_sid   sig_gid
              COMMUNITY SIP TCP/IP
1             message flooding       1            2            2       100000160 1
              directed to SIP proxy
2             (spp_ssh) Protocol     0            3            1       4         128
              mismatch
3             WEB-IIS cmd.exe access 2            1            7       1002      1
4             DNS named version      3            2            7       1616      1
              attempt
5             (portscan) TCP         0            3            NULL    1         122
              Portscan
6             (portscan) Open Port   0            3            NULL    27        122
7             SNMP request tcp       3            2            11      1418      1
8             SNMP AgentX/tcp        3            2            11      1421      1
              request
              (snort_decoder): Tcp
9             Window Scale Option    0            3            1       59        116
              found with length > 14
10            (http_inspect) WEBROOT 0            3            1       18        119
              DIRECTORY TRAVERSAL