#!/bin/bash
#Copyright 2003 William Stearns <wstearns@pobox.com>
#Released under the GPL.

#ZZZZ Check Me and MyVersion
Me='snort-rservices'
MyVersion='20031125'
#DefaultActions=''

[ -r /etc/firebricks/firebricks.conf ] &&			. /etc/firebricks/firebricks.conf
[ -r /etc/firebricks/$Me.conf ] &&				. /etc/firebricks/$Me.conf
[ -r ${FBLibDir:-'/usr/lib/firebricks/'}/firebrickslib ] &&	. ${FBLibDir:-'/usr/lib/firebricks/'}/firebrickslib
if [ -z "$FBLibVer" ]; then
	echo 'It looks like firebrickslib was not loaded, why?  Exiting' >&2
	exit 1
fi

for OneTask in $Tasks ; do
	case "$OneTask" in
	link)
		$IptablesBin -N $Me >/dev/null 2>&1
#ZZZZ try to restrict the following three to only send down what the chain needs to inspect.
		$IptablesBin $AppIn INPUT -i \! lo						-j $Me
		$IptablesBin $AppIn FORWARD							-j $Me
		$IptablesBin $AppIn OUTPUT							-j $Me
		;;
	unlink)
#ZZZZ Make the same changes as above (such as "-p tcp"), but if you cut and paste, note "$AppIn" is now "-D"
		$IptablesBin -D INPUT -i \! lo							-j $Me
		$IptablesBin -D FORWARD								-j $Me
		$IptablesBin -D OUTPUT								-j $Me
		$IptablesBin -X $Me >/dev/null 2>&1
		;;
	create)
		echo "Starting $Me" >&2
		FlushOrNewChain $Me


		LogAs="SID601"		$Ipt -A $Me -p tcp --dport 513 -m string --string '"::::::::::::::::"'	$Tail	# '"RSERVICES rlogin LinuxNIS"' classtype:bad-unknown sid:601
		LogAs="SID602"		$Ipt -A $Me -p tcp --dport 513 -m string --string '"binbin"'	$Tail	# '"RSERVICES rlogin bin"' arachnids,384 classtype:attempted-user sid:602
		LogAs="SID603"		$Ipt -A $Me -p tcp --dport 513 -m string --string '"echo \" + + \""'	$Tail	# '"RSERVICES rlogin echo++"' arachnids,385 classtype:bad-unknown sid:603
		LogAs="SID604"		$Ipt -A $Me -p tcp --dport 513 -m string --string '"-froot"'	$Tail	# '"RSERVICES rsh froot"' arachnids,387 classtype:attempted-admin sid:604
		LogAs="SID611"		$Ipt -A $Me -p tcp --sport 513 -m string --string '"rlogind: Permission denied."'	$Tail	# '"RSERVICES rlogin login failure"' arachnids,392 classtype:unsuccessful-user sid:611
		LogAs="SID605"		$Ipt -A $Me -p tcp --sport 513 -m string --string '"login incorrect"'	$Tail	# '"RSERVICES rlogin login failure"' arachnids,393 classtype:unsuccessful-user sid:605
		LogAs="SID606"		$Ipt -A $Me -p tcp --dport 513 -m string --string '"rootroot"'	$Tail	# '"RSERVICES rlogin root"' arachnids,389 classtype:attempted-admin sid:606
		LogAs="SID607"		$Ipt -A $Me -p tcp --dport 514 -m string --string '"binbin"'	$Tail	# '"RSERVICES rsh bin"' arachnids,390 classtype:attempted-user sid:607
		LogAs="SID608"		$Ipt -A $Me -p tcp --dport 514 -m string --string '"echo \"+ +\""'	$Tail	# '"RSERVICES rsh echo + +"' arachnids,388 classtype:attempted-user sid:608
		LogAs="SID609"		$Ipt -A $Me -p tcp --dport 514 -m string --string '"-froot"'	$Tail	# '"RSERVICES rsh froot"' arachnids,387 classtype:attempted-admin sid:609
		LogAs="SID610"		$Ipt -A $Me -p tcp --dport 514 -m string --string '"rootroot"'	$Tail	# '"RSERVICES rsh root"' arachnids,391 classtype:attempted-admin sid:610
		LogAs="SID2113"		$Ipt -A $Me -p tcp --dport 512 -m string --string '""' --string '""' --string '""'	$Tail	# '"RSERVICES rexec username overflow attempt"' classtype:attempted-admin sid:2113
		LogAs="SID2114"		$Ipt -A $Me -p tcp --dport 512 -m string --string '""' --string '""' --string '""'	$Tail	# '"RSERVICES rexec password overflow attempt"' classtype:attempted-admin sid:2114


		;;
	destroy)
		echo "Stopping $Me" >&2
		DestroyChain $Me
		;;
	renamechain)
		TempChain="$Me-$RANDOM"
		echo "Replacing existing rules in $Me with new rules" >&2
		$IptablesBin -E $Me $TempChain
		;;
	replacelinks)
		if [ -z "$TempChain" ]; then
			echo "No temporary chain to relink in $Me replacelinks, replace operation incomplete." >&2
		elif ! $IptablesBin -L $Me -n >/dev/null 2>&1 ; then
			echo "No $Me chain in $Me, replace operation incomplete." >&2
		elif ! $IptablesBin -L $TempChain -n >/dev/null 2>&1 ; then
			echo "No $TempChain chain in $Me, replace operation incomplete." >&2
		elif [ "`$IptablesBin -L INPUT -n --line-numbers | grep $TempChain | wc -l`" -ne 1 ]; then
			echo "Too few/many references to $TempChain in INPUT in $Me replacelinks, replace operation incomplete." >&2
		elif [ "`$IptablesBin -L FORWARD -n --line-numbers | grep $TempChain | wc -l`" -ne 1 ]; then
			echo "Too few/many references to $TempChain in FORWARD in $Me replacelinks, replace operation incomplete." >&2
		elif [ "`$IptablesBin -L OUTPUT -n --line-numbers | grep $TempChain | wc -l`" -ne 1 ]; then
			echo "Too few/many references to $TempChain in OUTPUT in $Me replacelinks, replace operation incomplete." >&2
		else
#ZZZZ Place the same criteria you used in link/unlink above in the following three lines.
#ZZZZ Criteria should go just in front of "-j $Me"
			$IptablesBin -R INPUT `$IptablesBin -L INPUT -n --line-numbers | grep $TempChain | awk '{print $1}'` -i \! lo		-j $Me
			$IptablesBin -R FORWARD `$IptablesBin -L FORWARD -n --line-numbers | grep $TempChain | awk '{print $1}'`		-j $Me
			$IptablesBin -R OUTPUT `$IptablesBin -L OUTPUT -n --line-numbers | grep $TempChain | awk '{print $1}'`			-j $Me
			DestroyChain $TempChain
			unset TempChain
		fi
		;;
	status)
		if $IptablesBin -L $Me -n >/dev/null 2>&1 ; then
			echo "$Me created" >&2
		else
			echo "$Me destroyed" >&2
		fi
		;;
	version)
		echo "$Me $MyVersion, firebrickslib $FBLibVer" >&2
		;;
	help)
		DefaultHelp
#ZZZZ Please change the text to appropriate help text for this module.  You should
#ZZZZ cover what the module does, if it's generally safe to use, and under what
#ZZZZ conditions it should not be used.  Please replace the lines between the two
#ZZZZ EOTEXT lines with your own.
		cat <<EOTEXT >&2
	The $Me module puts in some blocks for fragmented icmp packets
(illegal) and address mask and timestamp requests and replies.  At best,
these are uncommon and are used in network mapping.  These rules should
be safe to use on any network.
EOTEXT
		;;
	*)
		echo "Unknown action $Action in $Me, no action taken." >&2
		;;
	esac
done