#!/bin/bash
# arpcheck
# Copyright (c) 2005 - 2006 by Stefan Behte
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
#
# arpcheck checks /proc/net/arp for MAC/IP combinations and compares them to a static or dynamic MAC list.
# If something does not fit, you'll get an alarm which will also be logged. You can also run custom scripts.
#
# The MAC list is shorewall compatible, it's in the format:
# [Interface] [MAC] {IP}
# IP is optional!
#
# Example for a MAC list:
# eth2 00:11:22:33:44:55 # you can add comments after "#"
# eth2 00:de:ad:be:ef:00 192.168.13.37 # MAC/IP combo will be used
# eth2 de:ad:be:ef:be:ee #192.168.69.69 IP commented out, only MAC will be used
# #eth2 de:ad:73:50:ba:be # this line will be completely ignored
#
#
# Features of ARP check:
# - static mode (using a maclist in shorewall style)
# - dynamic mode (learning network config)
# - single mode (just run once and show the results)
# - logging functions (you can also turn this off, which would not be wise, you can specify
# - different logfiles for every type of logging event)
# - detects lan to lan scans (you can specify the interfaces to check and threshold - you also can turn this on/off)
# ( only useful if you have multiple interfaces )
# - blacklist support (you can specify the interfaces to check - you also can turn this on/off)
# - whitelist support (you can specify the interfaces to check - you also can turn this on/off)
# - nice colored output (you can turn this on/off)
#
# Copyright � 2005 - 2006 by Stefan Behte
#
# Changelog:
# 19.06.05: v1.0 - added colors
# - corrected spelling mistakes
# - fixed several errors in the code
# - added logging functionality
# 29.06.05: v1.1 - uses /proc/net/arp directly (MUCH faster)
# - changed output, added counter
# 06.07.05: v1.2 - changed the comments, added the header
# - added "-single / -s" switch, just run the checks 1 time and do not run an endless loop
# - now using multiple interfaces, specify them in INTERFACES (separate via space)
# - added free line when sleeping
# 13.07.05: v1.3 - added script which gets called, if attack is detected
# - added some comments
# - added pidfile (/var/run/arpcheck.pid)
# - added MAC blacklist, you can turn logging on/off for this via the variable LOGBLACK
# - added -learn / -s mode (using temporary file ".learning")
# - added lan scan detection
# 14.07.05: v1.4 - corrected many formating errors
# - added SCANFACES
# - added switch to turn colors on/off
# - custum logging: you can log blacklist-attacks and lan scans to different files
# - when new MAC/IP learned, we reduce the interval once
# 18.07.05: - fixed serious bug (when there was only interface+mac on one line an no comment->false detection as attacker)
# 27.07.05: v1.5 - separated the script into functions
# - dynamic and static mode can now be run simoultanoiusly (some ifaces dynamic, some static, NOT both at once)
# - added command line switches and help
# - added -nc switch (no color)
# - added -nd switch (no dynamic learning)
# - added -ns switch (no static maclist checks)
# - added -nb switch (no blacklist checks)
# - added -nS switch (no scan detection)
# - added -h / --help switch
# - changed -single to -s only
# - changed design, added more colors etc.
# 29.08.05: v1.6 - minor bugfixes
# - checked performance, fixed bugs which slowed it down a lot
# - added ".arp" hack: the whole script runs about 500% faster now :)
# - minor bugfixes
# 03.01.06: v1.7 - releasing under GPL
# 26.01.06: v1.8 - changed checkblacklist() - now you can create blacklists like this:
# * [iface{,iface,iface}] [mac]
# * eth0,eth1 00:11:22:33:44:55 if you want to blacklist that mac on eth0,eth1
# * eth2 00:11:22:33:44:55 if you just want to blacklist that mac on eth2
# * all 00:11:22:33:44:55 if you want to black that mac on any interface
# - you may also add commands after the mac, the script will just ignore them
# - added whitelist, those hosts will be ignored in the other check; you can also log via LOGWHITE
# - the format for the whitelist is the same as for the blacklist
# - added -nw command line switch (no whitelist checks)
# - totally changed the way scripts are called. Now it's WAY more better!
# - I've created several useful examples for calling external script, they include:
# * sending SMB/winpopup messages to administrators
# * sending email
# * inserting firewall rules with iptables (VERY useful for dynamic learning mode!) -> prevents users from changing IPs :)
# * starting of special services, if a whitelist mac is seen
# - I tested the examples and they should work for you with minor changes (change the IPs etc.)
# - many little bugfixes (e.g. counting lines of *-lists gave "" if there was no such file)
# - did some code cosmetics ;)
#
#
# TODO:
# - flood detection/protection (MAC in .flooddetect schreiben, nummer dahinter)
# - fix the dirty checkmacs() hack (some time...)
# - dynamic learning for only mac-authed hosts on static interfaces ?
#
# Planned for next release:
# - add timeout for learned macs (RELEARN_INTERVAL)
# - maybe add some variable that ensures you edited to config (like shorewall does), so people don't complain
# that the tool does not work properly or so
#
# ARP check is verified to work on:
# - Gentoo Linux Kernel 2.4
# - Gentoo Linux Kernel 2.6
# - SuSE Linux 9.1
# - so it should work with any linux >= kernel-2.4 distro
#
# Some comments on the runtime:
# - of course, this script gets slower, the more entries you have in /proc/net/arp
# - This script was designed for smaller corporate networks with 100 - 250 PCs and is performant enough to handle that
# ( you should not have a large number of hosts on a single collision domain anyways )
# - as you can see below, it would also be OK for larger networks, e.g. HUGE LAN parties
# - Normal runtime for single check (all checks enabled): ~0.2s on an Athlon XP 2400
# - test: every check enabled, static maclist with 77 entries, blacklist with 1 entry, massive LAN scanning to produce many arp entries:
# -> /proc/net/arp entries vs. time to run: 28248/4.6s, 26610/4.3s, 24877/3.7s, 13566/1.6s, 12033/1.5s, 9697/1s, 7498/0.8s, 3694/0.5s, 479/0.3s
# - I think these runtimes are OK. On a normal LAN you will only have about ~50 entries or so and the script will need 0.2 seconds for all checks
# - You will only have more entries in /proc/net/arp if your box is router and someone scans on an other iface
#
# Written by Stefan Behte
# Contact me, if you have any new ideas, bugs/bugfixes, recommondations or questions!
# Please also contact me, if you just like the tool. :)
#
# Stefan dot Behte at gmx dot net
#
############# CONFIGURATION ####################################################
### ONLY CHANGE HERE !!!
sINTERFACES="eth1 eth2" # which interfaces to check against static maclist, must be separated via space
dINTERFACES="eth0 eth3" # interfaces which you want to check dynamically in "learning mode"
# WARNING: do NOT specify the same interface in both !!
# every interface can only be in static or dynamic (learning) mode. Choose one ;)
sMACLIST="/etc/shorewall/maclist" # path to our static maclist
dMACLIST=".learned" # path to our dynamic maclist (learning mode)
LOGFILE="/var/log/arpcheck.log" # where to log
BLACKLIST="./BLACK" # blacklist with MACS/reason, works on ANY interface (change to specific iface) IP eth0,eth1
LOGBLACK=$LOGFILE # leave empty to not log blacklisted MACs
WHITELIST="./WHITE" # whitelist
LOGWHITE= # if you still want to log changes for whitelist hosts specify the logfile here
SCANFACES="eth0 eth1 eth2 eth3" # interfaces on which you want to detect scanners, leave empty if you don't want to use it
SCANTHRES=10 # highest NR of 00:00:00:00:00:00 entries to ignore
LOGSCAN=$LOGFILE # log the scan? leave empty if you do not want to log
NORMALINTERVAL=20 # sleep interval when everything is ok
ATTACKINTERVAL=10 # sleep interval, if attack detected
RUNSCRIPT="n" # run a script when attack occurs
SCRIPTLOG=$LOGFILE # file to log scriptruns to
# event parameters
# MAC/IP do not fit "$INTERFACE $MAC $IP $REALMAC"
# MAC not in list "$INTERFACE $MAC $IP"
# MAC is blacklisted "$INTERFACE $EVILMAC $IP"
# MAC is whitelisted "$INTERFACE $GOODMAC $IP"
COLOR=y # do you want colored output?
# if you're running arpcheck via cron for example better turn this off!
### End of basic config
################################################################################
### Running Scripts; only for advanced users
# call parameters for scriptrun:
# $1 $2 $3 $4 $5
# notfit $INTERFACE $MAC $IP $REALMAC # IP/MAC do not fit
# notlist $INTERFACE $MAC $IP # MAC is not in list
# black $INTERFACE $EVILMAC $IP # MAC is on blacklist
# white $INTERFACE $GOODMAC $IP # MAC is on whitelist
scriptrun()
{
# Here is are some examples which you can use with minor changes.
#
# notfit example: if a MAC/IP combo does not fit to your maclist, a DROP rule for that MAC will
# be inserted into chain ${INTERFACE}_in. Tested with shorewall, works fine. This is *VERY* useful,
# if you have enabled dynamic learning on an interface and want to lock out people that change their IP
# (evil people that try to circumvent port-filters on DHCP-Ranges, or want to be stealth while downloading
# Gigabytes of Warez...)
#
# iptables -nL eth2_in | grep "11:22:33:44:55:66" will print the blocked mac:
# DROP all -- 0.0.0.0/0 0.0.0.0/0 MAC 11:22:33:44:55:66
#
# notlist example: if a MAC/IP is found that's not on your maclist at all, SMB/winpopup messages are immediately
# sent to the Administrators. You need to specify IP:Netbios name. Works fine with multiple hosts.
#
# black example: mail the complete logfile to the administrator
#
# white example: for this example, create a whitelist that just contains the administrators iface and ip.
# then, exchange MIT-1 cookies from this host with your workstation (that has an X-Server, of course).
# Install wmnet, wmcpu and wmmemfree.
# Now, if that "good" admin mac is seen, this host will check if the admin's host is reachable and if wmnet, wmcpu
# and wmmemfree are already displayed on the admins workstation. If not, they will be started. Voila! :)
# This is useful for the cool admin -> "Oh look, all those status screens pop up when he just pings the firewall!" ;)
#
# you can do MUCH more with this; for example stop specific services when there is an attack, just shut down
# the server, or automatically gratious ARP-kill the other host and so on... the possibilities are only limited
# by your fantasy :)
#
# If you have good ideas, please send them to me! My eMail is written down above.
#
# Notice: using scripts can have a severe security impact (e.g. if your script shuts down the server by
# accident or if it halts arpcheck - you won't be happy I guess!)
#
# I hope you like the examples.
#
case "$1" in
nofit) iptables -nL ${2}_in | grep ^DROP | if ! grep -i "MAC $3" &>/dev/null
then
echo -n "Blocking MAC $3 on interface $2 by firewall: ";
/sbin/iptables -I ${2}_in -i ${2} --match mac --mac-source ${3} -j DROP
if [ "$?" = "0" ]
then
echo OK
else
echo FAILED
fi
else
echo "MAC $3 on interface $2 already blocked by firewall";
echo "To remove block, do:"
echo "/sbin/iptables -D ${2}_in -i ${2} --match mac --mac-source ${3} -j DROP"
echo "grep -vi \"${3}\" .learned >.ltmp; mv .ltmp .learned"
fi
echo
;;
notlist) MSGIPS="192.168.0.2:ADMINBOX1 192.168.0.3:ADMINBOX2";
echo "WARNING: Rogue host! $INTERFACE $MAC $IP is not on our maclist." > .tmpmsg
for i in $MSGIPS
do
ip=`echo $i | cut -f 1 -d":"`
nbt=`echo $i | cut -f 2 -d":"`
smbclient -U Router -M $nbt -I $ip <.tmpmsg
done
rm .tmpmsg &>/dev/null
;;
black) mail [email protected] < $LOGFILE;;
white) WMRUN=`pgrep wmnet | wc -l`
if [ "$WMRUN" = "0" ]
then
ping -c1 -W1 $REMOTE &>/dev/null
if [ "$?" = "0" ]
then
DISPLAY="inet/${REMOTE}:0" wmnet -w -W eth0 -L eth0-WAN &
DISPLAY="inet/${REMOTE}:0" wmnet -w -W eth1 -L eth1-DMZ &
DISPLAY="inet/${REMOTE}:0" wmnet -w -W eth2 -L eth2-BBI &
DISPLAY="inet/${REMOTE}:0" wmnet -w -W eth3 -L eth3-WILD &
DISPLAY="inet/${REMOTE}:0" wmbluecpu &
DISPLAY="inet/${REMOTE}:0" wmmemfree -c -b &
fi
fi
;;
esac
if [ "$SCRIPTLOG" != "" ]
then
echo "`date` $1 $2 $3 $4 $5" >> $SCRIPTLOG
fi
}
########################################################################################################################
### Uuuh this command line stuff really sucks - I really need to rewrite it. I'm just too lazy right now.
## init, cleanup
if [ "$1" = "-nc" ] || [ "$2" = "-nc" ] || [ "$3" = "-nc" ] || [ "$4" = "-nc" ] || [ "$5" = "-nc" ] || [ "$6" = "-nc" ] || [ "$7" = "-nc" ]
then
COLOR=n
fi
if [ "$1" = "-ns" ] || [ "$2" = "-ns" ] || [ "$3" = "-ns" ] || [ "$4" = "-ns" ] || [ "$5" = "-ns" ] || [ "$6" = "-ns" ] || [ "$7" = "-ns" ]
then
sINTERFACES=""
sMACLIST=""
fi
if [ "$1" = "-nd" ] || [ "$2" = "-nd" ] || [ "$3" = "-nd" ] || [ "$4" = "-nd" ] || [ "$5" = "-nd" ] || [ "$6" = "-nd" ] || [ "$7" = "-nd" ]
then
dINTERFACES=""
dMACLIST=""
fi
if [ "$1" = "-nb" ] || [ "$2" = "-nb" ] || [ "$3" = "-nb" ] || [ "$4" = "-nb" ] || [ "$5" = "-nb" ] || [ "$6" = "-nb" ] || [ "$7" = "-nb" ]
then
BLACKLIST=""
fi
if [ "$1" = "-nw" ] || [ "$2" = "-nw" ] || [ "$3" = "-nw" ] || [ "$4" = "-nw" ] || [ "$5" = "-nw" ] || [ "$6" = "-nw" ] || [ "$7" = "-nw" ]
then
WHITELIST=""
fi
if [ "$1" = "-nS" ] || [ "$2" = "-nS" ] || [ "$3" = "-nS" ] || [ "$4" = "-nS" ] || [ "$5" = "-nS" ] || [ "$6" = "-nS" ] || [ "$7" = "-nS" ]
then
SCANFACES=""
fi
if [ "$COLOR" = "y" ]
then
BANNER="\033[1;34mARP Check v1.8 by Stefan Behte\033[0m"
WARNING="\033[1;29m[\033[0m\033[1;31mWARNING\033[0m\033[1;29m]\033[0m"
LEARNED="\033[1;34mLEARNED\033[0m"
yOK="\033[1;33mOK\033[0m"
gOK="\033[1;32mOK\033[0m"
LAN="\033[1;34mLAN SCAN detection\033[0m"
STATIC="\033[1;34mSTATIC MAClist\033[0m"
DYNAMIC="\033[1;34mDYNAMIC learning\033[0m"
BLACKLI="\033[1;34mBLACKLIST\033[0m"
WHITELI="\033[1;34mWHITELIST\033[0m"
else
BANNER="ARP Check v1.8 by Stefan Behte"
WARNING="[WARNING]"
LEARNED=LEARNED
yOK=OK
gOK=OK
LAN="LAN SCAN detection"
STATIC="STATIC MAClist"
DYNAMIC="DYNAMIC learning"
BLACKLI="BLACKLIST"
WHITELI="WHITELIST"
fi
if [ "$1" = "-h" ] || [ "$2" = "-h" ] || [ "$3" = "-h" ] || [ "$4" = "-h" ] || [ "$5" = "-h" ] || [ "$6" = "-h" ] || [ "$1" = "--help" ] || [ "$2" = "--help" ] || [ "$3" = "--help" ] || [ "$4" = "--help" ] || [ "$5" = "--help" ] || [ "$6" = "--help" ]
then
echo -e "\n$BANNER"
cat <<EOF
This tool can detect changes on MAC/IP combinations on your LAN and also LAN scanning.
You have to edit the script and change the configuration settings in the header.
It supports
- multiple interfaces
- static MAClist and dynamic learning mode
- usage of both at the same time (not on the same interface)
- logging of detailed warnings
- different logfiles for different types of warnings
- blacklist / whitelist support
- running a script with the IP/MAC as parameters (e.g. iptables)
- single run mode
- nice, colored output :)
usage: $0 {switches} // when ran without switches, the normal config in the header of the tool is used.
-nd // no dynamic learning
-ns // no static MAClist
-nc // no colors
-nb // no blacklist checks
-nw // no whitelist checks
-nS // no scan detection
-s // single run, just show results and quit
-h // this help
EOF
exit 0
fi
export INTERVAL=${NORMALINTERVAL}
INTERFACES=${sINTERFACES}
rm -f .arp .attack .scandet &>/dev/null
# check if we're already running (exclude single mode)
if [ "$1" != "-s" ] && [ "$1" != "--single" ]
then
echo $$ > /var/run/arpcheck.pid
fi
if [ "$dINTERFACES" != "" ]
then
rm -f .learned &>/dev/null
touch .learned
fi
if [ "$sINTERFACES" != "" ]
then
NRMACS=$[ `grep -v "^#" /etc/shorewall/maclist | sort | uniq | wc -l` - 1 ]
fi
if [ -e $BLACKLIST ]
then
BLACKNR=`wc -l $BLACKLIST | awk '{print $1}'`
fi
if [ "$BLACKNR" = "" ]
then
BLACKNR=0
fi
if [ -e $WHITELIST ]
then
WHITENR=`wc -l $WHITELIST | awk '{print $1}'`
fi
if [ "$WHITENR" = "" ]
then
WHITENR=0
fi
checkmacs()
{
INTERFACES=`cat .ifaces`
MACLIST=`cat .maclist`
for INTERFACE in $INTERFACES
do
grep "$INTERFACE$" .arp | sort -n | while read line
do
IP=`echo $line | awk '{print $1}'` # save IP
MAC=`echo $line | awk '{print $2}'` # save MAC
# MAC in MAC list? # at the beginng -> commented out
grep -v "^#" $MACLIST | grep "^$INTERFACE" | if grep $MAC &>/dev/null
then # ja -> OK
line=`grep -v "^#" $MACLIST | grep "^$INTERFACE" | grep $MAC`
three=`echo $line | awk '{print $3}'`
if [ "$three" = "${IP}" ] # does the MAC fit to IP?
then
printf "$INTERFACE $IP/$MAC\t[MAC+IP]\t[$gOK]\n" # ja -> OK
else
echo $three | if grep "^#" &>/dev/null # no -> test, if # in line IP commented out
then
printf "$INTERFACE $IP/$MAC\t[MAC]\t\t[$yOK]\n" # ja -> OK
else # no -> MAC has a different IP -> someone is evil
if [ "$three" = "" ]
then
printf "$INTERFACE $IP/$MAC\t[MAC]\t\t[$yOK]\n"
else
REALMAC=`grep -v "^#" $MACLIST | grep "^$INTERFACE" | grep "$MAC" | awk '{print $3}'`
printf "$INTERFACE $IP/$MAC\t[MAC+IP]\t$WARNING\t$REALMAC/$MAC uses IP: $IP\n"
echo "`date` $MAC/$REALMAC uses an other IP: $IP" >> $LOGFILE
if [ "$RUNSCRIPT" = "y" ]; then scriptrun nofit $INTERFACE $MAC $IP $REALMAC; fi
touch .attack
fi
fi
fi
else # MAC not in list
printf "$INTERFACE $IP/$MAC\t[MAC]\t\t$WARNING\t$MAC not in MAC List!\n"
printf "`date` $INTERFACE/$MAC not in MAC List!\n" >> $LOGFILE
if [ "$RUNSCRIPT" = "y" ]; then scriptrun notlist $INTERFACE $MAC $IP; fi
touch .attack
fi
done
# echo
done
} # checkmacs
learnmacs()
{
if [ "$dINTERFACES" != "" ]
then
for INTERFACE in $dINTERFACES
do
grep $INTERFACE .arp | awk '{print $2}' | while read MAC
do
if ! grep $MAC $dMACLIST &>/dev/null
then
grep $MAC .arp | grep $INTERFACE | awk '{print $3 "\t" $2 "\t" $1}' >> $dMACLIST
printf "`tail -n1 $dMACLIST | awk '{print $1 " " $3 "/" $2}'`\t\t\t[$LEARNED]\n"
touch .attack
fi
done
done
fi
}
detectscan()
{
if [ "$SCANFACES" != "" ]
then
echo -e "$LAN enabled [$SCANFACES]:"
grep "00:00:00:00:00:00" /proc/net/arp > .scandet
ZEROMACS=0
for INTERFACE in $SCANFACES
do
ZEROMACS=`grep -c "$INTERFACE" .scandet`
if [ $ZEROMACS -gt $SCANTHRES ]
then
NRZ=`grep -c $INTERFACE .scandet`
printf "$INTERFACE 0.0.0.0/00:00:00:00:00:00\t\t\t\t$WARNING\tLAN scan detected on interface $INTERFACE, $NRZ entries\n"
if [ "$LOGSCAN" != "" ]
then
echo "`date` LAN scan detected: $INTERFACE/$NRZ " >> $LOGSCAN
fi
touch .attack
fi
done
fi
}
checkblacklist()
{
if [ ! -e $BLACKLIST ]
then
return -1
fi
cat $BLACKLIST | while read line
do
EVILMAC=`echo $line | awk '{print $2}'`
INTERFACES=`echo $line | awk '{print $1}' | tr -s ',' ' '` # eth0,eth1
for INTERFACE in $INTERFACES
do
if [ "$INTERFACE" = "all" ] # grep ^$INTERFACE :)
then
INTERFACE=""
fi
tmpline=`grep $EVILMAC .arp`
echo $tmpline | awk '{print $3}' | if grep ^${INTERFACE} &>/dev/null
then
IP=`grep -i $EVILMAC .arp | awk '{print $1}'`
INTERFACE=`grep -i $EVILMAC .arp | awk '{print $3}'`
printf "$INTERFACE $IP/$EVILMAC\t[MAC]\t\t$WARNING\t$EVILMAC is BLACKLISTED!\n"
if [ "$LOGBLACK" != "" ]
then
printf "`date` $INTERFACE/$EVILMAC/$IP is BLACKLISTED!\n" >> $LOGBLACK
fi
if [ "$RUNSCRIPT" = "y" ]; then scriptrun black $INTERFACE $EVILMAC $IP; fi
touch .attack
fi
done
done
}
filterwhitelist()
{
if [ ! -e $WHITELIST ]
then
return -1
fi
cat $WHITELIST | while read line
do
GOODMAC=`echo $line | awk '{print $2}'`
INTERFACES=`echo $line | awk '{print $1}' | tr -s ',' ' '` # eth0,eth1
for INTERFACE in $INTERFACES
do
if [ "$INTERFACE" = "all" ] # grep ^$INTERFACE :)
then
INTERFACE=""
fi
tmpline=`grep $GOODMAC .arp`
echo $tmpline | awk '{print $3}' | if grep ^${INTERFACE} &>/dev/null
then
IP=`grep -i $GOODMAC .arp | awk '{print $1}'`
INTERFACE=`grep -i $GOODMAC .arp | awk '{print $3}'`
grep -v "$tmpline" .arp > .arp.
mv .arp. .arp &>/dev/null
printf "$INTERFACE $IP/$GOODMAC\t[MAC]\t\t$OK\t$GOODMAC is WHITELISTED! Filtering out.\n"
if [ "$LOGWHITE" != "" ]
then
printf "`date` $INTERFACE/$GOODMAC/$IP is WHITELISTED!\n" >> $LOGBLACK
fi
if [ "$RUNSCRIPT" = "y" ]; then scriptrun white $INTERFACE $EVILMAC $IP; fi
fi
done
done
}
pause()
{
echo
##### choose correct sleeping interval (depends on state normal/attacked)
if [ -e .attack ]
then
INTERVAL=$ATTACKINTERVAL
rm .attack
else
INTERVAL=$NORMALINTERVAL
fi
##### that cool counter ;) [seconds slept/seconds to sleep]
echo -n "sleeping... ["
for i in `seq 1 $INTERVAL`
do
echo -n "${i}/${INTERVAL}]"
sleep 1
for j in `seq -1 $[${#i} + ${#INTERVAL}]`
do
echo -n -e '\x08'
done
done
}
while [ 1 ]
do
clear
echo -e "$BANNER\n"
detectscan
if [ "$dINTERFACES" != "" ] || [ "$sINTERFACES" != "" ] || [ "$BLACKLIST" != "" ]
then
grep -v "00:00:00:00:00:00" /proc/net/arp | awk '{print $1 " " $4 " " $6}' > .arp
fi
if [ "$BLACKLIST" != "" ]
then
echo -e "\n$BLACKLI enabled ($BLACKNR entries)"
checkblacklist
fi
if [ "$WHITELIST" != "" ]
then
echo -e "\n$WHITELI enabled ($WHITENR entries)"
filterwhitelist
fi
if [ "$sINTERFACES" != "" ]
then
echo -e "\n$STATIC ($sMACLIST, $NRMACS entries) [$sINTERFACES]:"
echo $sINTERFACES > .ifaces
echo $sMACLIST > .maclist
checkmacs
fi
if [ "$dINTERFACES" != "" ]
then
echo -e "\n$DYNAMIC (`wc -l .learned | awk '{print $1}'` found) [$dINTERFACES]:"
learnmacs
echo $dINTERFACES > .ifaces
echo $dMACLIST > .maclist
checkmacs
fi
if [ "$1" = "-s" ] || [ "$2" = "-s" ] || [ "$3" = "-s" ] || [ "$4" = "-s" ] || [ "$5" = "-s" ] || [ "$6" = "-s" ] || [ "$7" = "-s" ]
then
echo
break
fi
pause
done
rm /var/run/arpcheck.pid .learned .ifaces .maclist .scandet .arp &>/dev/null