Network Intrusion Detection System 実験室
基本形から簡単な応用まで載せてみました。
サンプル 〜基礎編〜
その弐
「その壱」からの続きで、全部のlibnids内部状態に対応した
プログラムは以下のようになります。
#!/usr/local/bin/ruby
require "rnids"
class SEED > NIDS
def callback(pkt)
return if not pkt.kind_of?(NIDS_TCP)
case pkt.tcp_state
when NIDS::NIDS_JUST_EST
print "connection establised : "
print "#{pkt.saddr}:#{pkt.sport} -> #{pkt.daddr}:#{pkt.dport}\n"
when NIDS::NIDS_DATA
print "sending data : "
print "#{pkt.saddr}:#{pkt.sport} -> #{pkt.daddr}:#{pkt.dport}\n"
when NIDS::NIDS_CLOSE
print "connection closed : "
print "#{pkt.saddr}:#{pkt.sport} -> #{pkt.daddr}:#{pkt.dport}\n"
when NIDS::NIDS_RESET
print "connection reseted : "
print "#{pkt.saddr}:#{pkt.sport} -> #{pkt.daddr}:#{pkt.dport}\n"
when NIDS::NIDS_TIMED_OUT
print "connection timedout : "
print "#{pkt.saddr}:#{pkt.sport} -> #{pkt.daddr}:#{pkt.dport}\n"
else
raise "you don't allow reach here"
end
end
def kill(pkt)
if pkt.tcp_data =~ /phf/
return true
end
return false
end
end
#
# allow C-c interruption
#
trap("SIGHUP", "EXIT")
trap("SIGINT", "EXIT")
#
# MAIN proc
#
seed = SEED.new
seed.run
あたらしくkill(pkg) メソッドを追加しました。
これはNIDS::NIDS_DATA 状態の時にのみ呼ばれるので
内部で状態のチェックをする必要なくpkt.tcp_data にアクセスできます。
ここでは典型的なCGIプログラムの弱点を付こうとしてphfを含む
データが流れたコネクションだけを切断しようとします。
これでは'phf'の3文字を含むweb pageを閲覧しただけで切断されるという欠点(^^;
もあります。
この欠点を解決するための簡単な解決方法はTCPセッションの方向を
考えることです。
|