■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> CREATE DATABASE snort;
mysql> GRANT CREATE,SELECT,INSERT,UPDATE ON snort.* to snort@localhost;
mysql> SET PASSWORD FOR snort@localhost=PASSWORD('パスワード');
mysql> exit
Enter password:
■簡易チェック
必要なものが揃っていること。
テーブルは初期では空。
Enter password:
Current database: snort
Current user: snort@localhost
Current pager: stdout
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も起動することを確認した為、削除。
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!
Starting Network Intrusion Detection System : snort (eth0 using /etc/snort/snort.conf ...done).
Status of snort daemon(s): eth0 OK.
0
■snort-mysqlのDB連携の確認
パスワードが平文なのでご注意を。
一応、アクセス権は640。rootユーザがrw、snortグループがr。
output database: log, mysql, user=snort password=********
-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
---
>
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
< }
---
>
>
>
>
>
>
■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」はログに無いのだが。。。
Aug 9 07:36:25 [122:1:0] (portscan) TCP Portscan[Priority: 3]: {PROTO:255} 192.168.72.1 -> 192.168.72.188
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
SQLPATH=/use/local/bin/myscripts
PASSWORD="XXXX"
echo "<html><head><title>snort table report</title></head><body><table border=\"0\"> <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\"> <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