Kozupon.com    
 
 iplogでステルススキャンを感知する!


ポートスキャンの一手法にステルススキャンがある。
ステルススキャンは、ハーフスキャンもしくはSYNスキャンとも言う。ポートスキャンを行う攻撃者は、このステルススキャンを使いセッションを確立せずにスキャンを行うという目くらまし戦法で攻撃相手のポートの確認を行う。
したがって、攻撃される側としてはログに残りにくいという致命的な欠点がある。TCPスキャンやUDPスキャンではもちろんログに残るわけである。ここでは、ログに残りにくいステルススキャンをログ化出来るiplogを紹介する。
さらに、このiplogはDos攻撃の足跡も残してくれる便利屋である。是非試していただきたい。

ここでは、ソース版とバイナリ版両方を説明する。


1.準備(ソース版)

1.1 libpcapのセットアップ

iplogをセットアップするには、まずlibpcapが必要になる。したがって、これをインストールする。
libpcapは、 ここ からゲットしてインストールする。
すでにインストールされている場合は、その限りではない。

● 適当なフォルダに展開
# cd /usr/local/src
# tar -zxvf /tmp/libpcap-0.7.1.tar.gz

● コンパイル&ビルド
# ./configure
# make
# make install

注:make無しでmake installだけでも良いかもしれない。
これで、libpcapはインストール完了!
次に、iplogはiplogと言うユーザとnogroupと言うグループが必要なので作る。

■ Linuxのばやい

# groupadd nogroup

# adduser -g nogroup -d /dev/null -s /bin/false iplog

■ FreeBSDのばやい

# pw groupadd nogroup

# pw useradd iplog -g nogroup -d /dev/null -s /bin/false

次に、iplog.pid用のディレクトリを作る。

# mkdir /var/run/iplog

# chown iplog.nogroup /var/run/iplog

1.2 iplogソースのゲット

iplogのソースは、 ここ からゲットする。
2002年7月4日現在で、iplog-2.2.3.tar.gzであった。


2.インストール(ソース版)

2.1 ソースの展開

ここでは、/tmpにソースを置き、/usr/local/srcに展開。
# cd /usr/local/src
# tar -zxvf /tmp/iplog-2.2.3.tar.gz

2.2 コンパイル&リンク

注:FreeBSDの場合は、gmakeで行うこと!

# cd iplog-2.2.3
# ./configure
# make
# make install

これで、セットアップは終わりである。


3.起動(ソース版)

起動は、以下のコマンドを実行する。
# /usr/local/sbin/iplog

このコマンドで、デーモンとして常駐するのでシェルにこのまま記述して、起動スクリプトにするとよい。
但し、FreeBSDではnewsyslog、Linuxではlogrotateでスケジューリングしてファイルを切り分けないと、いつの間にか巨大なログファイルになるから、気を付けよう!


4.カスタマイズ

カスタマイズは、/etc/iplog.confで行う。特に、設定が必要なのはDNSとかメールとかWebプロトコルのパケットである。これらのログは、元々取っているはずなので、あえてiplogで取る必要はないはずだ!したがって、これらのパケットが来たら無視するような設定をする。私の場合は、そうしている。
例えば、以下の記述を追加する。

# vi /etc/iplog.conf

省略(以下を最後の方に追加する)

ignore tcp sport 25
ignore tcp dport 25
ignore udp sport 53
ignore udp dport 53


5.実際の生ログ

テストのため、nmapのステルススキャンをローカルからサーバ宛に発行した結果、以下の結果を得た。

# more /var/log/iplog

Jul 4 20:27:33 iplog started.
Jul 4 20:28:07 TCP: port 967 connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:07 TCP: port 32771 connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:07 TCP: netrjs connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:07 TCP: dvl-activemail connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: port 900 connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: cichlid connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: rje connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: anet connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: nrcabq-lm connection attempt from michi (192.168.255.6):36797
Jul 4 20:28:08 TCP: SYN scan detected [ports 967,32771,77,1396,900,1377,5,212,1458,206,...] from michi (192.168.255.6) [port 36797]

これは、単にポートスキャンをやられてる!(爆爆)

Sep 1 17:03:46 ICMP: (from router.kozupon.com (192.168.255.1)) yhc.att.ne.jp (165.76.15.206): port is unreach
able to (tcp: dest port 25, source port 1059)
Sep 1 17:03:46 UDP: scan/flood detected [ports 1025,1027,1029,1030,1031,1032,1033,1034,1035,1036,...] from mi
chi.kozupon.com (192.168.255.6) [port 53]
Sep 1 17:04:43 UDP: scan/flood mode expired for michi.kozupon.com (192.168.255.6) - received a total of 36 pa
ckets (6587 bytes).


6.準備(rpm版)

Vine、RedHat系の場合は、 ここ でRPMソース版をゲットできる。
あらかじめ、バイナリ版のlibpcapはインストールしておくこと!


7.インストール(rpm版)

7.1 ソースのリビルド

# rpm --rebuild iplog-2.2.3-1.src.rpm

# cd /usr/src/redhat/RPMS/i386

# rpm -ivh iplog-2.2.3-1.i386.rpm

7.2 スクリプトの訂正

# cd /etc/rc.d/init.d/

# vi iplog

# Source function library.
. /etc/init.d/functions

. /etc/rc.d/init.d/functions

に訂正する。

7.3 iplogの起動アカウントを作成する

# groupadd nogroup

# adduser -g nogroup -d /dev/null -s /bin/false iplog

7.4 pidディレクトリの作成

# mkdir /var/run/iplog

# chown iplog.nogroup /var/run/iplog

7.5 iplog.confを作成する

# vi /etc/iplog.conf

/*
** $Id: example-iplog.conf,v 1.2 2000/12/31 18:40:40 odin Exp $
**
** Example iplog configuration file.
** Edit me and copy me to /etc/iplog.conf
**
** See iplog.conf(5) for details on syntax and a full description
** of available options.
*/

# Run as an unprivileged account with the login "iplog"
user iplog

# Run with group "nogroup"
group nogroup

# User "iplog" has write permission for the directory "/var/run/iplog"
pid-file /var/run/iplog/iplog.pid

# Log to /var/log/iplog
logfile /var/log/iplog

# Use the syslog(3) facility log_daemon.
facility log_daemon

# Use the syslog(3) priority (level) log_info.
priority log_info

# Log the IP address as well as the hostname of packets.
set log_ip true

# Do not log the destination of packets.
set log_dest false

# Port Scan Check
set portscan true

# Ignore DNS traffic from nameservers in /etc/resolv.conf.
#set ignore_dns

# Listen on eth0 and eth1
interface eth0                            ← ※1ここはインターフェースを記述している。OS毎に異なるので注意すること。

ignore icmp
ignore tcp dport 8080
ignore tcp dport 53
ignore udp dport 53
ignore udp dport 1024
ignore udp dport 2837

      ↑ ※2ここの記述はスキャンから除外するポートを指している。ログに入ると煩わしいポートは除外した方がよい。

# Operate in promiscuous mode and watch the 192.168.0.x network
#promisc 192.168.255.0/24

/*
** Ignore DNS traffic from nameservers.
** Using the -d option will add similar rules for all nameservers
** listed in /etc/resolv.conf
*/
#ignore udp from 192.168.0.1 sport 53
#ignore udp from 192.168.0.2 sport 53

# Example log statement.
#log tcp dport 1045:1055 sport ftp-data

# Ignore ftp-data connections from to ports 1024 and above.
#ignore tcp dport 1024: sport 20

# Ignore WWW connections, if you're running a WWW server.
#ignore tcp dport 80

# Ignore ICMP unreach.
#ignore icmp type unreach

# Ignore all ICMP except ICMP echo packets.
#ignore icmp type !echo

# Ignore UDP traffic from the 127.1.2 network
#ignore udp from 127.1.2/24

# or
#ignore udp from 127.1.2/255.255.255.0

私は、このように作成したが、みなさんの好きなようにカスタマイズして作成してください。

※1・※2は気をつけること!


8.起動(rpm版)

8.1 起動方法

# /etc/ini.d/iplog start

8.2 起動確認

# ps -axw | grep iplog

9455 ? S 0:00 /usr/sbin/iplog
9458 ? S 0:00 /usr/sbin/iplog
9459 ? S 0:00 /usr/sbin/iplog
9460 ? S 0:00 /usr/sbin/iplog
9461 ? S 0:00 /usr/sbin/iplog

こんな感じに、表示されたらOK!
カスタマイズ、実際の生ログは、4・5項と同じ!

8.3 起動スクリプト(ソースバージョンでRedHat9での場合)

# chkconfig: 345 58 74
# description:iplog

#!/bin/sh
#
# iplog This start and stops the iplog utility
#
# chkconfig: 345 97 03
# description: iplog's capabilities include the ability to detect \
# TCP port scans, TCP null scans, FIN scans, UDP and \
# ICMP "smurf" attacks, bogus TCP flags (used by \
# scanners to detect the operating system in use), \
# TCP SYN scans, TCP "Xmas" scans, ICMP ping floods, \
# UDP scans, and IP fragment attacks.
#
# processname: /usr/sbin/iplog
# config: /etc/iplog.conf
# pidfile: /var/run/iplog.pid

PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/sbin

# Source function library.
. /etc/init.d/functions

# Get config.
test -f /etc/sysconfig/network && . /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "yes" ] || exit 0

[ -x /usr/local/sbin/iplog ] || exit 1
[ -r /etc/iplog.conf ] || exit 1

RETVAL=0

start(){
echo -n "Starting iplog: "
daemon /usr/local/sbin/iplog
RETVAL=$?
echo
touch /var/lock/subsys/iplog
return $RETVAL
}

stop(){
echo -n "Stopping iplog: "
killproc iplog
RETVAL=$?
echo
rm -f /var/lock/subsys/iplog
return $RETVAL
}

reload(){
echo -n "Reloading configuration: "
killproc iplog -HUP
RETVAL=$?
echo
return $RETVAL
}

restart(){
stop
start
}

condrestart(){
[ -e /var/lock/subsys/iplog ] && restart
return 0
}


# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status iplog
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
*)
echo "Usage: iplog {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac

exit $RETVAL

# chmod 755 /etc/rc.d/init.d/iplog

# chkconfig --add iplog

# chkconfig --level 345 iplog on

# chkconfig --list iplog

iplog 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ


9.ログファイルのローティーション

iplogは、結構肥大化するのでログファイルの切り分けをしたい。
通常Linuxの場合、ログローティーションを使ってログを切り分けるが、どうもlogrotateを使うとiplogのプロセスが止まってしまう。iplog.pidを使いプロセスIDにシグナルを与えているが、止まってしまう(原因は謎!)。
何だかすっきりしないうちに考えたのがカスタムシェルを使ってログのバックアップを取る方法である。
この方法は、過去ログを複数保存することは不可能だが、バックアップファイルと言う形でコピーすることにより数日前のログぐらいは見れるので作成した。良いと思ったら使ってくださいな。

# cd /etc
# vi iplogbak.sh

#!/bin/sh

killall iplog
cp /var/log/iplog /var/log/iplog.bak
echo > /var/log/iplog
/usr/local/sbin/iplog

# chmod 755 iplogbak.sh

これで完了!
あとは、iplogbak.shをcronで適当な間隔で実行させればよい。

これでもiplogが止まってしまう場合は(Linuxの場合はこの方法の方が良い)、

# cd /etc/logrotate.d

# vi syslog

省略

/var/log/iplog {
postrotate
/etc/init.d/iplog restart
endscript
}

省略

このような記述を追加する。どうも、pidにシグナルを与えるとiplogのプロセスが落ちる。


10.iplogの誤検知

iplogには、どうもバグがあるらしい。ポートスキャンの誤検知をする。特に、ローカルのホスト側からターゲットサーバに向けてポートスキャンをされているlogが現れる。以下が、俺のlogである。

Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1236
Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1237
Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1238
Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1239
Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1240
Jun 7 12:19:05 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1241
Jun 7 12:19:06 TCP: squid connection attempt from mity-comp.kozupon.com (192.168.255.105):1242
Jun 7 12:19:07 TCP: port scan detected [ports 110,3128] from mity-comp.kozupon.com (192.168.255.105) [ports 1228,1229,1231,1232,1233,...]
Jun 7 20:24:53 TCP: port scan detected [port 3128] from mity-comp.kozupon.com (192.168.255.105) [ports 2172,2173,2174,2175,2176,...]

覚えのないポートスキャンのディテクトlogが頻繁に現れる。
これは、iplogの誤検知である。特にFTPサーバ上では誤検知が非常に多くなるそうである。ここに現れてるログは、通常TCPでポートコネクションをするためのスキャンをiplog自体が検出してる状態である(TCPとしては、当たり前のこと)。この状態をポートスキャンとディテクトするのはiplogは誤検知の域に有ると感じている。

以上


 
 
 



Copyright 2009 Kozupon.com.