本系列文章来自《高度安全环境下的高级渗透测试》一书学习笔记。
一、Nmap
Nmap 可以用来扫描一个网络、监控服务、帮助列出网络主机等。Nmap能够提供操作类型、开放端口等信息。Nmap脚本引擎可以扩展Nmap的功能。
之前文章简单介绍过其使用:
1. NMap家族
- ZenMap
- Neat:基于netcat,扩展了很多功能
- Ncrack:用来测试已部署的认证系统和密码强度,支持常用协议
- Ndiff:可用于网络基线测量,对比Nmap扫描结果之间的差别
- Nping:允许将自己构造的数据包整合在扫描过程中,并能够对原始的数据包进行操控
2. 语法
nmap - {type(s)} -{opt(s)} {target}
3. 常用选项
主机发现
选项 | 作用 |
-sn | Ping Scan 只进行主机发现,不进行端口扫描。 |
-Pn | 将所有指定的主机视作开启的,跳过主机发现的过程。 |
-PS/PA/PU/PY[portlist] | 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。 |
-PE/PP/PM | 使用ICMP echo, timestamp, and netmask 请求包发现主机。 |
-PO[protocollist] | 使用IP协议包探测对方主机是否开启。 |
-n/-R | -n表示不进行DNS解析;-R表示总是进行DNS解析。 |
–dns-servers <serv1[,serv2],…> | 指定DNS服务器。 |
–system-dns | 指定使用系统的DNS服务器。 |
–traceroute | 追踪每个路由节点。 |
端口扫描
选项 | 作用 |
-sS/sT/sA/sW/sM | 指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。 |
-sU | 指定使用UDP扫描方式确定目标主机的UDP端口状况。 |
-sN/sF/sX | 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。 |
–scanflags | 定制TCP包的flags |
-sI | 指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host) |
-sY/sZ | 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况 |
-sO | 使用IP protocol 扫描确定目标机支持的协议类型 |
-b <FTP relay host> | 使用FTP bounce scan扫描方式 |
-p | 扫描指定的端口 实例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9(其中T代表TCP协议、U代表UDP协议、S代表SCTP协议) |
-F | 快速模式,仅扫描TOP 100的端口 |
–top-ports | 扫描开放概率最高的number个端口;具体可以参见文件:nmap-services。默认情况下,nmap会扫描最有可能的1000个TCP端口 |
–port-ratio | 扫描指定频率以上的端口。 |
版本探测
选项 | 作用 |
-sV | 指定让Nmap进行版本侦测 |
–version-intensity | 指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。 |
–version-light | 指定使用轻量侦测方式 (intensity 2) |
–version-all | 尝试使用所有的probes进行侦测 (intensity 9) |
–version-trace | 显示出详细的版本侦测过程信息。 |
操作系统探测
选项 | 作用 |
-O | 指定Nmap进行OS侦测。 |
–osscan-limit | 限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)。 |
–osscan-guess | 大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统。 |
一般在使用是会结合-O -V
使用这两个选项可以造成下面的输出:
- Device type:设备类型
所有的指纹被分为高层的设备类型,router, printer, firewall、general purpose
“Device Type: router|firewall” - Running:运行的什么系统
它显示操作系统家族以及操作系统型号,多个操作系统用逗号分隔,型号用‘|’分隔 - OS CPE
以cpe:/o:开头 - OS details
如果不确切,名字会变成Aggressive OS guesses
Uptime guess:
Network Distance:
TCP Sequence Prediction:
IP ID Sequence Generation:
-sV和-O同时使用
如果输出的操作系统信息一致,那么可信度更高;如果不一致还要进一步调查。
使用-A选项可以将二者结合起来。
4. 其它选项
规避防火墙
选项 | 作用 |
-f | –mtu <val>: 指定使用分片、指定数据包的MTU. |
-D <decoy1,decoy2[,ME],…> | 用一组IP地址掩盖真实地址,其中ME填入自己的IP地址。 |
-S <IP_Address> | 伪装成其他IP地址 |
-e <iface> | 使用特定的网络接口 |
-g/–source-port <portnum> | 使用指定源端口 |
–data-length <num> | 填充随机数据让数据包长度达到Num。 |
–ip-options <options> | 使用指定的IP选项来发送数据包。 |
–ttl <val> | 设置time-to-live时间。 |
–spoof-mac <mac address/prefix/vendor name> | 伪装MAC地址 |
–badsum | 使用错误的checksum来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,说明回复来自防火墙或IDS/IPS) |
示例:
nmap -v -F -Pn -D192.168.1.100,192.168.1.102,ME -e eth0 -g 3355 192.168.1.1
-F表示快速扫描100个端口;-Pn表示不进行Ping扫描;-D表示使用IP诱骗方式掩盖自己真实IP(其中ME表示自己IP);
-e eth0表示使用eth0网卡发送该数据包;
-g 3355表示自己的源端口使用3355;
192.168.1.1是被扫描的目标IP地址。
更好的方式-D选项中嵌入RND随机数,这样更具有迷惑性。
可以从Wireshark中看到数据包的流动情况:对于每个探测包,Nmap都使用-D选项指定的IP地址发送不同的数据包,
从而达到扰乱对方防火墙/IDS检查的目的(更好的方式-D选项中嵌入RND随机数,这样更具有迷惑性)。
当探测到80端口时候,目标主机向我们回复了SYN/ACK包回来(当然也向其他诱骗的IP回复SYN/ACK包,我们无法接收到),证明80端口是开放的。
使用NSE脚本
选项 | 作用 |
-sC | 等价于 –script=default,使用默认类别的脚本进行扫描。 |
–script=<Lua scripts> | 使用某个或某类脚本进行扫描,支持通配符描述 |
–script-args=<n1=v1,[n2=v2,…]> | 为脚本提供默认参数 |
–script-args-file=filename | 使用文件来为脚本提供参数 |
–script-trace | 显示脚本执行过程中发送与接收的数据 |
–script-updatedb | 更新脚本数据库 |
–script-help=<Lua scripts>: 显示脚本的帮助信息,其中<Luascripts>部分可以逗号分隔的文件或脚本类别。 |
检测防火墙
示例:
nmap -p 80,443 --script=http-waf-detect 192.168.150.143
nmap -p 80,443 --script=http-waf-detect www.jianshu.com
nmap -p 80,443 --script=http-waf-fingerprint idea.lanyus.com
正常与不正常的输出样式:
PORT STATE SERVICE
80/tcp open http
443/tcp open https
PORT STATE SERVICE
80/tcp open http
| http-waf-detect: IDS/IPS/WAF detected:
|_www.jianshu.com:80/?p4yl04d3=
443/tcp open https
文件读入列表
选项 | 作用 |
-iL <inputfilename> | (从列表中输入) |
-iR <hostnum> | (随机选择目标) |
–exclude <host1[,host2][,host3],…> | (排除主机/网络) |
–excludefile <excludefile> | (排除文件中的列表) |
5. 常用扫描
常规扫描
nmap -A 192.168.1.10
常规扫描,可以返回端口、操作系统等信息。易于被察觉。
保持隐藏
-T(0~5) 控制扫描速度
--max-hostgroup 可将扫描的主机数量限制在一次一个
--max-retries 在渗透测试中,可能不需要修改这个选项,除非对网络的稳定性非常了解。如果情况非常紧急并且不在乎扫描过程中可能错过一个包含潜在漏洞的主机,可以将这个选项值设置为0
--max-parallelism 10: 一次仅允许10个探测请求。使用这个选项控制一次探测的数量。
--scan-delay : 允许在两个探测之间的停顿
示例:
nmap -P0 -n -sS --max_hostgroup 1 --max_retries 0 --max_parallelism 10 192.168.50.0/24
子网192.168.50.X上有哪些主机在线。
SYN扫描
nmap -sS -T5 192.168.50.10
NULL扫描
nmap -sN -T5 192.168.50.10
没看出来这个扫描有什么作用
ACK扫描
nmap -sA -T5 192.168.50.10
6. 让僵尸扫描
转嫁责任,会使用空闲扫描(idle scan),让一个僵尸主机承担扫描任务。
使用空闲扫描 -sI 时,必须找一台TCP Sequence Prediction成功率高的僵尸主机,该主机必须尽可能的空闲。业界经常推荐的网络打印机是很好的僵尸主机,因为它们不存在恒定的网络流量,而且预测它们的TCP序列难度很低。
找可能的僵尸主机
nmap -v -O -Pn -n 192.168.50.10
该命令获得TCP序列预测率(详细、操作系统检测、无ping、无域名解析)
要关注这里:
TCP Sequence Prediction: Difficulty=259(Good luck!)
预测的难度越高,一台主机用作僵尸主机的可能性就越小。还有,连续生成ID可能帮助我们增加扫描的成功率。
空闲扫描原理
1. 向僵尸主机发送SYN/ACK数据包,从而得到带有分片ID(IPID)的RST报文
2. 发送使用僵尸主机IP地址的伪造数据包给目标主机
3. 如果目标端口关闭,将会给僵尸主机响应RST报文。如果目标端口开放,目标主机将向僵尸主机响应SYN/ACK报文,僵尸主机发现这个非常的连接响应,因此向目标主机发送RST报文,这时IPID号开始增长。
4. 通过向僵尸主机发送另一个SYN/ACK以退出上述循环并检查僵尸主机RST报文中的IPID是否每次增长2,同时目标主机的RST每次增长1.
5. 重复以上步骤直到检测完主机的所有端口。
扫描命令
nmap -p 23,53,80,1780,5000 -Pn -sI 192.168.1.88 192.168.1.111
使用-p启动对已知TCP端口的扫描
-Pn强调不使用ping
-sI 启动空闲扫描,
192.168.1.88作为僵尸主机,
192.168.1.111 是目标主机。
使用wireshark抓包时可以看到192.168.1.88和192.168.1.111之间有一些奇怪的活动。
7. 规避IDS规则
以后再看。
8. 使用诱饵
nmap -D192.168.75.10,192.168.75.11,192.168.75.1,ME -p 80,21,22,25,443 -Pn 192.168.75.2
-D 实施一次诱饵扫描 后面是诱饵主机列表
-Pn 不使用ping
-p 端口范围
在目标主机的网络防火墙上,将会看到多台主机的连接记录。
9. 添加常用的Nmap脚本
Nmap的脚本在:
cd /usr/local/share/nmap/scripts
ls -lah
查看脚本帮助:
nmap --script-help banner.nse
在数据库中添加新脚本
1. 将script.nse脚本添加到其它的Nmap NSE脚本目录下
2. 通过下面命令更新数据库绑定的脚本:
nmap -script-updatedb
参考资料: