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