6 个版本 (1 个稳定版)
使用旧的 Rust 2015
1.0.0 | 2019年4月15日 |
---|---|
0.3.0 | 2018年10月16日 |
0.2.1 | 2018年9月4日 |
0.2.0 | 2018年8月2日 |
0.1.0 | 2018年7月28日 |
#4 in #nmap
84KB
2K SLoC
nmap-analyze
分析 nmap XML 输出并与预期规范进行比较。
nmap 是一个功能强大且广泛使用的端口扫描器。它扫描单个主机或一组主机上的开放 TCP 和 UDP 端口。这使得管理员可以验证防火墙和端口过滤配置。 nmap-analyze
是一个非常简单的工具,有助于简化验证过程。基本上,它将 nmap 的扫描结果作为 XML,将每个扫描主机的结果与规范进行比较,并报告所有偏差。 nmap-analyze
支持人类可读和 JSON 输出。后者可用于进一步的后处理。
我们运行大量虚拟机,并每天扫描它们的公共 IP 地址。通过使用 nmap-analyze
,我们可以快速解析大量的端口扫描结果,并将它们与我们期望的结果进行比较。这样,可以在有人利用它之前快速发现防火墙、安全组和服务设置的配置错误。
基本用法
nmap-analyze
需要三个输入:1. nmap 扫描结果以 XML 格式,2. IP 地址到端口规范的映射,3. 端口规范。映射允许您定义映射到同一端口规范的主机组。
运行 nmap
nmap-analyze
需要nmap创建 XML 输出文件并在调试 2 模式下运行(-dd
)。调试模式强制 nmap 为每个端口写入结果;而不仅仅是“有趣”的端口。例如,您可以在调试 2 模式(-dd
)下扫描 IP 地址为 192.168.0.1
的主机,不进行 DNS 解析(-n
),使用 TCP SYN 扫描模式(-sS
),并将 XML 输出到文件(-oX nmap-results.xml
)如下所示
sudo nmap -dd -n -sS -oX nmap-results.xml 192.168.0.1
端口规范映射
端口规范映射将主机的IP地址映射到相应的端口规范。这样,在多个主机具有相同角色的场景下,端口映射将实现n:1的映射,大大减少了端口规范的数量。例如,您可能有5个REST API服务器和3个数据库服务器。端口规范只需两个规范,每个服务器角色一个。例如,以下映射定义了这两个组及其相应的角色。只有字段ips
和portspec
是必需的。
{ "mappings":
[
{
"hostname": "rest01",
"id": "i-0",
"ips": ["192.168.0.1"],
"name": "Rest server 01",
"portspec": "Rest Server"
},
{
"hostname": "rest02",
"id": "i-1",
"ips": ["192.168.0.2"],
"name": "Rest Server 02",
"portspec": "Rest Server"
},
{
"hostname": "db01",
"id": "i-2",
"ips": ["192.168.0.3", "192.168.0.4"],
"name": "Db server 01",
"portspec": "Db Server"
}
]
}
端口规范映射需要JSON格式,因为其自动生成非常容易。例如,我们使用公共云提供商的CLI工具枚举我们的虚拟机。每台虚拟机都有一个公网IP地址和一个名为"host_group"的标签,该标签声明了虚拟机的角色。
对于AWS,您可以尝试以下方法生成映射文件。此示例需要AWS CLI工具和jq
。
function jq_filter {
local root="${1}"
local id="${2}"
local hostname="${3}"
local ips="${4}"
local name="${5}"
local portspec="${6}"
echo "${root} | { id: ${id}, hostname: ${hostname}, ips: ${ips}, name: ${name}, portspec: ${portspec} }"
}
aws ec2 describe-instances --filters 'Name=instance-state-name,Values=running' --output json | jq -r "$(jq_filter '.Reservations[].Instances[]' '.InstanceId' '.PublicDnsName' '[ .PublicIpAddress ]' '.Tags[] | select(.Key=="Name") .Value' '.Tags[] | select(.Key=="host_group") .Value')" > portspec_mapping.json
端口规范
端口规范文件定义了哪些端口必须打开、关闭或可能打开或关闭。端口规范文件由一系列项目组成,这些项目的名称由端口规范映射字段portspec
引用。这样,多个主机可以映射到同一个端口规范。以下示例显示了一个具有两个端口规范"Rest Server"和"Db Server"的端口规范文件
portspecs:
- name: Rest Server
ports:
- id: 22
state: closed
- id: 25
state: maybe
- id: 443
state: open
- name: DB Server
ports:
- id: 3306
state: open
"Rest Server"端口规范定义了端口22(ssh)必须关闭,端口443(https)必须打开。端口25(smtp)可能打开或关闭。"maybe"状态在单次扫描结果不确定或扫描结果可能变化的情况下很有用。例如,AWS有时会过滤端口25的扫描尝试。因此,尽管端口在技术上保持打开状态,但扫描有时会显示其为关闭状态。"Db Server"端口规范要求端口3306(mysql)必须打开。所有未明确定义的端口都应关闭。
端口扫描通常只探测有限的端口集合,而不是扫描所有65535个可能的端口以节省时间。如果扫描结果不包含指定的端口,因此nmap-analyze
无法决定端口规范是否遵守,它将发出错误信号。通过明确指定特定端口为关闭,您可以确保nmap-analyze
将尝试检查该端口。
演示
安装
Ubuntu [x86_64]
请添加我的PackageCloud开源仓库,并通过apt安装nmap-analyze
。
curl -s https://packagecloud.io/install/repositories/lukaspustina/opensource/script.deb.sh | sudo bash
sudo apt-get install nmap-analyze
Linux二进制文件 [x86_64]
GitHub 发布页面上提供了二进制文件。这些二进制文件是在Ubuntu上编译的。
macOS
请使用Homebrew在您的系统上安装nmap-analyze
。
brew install lukaspustina/os/nmap-analyze
macOS二进制文件 [x86_64]
GitHub 发布页面上提供了二进制文件。
源代码
请通过rustup安装Rust,然后运行
git clone https://github.com/lukaspustina/nmap-analyze
cd nmap-analyze
cargo build
Postcardware
您可以使用nmap-analyze
。如果您发现它很有用,我将非常感激您从您家乡寄给我一张明信片,说明您如何使用nmap-analyze
。我的工作地址是
Lukas Pustina
CenterDevice GmbH
Rheinwerkallee 3
53227 Bonn
Germany
依赖关系
~14–24MB
~347K SLoC