First script that parses nmaps output and checks for unexpected ports
This commit is contained in:
commit
d3d14a431e
1 changed files with 146 additions and 0 deletions
146
check_nmap.sh
Executable file
146
check_nmap.sh
Executable file
|
@ -0,0 +1,146 @@
|
|||
#!/bin/bash
|
||||
|
||||
function echoerr { echo "$@" 1>&2; }
|
||||
|
||||
### Parse attributes ###
|
||||
|
||||
INPUT=""
|
||||
DEBUG=false
|
||||
PORT_RANGE="1-65535"
|
||||
NMAP_ARGS=""
|
||||
KNOWN_PORTS=()
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-i|--input)
|
||||
INPUT="$2"
|
||||
if [ ! -f "$INPUT" ]; then
|
||||
echoerr "The specified input file '$INPUT' does not exist"
|
||||
exit 3
|
||||
fi
|
||||
shift;;
|
||||
-h|--host) HOST="$2"; shift;;
|
||||
-d|--debug) DEBUG=true;;
|
||||
-p|--portrange) PORT_RANGE="$2"; shift;;
|
||||
-k|--known) KNOWN_PORTS+=($2); shift;;
|
||||
--) shift; NMAP_ARGS="$@"; shift $#;;
|
||||
-?|--help)
|
||||
echo "Check nmap portscan. Arguments:"
|
||||
echo "--raid NAME: Raid name, e.g. md0"
|
||||
echo "--input FILE: Read from this file. Default: /proc/mdstat"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ -z "$HOST" -a -z "$INPUT" ]; then
|
||||
echoerr "Missing host argument (-h)"
|
||||
fi
|
||||
|
||||
function log {
|
||||
if $DEBUG; then
|
||||
echo " > $@"
|
||||
fi
|
||||
}
|
||||
function logLine {
|
||||
if $DEBUG; then
|
||||
echo " : $@"
|
||||
fi
|
||||
}
|
||||
NL=$'\n'
|
||||
|
||||
log "INPUT: $INPUT"
|
||||
log "PORT_RANGE: $PORT_RANGE"
|
||||
log "KNOWN_PORTS: ${KNOWN_PORTS[@]}"
|
||||
|
||||
function runNmap {
|
||||
local $portrange
|
||||
if [ -n "$PORT_RANGE" ]; then
|
||||
portrange="-p$PORT_RANGE"
|
||||
else
|
||||
portrange=""
|
||||
fi
|
||||
|
||||
local $input
|
||||
if [ -n "$INPUT" ]; then
|
||||
while read -r line; do
|
||||
parseLine "$line"
|
||||
done < $INPUT
|
||||
else
|
||||
local $cmd
|
||||
cmd="nmap $portrange $NMAP_ARGS -- $HOST"
|
||||
log "$cmd"
|
||||
while read -r line; do
|
||||
parseLine "$line"
|
||||
done <<< $($cmd)
|
||||
result=$?
|
||||
log "nmap exited with $result"
|
||||
if [ $result -ne 0 ]; then
|
||||
echoerr "CRITICAL - nmap exited with $result"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
NOW_PORTS=false
|
||||
OPEN_PORTS=()
|
||||
function parseLine {
|
||||
local line="$1"
|
||||
if ! $NOW_PORTS; then
|
||||
if [[ "$line" == PORT*STATE*SERVICE ]]; then
|
||||
NOW_PORTS=true
|
||||
fi
|
||||
else
|
||||
if [ -z "$line" ]; then
|
||||
NOW_PORTS=false
|
||||
else
|
||||
local x=${line/\/*}
|
||||
OPEN_PORTS+=($x)
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
ERROR=false
|
||||
NEW_PORTS=()
|
||||
function comparePorts {
|
||||
log ${KNOWN_PORTS[@]}
|
||||
KNOWN_PORTS=($(for each in ${KNOWN_PORTS[@]}; do echo $each; done | sort))
|
||||
log ${KNOWN_PORTS[@]}
|
||||
|
||||
for i in "${OPEN_PORTS[@]}"; do
|
||||
skip=false
|
||||
for j in "${KNOWN_PORTS[@]}"; do
|
||||
if [ $j -eq $i ]; then
|
||||
skip=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if ! $skip; then
|
||||
log Unexpected open port: $i
|
||||
NEW_PORTS+=($i)
|
||||
fi
|
||||
done
|
||||
if [ ${#NEW_PORTS[@]} -gt 0 ]; then
|
||||
ERROR=true
|
||||
fi
|
||||
}
|
||||
|
||||
function print {
|
||||
if $ERROR; then
|
||||
echo "CRITICAL - These ports should not be open: ${NEW_PORTS[@]}"
|
||||
else
|
||||
echo "OK"
|
||||
fi
|
||||
|
||||
|
||||
if $ERROR; then
|
||||
exit 2
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
runNmap
|
||||
comparePorts
|
||||
print
|
||||
|
Loading…
Reference in a new issue