网络自动化运维 Help

12-1nmap网络扫描工具

介绍

Nmap: (Network Mapper) 是一个免费且开源的网络扫描器,由 Gordon Lyon (Fyodor) 创建。 它是一个非常强大和通用的工具,被广泛用于网络发现和安全审计。

应用场景:

  • 网络资产清点

  • 安全审计和漏洞评估

  • 渗透前的信息收集

  • 网络故障排除

Nmap官网

安装

  1. Nmap在不同操作系统上有不同的可执行软件包, Nmap官网-下载页
    Nmap Windows版下载⏬
    安装包nmap-7.97-setup.exe

  2. Nmap安装保持默认,一路默认下一步,但注意一个选项添加命令行程序到系统环境变量Path 。中途会弹出另一个窗口安装npcap,保持默认安装,npcap是一个接口工具,让用户操控网卡,安装eNSP时携带的抓包工具Wireshark就依赖npcap/wincap,npcap时wincap的继任者。可以用来发套接字报文。

    12 1 nmap

  3. (重要)确认命令行工具可用,确认安装成功和添加环境变量Path。

    12 1 nmap

  4. 命令行使用

nmap -sn 192.168.1.0/24 #仅检测网段内存活主机 nmap -PS80 192.168.1.1 # CP SYN Ping扫描 nmap -p 1-1000 192.168.1.1 # 扫描端口范围(默认1-1000) nmap -sV 192.168.1.1 # 检测服务版本 nmap -O 192.168.1.1 # 识别操作系统(可能存在误报) nmap -A 192.168.1.1 # 全面扫描(包含OS、服务、脚本检测等)‌
12 1nmap

实验1 主机发现

如果想更灵活,比如发现主机然后探测端口,那么用编程语言调用更灵活。
场景:统计局域网内的主机数量;看看这间教室开了多少台机器;渗透攻击前获取网络内其它设备IP。

  1. 安装python-nmap库。
    nmap命令行工具可以单独使用,也可以安装python的调用库通过代码来更灵活的调用。
    调用关系是 python代码➡️python-nmap库➡️nmap软件(已添加环境变量Path),类似第四章和第十一章。

pip install python-nmap
  1. 代码(修改ip网段为你电脑所在的网段)

# 主机发现 import nmap def host_discovery_scan(target_range): try: nm = nmap.PortScanner() print(f"正在对范围进行主机发现 (Ping Scan): {target_range}") # 执行扫描 # -sn 参数:进行 Ping Scan,不进行端口扫描 # -T4 参数:设置扫描速度模板 nm.scan(hosts=target_range, arguments='-sn -T4') print("扫描完成。\n") print(f"使用的Nmap命令: {nm.command_line()}") print("\n--- 活动主机列表 ---") # 遍历所有在扫描结果中的主机 # all_hosts() 包含了所有被扫描的主机,无论它们是否在线 found_hosts = [] for host in nm.all_hosts(): host_info = nm[host] # 检查主机的状态 if host_info.state() == 'up': found_hosts.append(host) print(f"主机: {host} ({host_info.hostname()}) 状态: {host_info.state()}") if not found_hosts: print("未发现活动主机。") except nmap.PortScannerError as e: print(f"Nmap 扫描错误: {e}") except Exception as e: print(f"发生错误: {e}") if __name__ == "__main__": # 修改为你本地网络的范围 target_network_range = '172.31.3.0/24' host_discovery_scan(target_network_range)
12 1

实验2 扫描端口

场景:网络攻击前查询对方服务器开启了哪些端口,如22 ssh,3306 mysql;查看服务器哪些端口可用。

  1. 开启一个本地web服务(可省略,因为本地电脑上有很多程序服务可被扫描)

    12 1 http

  2. 扫描脚本(可以修改扫描ip和端口范围,运行需要三分钟左右耐心等待)

# 扫描端口 import nmap def simple_nmap_connect_scan(target_host, target_ports): try: # 创建 PortScanner 对象 nm = nmap.PortScanner() print(f"正在使用 TCP Connect 扫描主机: {target_host}, 端口: {target_ports}") # 执行扫描,使用 -sT 参数进行 TCP Connect 扫描,-sV 仍然用于服务版本检测 nm.scan(target_host, target_ports, arguments='-sT -sV') print("扫描完成。") # 打印扫描命令 print(f"使用的Nmap命令: {nm.command_line()}") # 检查扫描结果 if target_host in nm.all_hosts(): print(f"\n--- 主机: {target_host} ---") host_info = nm[target_host] print(f"主机状态: {host_info.state()}") # 遍历扫描到的协议 (tcp, udp等) for proto in host_info.all_protocols(): print(f" 协议: {proto}") # 获取该协议下的所有端口 lport = host_info[proto].keys() lport = list(lport) for port in lport: port_info = host_info[proto][port] print(f"端口: {port}\t状态: {port_info['state']}\t服务: {port_info.get('name', '未知')}\t版本: {port_info.get('version', '未知')}") else: print(f"未在扫描结果中找到主机: {target_host}") except nmap.PortScannerError as e: print(f"Nmap 扫描错误: {e}") except Exception as e: print(f"发生错误: {e}") if __name__ == "__main__": # 示例用法:扫描本地主机 (127.0.0.1) 的 20 到 100 端口 # 这个扫描使用 -sT,建立完整的TCP连接,不需要安装Npcap。如果是-sS ACK则依赖Npcap和管理员权限 target_host = '127.0.0.1' target_ports = '0-65535' # 也可以扫描特定端口target_ports = '22,80,443,3389' simple_nmap_connect_scan(target_host, target_ports)
  1. 可以观察到能扫描到刚才开的web服务

    12 1

实验三

(选做)自行尝试Nmap GUI,比起难记的参数,GUI工具提供了一些扫描基础模板。

26 五月 2025