nmap端口扫描及邮件告警脚本

一、背景需求

由于最近需要编写定时扫描端口脚本。所以选择了强悍的扫描工具--nmap。所以在测试完成脚本后分享在本博客。

在本文中使用的就是扫描主机是否存活。端口是是否增加及时邮件告知管理员,对扫描结果使用diff进行比对,若出

现增加端口,邮件告知管理员,谨防入侵。

二、NMAP简介

Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,

并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用

以评估网络系统安全。正如大多数被用于网络安全的工具,nmap 也是不少黑客及骇客(又称脚本小子)爱

用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用nmap来

搜集目标电脑的网络设定,从而计划攻击的方法。

Nmap 常被跟评估系统漏洞软件Nessus 混为一谈。Nmap 以隐秘的手法,避开闯入检测系统的监视,并尽

可能不影响目标系统的日常操作。

三、NMAP功能

其基本功能有三个,一是探测一组主机是否在线;其次是扫描 主机端口,嗅探所提供的网络服务;还可以推

断主机所用的操作系统 。Nmap可用于扫描仅有两个节点的LAN,直至500个节点以上的网络。Nmap 还允

许用户定制扫描技巧。通常,一个简单的使用ICMP协议的ping操作可以满足一般需求;也可以深入探测UDP

或者TCP端口,直至主机所使用的操作系统;还可以将所有探测结果记录到各种格式的日志中, 供进一步分析

操作。

四、NMAP:shell脚本编写

为了使脚本具有通用性。所以在前面编写脚本,写的的比较冗长,同时,是以同一天时间进行比对。


脚本中添加了使用该脚本的用户,你懂的。


本文可以自动创建所有文件及文件夹,请忽略部分输出,那是为了方便测试。请谅解。

#!/bin/bash
#author:aizhen
#mail:[email protected] 
###设crond 0:01 执行一次$0
###设crond 23:50 执行一次$0

user=$(whoami)
[email protected]
date=$(date "+%F")
subnet="192.168.40."
diff_dir="/diff"
nmap_dir="/nmap"
nmap_file=$date
nmap_file1=$date+1

###down机告警使用
send_mail(){
	echo -e "$1\noperator:$user" | mail -s "$2" $send_user
}

###diff告警使用
send_mail_diff(){
	echo -e "$1\noperatoe:$user" | mail -s "$2" $send_user
}

###每次扫描端口时,先测试主机是否存活,如果主机down机,马上给管理员发送邮件
host_alive(){
	for i in {128..130};do
	count=$(nmap -sP $subnet$i | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' | wc -l)
	if [ $count -eq 0 ];then
		send_mail "$subnet$i is down" "hosts down"
	fi
done
}

###每次先测试主机是否存活,扫描端口并写入文档,文档用于diff
scan_first(){
	host_alive
	for a in {128..130};do
		cd $nmap_dir
		if [ $? -ne 0 ];then
			mkdir -p $nmap_dir
			cd $nmap_dir
		fi 
		cd $nmap_file
		if [ $? -ne 0 ];then
			mkdir -p $nmap_file
			cd $nmap_file
		fi
		cat $subnet$a
		if [ $? -ne 0 ];then
			touch  $subnet$a
		fi
	first_count=$(nmap -sS  -p- $subnet$a | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' | wc -l)
		if [ $first_count -ne 0 ];then
			nmap -sS  -p- $subnet$a | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' >> $subnet$a
		fi
	first_count1=$(nmap -sS  -p- $subnet$a | awk '/^[0-9]/{print $1}' | wc -l)
		if [ $first_count1 -ne 0 ];then
			nmap -sS  -p- $subnet$a | awk '/^[0-9]/{print $1}' >>  $subnet$a
		fi
	done 
}

###依旧每次扫描端口前,测试主机是否存活,第二次扫描并diff
scan_second(){
	host_alive
	for b in {128..130};do
		cd $nmap_dir
		if [ $? -ne 0 ];then
			scan_first
			break
		fi
		cd $nmap_file
		if [ $? -ne 0 ];then
			scan_first
			break
		fi
		cd $nmap_dir/$nmap_file1
		if [ $? -ne 0 ];then
			mkdir -p $nmap_dir/$nmap_file1
			cd $nmap_dir/$nmap_file1
		fi
		cat $subnet$b
		if [ $? -ne 0 ];then
			touch $subnet$b
		fi
		second_count=$(nmap -sS  -p- $subnet$b | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' | wc -l)
                if [ $second_count -ne 0 ];then
                        nmap -sS  -p- $subnet$b | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' >> $subnet$b
                fi
        second_count1=$(nmap -sS  -p- $subnet$b | awk '/^[0-9]/{print $1}' | wc -l)
                if [ $second_count1 -ne 0 ];then
                        nmap -sS  -p- $subnet$b | awk '/^[0-9]/{print $1}' >>  $subnet$b
                fi
	done
	scan_diff

}

###用于对比两个文件,不同就告警
scan_diff(){
	cd $diff_dir
	if [ $? -ne 0 ];then
		mkdir -p $diff
	fi
	cd $nmap_dir
	if [ $? -ne 0 ];then
		break
	fi
	if [ ! -d $nmap_file -o ! -d $nmap_file1 ];then
		break
	fi
	
for f in {128..130};do
	diff $nmap_dir/$nmap_file/$subnet$f $nmap_dir/$nmap_file1/$subnet$f
	if [ $? -eq 1 ];then
		echo $subnet$f >> $diff_dir/$date
		diff $nmap_dir/$nmap_file/$subnet$f $nmap_dir/$nmap_file1/$subnet$f >> $diff_dir/$date
	fi
	done
	if [ ! -f $diff_dir/$date ];then
		send_mail_diff "no problem" "no port change"
	else 
		send_mail_diff "some port had changed\n$(cat $diff_dir/$date)" "port changed"
	fi
}

$1

测试结果如下:

测试主机出现宕机

nmap端口扫描及邮件告警脚本_第1张图片

端口扫描没有出现变化

nmap端口扫描及邮件告警脚本_第2张图片

端口扫描出现变化,增加了22端口

nmap端口扫描及邮件告警脚本_第3张图片

五、总结

筛选IP
nmap -sS  -p- 192.168.40.128 | awk '/^Nmap scan/{print $6}' | sed -e 's/[()]//g' >> nmap.txt


筛选开放端口
nmap -sS  -p- 192.168.40.128 | awk '/^[0-9]/{print $1}' >>  nmap.txt


脚本经本人测试过,可以使用。强调一下,为方便大家使用测试,我没将部分的显示丢到后台,敬请谅解。


本文为博主原创博文,如需要转载本文,请添加原文出处。谢谢!

你可能感兴趣的:(脚本编写)