利用masscan查找暴露在公网的敏感端口
[TOC]
实现原理
端口扫描,是网络安全中非常常用的技术手段。通过对特定的IP范围和端口范围进行穷举扫描,发现暴露在公网的端口,通过加强防火墙限制,提升应用服务的安全。
关于Masscan
- Masscan 是 Robert Graham 在 Github 上开源的端口扫描工具,它性能优越,极限速度可以从单机每秒发送1000万个数据包,号称能够在5分钟内完成对整个互联网所有的IP进行扫描。
- Masscan 针对 TCP 端口进行扫描,使用 SYN 扫描的方式,不建立一个完全的 TCP 连接,而是首先发送一个 SYN 数据包到目标端口,然后等待接收。如果接收到 SYN-ACK 包,则说明该端口是开放的,此时发送一个 RST 结束建立过程即可;否则,若目标返回 RST,则端口不开放。
- Masscan 在其内部使用异步传输,更为灵活,允许任意的IP和端口范围,并使用了随机化的目标扫描,使得对于非连续段IP的扫描更加高效,解决了范围切分带来的性能损失问题,且降低了对于目标网络的负载压力,提高了自由度和性能。
masscan安装
- 若github访问正常,建议编译安装
cd /opt/
yum install -y gcc make git libpcap-devel
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make && make install
- 若github无法访问,可下载安装
cd /opt/
wget -O masscan-master.zip https://codeload.github.com/robertdavidgraham/masscan/zip/master
unzip masscan-master.zip
mv masscan-master masscan
cd masscan
make && make install
使用语法
常用参数
参数 | 功能 | 备注 |
---|---|---|
--ports |
指定端口进行扫描 | 指定范围(21,80,1433-65535) |
-iL |
指定要扫描的IP清单文件 | |
-oG |
保存日志记录到文件 | |
--wait |
指定发送完包之后的等待时间,单位为s | 默认10秒,调低可以减少等待时间 |
--rate |
指定发包的速率 | 调高(5k到10w)可以加快扫描过程,但是扫描结果可能不准确 |
--open |
||
--banners |
获取banner信息,支持少量的协议 | |
--conf <filename> |
读取配置文件进行扫描 | |
--echo |
将当前的配置重定向到一个配置文件中 | |
--adapter <ifname> |
指定用来发包的网卡接口名称 | |
--adapter-ip <ip-address> |
指定发包的IP地址 | |
--adapter-port <port> |
指定发包的源端口 | |
--adapter-mac <mac-address> |
指定发包的源MAC地址 | |
--router-mac <mac address> |
指定网关的MAC地址 | |
--exclude <ip/range> |
IP地址范围黑名单,防止masscan扫描 | |
--excludefile <filename> |
指定IP地址范围黑名单文件 | |
--includefile,-iL <filename> |
读取一个范围列表进行扫描 |
扫描举例
以下以扫描 www.baidu.com
的端口为例,讲解 masscan 的使用:
[root@localhost]# ping -c2 www.baidu.com
PING www.a.shifen.com (112.80.248.75) 56(84) bytes of data.
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=1 ttl=52 time=13.3 ms
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=2 ttl=52 time=13.3 ms
- 基础语法
masscan 112.80.248.75 --ports 80
masscan 112.80.248.75 --ports 1-65535 --rate 1000
masscan -iL /tmp/iplist --wait 5 --open --rate 5000 --ports 1-65535 -oG /tmp/masscan.log
- 经过优化之后的推荐语法
masscan 112.80.248.75 --wait 5 --open --rate 5000 --ports 1-65535 --rate 1000 -oG /tmp/masscan.log
实战案例
- 先将某 xxx 业务要扫描的ip清单写入文件 iplist_xxx,以后增删ip只用修改此文件即可
mkdir -p /opt/masscan/{etc,logs}
cat > /opt/masscan/etc/iplist_xxx <<EOF
112.80.248.75
112.80.248.76
EOF
- 再将正常暴露公网的端口放入白名单
cat > /opt/masscan/etc/whitelist_xxx <<EOF
112.80.248.75 80 tcp
112.80.248.75 443 tcp
EOF
- 编写全扫描的脚本
#!/bin/sh
#.1.初始化参数.
DATE=`date "+%Y%m%d"`
PROJ_CODE="xxx"
PROJ_NAME="某业务"
#.2.执行masscan扫描.全端口扫描.
cd /opt/masscan
./bin/masscan -iL ./etc/iplist_$PROJ_CODE --wait 5 --open --rate 5000 --ports 1-65535 -oG ./logs/$PROJ_CODE.$DATE.log
#.3.只保留含有扫描结果的行,取IP和端口和协议,并排序.
grep -P "Host" ./logs/$PROJ_CODE.$DATE.log | awk -F'[ |:|/]+' '{print $3, $5, $7}' | sort > ./logs/$PROJ_CODE.$DATE.tmp
#.4.对比白名单,剔除白名单(格式:112.80.248.75 80 tcp)中的结果后重新生成扫描结果文件.
cat ./etc/whitelist_$PROJ_CODE | while read f
do
if [[ "${f}x" != "x" ]]
then
sed "s/${f}//g" ./logs/$PROJ_CODE.$DATE.tmp -i
grep -Ev "^$" ./logs/$PROJ_CODE.$DATE.tmp | sort -u > ./logs/$PROJ_CODE.$DATE.report
fi
done
#.5.发送邮件(请自行发挥)
rm -f ./logs/$PROJ_CODE.$DATE.tmp
sed -i "s#\(^\)#<br>#g" ./logs/$PROJ_CODE.$DATE.report
结果如下
[root@localhost masscan]# cat ./logs/xxx.20211213.log
# Masscan 1.3.2 scan initiated Mon Dec 13 06:00:13 2021
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Timestamp: 1639375226 Host: 112.80.248.75 () Ports: 80/open/tcp//http//
Timestamp: 1639375230 Host: 112.80.248.76 () Ports: 443/open/tcp//https//
Timestamp: 1639375231 Host: 112.80.248.76 () Ports: 80/open/tcp//http//
Timestamp: 1639375235 Host: 112.80.248.75 () Ports: 443/open/tcp//https//
# Masscan done at Mon Dec 13 06:00:45 2021
[root@localhost masscan]# cat ./logs/xxx.20211213.report
<br>112.80.248.76 443 tcp
<br>112.80.248.76 80 tcp
- 这里只是将扫描出来的敏感端口写入 ./logs/xxx.yyyymmdd.report 文件中,您可以将该文件内容作为邮件正文发送出来即可