一、背景需求
由于最近需要编写定时扫描端口脚本。所以选择了强悍的扫描工具--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:997822785@qq.com
###设crond 0:01 执行一次$0
###设crond 23:50 执行一次$0
user=$(whoami)
send_user=997822785@qq.com
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
测试结果如下:
测试主机出现宕机
端口扫描没有出现变化
端口扫描出现变化,增加了22端口
五、总结
筛选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
脚本经本人测试过,可以使用。强调一下,为方便大家使用测试,我没将部分的显示丢到后台,敬请谅解。
本文为博主原创博文,如需要转载本文,请添加原文出处。谢谢!