#端口扫描器 #nmap #端口扫描 #安全 #XML解析器 #开放端口 #虚拟机

程序+库 nmap-analyze

分析 nmap XML 输出并与预期规范进行比较

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

MIT 协议

84KB
2K SLoC

nmap-analyze

分析 nmap XML 输出并与预期规范进行比较。

Linux and macOS Build Status codecov GitHub release MIT licensed

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个数据库服务器。端口规范只需两个规范,每个服务器角色一个。例如,以下映射定义了这两个组及其相应的角色。只有字段ipsportspec是必需的。

{ "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将尝试检查该端口。

演示

asciicast

安装

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