Nmap可以检测目标主机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 它是网络管理员必用的软件之一,用以评估网络系统安全。Nmap通常用在信息搜集阶段,用于搜集目标机主机的基本状态信息。扫描结果可以作为漏洞扫描、漏洞利用和权限提升阶段的输入。例如,业界流行的漏洞扫描工具Nessus与漏洞利用工具Metasploit都支持导入Nmap的XML格式结果,而Metasploit框架内也集成了Nmap工具(支持Metasploit直接扫描)。

参数信息

nmap –iflist查看本地主机的接口信息(INTERFACES)和路由信息(ROUTES)

-A 选项用于使用进攻性方式扫描

-T4指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况较好的情况下推荐使用T4

-sn只进行主机发现,不进行端口扫描

-sO使用IP protocol扫描确定目标机支持的协议类型

image-20210829190612074

-p 扫描指定的端口

-sS/sT/sA/sW/sM指定使用 TCP SYN半开放/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描

-sU指定使用UDP扫描方式确定目标主机的UDP端口状况

-sY/sZ使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况

-PO使用IP协议包探测对方主机是否开启

-PE/PP/PM使用ICMP echo、ICMP timestamp、ICMP netmask 请求包发现主机

-PS/PA/PU/PY使用TCP SYN/TCP ACK或SCTP INIT/ECHO方式进行发现

-sN/sF/sX指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态

-v表示显示冗余信息,在扫描过程中显示扫描的细节,从而让用户了解当前的扫描状态

-script <script name> 指定扫描脚本

和ping相关

-Pn 不进行ping扫描(禁ping的时候)

-sP 用ping扫描判断主机是否存活,只有主机存活,nmap才会继续扫描

-PI 设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。

列表&网段扫描

-iL 1.txt批量扫描1.txt中的目标地址

-sLList Scan列表扫描,仅将指定的目标的IP列举出来,不进行主机发现

nmap 192.168.1.0/24 -exclude 192.168.1.10扫描除192.168.1.0外的该网段的其他地址
nmap 192.168.1.0/24 -excludefile f:/1.txt扫描除给定文件中的地址以外的其他地址

减少探测数量类

-F 快速模式,仅扫描TOP 100的端口

--top-ports <number>扫描开放概率最高的number个端口

--port-ratio <ratio>扫描指定频率以上的端口。与上述–top-ports类似,这里以概率作为参数

nmap -sS -sU --top-ports 100 [ip]探测N个最有可能开放的端口

DNS类

-n表示不进行DNS解析;

-R 表示总是进行DNS解析。

--dns-servers指定DNS服务器

--system-dns指定使用系统的DNS服务器

版本探测-sV

-sV指定让Nmap进行版本侦测

--version-intensity <level>指定版本侦测强度(0-9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。

--version-light指定使用轻量侦测方式 (intensity 2)

--version-all尝试使用所有的probes进行侦测 (intensity 9)

--version-trace显示出详细的版本侦测过程信息

OS系统探测-O

-O指定Nmap进行OS侦测,nmap拥有丰富的系统数据库nmap-os-db,目前可以识别2600多种操作系统与设备类型。

--osscan-limit限制Nmap只对确定的主机的进行OS探测(至少需确知该主机分别有一个open和closed的端口)

--osscan-guess大胆猜测对方的主机的系统类型。由此准确性会下降不少,但会尽可能多为用户提供潜在的操作系统

结果输出类

-oX test.xml将扫描结果生成 test.xml 文件,如果中断,则结果打不开

-oA test.xml将扫描结果生成 test.xml 文件,中断后,结果也可保存

-oG test.txt将扫描结果生成 test.txt 文件

隐藏信息针对防火墙

nmap -sF -T4 192.168.1.0 探测防火墙状态

--badsum使用错误的 checksum 来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,
说明回复来自防火墙或 IDS/IPS)

-e eth0指定使用eth0网卡进行探测

-f : --mtu <val>指定使用分片、指定数据包的 MTU

-b <FTP relay host> 使用FTP bounce scan扫描方式

-g/--source-port <portnum>使用指定源端口

-D <decoy1,decoy2[,ME],...>用一组 IP 地址掩盖真实地址,其中 ME 填入自己的 IP 地址

-S <IP_Address>伪装成其他 IP 地址

--ttl <val>设置 time-to-live 时间

--traceroute追踪每个路由节点

--scanflags <flags>定制TCP包的flags

--data-length <num>填充随机数据让数据包长度达到 Num

--ip-options <options>使用指定的 IP 选项来发送数据包

--spoof-mac <mac address/prefix/vendor name> 伪装 MAC 地址

--data-length <num>填充随机数据让数据包长度达到 Num。

1
nmap -F -Pn -D 10.96.10.100,10.96.10.110,ME  -e eth0  -g 5555 202.207.236.3

端口状态

端口扫描是Nmap最基本最核心的功能,用于确定目标主机的TCP/UDP端口的开放情况。

  • open端口是开放的。
  • closed端口是关闭的。
  • filtered端口被防火墙IDS/IPS屏蔽,无法确定其状态。
  • unfiltered端口没有被屏蔽,但是否开放需要进一步确定。
  • open|filtered端口是开放的或被屏蔽,Nmap不能识别。
  • closed|filtered端口是关闭的或被屏蔽,Nmap不能识别

工作原理

当探测公网IP时

nmap -sn

Nmap会发送四种不同类型的数据包来探测目标主机是否在线。

  1. ICMP echo request
  2. a TCP SYN packet to port 443(https)
  3. a TCP ACK packet to port 80(http)
  4. an ICMP timestamp request

依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误

nmap -PE/-PP/-PM

-PE 的ICMP Echo扫描简单来说是通过向目标发送ICMP Echo数据包来探测目标主机是否存活,但由于许多主机的防火墙会禁止这些报文,所以仅仅ICMP扫描通常是不够的。

-PP 的ICMP time stamp时间戳扫描在大多数防火墙配置不当时可能会得到回复,可以以此方式来判断目标主机是否存活。倘若目标主机在线,该命令还会探测其开放的端口以及运行的服务!

-PM 的ICMP address maskPing地址掩码扫描会试图用备选的ICMP等级Ping指定主机,通常有不错的穿透防火墙的效果

探测内网IP时

nmap -sn

使用nmap -sn [内网ip]这个命令会发送arp请求包探测目标ip是否在线,如果有arp回复包,则说明在线。此命令可以探测目标主机是否在线,如果在线,还可以得到其MAC地址。但是不会探测其开放的端口号。

nmap -PE/-PP/-PM

使用 nmap -PE/PP/PM [内网ip] 探测主机的开启情况,使用的是ARP请求报文,如果有ARP回复报文,说明主机在线。-PP/PE/PM命令探测到主机在线后,还会探测主机的端口的开启状态以及运行的服务

tcp

TCP SYN 扫描(-sS)

​ 这是Nmap默认的扫描方式,通常被称作半开放扫描。该方式发送SYN到目标端口,如果收到SYN/ACK回复,那么可以判断端口是开放的;如果收到RST包,说明该端口是关闭的。如果没有收到回复,那么可以判断该端口被屏蔽了。因为该方式仅发送SYN包对目标主机的特定端口,但不建立完整的TCP连接,所以相对比较隐蔽,而且效率比较高,适用范围广。

TCP connent 扫描(-sT)

TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭。该方式扫描速度慢,而且由于建立完整的TCP连接会在目标主机上留下记录,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑使用的方式

TCP ACK 扫描(-sA)

向目标主机的端口发送ACK包,如果收到RST包,说明该端口没有被防火墙屏蔽;没有收到RST包,说明被屏蔽。该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况

TCP FIN/Xmas/NULL 扫描(-sN/sF/sX)

这三种扫描方式被称为秘密扫描,因为相对比较隐蔽。FIN扫描向目标主机的端口发送的TCP FIN包或Xmas tree包或NULL包,如果收到对方的RST回复包,那么说明该端口是关闭的;没有收到RST包说明该端口可能是开放的或者被屏蔽了。其中Xmas tree包是指flags中FIN URG PUSH被置为1的TCP包;NULL包是指所有的flags都为0的TCP包。

UDP扫描(-sU)

UDP扫描用于判断UDP端口的情况,向目标主机的UDP端口发送探测包,如果收到回复ICMP port unreachable就说明该端口是关闭的;如果没有收到回复,那说明该UDP端口可能是开放的或者屏蔽的。因此,通过反向排除法的方式来判断哪些UDP端口是可能处于开放状态的。

其他方式(-sY/-sZ)

除了以上几种常用的方式外,Nmap还支持多种其他的探测方式。例如使用SCTP INIT/Cookie-ECHO方式是来探测SCTP的端口开放情况;使用IP protocol方式来探测目标主机支持的协议类型(tcp/udp/icmp/sctp等等);使用idle scan方式借助僵尸主机来扫描目标主机,以达到隐蔽自己的目的;或者使用FTP bounce scan,借助FTP允许的代理服务扫描其他的主机,同样达到隐蔽自己的目的

nmap -A ip

这个命令不仅列出目标主机开放的端口号,对应的服务,还较为详细的列出了服务的版本,其支持的命令,到达目标主机的每一跳路由等信息。在进行完全扫描时,扫描机与目标主机之间存在大量的数据流量交互,扫描时长随之增加。完全扫描不仅仅是TCP协议上的通信交互,还有例如ICMP、HTTP、NBSS、TDS、POP等等协议的交互,这些协议的交互是因为在完全扫描开始时首先对目标主机的开放端口进行了确认,之后再根据不同对应的不同服务进行服务版本信息探测、账户信息等信息的探测!

防火墙/IDS规避

防火墙与IDS规避为用于绕开防火墙与IDS的检测与屏蔽,以便能够更加详细地发现目标主机的状况。nmap提供了多种规避技巧通常可以从两个方面考虑规避方式:数据包的变换(Packet Change)和时序变换(Timing Change)

分片

将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去),某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查

IP诱骗(IP decoys)

在进行扫描时,将真实IP地址在和其他主机的IP地址混合使用(其他主机需要在线,否则目标主机将回复大量数据包到不存在的数主机,从而实质构成了DOS攻击),以此让目标主机的防火墙或IDS追踪大量的不同IP地址的数据包,降低其追查到自身的概率。但是,某些高级的IDS系统通过统计分析仍然可以追踪出扫描者真实的IP地址

IP伪装

IP伪装就是将自己发送的数据包中的IP地址伪装成其他主机的地址,从而目标机认为是其他主机与之通信。需要注意的是,如果希望接收到目标主机的回复包,那么伪装的IP需要位于统一局域网内。另外,如果既希望隐蔽自己的IP地址,又希望收到目标主机的回复包,那么可以尝试使用idle scan 或匿名代理等网络技术

指定源端口

某些目标主机只允许来自特定端口的数据包通过防火墙。例如,FTP服务器的配置为允许源端口为21号的TCP包通过防火墙与FTP服务器通信,但是源端口为其他的数据包被屏蔽。所以,在此类情况下,可以指定数据包的源端口

扫描延时

某些防火墙针对发送过于频繁的数据包会进行严格的侦查,而且某些系统限制错误报文产生的频率。所以,我们可以降低发包的频率和发包延时以此降低目标主机的审查强度

其他技术

nmap还提供其他多种规避技巧,比如指定使用某个网络接口来发送数据包、指定发送包的最小长度、指定发包的MTU、指定TTL、指定伪装的MAC地址,使用错误检查。

NSE脚本引擎

NSE脚本引擎(Nmap Scripting Engine)是nmap最强大,最灵活的功能之一,允许用户自己编写脚本来执行自动化的操作或者扩展nmap的功能。

nmap的脚本库的路径:/usr/share/nmap/scripts/xx/nmap/scripts/ ,该目录下的文件都是nse脚本

NSE使用Lua脚本语言,并且默认提供了丰富的脚本库,目前已经包含了14个类别的350多个脚本。NSE的设计初衷主要考虑以下几个方面:

  • 网络发现(Network Discovery)
  • 更加复杂的版本侦测(例如 skype 软件)
  • 漏洞侦测(Vulnerability Detection)
  • 后门侦测(Backdoor Detection)
  • 漏洞利用(Vulnerability Exploitation)

Nmap的脚本主要分为以下几类:

  • Auth:负责处理鉴权证书(绕过鉴权)的脚本

  • Broadcast:在局域网内探查更多服务去开启情况,如DHCP/DNS等

  • Brute:针对常见的应用提供暴力破解方式,如HTTP/HTTPS

  • Default:使用-sC或-A选项扫描时默认的脚本,提供基本的脚本扫描能力

  • Discovery:对网络进行更多的信息搜集,如SMB枚举,SNMP查询等

  • Dos:用于进行拒绝服务攻击

  • Exploit:利用已知的漏洞入侵系统

  • External:利用第三方的数据库或资源 。如,进行whois解析

  • Fuzzer:模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞

  • Intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽

  • Malware:探测目标是否感染了病毒,开启后门等

  • Safe:与Intrusive相反,属于安全性脚本

  • Version:负责增强服务与版本扫描功能的脚本

  • Vuln:负责检查目标机是否有常见漏洞,如MS08-067

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
例如:
nmap -script smb-vuln-ms17-010 192.168.10.34 #可以探测该主机是否存在ms17_010漏洞
nmap --max-parallelism 800 --script http-slowloris scanme.nmap.org #可以探测该主机是否存在http拒绝服务攻击漏洞
nmap -script http-iis-short-name-brute 192.168.10.34 #探测是否存在IIS短文件名漏洞
nmap -script mysql-empty-password 192.168.10.34 #验证mysql匿名访问
nmap -p 443 -script ssl-ccs-injection 192.168.10.34 #验证是否存在openssl CCS注入漏洞
namp --script=auth 192.168.10.34 #鉴权扫描 扫弱口令

--script=http-waf-detect #验证主机是否存在WAF
--script=http-waf-fingerprint #验证主机是否存在WAF

nmap --script-brute 192.168.1.1 #nmap可对数据库、SMB、SNMP等进行简单密码的暴力破解
nmap --script-vuln 192.168.1.1 #扫描是否有常见漏洞

--script-updatedb #更新脚本数据库
--script-help #输入脚本对应的使用方法

namp -n -p 445 --script=broadcast 192.168.10.34 #探测内网更多服务
namp -script external baidu.com
## 当主机不在域环境,可通过以下命令爆破域内用户
nmap -p 88 --script krb5-enum-users --script-args krb5-enum-users.realx="xie.com",userdb="users.txt" 192.168.10.131

vulscan.git

https://github.com/scipag/vulscan

1
2
3
4
cd /usr/share/nmap/script
sudo git clone https://github.com/scipag/vulscan
#使用
sudo nmap --script vulscan --script-args vulscandb=scipvuldb.csv -sV 192.168.201.131 |more

nmap-xml-csv

帮实习生写个脚本吧,功能是xml格式转换成表格方便客户查看

安装libnmap模块

https://pypi.org/project/python-libnmap/

1
pip install python-libnmap

img

window下这样报错家常便饭,先换官方手册上的git安装

1
2
3
git clone https://github.com/savon-noir/python-libnmap.git
cd python-libnmap
python setup.py install

导入xml格式文件

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from libnmap.parser import NmapParser
import csv

## xml --> csv
xml_filename = input("输入要导入的xml文件路径:")
csv_filename = input("导出文件名称或路径(chestnut:IDC_SYN.csv):")

rep_obj = NmapParser.parse_fromfile(xml_filename)
csv_obj = csv.writer(open(csv_filename, 'w', newline=''))
csv_obj.writerow(['主机', '端口', '协议', '服务', '状态', '信息'])
for _host in rep_obj.hosts:
for serv in _host.services:
data = [_host.ipv4, serv.port, serv.protocol, serv.service, serv.state, serv.banner]
csv_obj.writerow(data)
print('xml转换成csv格式完成')

环境是python3,打包下方便实习生使用

使用,拖入就好

img

封装方法+命令行参数

https://www.runoob.com/python3/python3-command-line-arguments.html