nmap

nmap工具原理

1 nmap扫描主要有 TCP 全连接扫描(会被扫描机器留下记录), 半连接扫描(不会留下记录)

image-20210921154650539

nmap使用入门

1
2
3
nmap -h
# 查看帮助信息
man  nmap # 这个命令可以更加详细的列出使用方法

nmap 脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
└─$ whereis nmap
nmap: /usr/bin/nmap /usr/share/nmap /usr/share/man/man1/nmap.1.gz

cd /usr/share/nmap/
ls scripts
# 这里有很多 nmap 的脚本
└─$ ls scripts | wc -l
602
# 我们可以看到这里有 602个 nmap的脚本可以使用
cd scripts
less scripts.db # 查看所有脚本的功能介绍
nmap --script-update
# 更新脚本
标志 原理
URG urg=1 时候,表示报文应尽快传送 【URGent】
PSH 【急迫标志】表示立刻传给应用层,不要等待缓存满时候再交付
ACK 为1时候,确认序号字段才有意义
RST ReSeT,当RST=1 时候,表示严重错误,要释放连接,然后重新建立连接。 这还可以用来拒绝不合法的报文段和拒绝打开一个连接
SYN 表明这个是请求建立连接报文段
FIN fin=1 表示字节发送完,请求释放连接

主机发现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 HOST DISCOVERY:
             -sL: List Scan - simply list targets to scan
             -sn: Ping Scan - disable port scan
             -Pn: Treat all hosts as online -- skip host discovery
             -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
             -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
             -PO[protocol list]: IP Protocol Ping
             -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
             --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
             --system-dns: Use OS's DNS resolver
             --traceroute: Trace hop path to each host

主机发现也叫 ping扫描, 发送简单的icmp请求报文

选项详情

-P* 选项用于选中 ping的类型,用于结合使用,可以使用不同的tcp端口、标志位

学习视频

nmap 的几种选项

选项 原理
-P0 (无ping) 通常nmap在进行高强度扫描时候,用它确定正则运行的机器,默认情况下,nmap只对正运行的主机进行高强度扫描,如端口扫描,版本探测 【这个速度会快一点】
-PS 【tcp syn ping】,发送tcp syn 空报文,默认目的端口是 80 ,但不同端口也可以作为选项指定,例如 nmap -PS 80,23,666 www.baidu.com
-PA (tcp ack ping) 【tcp ack ping】, 直接发送ack报文,因为没有先 syn 三次握手建立连接,所以服务器会认为是不合法连接,返回 RST报文,拒绝你的连接,这样就可以知道这个主机是存活的【因为拒绝了你,给你响应了报文】syn 不能用,就只能用 ack,
-PU (udp ping) 【udp没有建立连接请求,是无状态的】,这是基于ICMP端口作为扫描,这种好处是,穿越只过滤tcp协议流量的防火墙
-PE;-PP;-PM 分别是 echo, timestamp , mask 请求,主机存活的话,就会响应, PM 扫描速度非常的慢
PR arp ping,nmap优化了 arp请求的算法,如果目标主机在局域网上,nmap默认就是 arp,如果不想指定arp,可以设置 –send-ip
-n 不用域名解析,dns比较慢
-R 为所有目标解析 域名,对目的ip地址反向域名解析。一般发现机器正在运行的时候才这样做
1
2
3
4
5
6
7
nmap -PA  180.24.67.1-254 
nmap -PU  180.24.67.1-254 #udp扫描,穿越tcp防火墙

nmap -PM -PE -PP --send-ip 180.175.10.1-254

#nmap 主要用于扫描内网,
nmap 10.10.10.10 # 内网地址

cidr风格的地址

nmap支持 CIDR风格的地址,

你可以附加一个 /<numbit> 在ip地址或者主机后面,nmap将会扫描所有该参考ip地址 具有 <numbit> 想用比特的所有ip地址 或者主机。 例如 , 192.168.10.0/24 将会扫描 192.168.10.0, scanme.nmap.org/16 也能成功使用

gateway/16 表示扫描 65535个ip地址 ,

gateway/24 表示 扫描 256个ip地址

范围列表语法

192.168.0-255.1-254

192.168.1,3,5.1-254

,逗号表示并列, - 表示范围

-iR 随机选择扫描

选项 结束
-iR<hostnum> 随机选目标,例如nmap -sS -PS80 -iR 0 -p 80 ,随机的找一些网站浏览, 选项0 表示无休止扫描,后果自负
–exclude 排除目标主机

端口扫描

选项理解

选项 理解
-sT (tcp connect扫描) 全扫描,当syn可以事后,它通常是更好的选择,用这个去扫描unix系统很容易在 syslog 留下记录
-sU(udp扫描) dns,snmp,dhcp 注册端口分别是,53,161/162, 67/68 这3个,通过这个选项可以激活, udp扫描非常慢,可以使用 –host-timeout跳过慢速主机, 重试几次没有反应会得到,open|filtered(开放|被过滤的) ,filtered表示不确定是开放或者关闭
-sA ack扫描 , 上面 pA ping ack ,用于主机发现,scan ack 用来扫描端口
-sW tcp窗口扫描, scan window 模式,这个我也没怎么理解
-sN;-sF;-sX 分别是 tcp Null, FIN, 和 Xmas 扫描, sN不设置任何标志位,tcp标志头是0 , sF只设置 FIN标志位, -sX 设置 fin,psh, urg标志位 【-sX 比较快,因为设置了 URG 的标志位
-sO ip协议扫描, 类似udp的扫描方式,结果也是非常的慢,一般不用,但是也是有一定的作用的
-sl <zombie host> 允许你对目标进行tcp端口盲扫描 ,以防我们被发现 【利用僵尸主机,又叫肉鸡】

tcp syn流程如下

1
2
3
 -> syn/ack -> 目标主机
 <- rst closed/ syn\ack open
 
1
nmap --scanflags  URGACK  172.17.18.1-108

结果理解

参考文档

端口状态 解释
open 应用程序正在该端口接收TCP 连接或者UDP报文
closed 关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应)
filtered 由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙
unfiltered 未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭
open|filtered 当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。
closed|filtered 该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。

操作系统探测扫描

-O 启动操作系统探测 Operating system

--max-os-tries 设置重复探测次数

原理是通过数据库的指纹对比,得出os版本

脚本扫描【漏洞扫描】

参考过的博客

另外可以查看我文章的另一篇文章,db_nmap 上面有一些记录

脚本类型 说明
auth 绕开鉴权脚本
broadcast 查看服务开启状态,例如dhcp,dns,sqlserver等服务
brute 暴力破解等方式,比如爆破smb
default 默认脚本,-A选项等
discovery smb枚举,snmp查询
dos 拒绝服务攻击
exploit 已知漏洞入侵系统
external 利用第三方数据库或者资源
fuzzer 模糊测试,发送异常的包到目标及其,探测出潜在漏洞 intrusive入侵性脚本,可能引发对方ips 的记录或者屏蔽
malware 探测目标是否感染病毒,开启了后门等信息
safe 属于安全性脚本和 intrusive类似
version 负责增强服务和版本扫描
vuln 检查是否有常见漏洞 (Vulnerability)
--scriptredis-info redis-info为nmap 专门的插件,用于登录redis执行内部命令

附寻找脚本的方法:

1
2
3
cd /usr/share/nmap/scripts

find -name "*[脚本关键词]*"   
1
2
nmap -P0  --script=smb-vuln-*   10.218.25.63
# 利用软件自带的脚本扫描漏洞

扫描结果如下

1
2
3
4

Host script results:
|_smb-vuln-ms10-054: false
|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: Failed to receive bytes: ERROR
1
nmap -v -n -Pn -p 6379 -sV --script=redis-info 192.x.x.1/24
1
2
3
4
5
6
7
# 扫描root空口令

nmap -p3306 --script=mysql-empty-password.nse 10.11.124.102

# telnet暴力破解

nmap -p 23 --script telnet-brute --script-args userdb=[用户名字典路径],passdb=[密码字典路径] --script-args telnet-brute.timeout=8s 192.168.1.1  
1
2
nmap --script banner -A doc.qq.com
# 扫描 banner信息

查看 whois记录信息

whois 记录通常包含注册人姓名,联系方式等重要数据

1
nmap --script whois 目标

joomla cms漏洞扫描

使用 http-joomla-brute 脚本检测弱密码账号

1
nmap -p80 --script http-joomla-brute localhost

sql注入

1
nmap -p80 --script http-sql-injection localhost

用户审计

1
2
3
4
5
nmap -sV --script=mysql-users
# 爆破 空口令

nmap --script=mysql-brute localhost
# 使用 nmap脚本来爆破用户名密码

cve漏洞

mysql 最可怕的是 cve-2012-2122 ,攻击者用root尝试 300次登陆后进入数据库

1
nmap --script=mysql-vuln-cve2012-2122 l

实战演示

注意,本文章只是个人学习笔记,扫描的对象是靶机,请勿使用本文章的命令去扫任何网站,否则后果自负