利用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 文件中,您可以将该文件内容作为邮件正文发送出来即可
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2022-01-14 17:30:07

results matching ""

    No results matching ""