Nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
准备
nmap官网
原理
基础知识
端口状态
端口状态 | 信息 |
---|---|
Open(开放的) | 应用程序正在这个端口上监听连接 |
Closed(关闭的) | 端口对探测做出了响应,但是现在没有应用程序在监听这个端口 |
Filtered(过滤的) | 端口没有对探测做出响应。同时告诉我们探针可能被一些过滤器(防火墙)终止了 |
Unfiltered(未被过滤的) | 端口对探测做出了响应,但是Nmap无法确定它们是关闭还是开放。 |
Open/Filtered | 端口被过滤或者是开放的,Nmap无法做出判断。 |
Closed/Filtered | 端口被过滤或者是关闭的,Nmap无法做出判断 |
扫描目标设置
模式 | 示例 |
---|---|
单个目标 | nmap -T4 -F 192.168.1.11 |
多个目标 | nmap 192.168.1.11 192.168.1.12 192.168.1.13 |
IP地址段 | nmap 192.168.1.11-22 |
随机扫描 | nmap -iR 10 |
剔除性扫描,剔除个别不想扫描的主机 | nmap 192.168.1.0/24-exclude 192.168.1.5 |
高级玩法
脚本
NSE 即Nmap脚本引擎,涵盖网络发现到检测和利用安全漏洞等多方面任务
示例
nmap -sV -sC scanme.nmap.org
脚本文件需要放在nmap的script目录内才可以直接使用,否则要指定全路径
linux版本的默认路径为/usr/share/nmap/scripts
nmap --script http-title 192.168.1.11
nmap --script http-title,http-methods 192.168.1.11
nmap -p80 --script http-huawei-hg5xx-vuln 192.168.1.11
高级表达式
要选择整个类别,只需使用类别的名称(请参阅脚本作为参数。例如,要运行漏洞类别,使用以下命令:
nmap --script exploit 192.168.1.11
您也可以用逗号分隔它们来运行多个类别:
nmap --script discovery,intrusive 192.168.1.11
-sC选项仅仅是--script默认选项的别名。
按文件名或文件夹选择
要执行NSE脚本文件,请使用以下命令:
nmap --script /path/to/script.nse 192.168.1.11
与类别类似,可以通过分离路径来执行多个脚本
用逗号分隔:
nmap --script /path/to/script.nse,/another/path/script2.nse 192.168.1.11
要执行文件夹中包含的所有脚本,只需要传递文件夹名称
举个栗子:
nmap --script/path/to/folder/ 192.168.1.11
nmap --script/custom-nse-scripts/ scanme.nmap.org
表达式用于描述一组脚本。
我们可以利用脚本选择表达式的场景(未利用表达式将匹配任何脚本):
- 使用不属于exploit类别的脚本:
nmap -sV --script "not exploit" 192.168.1.11
- 使用not,or,and运算符构造更复杂的表达式。以下表达式将匹配不在intrusive,或者dos,或者exploit类别中的任何脚本。
nmap --script "not(intrusive or dos or exploit)" -sV 192.168.1.11
- 如果我们想要执行broadcast和discovery中的所有类别脚本。
nmap --script "broadcast and discovery" 192.168.1.11
- 使用通配符
*
:
nmap --script "snmp-*" 192.168.1.11
- 结合使用通配符和表达式
例如:让我们运行名称以http-开头的所有脚本,但排除
http-slowloris,http-brute,http-form-fuzzer和http-enum脚本:
nmap --script "http-*and not(http-slowloris or http-brute or http-enum or http-form-fuzzer)" 192.168.1.11
- 执行以http开头的但不在exploit类别中的所有脚本:
nmap --script "http-*not(exploit)" 192.168.1.11
脚本参数-script-args
-script-args
选项用于在NSE脚本中设置参数。
如:设置http-title脚本的useragent参数,可以这么写
nmap -sV --script http-title --script-args http.useragent="Mozilla 1337" 192.168.1.11
脚本名称有时是可以忽略的如下等价的表达式,注意区别
nmap -p80 --script http-trace--script-args path="xxx" 192.168.1.11
nmap -p80 --script http-trace--script-args http-trace.path="xxx" 192.168.1.11
注意,如果脚本的参数名与共享参数名称冲突时则不可以省略脚本名
脚本编写语言Lua
一般约定,以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua内部全局变量
Lua语言特性
- 轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
其它特性
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等
脚本编写注意事项
- 编写的脚本的后缀为nse
- 编写之后的NSE脚本存放在script文件夹内,这样脚本才可以生效
-
必须使用--script选项进行调用Nse脚本
脚本编写规则
- 导入脚本编写所需库
- 编写脚本描述信息
- 确定Rule类型
- 编写Action
思维导图
附录
nmap 帮助说明
查看原文