masscan 端口扫描——(Golang 简单使用总结)

1. 前言

最近要做一个扫描 ip 端口的功能

扫描的工具有很多,但是如何做到短时间扫描大量的 ip 是个相对困难的事情。

市场上比较出名的工具有 masscannmap

masscan 支持异步扫描,对多线程的利用很好,同时仅仅支持 syn 半开扫描,这让 masscan 对端口进行粗糙扫描的性能达到了非常高的地步

半开扫描是指发送一个 SYN 包(SYN-SENT 状态),等待目标主机回复 SYN+ACK 包(SYN-RECEIVED 状态),然后发送一个 RST 包(ESTABLISHED 状态),以终止连接。半开扫描的优点是速度快,因为它只需要发送一个 SYN 包和一个 RST 包,而不需要完成整个三次握手过程。缺点是容易被一些防火墙和 IDS/IPS 检测到,因为它不是一个完整的连接过程

缺点就是结果比较模糊,无法知道是否是被防火墙 ban 掉的端口

那么用 mmsacn 作为第一层的预处理是很好用的

2. masscan 的安装

准备 (这里不提倡使用yum,yum的版本比较低 )

  1. git 工具
  2. c 编译环境
  1. 克隆、编译
go 复制代码
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
  1. 安装
go 复制代码
make install
  1. 测试是否安装
go 复制代码
masscan --version

3. masscan 的简单使用

masscan 的主要关乎性能的参数有两个

选项 意义
/ --rate 发送包的速率,和扫描端口速度正相关
/ --wait 发送完包等待时间,和性能负相关,不过时间越久可以扫到的端口就可以越多

实际上,masscan 扫描速度非常快, masscan rate 1000 扫描一个 C 段(256 个 IP 地址)的主机,需要约 3-5 秒钟的时间,一般来说不用担心 masscan 性能不足的问题

  1. 扫描端口范围
go 复制代码
masscan -p 1-65535 115.42.32.45
  1. 扫描多个不连续端口
go 复制代码
masscan -p 32,43,5453,45 115.42.32.45
  1. 扫描网段
go 复制代码
masscan -p 1-65535 10.0.0.0/16

4. Golang 使用

golang 可以通过 cmd 直接和 masscan 进行交互,这里我们直接捕获输出值

go 复制代码
startPort := 1
endPort := 65535
portRange := fmt.Sprintf("%d-%d", startPort, endPort)

	// 构建 masscan 命令
	cmd := exec.Command("sudo", "masscan", ip, "-p", portRange, "--rate", "50k")

	// 获取命令输出
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	var stderr bytes.Buffer
	cmd.Stderr = &stderr
	if err != nil {
		fmt.Printf("Error running masscan: %v\n", err)
		return nil, err
	}
			fmt.Printf(out)

通过golang 结合命令行可以很方便的对 masscan 结果进行处理

我们也可以把它解析为数组

go 复制代码
func parseMasscanOutput(output string) []int {

	var openPorts []int
	re := regexp.MustCompile(`port (\d+)/tcp`)

	matches := re.FindAllStringSubmatch(output, -1)
	for _, match := range matches {
		if len(match) > 1 {
			portStr := match[1]
			portInt, err := strconv.Atoi(portStr)
			if err != nil {
				fmt.Printf("Error running masscan: %v\n", err)
				continue

			}
			openPorts = append(openPorts, portInt)
		}
	}

	return openPorts
}

5. 总结

masscan 是非常高性能的端口扫描工具(高到不需要考虑优化),我们可以使用masscan 进行一次扫描后,再后续使用其他工具进行处理

相关推荐
极客先躯37 分钟前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
亲爱的非洲野猪1 小时前
Java锁机制八股文
java·开发语言
LawrenceLan1 小时前
Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步
开发语言·前端·flutter·dart
charlie1145141912 小时前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
catchadmin3 小时前
Laravel12 + Vue3 的免费可商用商业级管理后台 CatchAdmin V5 正式发布
开发语言·php
袁气满满~_~3 小时前
Python数据分析学习
开发语言·笔记·python·学习
Elastic 中国社区官方博客3 小时前
Elastic:DevRel 通讯 — 2026 年 1 月
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
寻星探路3 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai
程序员小白条3 小时前
面试 Java 基础八股文十问十答第八期
java·开发语言·数据库·spring·面试·职场和发展·毕设
Dxy12393102163 小时前
python连接minio报错:‘SSL routines‘, ‘ssl3_get_record‘, ‘wrong version number‘
开发语言·python·ssl