12-1nmap网络扫描工具
介绍
Nmap: (Network Mapper) 是一个免费且开源的网络扫描器,由 Gordon Lyon (Fyodor) 创建。 它是一个非常强大和通用的工具,被广泛用于网络发现和安全审计。
应用场景:
网络资产清点
安全审计和漏洞评估
渗透前的信息收集
网络故障排除
Nmap官网
安装
Nmap在不同操作系统上有不同的可执行软件包, Nmap官网-下载页,
Nmap Windows版下载⏬
安装包nmap-7.97-setup.exe
Nmap安装保持默认,一路默认下一步,但注意一个选项添加命令行程序到系统环境变量Path 。中途会弹出另一个窗口安装npcap,保持默认安装,npcap是一个接口工具,让用户操控网卡,安装eNSP时携带的抓包工具Wireshark就依赖npcap/wincap,npcap时wincap的继任者。可以用来发套接字报文。

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

命令行使用
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、服务、脚本检测等)

实验1 主机发现
如果想更灵活,比如发现主机然后探测端口,那么用编程语言调用更灵活。
场景:统计局域网内的主机数量;看看这间教室开了多少台机器;渗透攻击前获取网络内其它设备IP。
安装python-nmap库。
nmap命令行工具可以单独使用,也可以安装python的调用库通过代码来更灵活的调用。
调用关系是 python代码➡️python-nmap库➡️nmap软件(已添加环境变量Path),类似第四章和第十一章。
pip install python-nmap
代码(修改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)

实验2 扫描端口
场景:网络攻击前查询对方服务器开启了哪些端口,如22 ssh,3306 mysql;查看服务器哪些端口可用。
开启一个本地web服务(可省略,因为本地电脑上有很多程序服务可被扫描) 
扫描脚本(可以修改扫描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)
可以观察到能扫描到刚才开的web服务

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